1

我在 python 上创建了一个小程序,它在低级别读取引导扇区,因此它不会损坏设备。我昨天在 Linux 中成功运行了这个程序,我有了在 Windows 中做同样事情的想法。但唯一的问题是来了,我无法读取例如:\Device\Harddisk0\Partition1引导分区或\Device\Harddisk0\DR0原始磁盘 0。每次我尝试它都告诉我:No such a file or a directory

我做错了什么?

4

2 回答 2

3

正确的做法是:

import os
disk_fd = os.open( r"\\.\PhysicalDrive0", os.O_RDONLY | os.O_BINARY)
data = os.read(disk_fd, 512)
os.close(disk_fd)

感谢@eryksun

于 2017-03-10T02:52:38.147 回答
0

一切都取决于您使用的 NT 或 WIN32 api。ZwOpenFile还是CreateFileW

\Device\Harddisk0\Partition1是 NT 名称格式,必须使用ZwOpenFileZwCreateFile仅使用。

要在其中使用此名称,CreateFileW您必须为其添加前缀\\?\globalroot

所以代码示例 - (在单个函数中同时使用 NT 和 win32 调用)

void xxx()
{
    HANDLE hFile;
    IO_STATUS_BLOCK iosb;
    UNICODE_STRING ObjectName;
    OBJECT_ATTRIBUTES oa = { sizeof(oa), 0, &ObjectName, OBJ_CASE_INSENSITIVE };
    RtlInitUnicodeString(&ObjectName, L"\\Device\\Harddisk0\\Partition1");

    UCHAR buf[0x200];
    if (0 <= ZwOpenFile(&hFile, FILE_GENERIC_READ, &oa, &iosb, FILE_SHARE_VALID_FLAGS, FILE_SYNCHRONOUS_IO_NONALERT))
    {
        LARGE_INTEGER ByteOffset = {};
        ZwReadFile(hFile, 0, 0, 0, &iosb, buf, sizeof(buf), &ByteOffset, 0);
        ZwClose(hFile);
    }

    hFile = CreateFile(L"\\\\?\\globalroot\\Device\\Harddisk0\\Partition1", FILE_GENERIC_READ, FILE_SHARE_VALID_FLAGS,
        0, OPEN_EXISTING, 0, 0);

    if (hFile != INVALID_HANDLE_VALUE)
    {
        OVERLAPPED ov = {};
        ULONG n;
        ReadFile(hFile, buf, sizeof(buf), &n, &ov);
        CloseHandle(hFile);
    }
}

您也可以将下一个 SymbolicLinks 用于CreateFileW

  • \\?\Harddisk<X>Partition<Y>- 用于硬盘 (0,1,..) 上的分区 (1,2,..)
  • \\?\PhysicalDrive<X>对于硬盘 (0,1,..)

一切都取决于-您是如何获得这条路径的?或者你只是硬编码它?

于 2016-12-31T22:11:36.823 回答