1) RtlDowncaseUnicodeString
这个函数可以将UNICODE_STRING类型的字符串全部转为小写字符,比较坑的是,转换后的字符串长度,并不带NULL结束符。
使用以下代码进行测试
UNICODE_STRING usName = { 0 };
RtlInitUnicodeString(&usName, L"test");
// 转为小写字符串
UNICODE_STRING usNameDownCase = { 0 };
RtlDowncaseUnicodeString(&usNameDownCase, &usName, TRUE);
RtlFreeUnicodeString(&usNameDownCase);
可以看到,一个正常的UNICODE_STRING类型的字符串在内存中是什么样的:
- Length 代表字符串所占大小,不带NULL结束符
- MaximumLength 代表字符串+结束符所占大小
- Buffer 字符串内容+结束符
所以正常情况下,MaximumLength比Length多2个字节,

当运行过RtlDowncaseUnicodeString后,这个函数内部为我们创建了一个UNICODE_STRING的字符串,
这个字符串的Length和MaximumLength是一样的,都是字符串所占大小(不含结束符),所以我们可以看到Buffer部分多出了3个问号,是因为没有结束符导致的。

这个就比较坑了!!这种情况下,如果再使用_wcsicmp进行字符串比较时,就会影响到结果。
但是使用RtlCompareUnicodeString不会影响结果。

本文深入探讨Windows内核API RtlDowncaseUnicodeString的功能,解析其将UNICODE_STRING类型字符串转换为小写的过程及注意事项。文章指出,转换后的字符串长度不包含NULL结束符,这可能影响字符串比较操作,但RtlCompareUnicodeString不受此影响。
5万+

被折叠的 条评论
为什么被折叠?



