Простейший WDM драйвер

Тема в разделе "WASM.NT.KERNEL", создана пользователем ov4inka, 17 мар 2009.

  1. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Написал, на мой взгляд простейший WDM-драйвер. Компилится, но не работает. Подскажите, почему.
    Код драйвера:
    Код (Text):
    1. #include <wdm.h>
    2.  
    3. NTSTATUS DriverEntry( IN PDRIVER_OBJECT  DriverObject,  IN PUNICODE_STRING UniRegistryPath);
    4. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT, IN PIRP);
    5. VOID UnloadRoutine(IN PDRIVER_OBJECT);
    6. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT, IN PIRP);
    7. NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP);
    8. NTSTATUS CloseFile_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP );
    9. NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP );
    10. NTSTATUS MyAddDeviceRoutine(IN PDRIVER_OBJECT, IN PDEVICE_OBJECT);
    11.  
    12. #ifdef PAGE_CODE
    13. #ifdef ALLOC_PRAGMA
    14. #pragma alloc_text(INIT, DriverEntry)
    15. #pragma alloc_text(PAGE, UnloadRoutine)
    16. #endif
    17. #endif
    18.  
    19.  
    20. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,
    21.                      IN PUNICODE_STRING UniRegistryPath )
    22. {
    23.     DbgPrint("My SUPER-Driver: Im in DriverEntry: \n");
    24.    
    25.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlRoutine;
    26.     DriverObject->MajorFunction[IRP_MJ_POWER]          = Def_IRPprocessing;
    27.     DriverObject->MajorFunction[IRP_MJ_PNP]            = Def_IRPprocessing;
    28.     DriverObject->MajorFunction[IRP_MJ_CREATE]         = CreateFile_IRPprocessing;
    29.     DriverObject->MajorFunction[IRP_MJ_CLOSE]          = CloseFile_IRPprocessing;
    30.     DriverObject->MajorFunction[IRP_MJ_CLEANUP]        = Def_IRPprocessing;
    31.     DriverObject->MajorFunction[IRP_MJ_READ]           =
    32.     DriverObject->MajorFunction[IRP_MJ_WRITE]          = ReadWrite_IRPhandler;
    33.     DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = Def_IRPprocessing;
    34.  
    35.     DriverObject->DriverUnload = UnloadRoutine;
    36.     DriverObject->DriverExtension->AddDevice = (PDRIVER_ADD_DEVICE) MyAddDeviceRoutine;
    37.     return STATUS_SUCCESS;
    38.  
    39. }
    40.  
    41. NTSTATUS MyAddDeviceRoutine(IN PDRIVER_OBJECT MyDriverObject, IN PDEVICE_OBJECT pPDO)
    42. {
    43.     DbgPrint("My SUPER-Driver: Im in MyAddDeviceRoutine: \n");
    44.     return STATUS_SUCCESS;
    45. }
    46.  
    47. NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT DeviceObject,
    48.                               IN PIRP Irp)
    49. {
    50.     DbgPrint("My SUPER-Driver: Im in DeviceControlRoutine: \n");
    51.     Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
    52.     Irp->IoStatus.Information = 0;
    53.     IoCompleteRequest( Irp, IO_NO_INCREMENT );
    54.     return Irp->IoStatus.Status;
    55. }
    56.  
    57. VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject)
    58. {
    59.     DbgPrint("My SUPER-Driver: Im in UnloadRoutine: \n");
    60.  
    61.     return;
    62. }
    63.  
    64. NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    65. {
    66.     DbgPrint("My SUPER-Driver: Im in ReadWrite_IRPhandler: \n");
    67.     Irp->IoStatus.Status = STATUS_SUCCESS;
    68.     Irp->IoStatus.Information = 0;
    69.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    70.     return STATUS_SUCCESS;
    71. }
    72.  
    73. NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    74. {
    75.     DbgPrint("My SUPER-Driver: Im in CreateFile_IRPprocessing: \n");
    76.     Irp->IoStatus.Status = STATUS_SUCCESS;
    77.     Irp->IoStatus.Information = FILE_OPENED;
    78.  
    79.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    80.  
    81.     return STATUS_SUCCESS;
    82. }
    83.  
    84. NTSTATUS CloseFile_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    85. {
    86.     DbgPrint("My SUPER-Driver: Im in CloseFile_IRPprocessing: \n");
    87.     Irp->IoStatus.Status = STATUS_SUCCESS;
    88.     Irp->IoStatus.Information = 0;
    89.  
    90.     IoCompleteRequest(Irp, IO_DISK_INCREMENT);
    91.     return STATUS_SUCCESS;
    92. }
    93.  
    94. NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
    95. {
    96.     PIO_STACK_LOCATION              io_stack;
    97.  
    98.     io_stack = IoGetCurrentIrpStackLocation(Irp);
    99.     DbgPrint("My SUPER-Driver: Im in Def_IRPprocessing: ");
    100.     DbgPrint("%p\n", io_stack->Parameters.DeviceIoControl.IoControlCode);
    101.     Irp->IoStatus.Status = STATUS_SUCCESS;
    102.     Irp->IoStatus.Information = FILE_OPENED;
    103.  
    104.     IoCompleteRequest(Irp, IO_NO_INCREMENT);
    105.     return STATUS_SUCCESS; 
    106. }
    Код ничего не делает, кроме как в дебагере пишет в какой он функции. Также взял из книжки Солдатова стартер для драйвера:

    Код (Text):
    1. #define DRIVERNAME _T("TestMe")
    2. #define DRIVERBINARY _T("C:\\test\\TestMe.sys")
    3.  
    4. BOOL InstallDriver( SC_HANDLE scm,
    5.                    LPCTSTR DriverName,
    6.                    LPCTSTR driverExec)
    7. {
    8.     SC_HANDLE Service = CreateService( scm, DriverName, DriverName, SERVICE_ALL_ACCESS,
    9.         SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, driverExec,
    10.         NULL, NULL, NULL, NULL, NULL);
    11.     if(Service == NULL)
    12.     {
    13.         DWORD err = GetLastError();
    14.         if(err == ERROR_SERVICE_EXISTS)
    15.         {
    16.             printf("Driver already installed\n");
    17.         } else {
    18.             printf("ERR: Can't create service. Error Number = %d\n", err);
    19.         }
    20.         return FALSE;
    21.     }
    22.     CloseServiceHandle(Service);
    23.     return TRUE;
    24. }
    25.  
    26. BOOL RemoveDriver(SC_HANDLE scm, LPCTSTR DriverName)
    27. {
    28.     SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS);
    29.     if( Service == NULL)
    30.         return FALSE;
    31.     BOOL ret = DeleteService(Service);
    32.     if(!ret)
    33.         printf("Error when Remove Driver\n");
    34.     CloseServiceHandle(Service);
    35.     return ret;
    36. }
    37.  
    38. BOOL StartDriver(SC_HANDLE scm, LPCTSTR DriverName)
    39. {
    40.     SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS);
    41.     if( Service == NULL)
    42.         return FALSE;
    43.     BOOL ret = StartService(Service, 0, NULL);
    44.     if(!ret)
    45.     {
    46.         DWORD err = GetLastError();
    47.         if(err == ERROR_SERVICE_ALREADY_RUNNING)
    48.             ret = TRUE;
    49.         else
    50.             printf("Error when starting Driver. Error = %d\n", err);
    51.     }
    52.     CloseServiceHandle(Service);
    53.     return ret;
    54. }
    55.  
    56. BOOL StopDriver(SC_HANDLE scm, LPCTSTR DriverName)
    57. {
    58.     SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS);
    59.     if( Service == NULL)
    60.         return FALSE;
    61.     SERVICE_STATUS serviceStatus;
    62.     BOOL ret = ControlService(Service, SERVICE_CONTROL_STOP, &serviceStatus);
    63.     if(!ret)
    64.     {
    65.         DWORD err = GetLastError();
    66.         printf("Error when starting Driver. Error = %d\n", err);
    67.     }
    68.     CloseServiceHandle(Service);
    69.     return ret;
    70. }
    71.  
    72.  
    73. int _tmain(int argc, _TCHAR* argv[])
    74. {
    75.     BOOL res;
    76.     SC_HANDLE scm;
    77.  
    78.     if(argc != 2)
    79.     {
    80.         printf("Error!! use 2 parameter!!!\n");
    81.         return -1;
    82.     }
    83.  
    84.     scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
    85.     if( scm == NULL )
    86.     {
    87.         printf("Error when initialize SCManagar\n");
    88.         return -1;
    89.     }
    90.  
    91.     if( !strcmp((const char *)argv[1], "i") )
    92.     {
    93.         printf("Trying install Driver...\n");
    94.         res = InstallDriver(scm, DRIVERNAME, DRIVERBINARY);
    95.         if( !res )
    96.             printf("Cannot install Driver\n");
    97.         printf("Operation install complete successfull!\n");
    98.     }
    99.    
    100.  
    101.     if( !strcmp((const char *)argv[1], "s") )
    102.     {
    103.         printf("Trying start Driver...\n");
    104.         res = StartDriver(scm, DRIVERNAME);
    105.         if( !res )
    106.             printf("Cannot start service\n");
    107.         printf("Operation start complete successfull!\n");
    108.     }
    109.    
    110.     if( !strcmp((const char *)argv[1], "b") )
    111.     {
    112.         printf("Trying stop operation...\n");
    113.         res = StopDriver(scm, DRIVERNAME);
    114.         if( !res )
    115.             printf("Cannot stop service\n");
    116.         printf("Operation stop complete successfull!\n");
    117.     }
    118.  
    119.     if( !strcmp((const char *)argv[1], "r") )
    120.     {
    121.         printf("Trying remove operation...\n");
    122.         res = RemoveDriver(scm, DRIVERNAME);
    123.         if( !res )
    124.             printf("Cannot remove service\n");
    125.         printf("Operation remove complete successfull!\n");
    126.     }
    127.  
    128.     return 0;
    129. }
    положил все аккуратненько в папочку "C:\test". Пытаюсь запустить. Итог:
    c:\test>Install.exe i
    Trying install Driver...
    Operation install complete successfull!

    c:\test>Install.exe s
    Trying start Driver...
    Error when starting Driver. Error = 1058
    Cannot start service
    Operation start complete successfull!

    В дебагере:
    SUPER-Driver: Im in DriverEntry:
    My SUPER-Driver: Im in UnloadRoutine:
     
  2. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    WDM-драйвер должен быть зарегистрирован для какого-либо класса, другими словами, PnP Manager должен о нём знать каким-то образом, иначе такой драйвер не является WDM (пассивные), такие драйвера называются legacy (активные). Чуть более подробно здесь.
     
  3. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    Хорошо, но что тогда минимального надо добавить в приведенный выше код, чтобы заработало?
     
  4. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    В код - ничего.
     
  5. ov4inka

    ov4inka New Member

    Публикаций:
    0
    Регистрация:
    1 дек 2008
    Сообщения:
    37
    тогда куда?
     
  6. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Читаем Уолтера Они и не мешаем другим людям работать.
     
  7. smileyoufake

    smileyoufake New Member

    Публикаций:
    0
    Регистрация:
    14 янв 2009
    Сообщения:
    16
    wdm драйвером и не пахнет.
    Либо, для самого просто драйвера(не wdm) тебе надо корректно написать driverentry, а именно: определить все таки объект устройство и все в этом духе.
    Либо почитать, что же такое Wdm драйвер и какие для него требования.И что такое вообще стек устройств, etc

    Намек:
    В любом случае у тебя функции деспетчеризации получают указатель на объект устройство.Где в приведенном тобой примере создание этого самого объекта устройства ?:)

    Walter Oney
    Солдатов