Определение положения IDE винта

Тема в разделе "WASM.WIN32", создана пользователем Johnikum, 19 сен 2004.

  1. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Добрый вечер (ночь, утро, день).



    Необходимо определить на каком канале (primary|secondary), а также положение (master|slave), находится винчестер.



    Пробовал делать это так:
    Код (Text):
    1.  
    2. DISK_CONTROLLER_NUMBER struct
    3.   ControllerNumber   dd ?
    4.   DiskNumber         dd ?
    5. DISK_CONTROLLER_NUMBER ends
    6.  
    7. IOCTL_DISK_CONTROLLER_NUMBER = 70044h
    8.  
    9. dwBytesReturned dd ?
    10. szDeviceName    DB "\\.\PhysicalDrive0", 0
    11. DCN             DISK_CONTROLLER_NUMBER <>
    12. .
    13. .
    14.       xor     ebx, ebx
    15.       invoke  CreateFile, offset szDeviceName, GENERIC_READ or GENERIC_WRITE,\
    16.               FILE_SHARE_READ OR FILE_SHARE_WRITE, ebx, OPEN_EXISTING,\
    17.               ebx,ebx
    18.       mov   esi,eax
    19. .
    20. .
    21.       invoke  DeviceIoControl, esi, IOCTL_DISK_CONTROLLER_NUMBER,ebx,ebx,\
    22.               offset DCN, sizeof DISK_CONTROLLER_NUMBER, offset dwBytesReturned, ebx
    23.  


    Это дело не пашет, GetLastError после DeviceIoControl говорит что такой функции нет. (ERROR_INVALID_FUNCTION) Или я где ошибся?



    Может можно как-то по другому?



    Пробовал делать с помощью SMART_GET_VERSION - работает, но нужно без нее.
     
  2. Skif

    Skif New Member

    Публикаций:
    0
    Регистрация:
    31 дек 2003
    Сообщения:
    55
    Когда-то столкнулся с той же самой проблемой, и решать ее пытался с помощью того же IOCTL, с тем же самым результатом. В ходе медитации с отладчиком и исходными текстами драйверов из ntddk выяснилось, что данный IOCTL реализован _только_ в драйвере atdisk.sys, который windows почему-то не использует. Так что, похоже, это тупиковый метод.
     
  3. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Определить какому физическому диску/дискам соответствует логический раздел можно с помощью IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.





    Нашел статью Криса Касперски: "Cпособы взаимодействия с диском на секторном уровне. часть 1" в ней говорится о структуре SCSI_REQUEST_BLOCK (описана в srb.h (DDK))
    Код (Text):
    1.  
    2. typedef struct _SCSI_REQUEST_BLOCK {
    3. .
    4. .
    5.     UCHAR PathId;                   // offset 5
    6.     UCHAR TargetId;                 // offset 6 контроллер устройства на шине. для IDE устройств 0 – primary, 1 – secondary
    7.     UCHAR Lun;                      // offset 7 логический номер устройства. для IDE устройств 0 – master, 1 – slayer
    8. .
    9. .
    10. };
    11.  


    Поля TargetId и Lun отражают то что мне надо.

    Теперь вопрос:

    Как из Kernel Mode Driver'a можно обратиться к какому либу устройству напрямую, но не для того которого написан драйвер?

    Как получить DEVICE_OBJECT для \\.\PhysicalDriveX из Kernel Mode? Чтобы потом ему послать структуру.



    Неужели чтобы определить в Windows IDE канал нужно в kernel mode лезть???
     
  4. Four-F

    Four-F New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2002
    Сообщения:
    1.237
    \\.\PhysicalDriveX - это символьная ссылка. Нужно сначала её таргет получить ZwQuerySymbolicLinkObject. Потом IoGetDeviceObjectPointer. Потом создать IRP IoBuildDeviceIoControlRequest/IoAllocateIrp/IoBuildSynchronousFsdReque st и послать драйверу IoCallDriver.
     
  5. Johnikum

    Johnikum Member

    Публикаций:
    0
    Регистрация:
    6 июн 2003
    Сообщения:
    97
    Большое спасибо, бум думать дальше.