日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

2 《Undocumented Windows 2000 Secrets》翻譯 --- 第二章( 四 )


USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING,*PUNICODE_STRING;
typedef struct _STRING
{
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
} STRING, *PSTRING;
typedef STRING ANSI_STRING, *PANSI_STRING;
typedef STRING OEM_STRING, *POEM_STRING;
列表 2-4. 字符串類型
Length 成員給出了當(dāng)前字符串的字節(jié)數(shù)(注意,不是字符個(gè)數(shù)),MaximumLength 成員指出 Buffer 所指向內(nèi)存塊的大小,實(shí)際的字符串?dāng)?shù)據(jù)將保存在該內(nèi)存塊中 。注意,MaximumLength 也是字節(jié)數(shù) 。由于 Unicode 字符寬度為 16 位,所有其長(zhǎng)度總是字符個(gè)數(shù)的兩倍 。通常,Buffer 指向的字符串都是以零結(jié)尾的 。然而,有些內(nèi)核模塊可能僅依賴字符串的長(zhǎng)度值,而不考慮結(jié)尾的 0 字符,這種情況下要小心處理 。
Windows 2000 的 ANSI 字符串叫做 STRING ,如 列表 2-4 中所示 。為了方便,nedef.h 分別定義了 ANSI_STRING 和 OEM_STRING 來(lái)代表使用不同代碼頁(yè)的 8 位字符串( ANSI 默認(rèn)代碼頁(yè)為 1252 ; OEM 默認(rèn)代碼頁(yè)為 437 ) 。不過(guò),Windows 2000 內(nèi)核使用的主要字符串類型還是 UNICODE_STRING。你可能偶爾會(huì)碰到 8 位字符串 。
在 圖 2-3 中,我給出了兩個(gè)典型的 UNICODE_STRING 示例 。左面的那個(gè)包含兩個(gè)獨(dú)立的內(nèi)存塊:一個(gè) UNICODE_STRING 結(jié)構(gòu)和一個(gè) 16 位 PWCHAR 類型的 Unicode 字符數(shù)組 。這或許是在 Windows 2000 數(shù)據(jù)類型中最常見(jiàn)的字符串類型 。右邊的是一種頻繁出現(xiàn)的特殊類型,在此種類型中,UNICODE_STRING 和 PWCHAR 數(shù)組位于同一個(gè)內(nèi)存塊中 。有些內(nèi)核函數(shù),包括 Native API 內(nèi)部使用的一些函數(shù),都在連續(xù)的內(nèi)存塊中保存其返回的結(jié)構(gòu)化的系統(tǒng)信息 。如果數(shù)據(jù)中包含字符串,它們通常都存儲(chǔ)在嵌入式的 UNICODE_STRING 中,如 圖 2-3 右面所示 。例如,NtQuerySystemInformation() 函數(shù)就頻繁使用了這種特殊的字符串類型 。
這些字符串結(jié)構(gòu)不許要手工維護(hù),ntdll.dll 和 ntoskrnl.exe 導(dǎo)出了一組豐富的運(yùn)行時(shí) API 函數(shù),如 RtlCreateUnicodeString() 、 RtlInitUnicodeString() 、 RtlCopyUnicodeString() 等 。通常,STRING 和 ANSI_STRING 也有對(duì)應(yīng)的等價(jià)函數(shù) 。這些函數(shù)中的大多數(shù)在 DDK 中都有文檔記錄,但其中有些沒(méi)有 。不過(guò),很容易猜出這些未文檔化的字符串函數(shù)的功能及其需要的參數(shù) 。使用 UNICODE_STRING 、 STRING 的好處是,可以隱示的指定 Buffer 可容納的字符串的大小 。如果你給一個(gè)函數(shù)傳遞了一個(gè) UNICODE_STRING 類型的字符串,而該函數(shù)需要適當(dāng)改變?cè)撟址闹担@可能會(huì)增加該字符串的長(zhǎng)度,那這個(gè)函數(shù)只需要簡(jiǎn)單的檢查 MaximumLength 成員就可確定是否有足夠的空間來(lái)存放結(jié)果 。
結(jié)構(gòu)體
個(gè)別的幾個(gè)內(nèi)核 API 函數(shù)期望其處理的對(duì)象有一個(gè)合適的 OBJECT_ATTRIBUTES 結(jié)構(gòu),列表 2-5 給出了該結(jié)構(gòu)的定義 。例如,NtOpenFile() 函數(shù)沒(méi)有 PWSTR 或 PUNICODE_STRING 參數(shù)用來(lái)指定要打開(kāi)的文件的路徑 。替代的,OBJECT_ATTRIBUTES 結(jié)構(gòu)中的 ObjectName 成員給出了該路徑 。通常,設(shè)置該結(jié)構(gòu)很容易 。除 ObjectName 外,還需要設(shè)置 Length 和 Attributes 成員 。Length 必須設(shè)置為: sizeof(OBJECT_ATTRIBUTES) ,Attributes 是一組來(lái)自 ntdef.h 的 OBJ_* 常量 。例如,如果你對(duì)象名稱不區(qū)分大小寫(xiě)的話,Attributes 應(yīng)設(shè)置為 OBJ_CASE_INSENSITIVE。當(dāng)然,ObjectName 成員是一個(gè) UNICODE_STRING 指針,并不是通常的 PWSTR。剩余的成員只要不使用,都可設(shè)置為 NULL。
typedef struct _OBJECT_ATTRIBUTES
{
ULONG Length;
HANDLE RootDirectory;
PUNICODE_STRING ObjectName;
ULONG Attributes;
PVOID SecurityDescriptor;
PVOID SecurityQualityOfService;
} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;
列表 2-5. OBJECT_ATTRIBUTES 結(jié)構(gòu)
OBJECT_ATTRIBUTES 結(jié)構(gòu)僅描述函數(shù)使用的數(shù)據(jù)的細(xì)節(jié),列表 2-6 給出的 IO_STATUS_BLOCK 結(jié)構(gòu)則用于記錄對(duì)用戶所提交的操作的處理結(jié)果 。該結(jié)構(gòu)很簡(jiǎn)單 ---Staus 成員存放一個(gè) NTSTATUS 類型的代碼,其值可能是 STATUS_SUCCESS 或定義于 ntstatus.h 中的所有可能的錯(cuò)誤代碼 。Information 成員在操作成功的情況下,提供與操作相關(guān)的附加數(shù)據(jù) 。比如,如果函數(shù)返回一個(gè)數(shù)據(jù)塊,該成員將被設(shè)置為該數(shù)據(jù)塊的大小 。

推薦閱讀