все зависит от 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>
- для раздела (1,2,..) на жестком диске (0,1,..)
\\?\PhysicalDrive<X>
для жесткого диска (0,1,..)
все зависит от того, как вы получили эти пути? или вы просто жестко кодируете это?
person
RbMm
schedule
31.12.2016
\\.
? Этоopen("\\\\.\\Device\\Harddisk0\\Partition1")
- person selbie   schedule 01.01.2017\Device\Harddisk0\DR0
находится в пространстве имен объектов. API Windows выборочно использует это пространство имен, например. глобальные символические ссылки на устройства создаются в\GLOBAL??
, например.C:
=›\Device\HarddiskVolume2
. Устаревшее пространство имен DOS позволяет вам использовать здесь некоторые ссылки на устройства, такие как буквы дисков и устаревшие устройства DOS, такие какCON
, но для доступа ко всему, что вам нужно, один из префиксов устройств WinAPI, либо\\.\
(некоторая обработка пути и косая черта разрешена, но ограниченаMAX_PATH
символами) или\\?\
(без обработки пути; должен быть Unicode и использовать обратную косую черту). - person Eryk Sun   schedule 01.01.2017\\.\PhysicalDrive0
, которая открывает\Device\Harddisk0\DR0
. Аналогично\\.\PhysicalDrive1
открывает\Device\Harddisk1\DR1
. Другой,\Device\Harddisk0\Partition1
, является томом, а не диском. Вы можете просто открыть букву тома или точку подключения GUID, например.\\.\C:
. Но вы не можете жестко закодировать это. Вы должны использовать API для сопоставления тома по букве диска, имени тома GUID или точке подключения NTFS с номером физического диска. - person Eryk Sun   schedule 01.01.2017t = open(r"\\.\PhysicalDrive0")
и получил ошибку:Permission Denied
. Поэтому я сделал это в своей командной строке от имени администратора, и это дало мне:OSError: [WinError 1] Incorrect Function
- person Zeiad Badawy   schedule 01.01.2017disk_fd = os.open( r"\\.\PhysicalDrive0", os.O_RDONLY | os.O_BINARY);
data = os.read(disk_fd, 512);
os.close(disk_fd)
. - person Eryk Sun   schedule 01.01.2017'\\.\%s' % os.environ['SystemDrive']
. Это почти всегда будет\\.\C:
. - person Eryk Sun   schedule 01.01.2017