今天花了近一天的时间都在调试ObReferenceObjectByName这个内核函数,结果却无比狗血。故写篇文章记录一下这一天蛋疼的调试记录。
其实说是调试,其实是一直编译连接不通过。今天在研究楚狂人(其实是360的大牛wowocock写的代码,楚狂人进行了简化处理)的键盘过滤驱动代码。
有一段代码是要获得kbdclass这个内核驱动对象的对象地址,然后获得整个设备链,将过滤设备绑定在所有设备之上。其中要用到ObReferenceObjectByName()这个内核函数,
代码如下:
POBJECT_TYPE IoDriverObjectType;
NTSTATUS ObReferenceObjectByName(
IN PUNICODE_STRING ObjectPath,
IN ULONG Attributes,
IN PACCESS_STATE PassedAccessState OPTIONAL,
IN ACCESS_MASK DesiredAccess OPTIONAL,
IN POBJECT_TYPE ObjectType,
IN KPROCESSOR_MODE AccessMode,
IN OUT PVOID ParseContext OPTIONAL,
OUT PVOID *ObjectPtr);
// 初始化一个字符串,就是Kdbclass驱动的名字。
RtlInitUnicodeString(&uniNtNameString, KBD_DRIVER_NAME);
// 请参照前面打开设备对象的例子。只是这里打开的是驱动对象。
status = ObReferenceObjectByName (
&uniNtNameString,
OBJ_CASE_INSENSITIVE,
NULL,
0,
IoDriverObj