⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jiurl玩玩win2k 对象.htm

📁 关于win2000核心编程的文章
💻 HTM
📖 第 1 页 / 共 4 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0069)http://jiurl.cosoft.org.cn/jiurl/document/JiurlPlayWin2k/ObObject.htm -->
<HTML><HEAD><TITLE>JIURL玩玩Win2k 对象</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<STYLE type=text/css>.title {
	FONT-FAMILY: "黑体", Arial, sans-serif; FONT-SIZE: 21px; FONT-WEIGHT: bold; LINE-HEIGHT: 48px; TEXT-DECORATION: none
}
.author {
	FONT-FAMILY: "宋体"; FONT-SIZE: 12px; LINE-HEIGHT: 16px
}
.content {
	FONT-SIZE: 14px; LINE-HEIGHT: 20px
}
</STYLE>

<META content="MSHTML 5.00.2614.3500" name=GENERATOR></HEAD>
<BODY bgColor=#f7f7f7 topMargin=5>
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=29 width="96%">
  <TBODY>
  <TR>
    <TD class=title height=41 width="100%">
      <P align=center><FONT face=宋体>JIURL玩玩Win2k 对象</FONT></P></TD></TR></CENTER>
  <TR>
    <TD class=author height=9 width="100%">
      <P align=center><FONT face=宋体>作者: <A 
      href="mailto:jiurl@mail.china.com">JIURL</A> </FONT></P></TD></TR>
  <TR>
    <TD class=author height=6 width="100%">
      <P align=center><FONT 
      face=宋体>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      主页: <A href="http://jiurl.yeah.net/">http://jiurl.yeah.net/</A> 
    </FONT></P></TD></TR>
  <TR>
    <TD class=author height=2 width="100%">
      <P align=center><FONT face=宋体>&nbsp;&nbsp;&nbsp; 日期: 2003-7-30</FONT> 
    </P></TD></TR></TBODY></TABLE></DIV>
<DIV align=center>
<CENTER>
<TABLE border=0 cellPadding=0 cellSpacing=0 height=1 width="96%">
  <TBODY>
  <TR>
    <TD height=1 width="100%">
      <HR color=#396da5 SIZE=3>
    </TD></TR></TBODY></TABLE></CENTER></DIV>
<DIV align=center>
<TABLE border=0 cellPadding=0 cellSpacing=0 class=content height=4300 
width="96%">
  <TBODY>
  <TR>
    <TD height=2132 vAlign=top width="131%">&nbsp;&nbsp;&nbsp; Windows 2000 
      中有如下27种对象 Directory Thread Mutant Controller Type Profile Event 
      SymbolicLink Section EventPair Desktop Timer File WindowStation Driver 
      WmiGuid Token Device IoCompletion Process Adapter Key Job WaitablePort 
      Port Callback Semaphore 。这27个名字就充分说明了对象对于Win2k有多么重要。 
      <P align=center><IMG border=0 height=450 
      src="JIURL玩玩Win2k 对象.files/ObObject1.gif" width=600></P>
      <P align=center><B>图1</B></P>
      <P>&nbsp;&nbsp;&nbsp; 
      先来看看对象的样子,如图1所示。对象至少由对象头和对象体组成,而在对象头之前(比对象头地址更低的地方)还可能有些相关的信息。对于不同类型的对象来说,对象头的定义是一样的,而对象体的大小,内容是完全不一样的。可选信息,对象头,对象体是紧紧的挨在一起的。<BR><BR>&nbsp;&nbsp;&nbsp; 
      也可以使用以下工具,增加对对象的认识。http://www.sysinternals.com 中的 Winobj ,可以观察命名空间中的对象。《 
      Programming the Microsoft Windows Driver Model 》一书附书CD中的工具 DevView 
      。这两个工具功能差不多。<BR><BR><B>对象头及可选结构</B></P>
      <P>&nbsp;&nbsp;&nbsp; OBJECT_HEADER 
      之前有四种可选结构,OBJECT_NAME,OBJECT_HANDLE_DB,OBJECT_QUOTA_CHARGES 
      ,OBJECT_CREATOR_INFO。他们是否存在,都由 OBJECT_HEADER 
      中的相关域进行说明。前三种结构如果存在他们的相对于OBJECT_HEADER 的位置由 OBJECT_HEADER 中的相关域进行说明。只有 
      OBJECT_CREATOR_INFO 结构,如果存在,就位于 OBJECT_HEADER 之前,并紧挨着 
      OBJECT_HEADER。<BR><BR>OBJECT_HEADER 
      的定义如下,大小24(十进制)个字节,也就是6个DWORD。<BR>(没有特别注明的话,本文所有的类型定义来自《Undocumented 
      Windows 2000 Secrets: A Programmer's 
      Cookbook》一书的部分章节及其附书源码。由于这部分没有什么官方文档,所以错误不可避免,大家对这些类型定义还是要有一点怀疑)<BR><BR>typedef 
      struct _OBJECT_HEADER<BR>{<BR>/*000*/ DWORD PointerCount; // number of 
      references<BR>/*004*/ DWORD HandleCount; // number of open 
      handles<BR>/*008*/ POBJECT_TYPE ObjectType;<BR>/*00C*/ BYTE NameOffset; // 
      -&gt; OBJECT_NAME<BR>/*00D*/ BYTE HandleDBOffset; // -&gt; 
      OBJECT_HANDLE_DB<BR>/*00E*/ BYTE QuotaChargesOffset; // -&gt; 
      OBJECT_QUOTA_CHARGES<BR>/*00F*/ BYTE ObjectFlags; // OB_FLAG_*<BR>/*010*/ 
      union<BR>{ // OB_FLAG_CREATE_INFO ? ObjectCreateInfo : 
      QuotaBlock<BR>/*010*/ PQUOTA_BLOCK QuotaBlock;<BR>/*010*/ 
      POBJECT_CREATE_INFO ObjectCreateInfo;<BR>/*014*/ };<BR>/*014*/ 
      PSECURITY_DESCRIPTOR SecurityDescriptor;<BR>/*018*/ 
      }<BR>OBJECT_HEADER;<BR><BR>.PointerCount<BR>ntoskrnl.exe 中的 API 
      ObfReferenceObject(), ObReferenceObjectByHandle(), 
      ObReferenceObjectByName(), 和 ObReferenceObjectByPointer() 
      增加的就是这个PointerCount, ObfDereferenceObject() 和 ObDereferenceObject() 
      用来减少这个值。<BR><BR>.HandleCount<BR>指明有多少个这个对象的打开句柄<BR><BR>.ObjectType<BR>指向 
      OBJECT_TYPE 结构体的指针。<BR><BR>.NameOffset<BR>用 OBJECT_HEADER 的地址减去 NameOffset 
      的值,来定位 OBJECT_NAME 部分。<BR>如果 NameOffset 值为0,表示这个 OBJECT_HEADER 没有 
      OBJECT_NAME。<BR>用来指出对象的名字,可选信息之一。<BR><BR>.HandleDBOffset<BR>用 
      OBJECT_HEADER 的地址减去 HandleDBOffset 的值,来定位 OBJECT_HANDLE_DB 部分。<BR>如果 
      HandleDBOffset 值为0,表示这个 OBJECT_HEADER 没有 
      OBJECT_HANDLE_DB。<BR>可选信息之一。<BR><BR>.QuotaChargesOffset<BR>用 OBJECT_HEADER 
      的地址减去 QuotaChargesOffset 的值,来定位 OBJECT_QUOTA_CHARGES 部分。<BR>如果 
      QuotaChargesOffset 值为0,表示这个 OBJECT_HEADER 没有 
      OBJECT_QUOTA_CHARGES。<BR>可选信息之一。<BR><BR>.ObjectFlags<BR>#define 
      OB_FLAG_CREATE_INFO 0x01 // has OBJECT_CREATE_INFO<BR>#define 
      OB_FLAG_KERNEL_MODE 0x02 // created by kernel<BR>#define 
      OB_FLAG_CREATOR_INFO 0x04 // has OBJECT_CREATOR_INFO<BR>#define 
      OB_FLAG_EXCLUSIVE 0x08 // OBJ_EXCLUSIVE<BR>#define OB_FLAG_PERMANENT 0x10 
      // OBJ_PERMANENT<BR>#define OB_FLAG_SECURITY 0x20 // has security 
      descriptor<BR>#define OB_FLAG_SINGLE_PROCESS 0x40 // no 
      HandleDBList<BR>也就是说,第0位,OB_FLAG_CREATE_INFO 位。第1位,OB_FLAG_KERNEL_MODE 
      位。第2位,OB_FLAG_CREATOR_INFO位。第3位,OB_FLAG_EXCLUSIVE 位。第4位,OB_FLAG_PERMANENT 
      位。第5位,OB_FLAG_SECURITY 位。第6位,OB_FLAG_SINGLE_PROCESS 位。<BR>如果 
      OB_FLAG_CREATOR_INFO 位为1,则在 OBJECT_HEADER 之前,紧挨着一个 OBJECT_CREATOR_INFO 
      结构。<BR>注意 OBJECT_CREATE_INFO 与 OBJECT_CREATOR_INFO 
      是不同的。<BR><BR>.QuotaBlock 或者 .ObjectCreateInfo<BR>如果 ObjectFlags 的 
      OB_FLAG_CREATE_INFO 位为1,<BR>则这里为 ObjectCreateInfo ,一个指针,指向一个 
      OBJECT_CREATE_INFO 结构。OBJECT_CREATE_INFO 为可选信息之一。<BR>否则,这里为 QuotaBlock 
      ,一个指针,指向一个 QUOTA_BLOCK 结构,<BR>提供关于paged 和 non-paged 
      内存池使用情况的信息。PspDefaultQuotaBlock 一个全局变量,保存着 DefaultQuotaBlock。很多对象的 
      QuotaBlock 中的地址和 PspDefaultQuotaBlock 一样,指向DefaultQuotaBlock。这个 union 
      的值可以为 NULL。<BR><BR>.SecurityDescriptor<BR>如果 ObjectFlags 的 
      OB_FLAG_SECURITY 位为1,<BR>则 SecurityDescriptor 为一个指针,指向一个 
      SECURITY_DESCRIPTOR 结构。<BR>如果 ObjectFlags 的 OB_FLAG_SECURITY 位为0,<BR>则 
      SecurityDescriptor 值为 NULL。<BR><BR><BR>OBJECT_NAME 定义如下<BR><BR>typedef 
      struct _OBJECT_NAME<BR>{<BR>/*000*/ POBJECT_DIRECTORY 
      Directory;<BR>/*004*/ UNICODE_STRING Name;<BR>/*00C*/ DWORD 
      Reserved;<BR>/*010*/ }<BR>OBJECT_NAME;<BR><BR>.Directory<BR>指向所在 Directory 
      对应的 Directory 
      Object。可以为空。<BR><BR>.Name<BR>对象的名字,是一个UNICODE_STRING结构,<BR>UNICODE_STRING结构在ddk中定义如下。<BR>typedef 
      struct _UNICODE_STRING {<BR>USHORT Length;<BR>USHORT 
      MaximumLength;<BR>PWSTR Buffer;<BR>} UNICODE_STRING 
      *PUNICODE_STRING;<BR><BR>.Reserved<BR>保留<BR><BR>其他的可选结构我们将在后面介绍。<BR><BR><BR>下面我们看一个实际的例子,一个名字叫"\"的Directory 
      类型对象,它其实就是Directory的根对象。<BR><BR>kd&gt; !object \<BR>!object \<BR>Object: 
      8141ecd0 Type: (81452820) Directory<BR>ObjectHeader: 
      8141ecb8<BR>HandleCount: 0 PointerCount: 34<BR>Directory Object: 00000000 
      Name: \<BR>120 symbolic links snapped through this 
      directory<BR>HashBucket[ 00 ]: 8141b930 Directory 'ArcName'<BR>HashBucket[ 
      01 ]: e2f7b600 Port 'SeLsaCommandPort'<BR>HashBucket[ 03 ]: e1007390 Key 
      '\REGISTRY'<BR>HashBucket[ 07 ]: e2bb16e0 Port 
      'DbgUiApiPort'<BR>HashBucket[ 09 ]: 810e7e00 Directory 
      'NLS'<BR>HashBucket[ 10 ]: 8141ea50 SymbolicLink 
      'DosDevices'<BR>HashBucket[ 13 ]: e14088a0 Port 
      'SeRmCommandPort'<BR>HashBucket[ 14 ]: 810e8540 Mutant 
      'NlsCacheMutant'<BR>e2fdb4c0 Port 'LsaAuthenticationPort'<BR>81421450 
      Device 'Dfs'<BR>810fc870 Event 'LanmanServerAnnounceEvent'<BR>HashBucket[ 
      16 ]: 81416530 Directory 'Driver'<BR>HashBucket[ 17 ]: e17c79c0 Port 
      'DbgSsApiPort'<BR>HashBucket[ 18 ]: 81437d30 Directory 
      'WmiGuid'<BR>HashBucket[ 19 ]: 8141b850 Directory 'Device'<BR>HashBucket[ 
      20 ]: 810f68d0 Directory 'Windows'<BR>HashBucket[ 21 ]: 810a7e70 Event 
      'SAM_SERVICE_STARTED'<BR>HashBucket[ 22 ]: 810f67f0 Directory 'RPC 
      Control'<BR>e1408aa0 Port 'SmApiPort'<BR>81422af0 Device 
      'Fat'<BR>HashBucket[ 23 ]: 810e8730 Directory 
      'BaseNamedObjects'<BR>HashBucket[ 24 ]: 8141eb10 Directory 
      '??'<BR>81416450 Directory 'FileSystem'<BR>HashBucket[ 26 ]: 8141ebf0 
      Directory 'ObjectTypes'<BR>HashBucket[ 27 ]: 8141ba10 Directory 
      'Security'<BR>e302e6e0 Port 'ErrorLogPort'<BR>HashBucket[ 31 ]: 8141bbb0 
      SymbolicLink 'SystemRoot'<BR>HashBucket[ 32 ]: 8141d2d0 Directory 
      'Callback'<BR>HashBucket[ 33 ]: 810ab330 Event 'EFSInitEvent'<BR>810f7df0 
      Event 'SeLsaInitEvent'<BR>810ec9d0 Event 
      'UniqueSessionIdEvent'<BR>HashBucket[ 35 ]: 810f5f50 Directory 
      'KnownDlls'<BR>\\ 从输出中我们可以看到 ObjectHeader: 8141ecb8 
      ,ObjectHeader结构大小为24个字节,也就是6个DWORD。<BR><BR>kd&gt; dd 8141ecb8 l 6<BR>dd 
      8141ecb8 l 6<BR>8141ecb8 00000023 00000000 81452820 32000010<BR>8141ecc8 
      00000001 e10010f8<BR><BR>\\ 分析一下这个 ObjectHeader 结构的每个域的值<BR>/*000*/ DWORD 
      PointerCount; // number of references<BR>00000023<BR><BR>/*004*/ DWORD 
      HandleCount; // number of open handles<BR>00000000<BR><BR>/*008*/ 
      POBJECT_TYPE ObjectType;<BR>81452820<BR><BR>/*00C*/ BYTE NameOffset; // 
      -&gt; OBJECT_NAME<BR>10<BR>\\ 有 OBJECT_NAME<BR><BR>/*00D*/ BYTE 
      HandleDBOffset; // -&gt; OBJECT_HANDLE_DB<BR>00<BR>\\ 没有 
      OBJECT_HANDLE_DB<BR><BR>/*00E*/ BYTE QuotaChargesOffset; // -&gt; 
      OBJECT_QUOTA_CHARGES<BR>00<BR>\\ 没有 OBJECT_QUOTA_CHARGES<BR><BR>/*00F*/ 
      BYTE ObjectFlags; // OB_FLAG_*<BR>32<BR>\\ 32(hex)=00110010(bin) ,即 
      OB_FLAG_KERNEL_MODE,OB_FLAG_PERMANENT,OB_FLAG_SECURITY 
      这3位被设立。<BR><BR>/*010*/ union<BR>{ // OB_FLAG_CREATE_INFO ? 
      ObjectCreateInfo : QuotaBlock<BR>/*010*/ PQUOTA_BLOCK 
      QuotaBlock;<BR>/*010*/ POBJECT_CREATE_INFO ObjectCreateInfo;<BR>/*014*/ 
      };<BR>00000001<BR>\\ OB_FLAG_CREATE_INFO位没有被设立,但从值来看也不是一个 PQUOTA_BLOCK 
      QuotaBlock。<BR><BR>/*014*/ PSECURITY_DESCRIPTOR 
      SecurityDescriptor;<BR>e10010f8<BR>\\ OB_FLAG_SECURITY 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -