/如果本文有不對的地方,望即時指點!
字符串的初始化
定義一個UNICODE_STRING類型的變量,這只是一個空的結構體而已,我們並沒有給它分配任何的內存。如果直接對其進行字符串拷貝等操作,肯定會 引起異常的,當我們定義這樣類型的一個變量,我們應該就把它看作一個WCHAR型的指針,沒有“new”空間,所以我們必須去“new”空間給它。
typedef struct
{
USHORT Length;
USHORT MaximumLength;
PWCHAR Buffer;
}UNICODE_STRING, *PUNICODE_STRING;
有以下幾種方式:
1.RtlInitEmptyUnicodeString
UNICODE_STRING str;
WCHAR wcsBuffer[1024] = {0};
RtlEmptyUnicodeString(&str, wcsBuffer, sizeof(wcsBuffer));
這種方式就像定義一個靜態的串 WCHAR wcsBuffer[1024] = {0}。
2.動態申請空間
UNICODE_STRING str;
str.Buffer = (PWCHAR)ExAllocatePoolWithTag(NonpagePool, 1024, ‘1234’);
str.Length = 0;
str.MaximumLength = 1024;
這種方式就像定義一個WCHAR* pwcsBuffer = new WCHAR[1024];
使用完之后,必須釋放內存。
ExFreePool或者是ExFreePoolWithTag。
3.定義常量UNICODE_STRING
可以使用宏RTL_CONSTANT_STRING
UNICODE_STRING str = RTL_CONSTANT_STRING(L”my first string”);
記住這個字符串不能再被修改,因為這就像定義了char *str = “123”; 該字符串不能再被修改。
字符串的拷貝
RtlCopyUnicodeString(&dst, &src);
字符串的連接
RtlAppendUnicodeToString(&dst, L”123”);
RtlAppendUnicodeToUnicodeString(&dst, &src);
//下面的表格是轉載的,找不到出處了,見諒!
驅動中使用的字符串操作函數 ,這里給出ANSI和UNICODE的對比
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|