Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

IoRegisterDeviceInterface & simbolic link

13K
31 августа 2005 года
solearis
1 / / 31.08.2005
Здравствуйте, подскажите пожайлуста по такому вопросу,
есть фильтр клавиатуры, за основу которого взят пример из 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;
...
}
4.7K
31 августа 2005 года
kelz
42 / / 21.06.2004
У меня была подобная проблема. Попробуй вместо
 
Код:
#define DOS_DEVICE_NAME L"\\DosDevices\\Global\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\DosDevices\\$kbfiltr"

поставить
 
Код:
#define DOS_DEVICE_NAME L"\\??\\Global\\$kbfiltr"
#define DOS_DEVICE_NAME_TOO L"\\??\\$kbfiltr"

Уже не помню где я это встречал, и почему именно так, но у меня работает именно таким образом. С DosDevices не получалось. CreateFile в изменениях не нуждается.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог