标签:ring entry 地址空间 quic enc rect ram return 期望
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() 代表要传输的数据大小
// 当 MaximumLength 和 Length 总是相同时应省略 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)
标签:ring entry 地址空间 quic enc rect ram return 期望
原文地址:https://www.cnblogs.com/Rev-omi/p/14869041.html