Где тут баг? Почему лоток не открывается? Код (Text): #include <ntddk.h> NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { __asm cli //MEDIA UNLOCK __asm { mov dx, 1f7h wait_01: in al, dx test al, 10000000b jnz wait_01 } __asm mov dx, 3f6h __asm mov al, 10b __asm out dx, al __asm mov dx, 1f6h __asm mov al, 00010000b __asm out dx, al __asm mov dx, 1f7h __asm mov al, 0dfh __asm out dx, al __asm { mov dx, 1f7h wait_02: in al, dx test al, 10000000b jnz wait_02 } // //MEDIA EJECT __asm mov dx, 3f6h __asm mov al, 10b __asm out dx, al __asm mov dx, 1f6h __asm mov al, 00010000b __asm out dx, al __asm mov dx, 1f7h __asm mov al, 0edh __asm out dx, al // __asm sti return /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ; } p.s. Под DOS тоже код не работает...
Сегодня заметил, что следующий код: Код (Text): #include <ntddk.h> unsigned char dev_err; NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { __asm cli //MEDIA EJECT __asm { mov dx, 1f7h wait_01: in al, dx test al, 10000000b jnz wait_01 } __asm mov dx, 3f6h __asm mov al, 00000010b __asm out dx, al __asm mov dx, 1f6h __asm mov al, 00010000b __asm out dx, al __asm mov dx, 1f7h __asm mov al, 0edh __asm out dx, al __asm { mov dx, 1f7h wait_02: in al, dx test al, 10000000b jnz wait_02 } __asm mov dx, 1f1h __asm in al, dx __asm mov dev_err, al // __asm sti DbgPrint("dev_err: 0x%x", dev_err); return /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ; } возвращает установленный бит ABRT в регистре ошибок, что, в свою очередь, означает неподдерживание девайсом этой команды... НО! Как же тогда лоток открывает драйвер, при посылке ему DeviceIoControl Code=IOCTL_STORAGE_EJECT_MEDIA ???
P.S. возможности поставить отладчик и посмотреть пока нет. Да и просто копаться в стэке драйверов не охото...
посидел я часок за SoftIce-ом... исследовав вот эту программу: Код (Text): int main(int argc, char* argv[]) { HANDLE hCdRomD; hCdRomD = CreateFile("\\\\.\\D:", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); DeviceIoControl(hCdRomD, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, NULL, NULL); return 0; } пришел к выводу, что для открытия лотка команда MEDIA EJECT (EDh) не готится... А открыть его можно командой PACKET (A0h). Вот работающий код, который открывает лоток (оновная часть кода слизана из SoftIce-а во время отладки выше приведенной проги (точнее дров, которые обрабатывают запрос на DeviceIoControl code==IOCTL_STORAGE_EJECT_MEDIA)): Код (Text): #include <ntddk.h> NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { unsigned char dev_err; unsigned char ptr_esi[] = "\x1b\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00"; dev_err = 0; __asm cli //PACKET __asm { mov dx, 1f7h wait_01: in al, dx test al, 10000000b jnz wait_01 } /*__asm mov dx, 3f6h __asm mov al, 00000010b __asm out dx, al*/ __asm mov dx, 1f6h __asm mov al, 0b0h ;00010000b __asm out dx, al __asm { mov dx, 1f4h mov al, 0h out dx, al mov dx, 1f5h mov al, 0h out dx, al mov dx, 1f1h mov al, 0h out dx, al } __asm mov dx, 1f7h __asm mov al, 0a0h __asm out dx, al __asm { mov dx, 1f7h wait_02: in al, dx test al, 10000000b jnz wait_02 } __asm { mov dx, 1f0h lea esi, ptr_esi mov ecx, 6h repz outsw } __asm { mov dx, 1f7h wait_03: in al, dx test al, 10000000b jnz wait_03 } __asm mov dx, 1f1h __asm in al, dx __asm mov dev_err, al // __asm sti DbgPrint("dev_err: 0x%x", dev_err); return /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ; } p.s. Тема закрыта