· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Определение положения IDE винта

Посл.отвђт Сообщенiе


Дата: Сен 19, 2004 03:12:20 · Поправил: Johnikum

Добрый вечер (ночь, утро, день).

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

Пробовал делать это так:
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 - работает, но нужно без нее.


Дата: Сен 19, 2004 13:03:40

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


Дата: Сен 23, 2004 01:15:58

Определить какому физическому диску/дискам соответствует логический раздел можно с помощью IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS.


Нашел статью Криса Касперски: "Cпособы взаимодействия с диском на секторном уровне. часть 1" в ней говорится о структуре SCSI_REQUEST_BLOCK (описана в srb.h (DDK))
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 лезть???


Дата: Сен 23, 2004 02:16:55

\\.\PhysicalDriveX - это символьная ссылка. Нужно сначала её таргет получить ZwQuerySymbolicLinkObject. Потом IoGetDeviceObjectPointer. Потом создать IRP IoBuildDeviceIoControlRequest/IoAllocateIrp/IoBuildSynchronousFsdReque st и послать драйверу IoCallDriver.


Дата: Сен 23, 2004 02:31:40

Большое спасибо, бум думать дальше.


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.047