天天看點

驅動開發(5)核心中的字元串

本博文由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