内核字符串操作遇到的一些坑

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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不会影响结果。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值