在 Windows 上读取引导扇区

Reading Boot Sector on Windows

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

我做错了什么?

都取决于您使用的 NT 或 WIN32 api。 ZwOpenFileCreateFileW ?

\Device\Harddisk0\Partition1 是 NT 名称格式,只能在 ZwOpenFileZwCreateFile 中使用。

要在 CreateFileW 中使用此名称,您必须在其前面加上 \?\globalroot

so 代码示例 -(在单个函数中同时使用 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> - 用于硬盘上的分区 (1,2,..) (0,1,..)
  • \?\PhysicalDrive<X> 硬盘 (0,1,..)

全部取决于 - 你是如何得到这条路径的?或者你只是硬编码?

正确的做法是:

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