随笔-60  评论-262  文章-1  trackbacks-0
空结尾的字符串,你可以用普通的 C 语法表示字符串常量
1) DbgPrint(“Hello World!”); //直接打印字符串。
2) char variable_string[] = “Hello World”;
   DbgPrint(“%s”,variable_string);

空结尾的宽字符串(WCHAR类型)
WCHAR    string_w[] = L“Hello World!”;
DbgPrint(“%ws”,string_w);

Unicode 串,由 UNICODE_STRING 结构描述, 包含 16 位字符.
typedef   struct _UNICODE_STRING {
       USHORT Length;
       USHORT MaximumLength;
      PWSTR   Buffer;
}UNICODE_STRING , *PUNICODE_STRING;

UNICODE_STRING    string_unicode = L”Hello World!”;
DbgPrint(“%ws\n”,string_unicode.Buffer);     

ANSI 串,由ANSI_STRING结构描述,包含8位字符。

typedef struct _STRING{
     USHORT Length;
     USHORT MaximumLength;
     PCHAR   Buffer;
}STRING, *PANSI_STRING;

STRING bar;
或者:ANSI_STRING bar;
RtlInitAnsiString(&bar, ”Hello World!”);
DbgPrint(“%s\n”, bar.Buffer);

分配和释放字符串缓冲区
RtlInitAnsiString 函数初始化 ANSI_STRING 字符串。
RtlInitUnicodeString 函数初始化 UNICODE_STRING 字符串。
RtlAnsiStringToUnicodeString 函数把 ANSI_STRING 转化成 UNICODE_STRING。
RtlFreeUnicodeString 函数释放给字符串动态分配的内存。

RtlInitAnsiString 和 RtlInitUnicodeString 初始化时不分配内存。不能使用 RtlFreeUnicodeString 函数. ANSI_STRING 和 UNICODE_STRING 中的 Buffer 指向一个字符串常量,当调用 RtlFreeUnicodeString 时字符串常量占用的地址被释放。所以产生错误。

RtlAnsiStringToUnicodeString 函数被调用时,将为目标变量分配内存。所以在不使用该变量时要用 RtlFreeUnicodeString 函数释放内存,以免内存泄漏。

例:
UNICODE_STRING string_unicode;
ANSI_STRING   string_ansi;
RtlInitUnicodeString(&string_unicode,L”Hello World!”);//不用释放内存
RtlInitAnsiString(&string_ansi,”Hello World!”);
RtlAnsiStringToUnicodeString(&string_unicode,&string_ansi,TRUE);//需要释放内存。
RtlFreeUnicodeString(&string_unicode); // 释放动态分配的内存。

DbgPrint 格式说明符
------------------------------------------------
符号   格式说明符     类型
------------------------------------------------
%c   ANSI字符     char
%C   宽字符      wchar_t
%d,%i   十进制有符号整数    int
%D   十进制_int64     _int64
%I   IRP主功能代码和次功能代码   PIRP
%L   十六进制的LARGE_INTEGER    LARGE_INTEGER
%s   NULL终止的ANSI字符串    char*
%S   NULL终止的宽字符串    wchar_t*
%T   UNICODE_STRING     PUNICODE_STRING
%u   十进制的ULONG     ULONG
%x   十六进制的ULONG     ULONG


posted on 2009-07-17 10:46 free2000fly 阅读(2831) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理