DeviceIoControl c кодом PARTITION_INFORMATION

Тема в разделе "WASM.WIN32", создана пользователем Programmer PRL, 21 фев 2005.

  1. Programmer PRL

    Programmer PRL New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    5
    Адрес:
    Russia
    Кто подскажет, почему 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()

    */

    Кто знает, подскажите, в МСДН ничо по этому поводу не нашёл :-((

    Заранее благодарю
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Programmer PRL

    Добавь GENERIC_READ в CreateFile.
    Код (Text):
    1. #define WIN32_LEAN_AND_MEAN
    2. #include <windows.h>
    3. #include <WinIoCtl.h>
    4. #include <stdio.h>
    5.  
    6. typedef struct
    7. {
    8.   BYTE  type;
    9.   char *name;
    10. } PT;
    11.  
    12. int main(void)
    13. {
    14.   HANDLE hDevice = CreateFile("\\\\.\\C:", GENERIC_READ,
    15.                      FILE_SHARE_READ | FILE_SHARE_WRITE,
    16.                      NULL, OPEN_EXISTING, 0, NULL);  
    17.   if (hDevice != INVALID_HANDLE_VALUE)
    18.   {
    19.     PARTITION_INFORMATION pi;
    20.     DWORD dwBytes = 0;
    21.  
    22.     if (FALSE != DeviceIoControl(hDevice, IOCTL_DISK_GET_PARTITION_INFO,
    23.                    NULL, 0, (LPVOID) &pi, sizeof(pi), &dwBytes, NULL))
    24.     {
    25.       PT pt[] = {PARTITION_ENTRY_UNUSED,    "Entry unused",
    26.                  PARTITION_FAT_12,          "12-bit FAT entries",
    27.                  PARTITION_XENIX_1,         "Xenix",
    28.                  PARTITION_XENIX_2,         "Xenix",
    29.                  PARTITION_FAT_16,          "16-bit FAT entries",
    30.                  PARTITION_EXTENDED,        "Extended partition entry",
    31.                  PARTITION_HUGE,            "Huge partition MS-DOS V4",
    32.                  PARTITION_IFS,             "IFS Partition",
    33.                  PARTITION_OS2BOOTMGR,      "OS/2 Boot Manager/OPUS/Coherent swap",
    34.                  PARTITION_FAT32,           "FAT32",
    35.                  PARTITION_FAT32_XINT13,    "FAT32 using extended int13 services",
    36.                  PARTITION_XINT13,          "Win95 partition using extended int13 services",
    37.                  PARTITION_XINT13_EXTENDED, "Same as type 5 but uses extended int13 services",
    38.                  PARTITION_PREP,            "PowerPC Reference Platform (PReP) Boot Partition",
    39.                  PARTITION_LDM,             "Logical Disk Manager partition",
    40.                  PARTITION_UNIX,            "Unix"};
    41.       unsigned i;
    42.  
    43.       for (i = 0; i < (sizeof(pt)/sizeof(pt[0])); i++)
    44.       {
    45.         if (pt[i].type == pi.PartitionType)
    46.         {
    47.           printf("Partition type is \'%s\'\n", pt[i].name);
    48.           break;
    49.         }
    50.       }
    51.       if (i > (sizeof(pt)/sizeof(pt[0])))
    52.         printf("Partition type is %d\n", pi.PartitionType);
    53.     }
    54.     else
    55.     {
    56.       DWORD err = GetLastError();
    57.       printf("DeviceIoControl failed 0x%08X(%d)\n", err, err);
    58.     }
    59.     CloseHandle(hDevice);
    60.   }
    61.   else
    62.   {
    63.     DWORD err = GetLastError();
    64.     printf("CreateFile failed 0x%08X(%d)\n", err, err);
    65.   }
    66.   return 0;
    67. }
     
  3. Programmer PRL

    Programmer PRL New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    5
    Адрес:
    Russia
    Благодарю q_q, действительно в этом всё и дело, правда на ОСЁвый PARTITION_OS2BOOTMGR в хедере не нашёлся, пришлось закоментарить.(детали реализации)



    У меня ещё вот какой вопрос.. Может кто подскажет мне хотя бы общую схему чтения образа диска (по секторам), с возможностью сохранения.
     
  4. SteelRat

    SteelRat New Member

    Публикаций:
    0
    Регистрация:
    26 авг 2004
    Сообщения:
    409
    Открываешь файл "\\.\f:" (для примера диска f:\) узнаешь дисковую геометрию (IOCTL_DISK_GET_DRIVE_GEOMETRY) по ней ориентируешся сколько секторов и размер сектора. В соответствии с этим устанавливаешь размер буфера и кол-во считываемых байт, а дальше в цикле читаешь простым ReadFile по секторам. Вот собственно и алгоритм. Таким считыванием я восстанавливал с USB Flash данные, пока не нашел этого в WinHex, он еще "круче" :)
     
  5. Programmer PRL

    Programmer PRL New Member

    Публикаций:
    0
    Регистрация:
    21 фев 2005
    Сообщения:
    5
    Адрес:
    Russia
    Благодарю, буду пробовать