3.1.2 字符串的初始化
UNICODE_STRING只含有一个指针,并没有字符串缓冲空间,下面的用法把str.Buffer传递给wcscpy作为目标缓冲区,会引发空指针异常
//把str变量清空
UNICODE_STRING str = {0};
//试图把字符串拷贝到新定义的字符串结构里面
wcscpy(str.Buffer,L"my first string!");
初始化UNICODE_STRING变量的正确例子
1.正确的做法是为str.Buffer指定缓冲区,例如
UNICODE_STRING str = {0};
WCHAR strBuf[128] = {0};
str.Buffer = strBuf;
wcscpy(str.Buffer,L"my first dstring!");
str.Length = str.MaxinumLength = wcslen(L"my first string")*sizeof(WCHAR);
2.这个下面的方法也是对的
UNICODE_STRING str;
str.Buffer = L"my first string !";
str.Length = str.MaxinumLength = wcslen(L"my first string")*sizeof(WCHAR);
3.用RTL函数初始化超级简单
UNICODE_STRING str = {0};
RtlInitUnicodeString(&str,L"my first string!");
3.1.2 字符串的拷贝
//目标字符串
UNICODE_STRING dst;
//定义缓冲区(暂时先不分配内存)
WCHAR dst_buf[256];
//这是个初始化常数字符串常用的宏
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my source string!");
//把目标字符串初始化为拥有缓冲区长度为256的unicode_string空串(新书上写错了,写成长度为0了,老书天书夜读上面是对的
)
RtlInitEmptyUnicodeString(&dst,dst_buf,256*sizeof(WCHAR));
//拷贝字符串
RtlCopyUnicodeString(&sat,&src);
3.1.3 字符串的连接
NTSTATUS status;
//目标字符串
UNICODE_STRING dst;
//定义缓冲区(暂时先不分配内存)
WCHAR dst_buf[256];
//这是个初始化常数字符串常用的宏
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my source string!");
//把目标字符串初始化为拥有缓冲区长度为256的unicode_string空串(新书上写错了,写成长度为0了,老书天书夜读上面是对的
)
RtlInitEmptyUnicodeString(&dst,dst_buf,256*sizeof(WCHAR));
//拷贝字符串
RtlCopyUnicodeString(&sat,&src);
status = RtlAppendUnicodeToString(
&dst,L"my second string!");
3.1.3 字符串的打印
//生成包含文件大小和路径的字符串
#include <ntstrsafe.h>
//文件路径长度不设限,应该动态分配内存,还不会分配内存,暂时用把内存空间定义在局部变量的方式代替
WCHAR dst_buf[512] = {0};
UNICODE_STRING dst;
NTSTATUS status;
UNICODE_STRING file_path=RTL_CONSTANT_STRING(L"\\??\\c:\\winddk\\7600.16385.1\\inc\\cifs.h");
USHORT file_size=1024;
//初始化一个空字符串,缓冲区长度为*sizeof(WCHAR)
RtlInitEmptyUnicodeString(&dst,dst_buf,521*sizeof());
//调用RtlStringCbprintfw打印
status = RtlStringCbPrintfw(dst.Buffer,512*sizeof(WCHAR),L"file path = %wZ file size = %d \r\n",&file_pathe,file_size);
dst.Length = wcslen(dst.Buffer)*sizeof(WCHAR);