#define DOS_DEVICE_NAME L"\\DosDevices\\Global\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\DosDevices\\$kbfiltr"
IoRegisterDeviceInterface & simbolic link
есть фильтр клавиатуры, за основу которого взят пример из DDK - kbfiltr.
Не получается из приложения пользователя открыеть его по символьной ссылке,
CreateFile("\\\\.\\$kbfiltr", ...); возвращает INVALID_HANDLE_VALUE, хотя драйверы других устройств (LPT1,TCP и т.д ) открываются нормально, т.е.проблема в драйвере, в способе создания с.ссылки наверное.
Всеми 3мя способами (см. ниже) simbolic link вродебы создается, в Simbolic Link Viewer видна как
$kbfiltr, но при попытке открытия, результат один и то же, INVALID_HANDLE_VALUE. Подскажите как написать правильно,
зарание благодарен
#define NT_DEVICE_NAME L"\\Device\\kbfiltr"
#define DOS_DEVICE_NAME L"\\DosDevices\\Global\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\DosDevices\\$kbfiltr"
NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath )
for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++) {
DriverObject->MajorFunction = KbFilter_DispatchPassThrough;
}
DriverObject->MajorFunction [IRP_MJ_CREATE] =
DriverObject->MajorFunction [IRP_MJ_CLOSE] = KbFilter_CreateClose;
DriverObject->MajorFunction [IRP_MJ_PNP] = KbFilter_PnP;
DriverObject->MajorFunction [IRP_MJ_POWER] = KbFilter_Power;
DriverObject->MajorFunction [IRP_MJ_INTERNAL_DEVICE_CONTROL] = KbFilter_InternIoCtl;
DriverObject->DriverUnload = KbFilter_Unload;
DriverObject->DriverExtension->AddDevice = KbFilter_AddDevice;
...
...
}
NTSTATUS KbFilter_AddDevice(IN PDRIVER_OBJECT Driver, IN PDEVICE_OBJECT PDO )
{
RtlInitUnicodeString( &deviceNameUnicodeString, NT_DEVICE_NAME );
status = IoCreateDevice(Driver,
sizeof(DEVICE_EXTENSION),
&deviceNameUnicodeString,
FILE_DEVICE_KEYBOARD,
0,
FALSE,
&device);
/// create simbolic link
if( IoIsWdmVersionAvailable( 1, 0x10 ) )
RtlInitUnicodeString( &deviceLinkUnicodeString, DOS_DEVICE_NAME );
else
RtlInitUnicodeString( &deviceLinkUnicodeString, DOS_DEVICE_NAME_TOO );
/*1*/ //status = IoCreateSymbolicLink( &deviceLinkUnicodeString, &deviceNameUnicodeString );
/*2*/ status = IoRegisterDeviceInterface( PDO, (LPGUID)&GUID_CLASS_KEYBOARD, NULL, &deviceLinkUnicodeString );
/*3*/ //status = IoCreateUnprotectedSymbolicLink( &deviceLinkUnicodeString, &deviceNameUnicodeString );
...
device->Flags |= ( DO_BUFFERED_IO | DO_POWER_PAGABLE );
device->Flags &= ~DO_DEVICE_INITIALIZING;
...
}
Код:
поставить
Код:
#define DOS_DEVICE_NAME L"\\??\\Global\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\??\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\??\\$kbfiltr"
Уже не помню где я это встречал, и почему именно так, но у меня работает именно таким образом. С DosDevices не получалось. CreateFile в изменениях не нуждается.