Здравствуйте. Прошу подсказки, в какую сторону копать. # Задача: При определенных условиях, мне необходимо из приложения(Usermode) уведомить свой драйвер, чтобы драйвер сделал необходимые изменения в конфигурации. - Задача односторонняя, мне нужно уведомлять только драйвер из usermode. (Обратная операция мне не нужна) - Через окна и сокеты не очень хочется делать.... # Вопрос: Как можно уведомить драйвер из приложения в usermode? P.S. -> Последний раз работал с драйверами в 2011 году =)) - Прошу не кидать камнями...
Здравствуйте. Вот моя реализация, делал по примерам из интернета... Если у кого-то будут какие-то замечания или советы, буду рад услышать. Заранее спасибо. # KernelMode: Код (C++): #define g_DEF_DriverName L"\\Device\\MyExampleName" #define g_DEG_DosDeviceName L"\\DosDevices\\MyExampleName" #define IOCTL_MY_NOTIFY \ CTL_CODE(0x00008000, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { NTSTATUS ntRes = 0; UNICODE_STRING usDriverName; UNICODE_STRING usDosDeviceName; // ---- RtlInitUnicodeString( & usDriverName, g_DEF_DriverName); RtlInitUnicodeString( & usDosDeviceName, g_DEG_DosDeviceName); // ---- ... // ---- ntRes = IoCreateDevice(DriverObject, 0, & usDriverName, 0x00008000, FILE_DEVICE_SECURE_OPEN, FALSE, & g_pDO_Sync); // ---- for(uiIndex = 0; uiIndex < IRP_MJ_MAXIMUM_FUNCTION; uiIndex++) { DriverObject->MajorFunction[uiIndex] = IO_UnSupportedFunction; } // ---- DriverObject->MajorFunction[IRP_MJ_CREATE] = IO_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = IO_Close; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = IO_IoControl; DriverObject->MajorFunction[IRP_MJ_READ] = IO_Read; DriverObject->MajorFunction[IRP_MJ_WRITE] = IO_Write; // ---- g_pDO_Sync->Flags |= DO_DIRECT_IO; // ---- ntRes = IoCreateSymbolicLink( & usDosDeviceName, & usDriverName); ... } VOID DriverUnload(IN PDRIVER_OBJECT DriverObject) { NTSTATUS ntRes = 0; UNICODE_STRING usDosDeviceName; // ---- RtlInitUnicodeString( & usDosDeviceName, g_DEG_DosDeviceName); // ---- ntRes = IoDeleteSymbolicLink( & usDosDeviceName); ... // ---- IoDeleteDevice(DriverObject->DeviceObject); } NTSTATUS IO_UnSupportedFunction(PDEVICE_OBJECT DeviceObject, PIRP Irp) { return STATUS_NOT_SUPPORTED; } NTSTATUS IO_Create(PDEVICE_OBJECT DeviceObject, PIRP Irp) { return STATUS_SUCCESS; } NTSTATUS IO_Close(PDEVICE_OBJECT DeviceObject, PIRP Irp) { return STATUS_SUCCESS; } NTSTATUS IO_Read(PDEVICE_OBJECT DeviceObject, PIRP Irp) { return STATUS_SUCCESS; } NTSTATUS IO_Write(PDEVICE_OBJECT DeviceObject, PIRP Irp) { return STATUS_SUCCESS; } NTSTATUS IO_IoControl(PDEVICE_OBJECT DeviceObject, PIRP Irp) { PIO_STACK_LOCATION irpStack; ULONG ControlCode = 0; ULONG InputLength = 0; ULONG OutputLength = 0; PVOID pBuffer = NULL; ULONG dwUserCommand = 0; // ---- irpStack = IoGetCurrentIrpStackLocation(Irp); ControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode; InputLength = irpStack->Parameters.DeviceIoControl.InputBufferLength; OutputLength = irpStack->Parameters.DeviceIoControl.OutputBufferLength; pBuffer = Irp->UserBuffer; // ---- if (ControlCode == IOCTL_MY_NOTIFY) { if ((pBuffer != NULL) && (OutputLength > 0)) { //RtlCopyMemory( & pDataFromUserMode, pBuffer, OutputLength); } } // ---- Irp->IoStatus.Status = STATUS_SUCCESS; Irp->IoStatus.Information = InputLength; IoCompleteRequest(Irp, IO_NO_INCREMENT); // ---- return STATUS_SUCCESS; } # UserMode: Код (C++): #define g_DEF_UM_DriverName L"\\\\.\\MyExampleName" int _tmain(int argc, _TCHAR* argv[]) { HANDLE hDevice = INVALID_HANDLE_VALUE; BOOL bResult = FALSE; DWORD dwLastError = 0; // ---- hDevice = CreateFileW(g_DEF_UM_DriverName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); // ---- if (hDevice == INVALID_HANDLE_VALUE) { dwLastError = GetLastError(); // ---- return (FALSE); } else { DWORD dwValue = 0x302; DWORD dwBytesReturned = 0; // ---- bResult = DeviceIoControl(hDevice, IOCTL_MY_NOTIFY, NULL, 0, & dwValue, sizeof(dwValue), & dwBytesReturned, NULL); // ---- CloseHandle(hDevice); } // ---- return 0; }