DriverUnload в x64 драйверах

Тема в разделе "WASM.X64", создана пользователем rain, 30 июл 2007.

  1. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    Опять я со своими х64 баранами.
    Проблема вот в чём. Процедуры диспатчинга(IRP_MJ_CREATE\CLOSE\DEVICE_CONTROL) вызываются нормально как и следуюет, а вот функция определённая в DriverObject-> DriverUnload почему-то не вызывается при вызове из юзера DeleteService, вместо этого DeleteService рапотрует ERROR_SERVICE_MARKED_FOR_DELETE и драйвер так и остаётся болтаться до перезагрузки (очень уморило после каждой пересборки перезагружать комп да и не правильно это)
    Причём тут х64 спросите вы? Дело в том что один и тотже сорец компилится под старую добрую х86 w2k и в нёй работает всё как пологается а вот в здесь почему-то появляются фокусы.
    Сначала как всегда подумал что мой косяк, пересмотрел сорец в доль и поперёк безрезультатно, потом собрал таким же макаром сэмпл из ДДК таже самая история в в2к всё работает а здесь не выгружается :dntknw:
    Говорите первое что пришло на ум, потому как мучаюсь я уже долго и с х64 платформой работают здесь значительно меньше людей чем с х86

    спасибо любимому форуму :)

    PS может уже пора бы подумать о ветке WASM.WIN64 ?
     
  2. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.578
    Адрес:
    Russia
    rain
    Если вы говорите про WinXP x64. То я там такого не наблюдал . Возможно это как ты связано с тем как вы загружаете драйвер.
    С помощью кмдКита , мой драйвер нормально и загружается и выгружается.
     
  3. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    TermoSINteZ
    да xp sp1, странно можно код | бинарничек?
     
  4. rain

    rain New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2006
    Сообщения:
    976
    всмысле код юзермода или код самого драйвера?
    в прочем приведу и то и то:
    драйвер(простите что на С):
    Код (Text):
    1. #include <ntddk.h>
    2. #define _DBG_
    3.  
    4. #ifdef _DBG_
    5. #define KDPRINT(_x_) \
    6.                 DbgPrint("  driver2.SYS: ");\
    7.                 DbgPrint(_x_);
    8. #else
    9. #define KDPRINT(_x_)
    10. #endif
    11.  
    12.  
    13. #define NT_DEVICE_NAME L"\\Device\\MyFirstDevice"
    14. #define DOS_DEVICE_NAME L"\\DosDevices\\MyFirstLink"
    15.  
    16.  
    17. NTSTATUS
    18. CreateClose(
    19.     IN PDEVICE_OBJECT DeviceObject,
    20.     IN PIRP Irp
    21.     )
    22. {
    23.     KDPRINT("create\\close")
    24.     Irp->IoStatus.Status = STATUS_SUCCESS;
    25.     Irp->IoStatus.Information = 0;
    26.    
    27.     IoCompleteRequest( Irp, IO_NO_INCREMENT );
    28.    
    29.     return STATUS_SUCCESS;
    30. }
    31.  
    32. VOID
    33. UnloadDriver(
    34.     IN PDRIVER_OBJECT DriverObject
    35.     )
    36.  
    37.  
    38. {
    39.    
    40.     PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject;
    41.     UNICODE_STRING uniWin32NameString;
    42.  
    43.     KDPRINT("unload driver");
    44.     RtlInitUnicodeString( &uniWin32NameString, DOS_DEVICE_NAME );
    45.  
    46.  
    47.     IoDeleteSymbolicLink( &uniWin32NameString );
    48.    
    49.     if ( deviceObject != NULL )
    50.     {
    51.         IoDeleteDevice( deviceObject );
    52.     }
    53.  
    54. }
    55.  
    56.  
    57. NTSTATUS
    58. DeviceControl(
    59.     IN PDEVICE_OBJECT DeviceObject,
    60.     IN PIRP Irp
    61.     )
    62. {
    63.  
    64.     KDPRINT("device control");
    65.  
    66.  
    67.  
    68.  
    69.     Irp->IoStatus.Status = STATUS_SUCCESS;
    70.     Irp->IoStatus.Information = 0;
    71.    
    72.     IoCompleteRequest( Irp, IO_NO_INCREMENT );
    73.    
    74.     return STATUS_SUCCESS;
    75. }
    76.  
    77.  
    78.  
    79. NTSTATUS
    80.   DriverEntry(
    81.     IN PDRIVER_OBJECT  DriverObject,
    82.     IN PUNICODE_STRING  RegistryPath
    83.     )
    84. {
    85.  
    86.    
    87.     NTSTATUS        ntStatus;
    88.     UNICODE_STRING  ntUnicodeString;  
    89.     UNICODE_STRING  ntWin32NameString;  
    90.     PDEVICE_OBJECT  deviceObject = NULL;  
    91.  
    92.     KDPRINT("entry starts");
    93.     RtlInitUnicodeString( &ntUnicodeString, NT_DEVICE_NAME );
    94.    
    95.     ntStatus = IoCreateDevice(
    96.         DriverObject,                   // Our Driver Object
    97.         0,                              // We don't use a device extension
    98.         &ntUnicodeString,               // Device name "\Device\SIOCTL"
    99.         FILE_DEVICE_UNKNOWN,            // Device type
    100.         FILE_DEVICE_SECURE_OPEN,     // Device characteristics
    101.         FALSE,                          // Not an exclusive device
    102.         &deviceObject );                // Returned ptr to Device Object
    103.  
    104.     if ( !NT_SUCCESS( ntStatus ) )
    105.     {
    106.         KDPRINT(("Couldn't create the device object\n"));
    107.         return ntStatus;
    108.     }
    109.    
    110.     //
    111.     // Initialize the driver object with this driver's entry points.
    112.     //
    113.  
    114.     DriverObject->MajorFunction[IRP_MJ_CREATE] = CreateClose;
    115.     DriverObject->MajorFunction[IRP_MJ_CLOSE] = CreateClose;
    116.     DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControl;
    117.     DriverObject->DriverUnload = UnloadDriver;
    118.    
    119.     //
    120.     // Initialize a Unicode String containing the Win32 name
    121.     // for our device.
    122.     //
    123.  
    124.     RtlInitUnicodeString( &ntWin32NameString, DOS_DEVICE_NAME );
    125.  
    126.     //
    127.     // Create a symbolic link between our device name  and the Win32 name
    128.     //
    129.  
    130.     ntStatus = IoCreateSymbolicLink(
    131.                         &ntWin32NameString, &ntUnicodeString );
    132.  
    133.     if ( !NT_SUCCESS( ntStatus ) )
    134.     {
    135.         //
    136.         // Delete everything that this routine has allocated.
    137.         //
    138.         KDPRINT(("Couldn't create symbolic link\n"));
    139.         IoDeleteDevice( deviceObject );
    140.     }
    141.  
    142.  
    143.     return ntStatus;
    144.  
    145. }
    код юзермода :
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap: none
    4.  
    5. include windows.inc
    6.  
    7. include kernel32.inc
    8. includelib kernel32.lib
    9.  
    10. include advapi32.inc
    11. includelib advapi32.lib
    12.  
    13.  
    14. .code
    15. start proc
    16. LOCAL pszFile: DWORD
    17. LOCAL szPath[MAX_PATH]: DWORD
    18.    
    19.     invoke GetCommandLine
    20.     mov edi, eax
    21.     mov ecx, MAX_PATH
    22.        
    23.     .if byte ptr [edi] == '"'
    24.         mov al, '"'
    25.     .else
    26.         mov al, ' '
    27.     .endif
    28.  
    29.     inc edi
    30.     repne scasb
    31.  
    32.    
    33.     mov al, ' '
    34.     repe scasb
    35.     dec edi
    36.    
    37.     .if  byte ptr [edi] == 0
    38.         ret
    39.     .endif  
    40.        
    41.     invoke GetFullPathName, edi, MAX_PATH, addr szPath, addr pszFile
    42.     .if !eax
    43.         ret
    44.     .endif
    45.  
    46.     invoke OpenSCManager, 0, 0, SC_MANAGER_CREATE_SERVICE
    47.     .if !eax
    48.         ret
    49.     .endif
    50.     mov esi, eax
    51.    
    52.     invoke CreateService, esi, pszFile, pszFile, SERVICE_START + DELETE, SERVICE_KERNEL_DRIVER,\
    53.          SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, addr szPath, 0,0,0,0,0
    54.     .if !eax
    55.         ret
    56.     .endif
    57.     mov edi, eax
    58.        
    59.     invoke StartService, edi, 0, 0
    60.    
    61.     invoke DeleteService, edi
    62.     invoke CloseServiceHandle, edi
    63.     invoke CloseServiceHandle, esi  
    64.    
    65.     ret
    66. start endp
    67. end start