本博文由CSDN部落客zuishikonghuan所作,版權歸zuishikonghuan所有,轉載請注明出處:http://blog.csdn.net/zuishikonghuan/article/details/49717715
在驅動開發中,核心函數使用的字元串不再是應用程式使用的Win32子系統API和Native API中的char*和wchar_t*,而是核心Unicode字元串UNICODE_STRING。
核心字元串有兩種,ANSI字元串是ANSI_STRING,Unicode字元串是UNICODE_STRING,他們的結構是這樣定義的:
typedef struct _STRING {
USHORT Length;
USHORT MaximumLength;
PCHAR Buffer;
} ANSI_STRING, *PANSI_STRING;
typedef struct _UNICODE_STRING {
USHORT Length;
USHORT MaximumLength;
PWSTR Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
Length:字元串長度,都是以位元組數為機關的!而不是字元數。
MaximumLength:字元串的最大長度,即 Buffer 指向的緩沖區長度,位元組為機關。
Buffer:真實字元串的指針。
下面,以Unicode版本,介紹一下核心字元串的建立、釋放、複制、比較等
建立字元串:RtlInitUnicodeString
VOID RtlInitUnicodeString(
_Out_ PUNICODE_STRING DestinationString,
_In_opt_ PCWSTR SourceString
);
DestinationString:指向要初始化的UNICODE_STRING結構的指針。
SourceString:一個指向以 null 結尾的寬字元字元串,用于初始化DestinationString。
釋放字元串:RtlFreeUnicodeString
VOID RtlFreeUnicodeString(
_Inout_ PUNICODE_STRING UnicodeString
);
UnicodeString:指向以前配置設定的、要釋放的 Unicode 字元串UNICODE_STRING結構的指針。
複制字元串:RtlCopyString
VOID RtlCopyString(
_Out_ PSTRING DestinationString,
_In_opt_ const STRING *SourceString
)
DestinationString:指向目标字元串的指針。
SourceString:指向源字元串的指針。
注:
1。這裡的字元串ANSI_STRING結構和UNICODE_STRING結構均可。
2。目标字元串結構中的緩沖區一定要事先申請好,從 SourceString 複制的位元組數是 SourceString 的長度或 DestinationString 的最大長度,以較小者為準。
字元串比較:RtlCompareUnicodeString
LONG RtlCompareUnicodeString(
_In_ PCUNICODE_STRING String1,
_In_ PCUNICODE_STRING String2,
_In_ BOOLEAN CaseInSensitive
);
String1:指向第一個字元串UNICODE_STRING結構的指針
String2:指向第二個字元串UNICODE_STRING結構的指針。
CaseInSensitive:如果為 TRUE,則在做比較時應忽略大小寫。
傳回值:RtlCompareUnicodeString 傳回比較的結果:
0:String1 等于 String2。
<0:String1 小于 String2。
>0:String1 大于 String2。
另外還有幾個比較常用的,但在這裡不再詳細說了,都很簡單。
字元串編碼轉換:RtlAnsiStringToUnicodeString、 RtlUnicodeStringToAnsiString
字元串轉換到大寫:RtlUpperString
字元串與int的轉換:RtlUnicodeStringToInteger、RtlIntegerToUnicodeString