wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1378回复:2

再谈对象管理器

楼主#
更多 发布于:2002-03-02 15:08
版主在《关于对象管理器》中说的不太对吧?我认为FILE对象应该属于对象管理器的管辖范围。
1。在\\Object Types\\有个叫做File的对象。
2。Supermi谈到使用ObCreateObject创建了一个File对象。(在《有狠心的同志请看看》)
另外,我认为所有的未命名的对象都应该属于对象管理器的管理范围。只不过还没有找到十分确定的证据,最近太忙,没时间反汇编系统代码。还有,我想知道File对象是个什么角色,跟Device对象是什么关系?
tsu00
驱动牛犊
驱动牛犊
  • 注册日期2002-02-01
  • 最后登录2006-08-04
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-03-03 13:37
版主在《关于对象管理器》中说的不太对吧?我认为FILE对象应该属于对象管理器的管辖范围。
1。在\\Object Types\\有个叫做File的对象。
2。Supermi谈到使用ObCreateObject创建了一个File对象。(在《有狠心的同志请看看》)
另外,我认为所有的未命名的对象都应该属于对象管理器的管理范围。只不过还没有找到十分确定的证据,最近太忙,没时间反汇编系统代码。还有,我想知道File对象是个什么角色,跟Device对象是什么关系?


File对象,既然是对象,当然是由对象管理器管辖的了。关于由什么来创建File对象的。我来讲讲流程吧。
  1、CreateFile:Kernel32.dll中的api,没什么好解释的。
 2、进入NtCreateFile(ZwCreateFile),ntdll.dll中的,在xp中是指向同一地址的。其借助System Service进入Kernel Mode。
 3、进入ntoskrnl.exe下的NtCreateFile(内核模式的)。
 4、进入IoCreateFile
  5、进入ObOpenObjectByName
 6、进入IopParseDevice
应该重点说说IopParseDevice:IopParseDevice负责建立IRP_MJ_CREATE IRP,建立File对象,File对象的VPB存储实际的Volumn information,然后将建立的irp发送到由vpb指定的相应的File System Driver。

流程大概就是这样,我想你困惑的只是file对象与其它对象有什么不同而已,其实没有什么区别,File对象与Device对象等等在io管理器中是一样的,你看看iopparsedevice的建立file object的代码,就很容易理解(xp专业2600):

-------前面略掉许多参数代码
805754e4 ff35f8445480    push    dword ptr [nt!IoFileObjectType (805444f8)]
805754ea 50               push    eax
805754eb e801b9ffff       call    nt!ObCreateObject (80570df1)

而你也意识到file object type的存在,我肯定你也知道其它type的,任何object对于对象管理器的obcreateobject实现的。当然不可能是直接用allocate pool来实现的(我指nt/2000/xp本身,如果谁可以直接产生也是可能的,毕竟这些对象本身只是内存中一个数据结构而已,你要知道具体结构,我想也应该可能)

不知道这样说容易明白吗?
还有这儿说是国内最专业的,其实信噪也很高,我都不想来。


Welcome to [url]http://webcrazy.yeah.net[/url]!
wilton
驱动牛犊
驱动牛犊
  • 注册日期2001-04-23
  • 最后登录2005-03-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-03-03 22:35
既然对象管理器管理File对象,那么File对象就应该是全局的,也应该可以通过某种方式得到所有的File对象(也包括所有的未命名对象)的列表,就如同命名对象一样。
另外,我通过ObQueryNameString得到了File对象完整的名称,包括开始的Device对象(刑如:\\Device\\HarddiskVolume1\\pig.txt)。File的对象头没有名称的UNICODE_STRING,而是写在对象体的FileName域(\\pig.txt)。好像lu0说的对“对象管理器管理的对象名本身的位置是不确定的. 有时有有时没有, 有时位置变化”。
还有,为什么我通过ObReferenceObjectByHandle和IoGetDeviceObjectPointer等函数都会返回一个File对象,这个File对象指向哪个文件,有什么用,为什么总是立刻调用ObDereferenceObject?
游客

返回顶部