在內(nèi)核中使用的字符串是UNICODE_STRING,就是說在內(nèi)核中的字符集是Unicode編碼的.在Windows系統(tǒng)中,Unicode編碼的字符,一個字符占2個字節(jié).
UNICODE_STRING 定義(definition) :
typedef struct _UNICODE_STRING{
USHORT LENGTH; // 字節(jié)數(shù),不是字符數(shù),有效數(shù)據(jù)的字節(jié)數(shù)
USHORT MaximumLength; // 字節(jié)數(shù),告訴系統(tǒng)函數(shù)最多有多少內(nèi)存可用
// 最大可表示32767個字符
PWSTR Buffer; // 指針, 非零結(jié)尾,中間也可能含有零
}UNICODE_STRING,*PUNICODE_STRING;
// 因?yàn)锽uffer不是以零結(jié)尾,所以用wcscpt / wcscmp等操作字符串
// 的處理Buffer中的值是不可靠的,因?yàn)檫@些函數(shù)是以字符串末尾字
// 符'\0'為結(jié)尾來處理字符串的.**
定義UNICODE_STRING
UNICODE_STRINGuStr = {0}; // 直接定義,Buffer沒有內(nèi)存,必須正確初始化
初始化UNICODE_STRING的三種方式
字符串常量
UNICODE_STRING uStrTest1 = {0};
WCHAR *szHello = L"Hello world";
uStrTest1.Length = wcslen(szHello) * sizeof(WCHAR);
uStrTest1.MaximumLength = (wcslen(szHello) + 1) * sizeof(WCHAR);
RtlInitUnicodeString(&uStrTest1,szHello);
// 等價于 char *str = "hello world";
// uStrTest1.Buffer指向的地址是靜態(tài)常量區(qū),所以對著uStrTest1進(jìn)行修改操作必錯
在棧上為Buffer初始化
UNICODE_STRING uStrTest2 = {0};
WCHAR szHello2[512] = L"Hello world";
uStrTest2.Buffer = szHello2;
uStrTest2.Length = wcslen(L"Hello world") * sizeof(WCHAR);
uStrTest2.MaximumLength = sizeof(szHello2);
在堆上為Buffer初始化
UNICODE_STRING uStrTest3 = {0};
ULONG ulLength = (wcslen(L"Hello world") * sizeof(WCHAR));
// 為Buffer在堆上分配一塊內(nèi)存
// MAX_PATH : 代表Windows系統(tǒng)中文件路徑的最大長度.值是260
uStrTest3.Buffer = ExAllocatePoolWithTag(PagedPool,MAX_PATH * sizeof(WCHAR),'POCU');
// 判斷內(nèi)存是否分配成功
if (uStrTest3.Buffer == NULL)
{
return;
}
// 為分配到的內(nèi)存初始化
RtlZeroMemory(uStrTest3.Buffer,MAX_PATH * sizeof(WCHAR));
memcpy(uStrTest3.Buffer,L"Hello world",ulLength);
uStrTest3.Length = ulLength;
uStrTest3.MaximumLength = MAX_PATH * sizeof(WCHAR);