Уведомление драйвера из usermode.

Тема в разделе "WASM.NT.KERNEL", создана пользователем MuForum, 10 июл 2018.

Метки:
  1. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Здравствуйте.
    Прошу подсказки, в какую сторону копать.

    # Задача: При определенных условиях, мне необходимо из приложения(Usermode) уведомить свой драйвер, чтобы драйвер сделал необходимые изменения в конфигурации.
    - Задача односторонняя, мне нужно уведомлять только драйвер из usermode. (Обратная операция мне не нужна)
    - Через окна и сокеты не очень хочется делать....

    # Вопрос: Как можно уведомить драйвер из приложения в usermode?


    P.S. -> Последний раз работал с драйверами в 2011 году =))
    - Прошу не кидать камнями...
     
    Последнее редактирование: 10 июл 2018
  2. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    861
    DeviceIoControl?
     
  3. MuForum

    MuForum Member

    Публикаций:
    0
    Регистрация:
    11 мар 2007
    Сообщения:
    109
    Здравствуйте.
    Вот моя реализация, делал по примерам из интернета...
    Если у кого-то будут какие-то замечания или советы, буду рад услышать.
    Заранее спасибо.

    # KernelMode:
    Код (C++):
    1. #define g_DEF_DriverName L"\\Device\\MyExampleName"
    2. #define g_DEG_DosDeviceName L"\\DosDevices\\MyExampleName"
    3. #define IOCTL_MY_NOTIFY \
    4. CTL_CODE(0x00008000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
    5.  
    6. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
    7. {
    8. NTSTATUS ntRes = 0;
    9. UNICODE_STRING usDriverName;
    10. UNICODE_STRING usDosDeviceName;
    11. // ----
    12. RtlInitUnicodeString( & usDriverName, g_DEF_DriverName);
    13. RtlInitUnicodeString( & usDosDeviceName, g_DEG_DosDeviceName);
    14. // ----
    15. ...
    16. // ----
    17. ntRes = IoCreateDevice(DriverObject, 0, & usDriverName,
    18. 0x00008000, FILE_DEVICE_SECURE_OPEN, FALSE, & g_pDO_Sync);
    19. // ----
    20. for(uiIndex = 0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++)
    21. {
    22. DriverObject->MajorFunction[uiIndex] = IO_UnSupportedFunction;
    23. }
    24. // ----
    25. DriverObject->MajorFunction[IRP_MJ_CREATE] = IO_Create;
    26. DriverObject->MajorFunction[IRP_MJ_CLOSE] = IO_Close;
    27. DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IO_IoControl;
    28. DriverObject->MajorFunction[IRP_MJ_READ] = IO_Read;
    29. DriverObject->MajorFunction[IRP_MJ_WRITE] = IO_Write;
    30. // ----
    31. g_pDO_Sync->Flags |= DO_DIRECT_IO;
    32. // ----
    33. ntRes = IoCreateSymbolicLink( & usDosDeviceName, & usDriverName);
    34. ...
    35. }
    36.  
    37. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
    38. {
    39. NTSTATUS ntRes = 0;
    40. UNICODE_STRING usDosDeviceName;
    41. // ----
    42. RtlInitUnicodeString( & usDosDeviceName, g_DEG_DosDeviceName);
    43. // ----
    44. ntRes = IoDeleteSymbolicLink( & usDosDeviceName);
    45. ...
    46. // ----
    47. IoDeleteDevice(DriverObject->DeviceObject);
    48. }
    49.  
    50. NTSTATUS IO_UnSupportedFunction(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    51. {
    52. return STATUS_NOT_SUPPORTED;
    53. }
    54.  
    55. NTSTATUS IO_Create(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    56. {
    57. return STATUS_SUCCESS;
    58. }
    59.  
    60. NTSTATUS IO_Close(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    61. {
    62. return STATUS_SUCCESS;
    63. }
    64.  
    65. NTSTATUS IO_Read(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    66. {
    67. return STATUS_SUCCESS;
    68. }
    69.  
    70. NTSTATUS IO_Write(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    71. {
    72. return STATUS_SUCCESS;
    73. }
    74.  
    75. NTSTATUS IO_IoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp)
    76. {
    77. PIO_STACK_LOCATION  irpStack;
    78. ULONG ControlCode = 0;
    79. ULONG InputLength  = 0;
    80. ULONG OutputLength = 0;
    81. PVOID pBuffer = NULL;
    82. ULONG dwUserCommand = 0;
    83. // ----
    84. irpStack = IoGetCurrentIrpStackLocation(Irp);
    85. ControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
    86. InputLength  = irpStack->Parameters.DeviceIoControl.InputBufferLength;
    87. OutputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
    88. pBuffer = Irp->UserBuffer;
    89. // ----
    90. if (ControlCode == IOCTL_MY_NOTIFY)
    91. {
    92. if ((pBuffer != NULL) && (OutputLength > 0))
    93. {
    94. //RtlCopyMemory( & pDataFromUserMode, pBuffer, OutputLength);
    95. }
    96. }
    97. // ----
    98. Irp->IoStatus.Status      = STATUS_SUCCESS;
    99. Irp->IoStatus.Information = InputLength;
    100. IoCompleteRequest(Irp, IO_NO_INCREMENT);
    101. // ----
    102. return STATUS_SUCCESS;
    103. }
    # UserMode:
    Код (C++):
    1. #define g_DEF_UM_DriverName L"\\\\.\\MyExampleName"
    2. int _tmain(int argc, _TCHAR* argv[])
    3. {
    4. HANDLE hDevice = INVALID_HANDLE_VALUE;
    5. BOOL bResult   = FALSE;
    6. DWORD dwLastError = 0;
    7. // ----
    8. hDevice = CreateFileW(g_DEF_UM_DriverName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL);
    9. // ----
    10. if (hDevice == INVALID_HANDLE_VALUE)
    11. {
    12. dwLastError = GetLastError();
    13. // ----
    14. return (FALSE);
    15. }
    16. else
    17. {
    18. DWORD dwValue = 0x302;
    19. DWORD dwBytesReturned = 0;
    20. // ----
    21. bResult = DeviceIoControl(hDevice, IOCTL_MY_NOTIFY,
    22. NULL, 0,
    23. & dwValue, sizeof(dwValue),
    24. & dwBytesReturned, NULL);
    25. // ----
    26. CloseHandle(hDevice);
    27. }
    28. // ----
    29. return 0;
    30. }