DbgPrint 输出

1) 直接打印字符串。
DbgPrint(“Hello World!”);

2) 空结尾的字符串,你可以用普通得C语法表示字符串常量
char variable_string[]  =  “Hello World”;
DbgPrint(“%s”, variable_string);

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

或者

DbgPrint(“%S”, string_w);

4)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(“%wZ\n”,  &string_unicode);

5) 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(“%wZ\n”, &bar);

DebugPrint格式说明符

符号                                  格式说明符                                         类型

%c, %lc                            ANSI字符                                             char

%C, %wc                          宽字符                                                  wchar_t

%d, %i                             十进制有符号整数                                  int

%D                                   十进制_int64                                      _int64

%L                                   十六进制的LARGE_INTEGER             LARGE_INTEGER

%s, %ls                            NULL终止的ANSI字符串                       char*

%S, %ws                         NULL终止的宽字符串                           wchar_t*

%Z                                  ANSI_STRING字符串

%wZ                               UNICODE_STRING字符串

%u                                  十进制的ULONG                                    ULONG

%x                                 小写字符十六进制的ULONG                    ULONG

%X                                 大写字符十六进制的ULONG                    ULONG

%p                                 指针Pointer 32/64位

根据DDK上说明,Unicode格式(%C, %S, %lc, %ls, %wc, %ws, and %wZ)只能在 IRQL = PASSIVE_LEVEL时才能使用.

在Vista下模式DbgPrint的输出信息是无法输出到WinDbg中的,这是因为Vista下引入了新的函数DbgPrintEx (DbgPrint实际上调用这个函数),这个函数可以控制输出的Level(这下不用自己做这样的工作了)。但是默认的,Vista下DbgPrint 输出的信息在WinDBG中是无法生效的。可以按一下方法来使它生效:

打开注册表到这个路径:HKLM\SYSTEM\CCS\Control\Session Manager\Debug Print Filter
修改Default值为0F,重启即可。

===========================================================

在C/C++中,64为整型一直是一种没有确定规范的数据类型。现今主流的编译器中,对64为整型的支持也是标准不一,形态各异。一般来说,64位整型的定义方式有long long和__int64两种(VC还支持_int64),而输出到标准输出方式有printf(“%lld”,a),printf(“%I64d”,a),和cout << a三种方式。

本文讨论的是五种常用的C/C++编译器对64位整型的支持,这五种编译器分别是gcc(mingw32),g++(mingw32),gcc(linux i386),g++(linux i386),Microsoft Visual C++ 6.0。可惜的是,没有一种定义和输出方式组合,同时兼容这五种编译器。为彻底弄清不同编译器对64位整型,我写了程序对它们进行了评测,结果如下表。

变量定义 输出方式 gcc(mingw32) g++(mingw32) gcc(linux i386) g++(linux i386) MicrosoftVisual C++ 6.0
long long “%lld” 错误 错误 正确 正确 无法编译
long long “%I64d” 正确 正确 错误 错误 无法编译
__int64 “lld” 错误 错误 无法编译 无法编译 错误
__int64 “%I64d” 正确 正确 无法编译 无法编译 正确
long long cout 非C++ 正确 非C++ 正确 无法编译
__int64 cout 非C++ 正确 非C++ 无法编译 无法编译
long long printint64() 正确 正确 正确 正确 无法编译

上表中,正确指编译通过,运行完全正确;错误指编译虽然通过,但运行结果有误;无法编译指编译器根本不能编译完成。观察上表,我们可以发现以下几点:

  1. long long定义方式可以用于gcc/g++,不受平台限制,但不能用于VC6.0。
  2. __int64是Win32平台编译器64位长整型的定义方式,不能用于Linux。
  3. “%lld”用于Linux i386平台编译器,”%I64d”用于Win32平台编译器。
  4. cout只能用于C++编译,在VC6.0中,cout不支持64位长整型。

表中最后一行输出方式中的printint64()是我自己写的一个函数,可以看出,它的兼容性要好于其他所有的输出方式,它是一段这样的代码:

CPP
void printint64(long long a)
{
if (a<=100000000)
printf("%d\n",a);
else
{
printf("%d",a/100000000);
printf("d\n",a0000000);
}
}

这种写法的本质是把较大的64位整型拆分为两个32位整型,然后依次输出,低位的部分要补0。看似很笨的写法,效果如何?我把它和cout输出方式做了比较,因为它和cout都是C++支持跨平台的。首先printint64()和cout(不清空缓冲区)的运行结果是完全相同的,不会出现错误。我的试验是分别用两者输出1000000个随机数,实际结果是,printint64()在1.5s内跑完了程序,而cout需要2s。cout要稍慢一些,所以在输出大量数据时,要尽量避免使用。

//

d,lx,ld,,lu,这几个都是输出32位的
hd,hx,hu,这几个都是输出16位数据的
hhd,hhx,hhu,这几个都是输出8位的
lld,ll,llu,llx,这几个都是输出64位的

%llu是64位无符号
%llx才是64位16进制数

按照frm 字符串中的格式说明符输出格式化文本格式说明符是标准格式的一个子集
%d--输出有符号十进制整数
%o --输出无符号八进制整数
%x - 输出无符号十六进制整数
%X –除了大写字母使用'A'-'F'外同 %x
%u - 输出无符号十进制整数
%s – 输出一个以C 中空字符NULL 结束的字符串
%c – 以 ASCII 字符形式输出只输出一个字符
%f – 以小数形式输出浮点数
%S – 输出在FLASH 存贮器中的字符串常量
如果在% 和o 或x 之间指定有一个字符那么就会在开头分别打印0 或
0x 如果在%和一个整数格式字符之间指定有一个l (字母l)字符则输出长整型整数
而不是整型整数
三个版本中支持printf 取决于你的需要和代码的大小要求越高代码越大
基本形: 只支持不带修饰符的 %c, %d, %x, %u, 和 %s 格式说明符
长整形: 支持长整形数修饰符 %ld, %lu, %lx 和 宽度及精度 修饰符
浮点形: 支持全部格式包括%f
%c ANSI字符 char
%C 宽字符 wchar_t
%d,%i 十进制有符号整数 int
%D 十进制__int64 __int64
%I IRP主功能代码和次功能代码 PIRP
%l 十六进制的__int64 __int64
%L 十六进制的LARGE_INTEGER LARGE_INTEGER
%s NULL终止的ANSI字符串 char *
%S NULL终止的宽字符串 wchar_t *
%T UNICODE_STRING PUNICODE_STRING
%u 十进制的ULONG ULONG
%x 十六进制的ULONG ULONG

DbgPrint输出 格式 %ws %wZ %p相关推荐

  1. Windbg下无法显示dbgPrint输出的信息

    Windbg下无法显示dbgPrint输出的信息 http://blog.csdn.net/happy987818/article/details/50516236 刚开始使用Windbg进行内核驱动 ...

  2. linux 终端控制-- 多彩输出 格式排版

    linux 终端控制-- 多彩输出 格式排版 在unix/linux的终端下,怎么控制终端输出的颜色和格式呢,当然了有专门的工具,tput,但是能被terminal直接读懂的格式化字符串更通用. 先来 ...

  3. win2003下面显示dbgprint的输出内容

    大家都知道 driver studio 带一个 drivermonitor 的工具,能显示程序里面由 dbgprint 输出的字符串,这里说说他的工作原理,本人也是初学者,不对的地方,请指教. 先说自 ...

  4. DbgPrint 函数流程分析

    DbgPrint 函数流程分析 前言 Windows 下编写内核驱动时经常用到 DbgPrint 函数输出一些调试信息,用来辅助调试.当正在用 WinDbg 内核调试时,调试信息会输出到 WinDbg ...

  5. Win7下使用DbgPrint

    在Win7下默认DbgPrint输出信息后,使用DbgView看不到内容. 新建一个reg文件,双击导出就行了. Windows Registry Editor Version 5.00 [HKEY_ ...

  6. 关于printf输出 格式化规定符 的

    又是一篇做备忘的文档,从网上转了3篇来,可以够详细得说明这个问题了: ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~1~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ...

  7. python 0 100被7整除_python: 输出 1~100 之间不能被 7 整除的数,每行输出 10 个数字,要求应用字符串格式化方法美化输出格式。...

    #输出 1~100 之间不能被 7 整除的数 j = 0    # 定义 计数变量为 j,初始值为1 for i in range(1,101):    # 遍历1-100取值,定义为变量 i if ...

  8. 用python处理excel的基本语法_Python操作Excel学习笔记(28):条件格式

    excelperfect Excel支持3种不同类型的条件格式:内置.标准和自定义.内置条件格式将特定规则与预定义样式相组合.标准条件格式将特定规则与自定义格式相组合.此外,可以定义自定义公式来应用使 ...

  9. cdr存成html格式的文件格式,CDR必备!CDR保存与各种格式之间转换!-cdr文件用什么打开...

    cdr功能毋庸置疑的强悍.只要发挥得当工资与地位自然是会让你得到你想要的.但在新手操作的时候总会出现这些或者那些一些问题,下面咱们就来总结一下cdr的打开方式与各种格式之间的转换吧! 一.cdr文件打 ...

  10. c语言浮点数能用八进制输出不,深析C语言浮点型数据的输入输出

    方星星 吕永强 摘  要 C语言的基本数据类型分为:整型.字符型和浮点型,大多C语言教材都概括了整型和字符型数据的编码及输入输出,但并未详细介绍浮点型数据的编码及输入输出,这导致很多学生不能灵活运用这 ...

最新文章

  1. SQL repeat()函数
  2. linux如何查看归档文件,linux基本命令:文本搜索,拷贝文件,移动文件,归档管理,压缩解压缩文件,查看命令位置...
  3. 文档null一段 虚拟机操作
  4. JEECG第17期架构培训班15号开班啦!每期十个名额,想报名的抓紧时间啦!
  5. 【sklearn第二十五讲】交叉验证
  6. php mysql pod_php – 连接到同一pod中的MySQL容器
  7. 请问如何查一篇外文文献的DOI号?
  8. Termux-API 使用教程,很多坑,电量,设备信息
  9. 常用链接cg 和game
  10. python不能复制粘贴_python 复制与粘贴处理笔记
  11. 基于声网 iOS SDK 实现视频直播应用
  12. 【转载】Ajax调用Wcf服务
  13. Failed to convert value of type 'java.lang.String' to required type 'java.util.Date
  14. 电影成O2O圈地利刃 百度糯米影业进入加速快车道
  15. Linux性能分析工具
  16. 谈一谈Coders Programmer Developer的区别
  17. IDL图像可视化(八)
  18. 2022年智能家居十大预测新鲜出炉:全屋智能驶入快车道?健身镜成新宠……
  19. 北京市政交通一卡通系统的应用情况研究
  20. 根据传入日期 往前或者往后 顺延月份

热门文章

  1. 看我简单教会你如何按关键字搜索淘宝商品
  2. C语言:寻找重复数字
  3. Metasploit -- 渗透攻击模块(exploit)
  4. python实现列主元消去法解线性方程组
  5. ​2021年度学习清单
  6. STR鉴定原理、流程已经报告数据解读指南
  7. 普通上班族如何快速买房买车,一个程序员摸索的实操经验分享
  8. 蓝桥杯 ALGO-45算法训练 调和数列问题
  9. HTML记事本滚动字幕怎么弄,滚动字幕怎么用word做 如何用WORD制作滚动字幕
  10. 新库上线 | CnOpenDataA股上市公司裁判文书数据