首页
社区
课程
招聘
[旧帖] [求助]CreateFile打开虚拟过滤设备驱动失败 0.00雪花
发表于: 2013-3-25 23:28 1869

[旧帖] [求助]CreateFile打开虚拟过滤设备驱动失败 0.00雪花

2013-3-25 23:28
1869
问:最近在学键盘过滤设备驱动的编写,我在驱动程序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虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 291
活跃值: (213)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
2
只能打开符号链接。
2013-3-26 01:23
0
雪    币: 70
活跃值: (40)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
3
论坛大婶果然给力,感激感激,此问题已结。
2013-3-26 07:32
0
游客
登录 | 注册 方可回帖
返回
//