Добрый вечер (ночь, утро, день). Необходимо определить на каком канале (primary|secondary), а также положение (master|slave), находится винчестер. Пробовал делать это так: Код (Text): DISK_CONTROLLER_NUMBER struct ControllerNumber dd ? DiskNumber dd ? DISK_CONTROLLER_NUMBER ends IOCTL_DISK_CONTROLLER_NUMBER = 70044h dwBytesReturned dd ? szDeviceName DB "\\.\PhysicalDrive0", 0 DCN DISK_CONTROLLER_NUMBER <> . . xor ebx, ebx invoke CreateFile, offset szDeviceName, GENERIC_READ or GENERIC_WRITE,\ FILE_SHARE_READ OR FILE_SHARE_WRITE, ebx, OPEN_EXISTING,\ ebx,ebx mov esi,eax . . invoke DeviceIoControl, esi, IOCTL_DISK_CONTROLLER_NUMBER,ebx,ebx,\ offset DCN, sizeof DISK_CONTROLLER_NUMBER, offset dwBytesReturned, ebx Это дело не пашет, GetLastError после DeviceIoControl говорит что такой функции нет. (ERROR_INVALID_FUNCTION) Или я где ошибся? Может можно как-то по другому? Пробовал делать с помощью SMART_GET_VERSION - работает, но нужно без нее.
Когда-то столкнулся с той же самой проблемой, и решать ее пытался с помощью того же IOCTL, с тем же самым результатом. В ходе медитации с отладчиком и исходными текстами драйверов из ntddk выяснилось, что данный IOCTL реализован _только_ в драйвере atdisk.sys, который windows почему-то не использует. Так что, похоже, это тупиковый метод.
Определить какому физическому диску/дискам соответствует логический раздел можно с помощью IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS. Нашел статью Криса Касперски: "Cпособы взаимодействия с диском на секторном уровне. часть 1" в ней говорится о структуре SCSI_REQUEST_BLOCK (описана в srb.h (DDK)) Код (Text): typedef struct _SCSI_REQUEST_BLOCK { . . UCHAR PathId; // offset 5 UCHAR TargetId; // offset 6 контроллер устройства на шине. для IDE устройств 0 – primary, 1 – secondary UCHAR Lun; // offset 7 логический номер устройства. для IDE устройств 0 – master, 1 – slayer . . }; Поля TargetId и Lun отражают то что мне надо. Теперь вопрос: Как из Kernel Mode Driver'a можно обратиться к какому либу устройству напрямую, но не для того которого написан драйвер? Как получить DEVICE_OBJECT для \\.\PhysicalDriveX из Kernel Mode? Чтобы потом ему послать структуру. Неужели чтобы определить в Windows IDE канал нужно в kernel mode лезть???
\\.\PhysicalDriveX - это символьная ссылка. Нужно сначала её таргет получить ZwQuerySymbolicLinkObject. Потом IoGetDeviceObjectPointer. Потом создать IRP IoBuildDeviceIoControlRequest/IoAllocateIrp/IoBuildSynchronousFsdReque st и послать драйверу IoCallDriver.