UNICODE_STRING基础
2017-09-13 本文已影响31人
Mon7ey
在内核中使用的字符串是UNICODE_STRING,就是说在内核中的字符集是Unicode编码的.在Windows系统中,Unicode编码的字符,一个字符占2个字节.
UNICODE_STRING 定义(definition) :
typedef struct _UNICODE_STRING{
USHORT LENGTH; // 字节数,不是字符数,有效数据的字节数
USHORT MaximumLength; // 字节数,告诉系统函数最多有多少内存可用
// 最大可表示32767个字符
PWSTR Buffer; // 指针, 非零结尾,中间也可能含有零
}UNICODE_STRING,*PUNICODE_STRING;
// 因为Buffer不是以零结尾,所以用wcscpt / wcscmp等操作字符串
// 的处理Buffer中的值是不可靠的,因为这些函数是以字符串末尾字
// 符'\0'为结尾来处理字符串的.**
定义UNICODE_STRING
UNICODE_STRINGuStr = {0}; // 直接定义,Buffer没有内存,必须正确初始化
初始化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指向的地址是静态常量区,所以对着uStrTest1进行修改操作必错
在栈上为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在堆上分配一块内存
// MAX_PATH : 代表Windows系统中文件路径的最大长度.值是260
uStrTest3.Buffer = ExAllocatePoolWithTag(PagedPool,MAX_PATH * sizeof(WCHAR),'POCU');
// 判断内存是否分配成功
if (uStrTest3.Buffer == NULL)
{
return;
}
// 为分配到的内存初始化
RtlZeroMemory(uStrTest3.Buffer,MAX_PATH * sizeof(WCHAR));
memcpy(uStrTest3.Buffer,L"Hello world",ulLength);
uStrTest3.Length = ulLength;
uStrTest3.MaximumLength = MAX_PATH * sizeof(WCHAR);