在 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。 ZwOpenFile
或 CreateFileW
?
\Device\Harddisk0\Partition1
是 NT 名称格式,只能在 ZwOpenFile
或 ZwCreateFile
中使用。
要在 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
我在 python 上创建了一个小程序,它读取低级别的引导扇区,因此它不会损坏设备。我昨天在 Linux 成功地 运行 这个程序,我在 Windows 有了做同样事情的想法。但是出现的唯一问题是我无法读取例如:\Device\Harddisk0\Partition1
,启动分区或 \Device\Harddisk0\DR0
,原始磁盘 0。每次我尝试它都会抛出一个错误:No such a file or a directory
我做错了什么?
都取决于您使用的 NT 或 WIN32 api。 ZwOpenFile
或 CreateFileW
?
\Device\Harddisk0\Partition1
是 NT 名称格式,只能在 ZwOpenFile
或 ZwCreateFile
中使用。
要在 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