首页
社区
课程
招聘
有关驱动的兼容性问题
发表于: 2013-1-9 15:02 4035

有关驱动的兼容性问题

2013-1-9 15:02
4035
ObGetObjectType这个函数是windows 7系统中获得对象类型的函数,在windows xp中获得对象类型的方法是直接取对象头,不需要用到这个函数。所以这个函数不兼容windows xp,一旦声明这个函数即会导致蓝屏(0x7B)。
我目前想要实现windows 7和XP兼容,所以必须用到ObGetObjectType这个函数,目的是在windows 7中获得对象类型,但是又不兼容XP,即使我使用if。。else语句,判断系统类型后在声明仍然会蓝屏,请问各位大牛有什么解决的办法没有。

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
有过这方面代码经验的求指教。。。这bug调了很久才知道是这个函数不兼容,而且用windbg都无法调试,只能使用!analyze -v来分析蓝屏代码。。。很纠结
2013-1-9 15:19
0
雪    币: 601
活跃值: (256)
能力值: ( LV11,RANK:190 )
在线值:
发帖
回帖
粉丝
3
xp下直接读取对象头,win7(32位)下可以搜索ObTypeIndexTable变量,之后*(&ObTypeIndexTable + *(PBYTE)(ADDRESS- 0xC));
2013-1-9 15:46
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
好吧,我试下这个方法。之前觉得搜索这个数组很麻烦,windows7提供了自带的函数直接通过索引获得类型比较简单点。
2013-1-9 15:57
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
对了问句这个变量是否是导出变量?是导出变量的话应该直接声明就可以用了把?
2013-1-9 16:01
0
雪    币: 79
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
感谢三楼,给了我灵感,分全部给你把!也没有别人。下面贴出我的方法,以后有人遇到同样的问题可以搜索的到。
首先是三楼的回答:
xp下直接读取对象头,win7(32位)下可以搜索ObTypeIndexTable变量,之后*(&ObTypeIndexTable + *(PBYTE)(ADDRESS- 0xC));

我自己的解决方法:
没有搜索ObTypeIndexTable这个表,因为感觉挺复杂的,首先要搜索这个变量,而且也不知道从哪个地方开始搜索。所以我仍然使用的是ObGetObjectType这个windows7提供的函数。但是这次不是直接使用导出函数,因为使用导出函数会导致windows xp系统的不兼容。所以我通过一个GetAddress函数动态获得这个函数地址。代码如下:
typedef PVOID(NTAPI *OBGETOBJECTTYPE)(PVOID);
OBGETOBJECTTYPE OBGetObjectType;

VOID GetAddress()
{
	PUCHAR addr;
	UNICODE_STRING pslookup; 
	RtlInitUnicodeString(&pslookup,L"ObGetObjectType"); 
	addr=(PUCHAR)MmGetSystemRoutineAddress(&pslookup);
	OBGetObjectType=(OBGETOBJECTTYPE )addr;
	return;
}

代码我就不解释了,留给后面同样出现这种问题的童鞋把!这个bug解决了很久,很菜,还望莫笑
2013-1-9 17:25
0
雪    币: 29
活跃值: (26)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
感谢楼主无私分享,学习了。
2013-1-9 19:08
0
游客
登录 | 注册 方可回帖
返回
//