MEDIA EJECT (IDE)

Тема в разделе "WASM.OS.DEVEL", создана пользователем alexalexalex03, 18 июл 2010.

  1. alexalexalex03

    alexalexalex03 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2010
    Сообщения:
    8
    Где тут баг? Почему лоток не открывается?

    Код (Text):
    1. #include <ntddk.h>
    2.  
    3.  
    4. NTSTATUS
    5. DriverEntry(
    6.     IN PDRIVER_OBJECT DriverObject,
    7.     IN PUNICODE_STRING RegistryPath
    8.     )
    9. {  
    10.     __asm   cli
    11.  
    12. //MEDIA UNLOCK
    13.     __asm
    14.     {
    15.         mov dx, 1f7h
    16.     wait_01:
    17.         in  al, dx
    18.         test    al, 10000000b
    19.         jnz wait_01
    20.     }
    21.  
    22.     __asm   mov dx, 3f6h
    23.     __asm   mov al, 10b
    24.     __asm   out dx, al
    25.  
    26.     __asm   mov dx, 1f6h
    27.     __asm   mov al, 00010000b
    28.     __asm   out dx, al
    29.  
    30.     __asm   mov dx, 1f7h
    31.     __asm   mov al, 0dfh
    32.     __asm   out dx, al
    33.  
    34.     __asm
    35.     {
    36.         mov dx, 1f7h
    37.     wait_02:
    38.         in  al, dx
    39.         test    al, 10000000b
    40.         jnz wait_02
    41.     }
    42. //
    43.  
    44.  
    45. //MEDIA EJECT
    46.     __asm   mov dx, 3f6h
    47.     __asm   mov al, 10b
    48.     __asm   out dx, al
    49.  
    50.     __asm   mov dx, 1f6h
    51.     __asm   mov al, 00010000b
    52.     __asm   out dx, al
    53.  
    54.     __asm   mov dx, 1f7h
    55.     __asm   mov al, 0edh
    56.     __asm   out dx, al     
    57. //
    58.     __asm   sti
    59.  
    60.     return  /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ;
    61. }
    p.s. Под DOS тоже код не работает...
     
  2. alexalexalex03

    alexalexalex03 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2010
    Сообщения:
    8
    Primary Slave: CDROM
     
  3. alexalexalex03

    alexalexalex03 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2010
    Сообщения:
    8
    Сегодня заметил, что следующий код:
    Код (Text):
    1. #include <ntddk.h>
    2.  
    3.  
    4. unsigned char   dev_err;
    5.  
    6.  
    7. NTSTATUS
    8. DriverEntry(
    9.     IN PDRIVER_OBJECT DriverObject,
    10.     IN PUNICODE_STRING RegistryPath
    11.     )
    12. {  
    13.     __asm   cli
    14.  
    15. //MEDIA EJECT
    16.     __asm
    17.     {
    18.         mov dx, 1f7h
    19.     wait_01:
    20.         in  al, dx
    21.         test    al, 10000000b
    22.         jnz wait_01
    23.     }
    24.  
    25.     __asm   mov dx, 3f6h
    26.     __asm   mov al, 00000010b
    27.     __asm   out dx, al
    28.  
    29.     __asm   mov dx, 1f6h
    30.     __asm   mov al, 00010000b
    31.     __asm   out dx, al
    32.  
    33.     __asm   mov dx, 1f7h
    34.     __asm   mov al, 0edh
    35.     __asm   out dx, al 
    36.  
    37.     __asm
    38.     {
    39.         mov dx, 1f7h
    40.     wait_02:
    41.         in  al, dx
    42.         test    al, 10000000b
    43.         jnz wait_02
    44.     }  
    45.  
    46.     __asm   mov dx, 1f1h
    47.     __asm   in  al, dx
    48.     __asm   mov dev_err,    al
    49. //
    50.     __asm   sti
    51.  
    52.    
    53.     DbgPrint("dev_err: 0x%x", dev_err);
    54.  
    55.  
    56.     return  /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ;
    57. }
    возвращает установленный бит ABRT в регистре ошибок, что, в свою очередь, означает неподдерживание девайсом этой команды... НО! Как же тогда лоток открывает драйвер, при посылке ему DeviceIoControl Code=IOCTL_STORAGE_EJECT_MEDIA ???
     
  4. alexalexalex03

    alexalexalex03 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2010
    Сообщения:
    8
    P.S. возможности поставить отладчик и посмотреть пока нет. Да и просто копаться в стэке драйверов не охото...
     
  5. alexalexalex03

    alexalexalex03 New Member

    Публикаций:
    0
    Регистрация:
    14 апр 2010
    Сообщения:
    8
    посидел я часок за SoftIce-ом... исследовав вот эту программу:
    Код (Text):
    1. int main(int argc, char* argv[])
    2. {
    3.     HANDLE  hCdRomD;
    4.  
    5.  
    6.     hCdRomD =   CreateFile("\\\\.\\D:",
    7.                                 GENERIC_READ | GENERIC_WRITE,
    8.                                 0,
    9.                                 NULL,
    10.                                 OPEN_EXISTING,
    11.                                 FILE_ATTRIBUTE_NORMAL,
    12.                                 NULL);
    13.  
    14.     DeviceIoControl(hCdRomD,
    15.                         IOCTL_STORAGE_EJECT_MEDIA,
    16.                         NULL,
    17.                         0,
    18.                         NULL,
    19.                         0,
    20.                         NULL,
    21.                         NULL);
    22.  
    23.  
    24.     return 0;
    25. }
    пришел к выводу, что для открытия лотка команда MEDIA EJECT (EDh) не готится... А открыть его можно командой PACKET (A0h). Вот работающий код, который открывает лоток (оновная часть кода слизана из SoftIce-а во время отладки выше приведенной проги (точнее дров, которые обрабатывают запрос на DeviceIoControl code==IOCTL_STORAGE_EJECT_MEDIA)):
    Код (Text):
    1. #include <ntddk.h>
    2.  
    3. NTSTATUS
    4. DriverEntry(
    5.     IN PDRIVER_OBJECT DriverObject,
    6.     IN PUNICODE_STRING RegistryPath
    7.     )
    8. {  
    9.     unsigned char   dev_err;
    10.     unsigned char   ptr_esi[] = "\x1b\x00\x00\x00\x02\x00\x00\x00\x00\x00\x00\x00\x00\x00";
    11.  
    12.     dev_err =   0;
    13.  
    14.  
    15.     __asm   cli
    16.  
    17. //PACKET
    18.     __asm
    19.     {
    20.         mov dx, 1f7h
    21.     wait_01:
    22.         in  al, dx
    23.         test    al, 10000000b
    24.         jnz wait_01
    25.     }
    26.  
    27.     /*__asm mov dx, 3f6h
    28.     __asm   mov al, 00000010b
    29.     __asm   out dx, al*/
    30.  
    31.     __asm   mov dx, 1f6h
    32.     __asm   mov al, 0b0h    ;00010000b
    33.     __asm   out dx, al
    34.  
    35.     __asm
    36.     {
    37.         mov dx, 1f4h
    38.         mov al, 0h
    39.         out dx, al 
    40.        
    41.         mov dx, 1f5h
    42.         mov al, 0h
    43.         out dx, al
    44.  
    45.         mov dx, 1f1h
    46.         mov al, 0h
    47.         out dx, al
    48.     }
    49.  
    50.     __asm   mov dx, 1f7h
    51.     __asm   mov al, 0a0h
    52.     __asm   out dx, al
    53.  
    54.     __asm
    55.     {
    56.         mov dx, 1f7h
    57.     wait_02:
    58.         in  al, dx
    59.         test    al, 10000000b
    60.         jnz wait_02
    61.     }  
    62.    
    63.     __asm
    64.     {
    65.         mov dx, 1f0h
    66.         lea esi,    ptr_esi
    67.         mov ecx,    6h
    68.         repz    outsw
    69.     }
    70.  
    71.     __asm
    72.     {
    73.         mov dx, 1f7h
    74.     wait_03:
    75.         in  al, dx
    76.         test    al, 10000000b
    77.         jnz wait_03
    78.     }  
    79.  
    80.     __asm   mov dx, 1f1h
    81.     __asm   in  al, dx
    82.     __asm   mov dev_err,    al
    83. //
    84.     __asm   sti
    85.  
    86.    
    87.     DbgPrint("dev_err: 0x%x", dev_err);
    88.  
    89.  
    90.     return  /*STATUS_SUCCESS;*/STATUS_INVALID_PARAMETER ;
    91. }
    p.s. Тема закрыта :)