美文网首页
UNICODE_STRING基础

UNICODE_STRING基础

作者: Mon7ey | 来源:发表于2017-09-13 09:13 被阅读31次

    在内核中使用的字符串是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);
    

    常用API

    相关文章

      网友评论

          本文标题:UNICODE_STRING基础

          本文链接:https://www.haomeiwen.com/subject/qlmcsxtx.html