内核模式下的字串操作

A、ASCII字符串和UNICODE字符串

 B、ANSI_STRING字符串和UNICODE_STRING字符串

 C字符串的初始化与销毁

 D字符串复制,比较,(大小写,整数和字串)相互转换

 E、ANSI_STRING字符串和UNICODE_STRING字符串相互转换

 

 A、ASNI字符串和UNICODE字符串

    在C语言中,有ANSI和UNICODE 两个不同字串类型。

    char* s1="abc";          //CHAR * s1="abc"; 61

    KdPrint(("%x,%s\n",s1,s1));

    wchar_t * s2=L"abc";     //WCHAR * s2=L"abc";00 61

    KdPrint(("%x,%S\n",s2,s2));

 B、ANSI_STRING字符串和UNICODE_STRING字符串

    在C语言中,传统的char和wchar_t类型的字符串在使用过程中,很容易出现缓冲区溢出错误,从而导致整个系统的崩溃。一般由于程序员没有对字串长度进行校验造成的。

    所以在DDK中 提供了2个带字串长度的类型 ANSI_STRING和UNICODE_STRING

   ANSI_STRING s1 ;        //CHAR Length MaxLength PCHAR

   KdPrint(("%x,%Z\n",s1,s1));

   UNICODE_STRING s2   //WCHAR * =PWSTR

   KdPrint(("%x,%wZ\n",s2,s2));

C字符串的初始化与销毁

在使用ANSI_STRING和UNICODE_STRING这2个类型的字串时都需要对其进行初始化 和销毁

RtlInitAnsiString  RtlInitString(&s1,"abc"); //%Z

RtlInitUnicodeString(&s2,L"abc");// %wZ

    AnsiString1.Buffer="AnsiString1字符串";

    AnsiString1.Length=strlen( AnsiString1.Buffer);

    AnsiString1.MaximumLength=BUFFER_SIZE;

         UnicodeString1.Buffer =  L"3333333333333333333322222222221111112";

         UnicodeString1.Length=wcslen(UnicodeString1.Buffer)*2;

         UnicodeString1.MaximumLength = BUFFER_SIZE;

D字符串复制比较,(大小写整数和字串相互转换

RtlFreeAnsiString

RtlFreeUnicodeString

RtlCopyUnicodeString

RtlEqualUnicodeString

RtlUpcaseUnicodeString

RtlUnicodeStringToInteger

RtlIntegerToUnicodeString

E、ANSI_STRING字符串和UNICODE_STRING字符串相互转换

RtlUnicodeStringToAnsiString

RtlAnsiStringToUnicodeString

//----------------------www.yjxsoft.com------------------郁金香灬技术

//文件名 "38.h"

#define BUFFER_SIZE 1024

#pragma INITCODE

VOID CharTest()

         KdPrint(("Char字串测试--Start \n"));

         PCHAR s1="abc11";        //CHAR ANSI

         KdPrint(("%x,%s\n",s1,s1));

         PWSTR s2=L"abc11";     //WCHAR UNICODE //PWSTR

         KdPrint(("%x,%S\n",s2,s2));

         KdPrint(("Char字串测试--End \n"));

         _asm int 3

}

//ANSI_STRING

//UNICODE_STRING

//字符串初始化测试

#pragma INITCODE

VOID StringInitTest()

{

         KdPrint(("初始化字串测试--Start \n"));

   ANSI_STRING  AnsiString1={0};

   UNICODE_STRING UnicodeString1={0};

        

    AnsiString1.Buffer="AnsiString1字符串";

    AnsiString1.Length=strlen( AnsiString1.Buffer);

    AnsiString1.MaximumLength=BUFFER_SIZE;

         UnicodeString1.Buffer =  L"3333333333333333333322222222221111112";

         UnicodeString1.Length=wcslen(UnicodeString1.Buffer)*2;

         UnicodeString1.MaximumLength = BUFFER_SIZE;

   //方法2 RTL函数初始化

         //初始化ANSI_STRING字符串

         //RtlInitAnsiString(&AnsiString1,"AnsiString1字符串"); 

         //RtlInitUnicodeString(&UnicodeString1,L"3333333333333333333322222222221111112");

         //打印ASCII字符用 %Z

         KdPrint(("%x AnsiString1:   %Z\n",&AnsiString1,   &AnsiString1));

         //打印UNICODE字符用 %wZ 中文字符会被截断

         KdPrint(("%x UnicodeString1:%wZ\n",&UnicodeString1,&UnicodeString1));

         KdPrint(("初始化字串测试--END \n"));

         __asm int 3

}//D、字符串复制,比较,(大小写,整数和字串)相互转换

#pragma INITCODE

VOID StringCopyTest()

{

         KdPrint(("-------------------字串复制测试开始---------------D \n"));

         //初始化UnicodeString1

         UNICODE_STRING UnicodeString1;

         RtlInitUnicodeString(&UnicodeString1,L"UnicodeString1");

         //初始化UnicodeString2

         UNICODE_STRING UnicodeString2={0};

         UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);

         UnicodeString2.MaximumLength = BUFFER_SIZE;

         //将初始化UnicodeString1拷贝到UnicodeString2

         RtlCopyUnicodeString(&UnicodeString2,&UnicodeString1);

 

         //分别显示UnicodeString1UnicodeString2

         KdPrint(("字串1:%wZ\n",&UnicodeString1));

         KdPrint(("字串2:%wZ\n",&UnicodeString2));

 

         //销毁UnicodeString2

         //注意!调用过RtlInitUnicodeString 初始化的字串!UnicodeString1不用销毁,

         //RtlFreeUnicodeString(&UnicodeString1); 加上此行会蓝屏

         RtlFreeUnicodeString(&UnicodeString2);

         KdPrint(("-------------------字串复制测试结束--------------- \n"));

}

 

//字符串比较测试

#pragma INITCODE

VOID StringCompareTest()

KdPrint(("\n-------------------字串比较测试 开始--------------- \n"));

//初始化UnicodeString1

UNICODE_STRING UnicodeString1;

RtlInitUnicodeString(&UnicodeString1,L"UnicodeString1");

//初始化UnicodeString2

UNICODE_STRING UnicodeString2;

RtlInitUnicodeString(&UnicodeString2,L"UnicodeString2");

KdPrint(("%wZ 和,%wZ",&UnicodeString1,&UnicodeString2));

if (RtlEqualUnicodeString(&UnicodeString1,&UnicodeString2,TRUE)) //第三个参数 表示区分大小写

{

         KdPrint(("UnicodeString1 和 UnicodeString2  相等\n"));

}else

{

         KdPrint(("UnicodeString1 和 UnicodeString2 不相等\n"));

}

KdPrint(("\n-------------------字串比较测试 结束--------------- \n"));

}

//字符串变大写测试

#pragma INITCODE

VOID StringToUpperTest()

         KdPrint(("\n-------------------字串转大写测试 开始--------------- \n"));

         //初始化UnicodeString1

         UNICODE_STRING UnicodeString1;

         RtlInitUnicodeString(&UnicodeString1,L"UnicodeString1—Aabc");

 

         //变化前

         KdPrint(("UnicodeString1 初值:%wZ\n",&UnicodeString1));

         //变大写

         RtlUpcaseUnicodeString(&UnicodeString1,&UnicodeString1,FALSE);

         //变化后

         KdPrint(("UnicodeString1 转换大写后:%wZ\n",&UnicodeString1));

         KdPrint(("\n-------------------字串转大写测试 结束--------------- \n"));

}

 

//字符串与整型相互转化测试

#pragma INITCODE

VOID StringToIntegerTest()

{  

         KdPrint(("\n-------------------字串转整数测试 开始--------------- \n"));

         //(1)字符串转换成数字

         //初始化UnicodeString1

         UNICODE_STRING UnicodeString1;

         RtlInitUnicodeString(&UnicodeString1,L"-100");

 

         ULONG lNumber;

         KdPrint(("待转换字串%wZ \n",&UnicodeString1));

         NTSTATUS nStatus = RtlUnicodeStringToInteger(&UnicodeString1,10,&lNumber);

         if ( NT_SUCCESS(nStatus))

         {

                   KdPrint(("转换整数成功 结果=%d !\n",lNumber));

         }else

         {

                   KdPrint(("转换整数 失败\n"));

         }

 

         //(2)数字转换成字符串

         //初始化UnicodeString2

         UNICODE_STRING UnicodeString2={0};

         UnicodeString2.Buffer = (PWSTR)ExAllocatePool(PagedPool,BUFFER_SIZE);

         UnicodeString2.MaximumLength = BUFFER_SIZE;

         nStatus = RtlIntegerToUnicodeString(200,10,&UnicodeString2);

         if ( NT_SUCCESS(nStatus))

         {

                   KdPrint(("转换字串成功! 结果:%wZ\n",&UnicodeString2));

         }else

         {

                   KdPrint(("转换字串 失败!\n"));

         }

 

         //销毁UnicodeString2

         //注意!调用过RtlInitUnicodeString 初始化的字串!UnicodeString1不用销毁,

         //RtlFreeUnicodeString(&UnicodeString1); 加上此行会蓝屏

         RtlFreeUnicodeString(&UnicodeString2);

         KdPrint(("\n-------------------字串转整数测试 结束--------------- \n"));

}

//EANSI_STRING字符串和UNICODE_STRING字符串相互转换

 

//ANSI_STRING字符串与UNICODE_STRING字符串相互转换测试

#pragma INITCODE

VOID StringConverTest()

         KdPrint(("\n-------------------ANSI_STRING字符串与UNICODE_STRING字符串相互转换测试 开始--------------- \n"));

         //(1)UNICODE_STRING字符串转换成ANSI_STRING字符串

         //初始化UnicodeString1

         UNICODE_STRING UnicodeString1;

         RtlInitUnicodeString(&UnicodeString1,L"UnicodeString1");

 

         ANSI_STRING AnsiString1;

         NTSTATUS nStatus = RtlUnicodeStringToAnsiString(&AnsiString1,&UnicodeString1,TRUE);

 

         if ( NT_SUCCESS(nStatus))

         {

                   KdPrint(("RtlUnicodeStringToAnsiString 转换成功 结果=%Z\n",&AnsiString1));

         }else

         {

                   KdPrint(("RtlAnsiStringToUnicodeString 转换失败 !\n"));

         }

         //销毁AnsiString1

         RtlFreeAnsiString(&AnsiString1);

         //(2)ANSI_STRING字符串转换成UNICODE_STRING字符串

         //初始化AnsiString2

         ANSI_STRING AnsiString2;

         RtlInitString(&AnsiString2,"AnsiString2");

         UNICODE_STRING UnicodeString2;

         nStatus = RtlAnsiStringToUnicodeString(&UnicodeString2,&AnsiString2,TRUE);

         if ( NT_SUCCESS(nStatus))

         {

                   KdPrint(("RtlAnsiStringToUnicodeString转换成功 结果=%wZ\n",&UnicodeString2));

         }else

         {

                   KdPrint(("RtlAnsiStringToUnicodeString字串转换失败!\n"));

         }

         //销毁UnicodeString2

         RtlFreeUnicodeString(&UnicodeString2);

         KdPrint(("\n-------------------ANSI_STRING字符串与UNICODE_STRING字符串相互转换测试 结束--------------- \n"));

}

         VOID StringTestAll()

         {    //Char类字符串测试

          CharTest();

         //字串初始化测试

                   StringInitTest();

                   //字符串拷贝测试

                   StringCopyTest();

                   //字符串比较测试

                   StringCompareTest();

                   //字符串变大写测试

                   StringToUpperTest();

                   //字符串与整型相互转化测试

                   StringToIntegerTest();

                   //ANSI_STRING字符串与UNICODE_STRING字符串相互转换测试

                   StringConverTest();

         }

猜你喜欢

转载自blog.csdn.net/zang141588761/article/details/82872383