关闭

字符串拷贝,连接,打印

412人阅读 评论(0) 收藏 举报
分类:

1.字符串拷贝

UNICODE_STRING并不保证Buffer中的字符串是以空结束的。所以使用wcscpy来拷贝字符串是不行的。

UNICODE_STRING可以使用RtlCopyUnicodeString来进行拷贝。


UNICODE_STRING dst;//目标字符串

WCHAR dst_buf[256];

UNICODE_STRING SRC = =RTL_CONST_STRING(L"My Souce String!");


// The RtlInitEmptyUnicodeString macro initializes an empty counted Unicode string.

//把目标字符串初始化为拥有缓冲区长度为256的UNICODE_STRING空字符串

RtlInitEmptyString(dst, dst_buff, 256*sizeof(WCHAR));

RtlCopyUnicodeString(&dst, &src);


2.字符串连接

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

if(satrus != STATUS_SUCCESS)

{

... ...

}

另外一种情况是希望连接两个UNICODE_STRING,这种情况请调用RtlAppendUnicodeString。这个函数的第二个参数也是一个UNICODE_STRING的指针。


3.字符串打印

如果对C语言熟悉会使用sprintf,这个函数的宽字符版本为swprintf。该函数在驱动开发中依然可以使用,但不安全,为软建议使用

RtlStringCbPrintfW来代替它。RtlStringCbPrintfW需要包含头文件ntstrsafe.h,在连接的时候,还需要连接库ntsagestr.lib

status = RtlStringCbPrintfW(

dst->Buffer, 512*sizeof(WCHAR), L"filepath = %wz file size = %d \r\n",&file_path, file_size);

dst->Length = wcslen(dst->Buffer)*sizeof(WCHAR);


说明:UNICODE_STRING类似的指针,用%wz打印可以打印出字符串,在不能保证字符串为空字符串的时候,必须避免使用%ws后者s%。

            另外,常见的输出打印,printf函数只有在有控制台输出的情况下才有意义,在驱动中没有控制台,但是windows内核中拥有调试信息输出机制,可以使用winDbg查看打印的调试信息。

           驱动程序中可以使用DbgPrint函数来打印调试信息。这个函数的使用和printf基本相同,但是格式字符串要使用宽字符。DbgPrintf()的一个缺点在于,发行版本的驱动程序往往不希望附带任何输出信息,只有调试版才需要调试信息。但是DbgPrint()无论是发行版还是调试版编译都会有效,为此可以自己定义一个宏:

       #if DBG

             KdPrint(a) DbgPrint ##a

       #else

             KdPrint(a)

      #endif

     不过这样做的后果是,由于KdPrint只支持一个参数,因此必须把BbgPrint的所有参数都刮起来当做一个参数传入。

      status = KdPrint( (

                                          L"file path = %wZ file size = %d \r\n",

                                          &file_path, file_size));

    这个宏没有必要自己定义,WDK包中已有,所以   可以直接使用KdPrint来代替DbgPrint取得更方便的效果。

  

    



0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3058次
    • 积分:94
    • 等级:
    • 排名:千里之外
    • 原创:5篇
    • 转载:5篇
    • 译文:0篇
    • 评论:0条
    文章分类