Unicode字符串结构,一个字符为双字节,内核使用这个编码
typedef struct _UNICODE_STRING{
USHORT Length; //字符串长度
USHORT MaximumLength; 字符串缓冲区长度
PWSTR Buffer; //字符串缓冲区的指针,并不包含字符串缓冲的空间
} UNICODE_STRING, *PUNICODE_STRING;
ANSI字符串,需要窄字符串的场合使用,且很少见
typedef struct _STRING{
USHORT Length;
USHORT MaximumLength;
PSTR Buffer;
} ANSI_STRING, *PANSI_STRING;
字符串的初始化
UNICODE_STRING str = {0};
WCHAR strBuf[123] = {0};
str.Buffer = strBuf;
wcscpy(str.Buffer,L"my first string!");//拷贝字符串
str.Length = str.MaximumLength = wcslen(L"my first string!") * sizeof(WCHAR);
UNICODE_STRING str;
str.Buffer = L"my first string!";
str.Length = str.MaximumLength = wcslen(L"my first string!") * sizeof(WCHAR);
UNICODE_STRING str = {0};
RtlInitUnicodeString(&str,L"my first string!");
字符串拷贝
因为字符串不再是以空结束,所以不能使用 wcscpy 函数来拷贝字符串.
可以用 RtlCopyUnicodeString 来进行拷贝,但需要注意目标字符串的 Buffer 指向的缓冲区必须有足够的空间,否则会拷贝不完全.
UNICODE_STRING dst;//目标字符串
WCHAR dst_buf[256];//定义缓冲区,因为现在还不会分配内存
UNICODE_STRING src = RTL_CONSTANT_STRING(L"my source string!");//初始化常数字符串
RtlInitEmptyUnicodeString(&dst,dst_buf,256*sizeof(WCHAR));//把目标字符串初始化为拥有缓冲区长度为0的UNICODE_STRING空串,并没有拷贝任何内容.
RtlCopyUnicodeString(&dst,&src);//字符串拷贝
字符串连接
status = RtlAppendUnicodeToString(&目标字符串,L"需要添加的字符串");
需要保证目标字符串的空间大小
如果函数执行成功,则返回 STATUS_SUCCESS ,否则返回一个错误码,如果目标缓冲区大小不够,则返回 STATUS_BUFFER_TOO_SMALL
连接两个 UNICODE_STRING 使用 RtlAppendUnicodeStringToString(&目标UNICODE_STRING,&UNICODE_STRING指针);
字符串打印
status = RtlStringCbPrintfW(dst.Buffer,30,L"test code %d",66666);
对已初始化的 dst 的 Buffer 从新复制为第三个参数,且第二个参数必须要比第三个参数大2字节
通过此函数可以使用 wcslen(dst.Buffer)*sizeof(WCHAR) 因为字符串是以空结束的.
如果目标缓冲区不足,不足部分被截去,返回 STATUS_BUFFER_OVERFLOW ,可以增加缓冲区后再次尝试
DbgPrint()