Кто подскажет, почему DeviceIoControl выдаёт ERROR_ACCESS_DENIED хотя я под админом: hDevice = CreateFile( "\\\\.\\F:",//PhysicalDrive0", NULL, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL ); //Xэндл нормальный bResult = DeviceIoControl( hDevice, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, (LPVOID) &OutBuffer, (DWORD) sizeof (OutBuffer), &dwretb, NULL ); /* DERMO bResult == 0 ERROR_ACCESS_DENIED == GetLastError() */ Кто знает, подскажите, в МСДН ничо по этому поводу не нашёл :-(( Заранее благодарю
Programmer PRL Добавь GENERIC_READ в CreateFile. Код (Text): #define WIN32_LEAN_AND_MEAN #include <windows.h> #include <WinIoCtl.h> #include <stdio.h> typedef struct { BYTE type; char *name; } PT; int main(void) { HANDLE hDevice = CreateFile("\\\\.\\C:", GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (hDevice != INVALID_HANDLE_VALUE) { PARTITION_INFORMATION pi; DWORD dwBytes = 0; if (FALSE != DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO, NULL, 0, (LPVOID) &pi, sizeof(pi), &dwBytes, NULL)) { PT pt[] = {PARTITION_ENTRY_UNUSED, "Entry unused", PARTITION_FAT_12, "12-bit FAT entries", PARTITION_XENIX_1, "Xenix", PARTITION_XENIX_2, "Xenix", PARTITION_FAT_16, "16-bit FAT entries", PARTITION_EXTENDED, "Extended partition entry", PARTITION_HUGE, "Huge partition MS-DOS V4", PARTITION_IFS, "IFS Partition", PARTITION_OS2BOOTMGR, "OS/2 Boot Manager/OPUS/Coherent swap", PARTITION_FAT32, "FAT32", PARTITION_FAT32_XINT13, "FAT32 using extended int13 services", PARTITION_XINT13, "Win95 partition using extended int13 services", PARTITION_XINT13_EXTENDED, "Same as type 5 but uses extended int13 services", PARTITION_PREP, "PowerPC Reference Platform (PReP) Boot Partition", PARTITION_LDM, "Logical Disk Manager partition", PARTITION_UNIX, "Unix"}; unsigned i; for (i = 0; i < (sizeof(pt)/sizeof(pt[0])); i++) { if (pt[i].type == pi.PartitionType) { printf("Partition type is \'%s\'\n", pt[i].name); break; } } if (i > (sizeof(pt)/sizeof(pt[0]))) printf("Partition type is %d\n", pi.PartitionType); } else { DWORD err = GetLastError(); printf("DeviceIoControl failed 0x%08X(%d)\n", err, err); } CloseHandle(hDevice); } else { DWORD err = GetLastError(); printf("CreateFile failed 0x%08X(%d)\n", err, err); } return 0; }
Благодарю q_q, действительно в этом всё и дело, правда на ОСЁвый PARTITION_OS2BOOTMGR в хедере не нашёлся, пришлось закоментарить.(детали реализации) У меня ещё вот какой вопрос.. Может кто подскажет мне хотя бы общую схему чтения образа диска (по секторам), с возможностью сохранения.
Открываешь файл "\\.\f:" (для примера диска f:\) узнаешь дисковую геометрию (IOCTL_DISK_GET_DRIVE_GEOMETRY) по ней ориентируешся сколько секторов и размер сектора. В соответствии с этим устанавливаешь размер буфера и кол-во считываемых байт, а дальше в цикле читаешь простым ReadFile по секторам. Вот собственно и алгоритм. Таким считыванием я восстанавливал с USB Flash данные, пока не нашел этого в WinHex, он еще "круче"