其他分享
首页 > 其他分享> > 第二章:ObpLookupObjectName 函数

第二章:ObpLookupObjectName 函数

作者:互联网

ObjectHeader = OBJECT_TO_OBJECT_HEADER( RootDirectory );

  #define  OBJECT_TO_OBJECT_HEADER( o )   CONTAINING_RECORD( (o), OBJECT_HEADER, Body )

  #define  CONTAINING_RECORD(address, type, field)      ((type *)( \
                            (PCHAR)(address) - \
                            (ULONG_PTR)  \     

                            (&((type *)0)->field)))      // 即  _object_header = object - ( _object_body - 0 )

首先,&((type *)0) 转化为 type 类型的 NULL 指针,再取其 field 域的地址(即 Body,对象体的地址),这样即可取得其相对地址,但这种写法仅仅能使用在宏中,编译器会预编译并将值计算好。因此这个并非是所有结构体共用一个宏而是,一个结构体使用一个宏。因此,不同的类型头文件不会互相引用。

此处的 IoFileObjectType 是一个全局文件对象类型指针,当然也表示 IoFileObject 是一个全局文件对象类型,可理解为一个记录全局数据的对象类型,在 Win7 中可以增加一些特殊操作。

注意 TotalNumberOfObjects 和 HighWaterNumberOfObjects ,HighWaterxxxxx 代表文件对象最多时的数量,而 TotalNumberxxxxx 则表示当前的数量。

同时注意:此处的 ObjectName 是 PUNICODE_STRING ,其结构体为:

#define OBJ_NAME_PATH_SEPARATOR ((WCHAR)L'\\')
(*(ObjectName->Buffer) == OBJ_NAME_PATH_SEPARATOR)
// 注意此时比较是以 PWSTR,即 unsigned short 为单位,故只比较一个字符
[size_is(MaximumLength / 2), length_is((Length) / 2)] USHORT * Buffer; 
          //这种语法格式是 MIDL(Microsoft Interface Definition Language),
    //是微软用于服务器和客户端程序之间通信所使用的协议(例如,RPC、COM/DCOM)的接口定义语言.
  //二者同时使用时 size_is() 代表要为数据分配的内存大小,length_is() 代表要传输的数据大小
// 当 MaximumLengthLength 总是相同时应省略 length_is()


其中 size_is() 指明 Buffer 指针指向的地址空间的大小,而 length_is() 则指明元素的数量。

[size_is( , m)] short ** ppshort); // Specifies a pointer to a pointer
                     // to an m-sized block of shorts

[in, size_is(m)] short b[][20]); // If m = 10, b[10][20]

[size_is(m,n)] short ** ppshort); // Specifies a pointer to an m-sized block
// of pointers, each of which points to an n-sized block of shorts.
              // m associates with the pointer closeest to the identifer it decorates.
            //n associates with rest. A 指针指向一个以 m 为单位的内存块,每块都存着一个指针 B,B 指向以 n 为单位的内存块

[size_is(size), length_is(length)] char string[*]; // counted string holding at most "size" characters.

const ALIGNEDNAME ObpDosDevicesShortNamePrefix = { L'\\',L'?',L'?',L'\\' }; // L"\??\"

 typedef union {
  WCHAR Name[sizeof(ULARGE_INTEGER)/sizeof(WCHAR)];
  ULARGE_INTEGER Alignment;
} ALIGNEDNAME;    // Union 结构体,会选取较大的域分配空间,两个域共用一块内存。

#if defined(MIDL_PASS)
typedef struct _ULARGE_INTEGER {
#else // MIDL_PASS
typedef union _ULARGE_INTEGER {
  struct {
    ULONG LowPart;
    ULONG HighPart;
  };
  struct {
    ULONG LowPart;
    ULONG HighPart;
  } u;
#endif //MIDL_PASS
  ULONGLONG QuadPart;
} ULARGE_INTEGER;    // 如果如果没有定义 MIDL_PASS,则有三个域共用一块内存(8字节)

            // 此处 MIDL_PASS 的意义是,如果 CPU 不支持一次读取 8 字节,则一次读 4 字节

    InsertObject: 为 \ ,且没给出 RootDirectoryHandle 且 根目录对象未被创建时,是期望找到的对象名字。其它情况将为这个参数创建一个目录对象。

  FoundObject: Receives a pointer to the object body if found

主要的逻辑结构:

ParseFromRoot::

quickStart::

ReparseObject::

解引用、释放 Contex ,return(Status)

标签:返回,NULL,RootDirectory,函数,ObjectName,对象,第二章,ObpLookupObjectName,size
来源: https://www.cnblogs.com/Rev-omi/p/14869041.html