我在 python 上创建了一个小程序,它在低级别读取引导扇区,因此它不会损坏设备。我昨天在 Linux 中成功运行了这个程序,我有了在 Windows 中做同样事情的想法。但唯一的问题是来了,我无法读取例如:\Device\Harddisk0\Partition1
引导分区或\Device\Harddisk0\DR0
原始磁盘 0。每次我尝试它都告诉我:No such a file or a directory
我做错了什么?
正确的做法是:
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
一切都取决于您使用的 NT 或 WIN32 api。ZwOpenFile
还是CreateFileW
?
\Device\Harddisk0\Partition1
是 NT 名称格式,必须使用ZwOpenFile
或ZwCreateFile
仅使用。
要在其中使用此名称,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,..)一切都取决于-您是如何获得这条路径的?或者你只是硬编码它?