字符串的初始化git
定義一個UNICODE_STRING類型的變量,這只是一個空的結構體而已,咱們並無給它分配任何的內存。若是直接對其進行字符串拷貝等操做,確定會 引發異常的,當咱們定義這樣類型的一個變量,咱們應該就把它看做一個WCHAR型的指針,沒有「new」空間,因此咱們必須去「new」空間給它。函數
typedef structspa
{指針
USHORT Length;code
USHORT MaximumLength;orm
PWCHAR Buffer;內存
}UNICODE_STRING, *PUNICODE_STRING;ci
有如下幾種方式:字符串
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的對比
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|