内核模式下的字符串操作

VOID StringTest()
{
	// ASCII 字符串
	CHAR* char1="Hello,World";
	KdPrint(("char1=%s\r\n",char1));

	// 宽字符字符串
	WCHAR* wchar1=L"Hello,World";
	KdPrint(("wchar1=%ws\r\n",wchar1));
	KdPrint(("wchar1=%S\r\n",wchar1));

	// 内核模式下的ANSI字符串
	ANSI_STRING ansistring;
 	RtlInitAnsiString(&ansistring,char1);
	KdPrint(("ansistring=%Z\r\n",&ansistring));
	KdPrint(("ansistring长度=%d",ansistring.Length));
	RtlInitAnsiString(&ansistring,"KERNEL");
	KdPrint(("ansistring=%Z\r\n",&ansistring));
	KdPrint(("ansistring长度=%d",ansistring.Length));

	// 内核模式下的UNICODE字符串
	UNICODE_STRING unicodestring;
	RtlInitUnicodeString(&unicodestring,wchar1);
	KdPrint(("unicodestring=%wZ\r\n",&unicodestring));
	KdPrint(("unicodestring.length=%d",unicodestring.Length));
	RtlInitUnicodeString(&unicodestring,L"KERNEL");
	KdPrint(("unicodestring=%wZ\r\n",&unicodestring));
	KdPrint(("unicodestring.length=%d",unicodestring.Length));

	// 内核模式下的ANSI字符串拷贝
	ANSI_STRING ansistring1;
	ansistring1.Length=0;
	ansistring1.Buffer=(CHAR*)ExAllocatePool(PagedPool,1024);
	ansistring1.MaximumLength=1024;
	KdPrint(("拷贝前ansistring1=%Z\r\n",&ansistring1));
	KdPrint(("拷贝前ansistring1.length=%d",ansistring1.Length));
	KdPrint(("拷贝前ansistring1.MaxLength=%d",ansistring1.MaximumLength));
 	RtlCopyString(&ansistring1,&ansistring);
 	KdPrint(("拷贝后ansistring1=%Z\r\n",&ansistring1));
 	KdPrint(("拷贝后ansistring1.length=%d",ansistring1.Length));
	KdPrint(("拷贝后ansistring1.MaxLength=%d",ansistring1.MaximumLength));
	RtlFreeAnsiString(&ansistring1);

	// 内核模式下的UNICODE字符串拷贝
	UNICODE_STRING unicodestring1;
	unicodestring1.Length=0;
	unicodestring1.MaximumLength=1024;
	unicodestring1.Buffer=(WCHAR*)ExAllocatePool(PagedPool,1024);
	KdPrint(("拷贝前unicodestring1=%wZ\r\n",&unicodestring1));
	KdPrint(("拷贝前unicodestring1.Length=%d\r\n",unicodestring1.Length));
	KdPrint(("拷贝前unicodestring1.MaximumLength=%d\r\n",unicodestring1.MaximumLength));
	RtlCopyUnicodeString(&unicodestring1,&unicodestring);
	KdPrint(("拷贝后unicodestring1=%wZ\r\n",&unicodestring1));
	KdPrint(("拷贝后unicodestring1.Length=%d\r\n",unicodestring1.Length));
	KdPrint(("拷贝后unicodestring1.MaximumLength=%d\r\n",unicodestring1.MaximumLength));
	RtlFreeUnicodeString(&unicodestring1);

	// 内核模式下的ANSI字符串比较
	ANSI_STRING ansistring2;
	RtlInitAnsiString(&ansistring2,"YJZ");
	LONG lRet=RtlCompareString(&ansistring,&ansistring2,TRUE);
	KdPrint(("ansistring=%Z\r\n",&ansistring));
	KdPrint(("ansistring2=%Z\r\n",&ansistring2));
	KdPrint(("比较结果=%d\r\n",lRet));	

	// 字符串转换为大写
	ANSI_STRING ansistr;
	RtlInitAnsiString(&ansistr,"Hello,World");
	ANSI_STRING ansistr1;
	ansistr1.MaximumLength=ansistr.Length;
	ansistr1.Buffer=(CHAR*)ExAllocatePool(PagedPool,ansistr1.MaximumLength);
	RtlUpperString(&ansistr1,&ansistr);
	KdPrint(("%Z转换为大写=%Z\r\n",&ansistr,&ansistr1));
	RtlFreeAnsiString(&ansistr1);
	UNICODE_STRING unicodestr,unicodestr1;
	RtlInitUnicodeString(&unicodestr,L"Hello,World");
	RtlUpcaseUnicodeString(&unicodestr1,&unicodestr,TRUE);
	KdPrint(("%wZ转换为大写=%wZ",&unicodestr,&unicodestr1));
	RtlFreeUnicodeString(&unicodestr1);

	// 字符串与整形转换
	UNICODE_STRING ustr;
	ULONG lValue=0;
	RtlInitUnicodeString(&ustr,L"-100");
	if (NT_SUCCESS(RtlUnicodeStringToInteger(&ustr,10,&lValue)))
	{
		KdPrint(("%wZ转换为整形后=%d\r\n",&ustr,lValue));
	}
	ustr.Buffer=(WCHAR*)ExAllocatePool(PagedPool,256);
	if (NT_SUCCESS(RtlIntegerToUnicodeString(200,10,&ustr)))
	{
		KdPrint(("%d转换为字符串之后=%wZ,长度=%d\r\n",200,&ustr,ustr.Length));
	}

	// ANSI_STRING 与UNICODE_STRING互相转换
	ANSI_STRING ansistr2;
	RtlInitAnsiString(&ansistr2,"Hello,World");
	UNICODE_STRING unicodestr2;
	if (NT_SUCCESS(RtlAnsiStringToUnicodeString(&unicodestr2,&ansistr2,TRUE)))
	{
		KdPrint(("AnsiString:%Z转换为UnicodeString后为:%wZ\r\n",&ansistr2,&unicodestr2));
		RtlFreeUnicodeString(&unicodestr2);
	}

	UNICODE_STRING ustr3;
	RtlInitUnicodeString(&ustr3,L"Hello,World");
	ANSI_STRING ansistr3;
	if (NT_SUCCESS(RtlUnicodeStringToAnsiString(&ansistr3,&ustr3,TRUE)))
	{
		KdPrint(("UNICODE_STRING:%wZ转换为ANSI_STRING之后=%Z\r\n",&ustr3,&ansistr3));
		RtlFreeAnsiString(&ansistr3);
	}

 转自  :http://blog.csdn.net/yjz1409276/article/details/7292501
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值