内核模式下的字符串操作
2012-02-25 00:27
411 查看
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); }
相关文章推荐
- 《Windows内核编程》---内核模式下字符串的基本操作
- Windows驱动开发(3) - 内核模式下的字符串操作
- 内核模式下的字符串操作
- 内核模式下的字符串操作
- 内核模式下的字符串操作
- 内核模式下的字符串操作
- 《Windows内核编程》---内核模式下字符串的基本操作
- 《Windows内核编程》---内核模式下字符串的基本操作
- 内核模式下的字符串操作示例
- 3.1 内核模式下的字符串操作
- 【WindowsDDK】内核字符串操作蓝屏的一个解决办法
- Linux操作系统 内核工作队列的操作模式
- Windows内核字符串的操作(基础,但是很重要)
- Windows驱动开发(4) - 内核模式下的文件操作
- Windows内核函数(2) - 内核模式下的文件操作
- 字符串的基本操作和模式匹配
- 内核模式下的文件操作_zwcreatefile_zwopenfile_zwreadfile_zwwritefile
- 内核模式下的文件操作
- Windows内核函数(3) - 内核模式下的注册表操作
- 内核模式下的字符串