-
-
[旧帖]
[求助]CreateFile打开虚拟过滤设备驱动失败
0.00雪花
-
发表于:
2013-3-25 23:28
1869
-
[旧帖] [求助]CreateFile打开虚拟过滤设备驱动失败
0.00雪花
问:最近在学键盘过滤设备驱动的编写,我在驱动程序CreateDeviceFun函数中先绑定"//Device//Kbdclass"然后IoCreateDevice了我的虚拟过滤驱动设备对象,并绑定到设备栈中。现在我在Ring3程序中想打开这个驱动设备,实现读取内核驱动程序中的键盘按键信息。利用下面的函数创建,却一直返回失败:
//打开驱动设备对象
HANDLE hDevice = CreateFile(L"\\\\.\\Kbdclass" ,GENERIC_READ | GENERIC_WRITE ,
0 ,NULL ,OPEN_EXISTING ,
FILE_ATTRIBUTE_NORMAL ,NULL ) ;
if (hDevice == INVALID_HANDLE_VALUE)//判断设备是否成功打开
{
printf("Main: Failed to open device handle error code: %d\n" ,GetLastError()) ;
goto _Return ;
}
下面是内核中绑定键盘设备和IoCreateDevice部分的代码:
//打开Driver-->Kbdclass驱动对象
RtlInitUnicodeString(&kbdDriverName ,KBD_DRIVER_NAME) ;
ntStatus = ObReferenceObjectByName(&kbdDriverName ,OBJ_CASE_INSENSITIVE ,NULL ,0 ,IoDriverObjectType ,
KernelMode ,NULL ,&kbdDriverObject) ;
if (!NT_SUCCESS(ntStatus))
{
KdPrint(("CreateDeviceFun: Open Kbdclass driver error.\n")) ;
return(ntStatus) ;
}
else
{
//调用ObReferenceObjectByName会导致驱动对象的引用计数增加
//必须调用相对应的解引用函数ObDereferenceObject
ObDereferenceObject(pDriverObject) ;
}
//这是设备链的第一个设备,位于设备栈的顶层
pTargetDeviceObject = kbdDriverObject->DeviceObject ;
//遍历设备链
while (pTargetDeviceObject)
{
//生成一个过滤设备
ntStatus = IoCreateDevice(pDriverObject ,sizeof(KEY_BOARD_DEV_EXT) ,NULL ,pTargetDeviceObject->DeviceType ,
pTargetDeviceObject->Characteristics ,FALSE ,OUT &pFilterDeviceObject) ;
if (!NT_SUCCESS(ntStatus))
{
KdPrint(("CreateDeviceFun: Create filter device error.\n")) ;
return(ntStatus) ;
}
到底Ring3程序中CreateFile函数填写的设备名是什么?填写空或者Kbdclass都不正确,求同志们帮忙。
[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法