空结尾的字符串,你可以用普通的 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 阅读(3225)
评论(0) 编辑 收藏 引用