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不会影响结果。