Опять я со своими х64 баранами. Проблема вот в чём. Процедуры диспатчинга(IRP_MJ_CREATE\CLOSE\DEVICE_CONTROL) вызываются нормально как и следуюет, а вот функция определённая в DriverObject-> DriverUnload почему-то не вызывается при вызове из юзера DeleteService, вместо этого DeleteService рапотрует ERROR_SERVICE_MARKED_FOR_DELETE и драйвер так и остаётся болтаться до перезагрузки (очень уморило после каждой пересборки перезагружать комп да и не правильно это) Причём тут х64 спросите вы? Дело в том что один и тотже сорец компилится под старую добрую х86 w2k и в нёй работает всё как пологается а вот в здесь почему-то появляются фокусы. Сначала как всегда подумал что мой косяк, пересмотрел сорец в доль и поперёк безрезультатно, потом собрал таким же макаром сэмпл из ДДК таже самая история в в2к всё работает а здесь не выгружается Говорите первое что пришло на ум, потому как мучаюсь я уже долго и с х64 платформой работают здесь значительно меньше людей чем с х86 спасибо любимому форуму PS может уже пора бы подумать о ветке WASM.WIN64 ?
rain Если вы говорите про WinXP x64. То я там такого не наблюдал . Возможно это как ты связано с тем как вы загружаете драйвер. С помощью кмдКита , мой драйвер нормально и загружается и выгружается.
всмысле код юзермода или код самого драйвера? в прочем приведу и то и то: драйвер(простите что на С): Код (Text): #include <ntddk.h> #define _DBG_ #ifdef _DBG_ #define KDPRINT(_x_) \ DbgPrint(" driver2.SYS: ");\ DbgPrint(_x_); #else #define KDPRINT(_x_) #endif #define NT_DEVICE_NAME L"\\Device\\MyFirstDevice" #define DOS_DEVICE_NAME L"\\DosDevices\\MyFirstLink" NTSTATUS CreateClose( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { KDPRINT("create\\close") Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } VOID UnloadDriver( IN PDRIVER_OBJECT DriverObject ) { PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject; UNICODE_STRING uniWin32NameString; KDPRINT("unload driver"); RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME ); IoDeleteSymbolicLink( &uniWin32NameString ); if ( deviceObject != NULL ) { IoDeleteDevice( deviceObject ); } } NTSTATUS DeviceControl( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) { KDPRINT("device control"); Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = 0; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return STATUS_SUCCESS; } NTSTATUS DriverEntry( IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath ) { NTSTATUS ntStatus; UNICODE_STRING ntUnicodeString; UNICODE_STRING ntWin32NameString; PDEVICE_OBJECT deviceObject = NULL; KDPRINT("entry starts"); RtlInitUnicodeString( &ntUnicodeString, NT_DEVICE_NAME ); ntStatus = IoCreateDevice( DriverObject, // Our Driver Object 0, // We don't use a device extension &ntUnicodeString, // Device name "\Device\SIOCTL" FILE_DEVICE_UNKNOWN, // Device type FILE_DEVICE_SECURE_OPEN, // Device characteristics FALSE, // Not an exclusive device &deviceObject ); // Returned ptr to Device Object if ( !NT_SUCCESS( ntStatus ) ) { KDPRINT(("Couldn't create the device object\n")); return ntStatus; } // // Initialize the driver object with this driver's entry points. // DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateClose; DriverObject->MajorFunction[IRP_MJ_CLOSE] = CreateClose; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControl; DriverObject->DriverUnload = UnloadDriver; // // Initialize a Unicode String containing the Win32 name // for our device. // RtlInitUnicodeString( &ntWin32NameString, DOS_DEVICE_NAME ); // // Create a symbolic link between our device name and the Win32 name // ntStatus = IoCreateSymbolicLink( &ntWin32NameString, &ntUnicodeString ); if ( !NT_SUCCESS( ntStatus ) ) { // // Delete everything that this routine has allocated. // KDPRINT(("Couldn't create symbolic link\n")); IoDeleteDevice( deviceObject ); } return ntStatus; } код юзермода : Код (Text): .386 .model flat, stdcall option casemap: none include windows.inc include kernel32.inc includelib kernel32.lib include advapi32.inc includelib advapi32.lib .code start proc LOCAL pszFile: DWORD LOCAL szPath[MAX_PATH]: DWORD invoke GetCommandLine mov edi, eax mov ecx, MAX_PATH .if byte ptr [edi] == '"' mov al, '"' .else mov al, ' ' .endif inc edi repne scasb mov al, ' ' repe scasb dec edi .if byte ptr [edi] == 0 ret .endif invoke GetFullPathName, edi, MAX_PATH, addr szPath, addr pszFile .if !eax ret .endif invoke OpenSCManager, 0, 0, SC_MANAGER_CREATE_SERVICE .if !eax ret .endif mov esi, eax invoke CreateService, esi, pszFile, pszFile, SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER,\ SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, addr szPath, 0,0,0,0,0 .if !eax ret .endif mov edi, eax invoke StartService, edi, 0, 0 invoke DeleteService, edi invoke CloseServiceHandle, edi invoke CloseServiceHandle, esi ret start endp end start