Написал, на мой взгляд простейший WDM-драйвер. Компилится, но не работает. Подскажите, почему. Код драйвера: Код (Text): #include <wdm.h> NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UniRegistryPath); NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT, IN PIRP); VOID UnloadRoutine(IN PDRIVER_OBJECT); NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT, IN PIRP); NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP); NTSTATUS CloseFile_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP ); NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT, IN PIRP ); NTSTATUS MyAddDeviceRoutine(IN PDRIVER_OBJECT, IN PDEVICE_OBJECT); #ifdef PAGE_CODE #ifdef ALLOC_PRAGMA #pragma alloc_text(INIT, DriverEntry) #pragma alloc_text(PAGE, UnloadRoutine) #endif #endif NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING UniRegistryPath ) { DbgPrint("My SUPER-Driver: Im in DriverEntry: \n"); DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControlRoutine; DriverObject->MajorFunction[IRP_MJ_POWER] = Def_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_PNP] = Def_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateFile_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_CLOSE] = CloseFile_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = Def_IRPprocessing; DriverObject->MajorFunction[IRP_MJ_READ] = DriverObject->MajorFunction[IRP_MJ_WRITE] = ReadWrite_IRPhandler; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = Def_IRPprocessing; DriverObject->DriverUnload = UnloadRoutine; DriverObject->DriverExtension->AddDevice = (PDRIVER_ADD_DEVICE) MyAddDeviceRoutine; return STATUS_SUCCESS; } NTSTATUS MyAddDeviceRoutine(IN PDRIVER_OBJECT MyDriverObject, IN PDEVICE_OBJECT pPDO) { DbgPrint("My SUPER-Driver: Im in MyAddDeviceRoutine: \n"); return STATUS_SUCCESS; } NTSTATUS DeviceControlRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DbgPrint("My SUPER-Driver: Im in DeviceControlRoutine: \n"); Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return Irp->IoStatus.Status; } VOID UnloadRoutine(IN PDRIVER_OBJECT DriverObject) { DbgPrint("My SUPER-Driver: Im in UnloadRoutine: \n"); return; } NTSTATUS ReadWrite_IRPhandler(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DbgPrint("My SUPER-Driver: Im in ReadWrite_IRPhandler: \n"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS CreateFile_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DbgPrint("My SUPER-Driver: Im in CreateFile_IRPprocessing: \n"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } NTSTATUS CloseFile_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { DbgPrint("My SUPER-Driver: Im in CloseFile_IRPprocessing: \n"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest(Irp, IO_DISK_INCREMENT); return STATUS_SUCCESS; } NTSTATUS Def_IRPprocessing(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp) { PIO_STACK_LOCATION io_stack; io_stack = IoGetCurrentIrpStackLocation(Irp); DbgPrint("My SUPER-Driver: Im in Def_IRPprocessing: "); DbgPrint("%p\n", io_stack->Parameters.DeviceIoControl.IoControlCode); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = FILE_OPENED; IoCompleteRequest(Irp, IO_NO_INCREMENT); return STATUS_SUCCESS; } Код ничего не делает, кроме как в дебагере пишет в какой он функции. Также взял из книжки Солдатова стартер для драйвера: Код (Text): #define DRIVERNAME _T("TestMe") #define DRIVERBINARY _T("C:\\test\\TestMe.sys") BOOL InstallDriver( SC_HANDLE scm, LPCTSTR DriverName, LPCTSTR driverExec) { SC_HANDLE Service = CreateService( scm, DriverName, DriverName, SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_AUTO_START, SERVICE_ERROR_IGNORE, driverExec, NULL, NULL, NULL, NULL, NULL); if(Service == NULL) { DWORD err = GetLastError(); if(err == ERROR_SERVICE_EXISTS) { printf("Driver already installed\n"); } else { printf("ERR: Can't create service. Error Number = %d\n", err); } return FALSE; } CloseServiceHandle(Service); return TRUE; } BOOL RemoveDriver(SC_HANDLE scm, LPCTSTR DriverName) { SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS); if( Service == NULL) return FALSE; BOOL ret = DeleteService(Service); if(!ret) printf("Error when Remove Driver\n"); CloseServiceHandle(Service); return ret; } BOOL StartDriver(SC_HANDLE scm, LPCTSTR DriverName) { SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS); if( Service == NULL) return FALSE; BOOL ret = StartService(Service, 0, NULL); if(!ret) { DWORD err = GetLastError(); if(err == ERROR_SERVICE_ALREADY_RUNNING) ret = TRUE; else printf("Error when starting Driver. Error = %d\n", err); } CloseServiceHandle(Service); return ret; } BOOL StopDriver(SC_HANDLE scm, LPCTSTR DriverName) { SC_HANDLE Service = OpenService( scm, DriverName, SERVICE_ALL_ACCESS); if( Service == NULL) return FALSE; SERVICE_STATUS serviceStatus; BOOL ret = ControlService(Service, SERVICE_CONTROL_STOP, &serviceStatus); if(!ret) { DWORD err = GetLastError(); printf("Error when starting Driver. Error = %d\n", err); } CloseServiceHandle(Service); return ret; } int _tmain(int argc, _TCHAR* argv[]) { BOOL res; SC_HANDLE scm; if(argc != 2) { printf("Error!! use 2 parameter!!!\n"); return -1; } scm = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if( scm == NULL ) { printf("Error when initialize SCManagar\n"); return -1; } if( !strcmp((const char *)argv[1], "i") ) { printf("Trying install Driver...\n"); res = InstallDriver(scm, DRIVERNAME, DRIVERBINARY); if( !res ) printf("Cannot install Driver\n"); printf("Operation install complete successfull!\n"); } if( !strcmp((const char *)argv[1], "s") ) { printf("Trying start Driver...\n"); res = StartDriver(scm, DRIVERNAME); if( !res ) printf("Cannot start service\n"); printf("Operation start complete successfull!\n"); } if( !strcmp((const char *)argv[1], "b") ) { printf("Trying stop operation...\n"); res = StopDriver(scm, DRIVERNAME); if( !res ) printf("Cannot stop service\n"); printf("Operation stop complete successfull!\n"); } if( !strcmp((const char *)argv[1], "r") ) { printf("Trying remove operation...\n"); res = RemoveDriver(scm, DRIVERNAME); if( !res ) printf("Cannot remove service\n"); printf("Operation remove complete successfull!\n"); } return 0; } положил все аккуратненько в папочку "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:
WDM-драйвер должен быть зарегистрирован для какого-либо класса, другими словами, PnP Manager должен о нём знать каким-то образом, иначе такой драйвер не является WDM (пассивные), такие драйвера называются legacy (активные). Чуть более подробно здесь.
wdm драйвером и не пахнет. Либо, для самого просто драйвера(не wdm) тебе надо корректно написать driverentry, а именно: определить все таки объект устройство и все в этом духе. Либо почитать, что же такое Wdm драйвер и какие для него требования.И что такое вообще стек устройств, etc Намек: В любом случае у тебя функции деспетчеризации получают указатель на объект устройство.Где в приведенном тобой примере создание этого самого объекта устройства ? Walter Oney Солдатов