|
|
| Посл.отвђт | Сообщен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 |