寒江独钓 键盘过滤驱动问题

见习学术士 2011-05-16 04:15:40
寒江独钓的键盘过滤驱动

// 初始化一个字符串,就是Kdbclass驱动的名字。
RtlInitUnicodeString(&uniNtNameString, KBD_DRIVER_NAME);
// 请参照前面打开设备对象的例子。只是这里打开的是驱动对象。
status = ObReferenceObjectByName (
&uniNtNameString,
OBJ_CASE_INSENSITIVE,
NULL,
0,
IoDriverObjectType,
KernelMode,
NULL,
&KbdDriverObject
);
// 如果失败了就直接返回
if(!NT_SUCCESS(status))
{
KdPrint(("MyAttach: Couldn't get the MyTest Device Object\n"));
return( status );
}
else
{
// 这个打开需要解应用。早点解除了免得之后忘记。
ObDereferenceObject(DriverObject);
}

// 这是设备链中的第一个设备
pTargetDeviceObject = KbdDriverObject->DeviceObject;
// 现在开始遍历这个设备链
while (pTargetDeviceObject)
{
//,...............
}


这段绑定代码, 在执行到 while (pTargetDeviceObject) , 由于 pTargetDeviceObject 为空直接退出了。
ObReferenceObjectByName 这个函数调用是成功的, 为什么会这样呢,抓狂了。
...全文
162 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
永远的汇编 2012-06-19
  • 打赏
  • 举报
回复
ObReferenceObjectByName是C++中的。在C中要加extern "C". 不然执行到ObReferenceObjectByName就直接蓝屏了.
见习学术士 2011-05-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 svtanto 的回复:]
看我的博客,有个可以运行的源码供楼主参考。
http://blog.csdn.net/svtanto
[/Quote]

一样的
不知道为什么用 WINDBG 调试
RtlInitUnicodeString(&kbdClassName, L"\\Driver\\Kbdclass");
status = ObReferenceObjectByName(&kbdClassName, OBJ_CASE_INSENSITIVE, NULL, 0,
IoDriverObjectType, KernelMode, NULL, &targetDriverObject);
if (!NT_SUCCESS(status)) {
KdPrint(("ObReferenceObjectByName failed\n"));
return ;
}
ObDereferenceObject(targetDriverObject);
curDeviceObject = targetDriverObject->DeviceObject;

红色部分就返回空,后面绑定创建设备代码根本没有执行到。

如果直接启动虚拟机不进入WINDBG调试模式,就一切正常!

现在我在修改了键盘过滤驱动,蓝屏了所以想调试一下,遇到这蛋疼的问题
svtanto 2011-05-19
  • 打赏
  • 举报
回复
看我的博客,有个可以运行的源码供楼主参考。
http://blog.csdn.net/svtanto
见习学术士 2011-05-17
  • 打赏
  • 举报
回复
我好想发现点问题了。
虚拟机正常启动就会蓝屏,
如果用WINDBG调试模块去调试,由于绑定kdbclass失败,后面的代码都没执行,所以过滤驱动无效也就不会蓝屏。。

现在想不明白为什么调试模式,它调用ObReferenceObjectByName 后,
pTargetDeviceObject = KbdDriverObject->DeviceObject;
这个为空??
见习学术士 2011-05-17
  • 打赏
  • 举报
回复
来人哇。。。。
__lhy 2011-05-17
  • 打赏
  • 举报
回复
还在看前面的串口过滤
haogeai123 2011-05-16
  • 打赏
  • 举报
回复
编写Windows内核程序,就意味着这个程序可以执行任意指令,可以访问计算机所有的软件、硬件资源。因此,稍有不慎就有可能将系统变得不稳定。Windows的设计者设计了各种驱动模型或者框架,如NT式内核驱动模型、WDM框架和新推出的WDF框架。在这些模型框架下编程,就使内核编程变得简单,同样也降低了内核程序崩溃的机会。其实,Windows驱动程序员和黑客都在写内核程序,唯一不同的是驱动程序员按照微软设计的模型写程序,而黑客可以不按照这些框架写。Windows设计的这些框架,可以将操作系统的原理隐藏起来,只暴露一些接口,驱动程序员只要把这些接口写好就可以了。从这个角度看,驱动开发并不难,尤其是读完本书后,更会觉得不难了。但是想完成一些特殊的功能,如内核级隐藏进程等,Windows的这些框架就没什么用处了,程序员就需要对Windows内核有全面的了解,通过直接修改Windows内核来实现这些目的。往往黑客对这种技术乐此不疲,通过修改Windows内核,你会发现你的程序几乎无所不能。   编写内核程序是一件很痛苦的事情,回想起这些年学习内核程序开发的经历,真是感慨万千。就如同谭文所说:编写内核程序的人从某种程度讲是孤独的。当一个经验并不丰富的小程序员面对庞大复杂的并且不开源的Windows框架时,那是一种怎样的无助感啊!谭文是我比较钦佩的程序员之一,他对技术非常执着,并且精力充沛。内核程序的知识涉及面非常广,不同类别的内核程序差别也特别大,他几乎都有所涉猎。相信读者在读完这本书后,能对Windows内核开发有比较详细的了解,同时也能结合书中的实例写出很优秀的内核程序了 本书从Windows内核编程出发,全面系统地介绍了串口、键盘、磁盘、文件系统、网络等相关的Windows内核模块的编程技术,以及基于这些技术实现的输入密码保护、防毒引擎、文件加密、网络嗅探、网络防火墙等信息安全软件的核心组件的具体编程。主要知识重点包括:Windows串口与键盘过滤驱动、Windows虚拟存储设备与存储设备过滤驱动、Windows文件系统过滤驱动、文件系统透明加密/解密驱动、Windows各类网络驱动(包括TDI过滤驱动及3类NDIS驱动),以及最新的WDF驱动开发模型。有助于读者熟悉Windows内核驱动的体系结构,并精通信息安全类的内核编程技术。本书的大部分代码具有广泛的兼容性,适合从Windows 2000一直到目前最新的Windows 7 Beta版。  本书则基本上介绍的是正统的内核编程技术,是微软在内核编程中给信息安全软件开发者提供的相关接口的大集合,是名门正派的技术,不沾邪气。一个好的内核程序员,“正邪兼修”是有必要的。   本书既适合于有志于成为软件程序员的学生使用,也适合于希望加强自己的技术实力的Windows程序员阅读,同时更适合于从事信息安全行业的Windows软件的开发者作为手头参考。

21,600

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 驱动开发/核心开发
社区管理员
  • 驱动开发/核心开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧