Rtl系列函数学习记录

来源:互联网 发布:淘宝的淘话费 编辑:程序博客网 时间:2024/05/11 03:16

参考教程:谭文的《Windows驱动编程基础教程》

附:这本书真的不错,支持一下作者,不过可能是WDK版本不同或是作者笔误,学习的结果与教程有些出入,另外文章部分是本人学习过程中的理解,可能会有错误。

 

1.环境说明,要先装WDK或DDK,引用头文件:ntddk.h,ntdef.h,引用库文件:ntdll.lib。

 

2.RTL_CONSTANT_STRING

         这个是初始化unicode串的宏,只能用在串定义的时候,如下:

                  UNICODE_STRING str = RTL_CONSTANT_STRING(L“my first string!”);

         像下面这样的用法是不可以的:

                 UNICODE_STRING str;

                 str= RTL_CONSTANT_STRING(L“my first string!”);

 

3.RtlInitEmptyUnicodeString

        这是对UNICODE_STRING进行初始化的函数,引用方法如下:

                 UNICODE_STRING dst;   // 目标字符串

                 WCHAR dst_buf[50];

                 RtlInitEmptyUnicodeString(&dst,dst_buf,50*sizeof(WCHAR));

                 函数运行前:dst.Buffer=0xCCCCCCC(int 3中断),dst.Length=dst.MaximumLength=一个比较大的数

                 函数运行后:dst.Buffer=&dst_buf, dst.Length=0,dst.MaximumLength=100(50*2).

 

4.RtlCopyUnicodeString

        字符串拷贝,用法如下:

                RtlCopyUnicodeString(&dst,&src);

        这个函数有几点要注意:

               src需要初始化,否则会引起读'CCCCCCCC'中断;

               dst也需要初始化,否则会引起写'CCCCCCCC'中断;

               该函数拷贝前未进行长度校验,如果dst.MaximumLength<=src.Length也会引发中断,至少需要大一个unicode字符长即2,否则字符是0xCCCC结束,而正常应该是0x0000;

               如果像上面那样用RtlInitEmptyUnicodeString(&dst,dst_buf,50*sizeof(WCHAR))初始化dst,那么dst_buf在定义时长度至少要比src.Length大1(字符串最后一个为空),否则会报一个dst_buf corrupted的错误。

 

5.RtlAppendUnicodeToString

         字符串连接,用法如下:

               RtlAppendUnicodeToString(&dst,L"my second string!");

         说明:此函数在连接字串前会进行空间长度校验,不足则不进行字符串连接。        

 

6.RtlStringCbPrintfW

        注: 此函数需在驱动环境下运行,Alt+F12查看函数的定义,引用方法如下:

             status=RtlStringCbPrintfW(dst.Buffer,30,L"test code");

        说明:调用此函数要先对dst进行初始化,函数调用的结果是,无论dst.Buffer之前是什么值,都重新赋成第三个参数的值,并且第二个参数至少要比第三个参数的长度(按字节算)大2(即1个unicode字符长),执行成功后status会返回0。

 

补充学习:UNICODE_STRING并不保证Buffer中的字符串是以空结束的,因此直接调用wcslen(str.Buffer),printf("%ws",str.Buffer)可能会引发错误。 

 

 

 

 

 

原创粉丝点击