3.1内核字符串操作

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()

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容