开发驱动时用到的内核打印函数KdPrint 的使用方法
来源:互联网 发布:房产网站源码 php 编辑:程序博客网 时间:2024/05/22 09:29
转载自: http://blog.csdn.net/wjcsharp/article/details/6161712
DbgPrint会发送一个消息给内核调试器。
DbgPrint and DbgPrintEx can be called at IRQL<=DIRQL. However, Unicode format codes (%wc and %ws) can be used only at IRQL PASSIVE_LEVEL. Also, because the debugger uses interprocess interrupts (IPIs) to communicate with other processors, callingDbgPrint at IRQL>DIRQL can cause deadlocks.
仅能在内核模式下使用DbgPrint函数。如果想在用户模式下使用打印到windbg上查看,得用OutPutDebugString。
In Windows Vista and later versions of Windows, DbgPrint sends a message only if certain conditions apply. Specifically, it behaves like theDbgPrintEx routine with the DEFAULT component and a message importance level of DPFLTR_INFO_LEVEL. In other words, the following two function calls are identical:
KdPrint使用方法类似printf,注意KdPrint((" ", ));使用的是双括号。
用KdPrint(())来代替printf 输出信息。这些信息可以在DbgView 中看到。KdPrint(())自身是一个宏,
为了完整传入参数所以使用了两重括弧。这个比DbgPrint 调用要稍好。因为在free 版不被编译。
DebugPrint格式说明符
二、
几天一直在做那些无聊的实验,把驱动的学习耽误到现在。幸好,把那些无聊的实验写完。
话说回来,驱动编程真的比在RING3下麻烦很多呢,在字符串的使用都需要做很多的初始化,搞到我头都大了,如果是用C就很好理解,但是我用的是汇编~~~。今天,就看了看关于DbgPrint的用法,顺便做点笔记。
DbgPrintf,是输出Debug信息的,用法跟printf,sprintf,wsprintf类似。
ULONG DbgPrint( IN PCHAR Format, . . . . [arguments] );
1、直接输出字符串,输出的字符串是以NULL结尾的字符串(CHAR类型),如:
invoke DbgPrint,$CTA0("the Driver has loaded.")
2、指定格式输出字符串,输出得字符串可以是以NULL结尾的ASNI字符串,也可以是宽字符串(WCHAR类型),如:
invoke DbgPrint,$CTA0("%s"),$CTA0("The Driver has Unloaded.") ;输出ASNI字符串 invoke DbgPrint,$CTA0("%ws"),$CTW0("The Driver has Unloaded.") ;输出wchar类型字符串 invoke DbgPrint,$CTA0("%S"),$CTW0("The Driver has Unloaded.") ;输出wchar类型字符串(注意是大写的S)
3、UNICODE_STRING结构的串的输出,如:
ucstShow UNICODE_STRING <?> ;定义一个UNICODE_STRING的结构 invoke RtlInitUnicodeString,addr ucstShow,$CTW0("This is the fifth debug Information.") ;初始化 invoke DbgPrint,$CTA0("%wZ"),addr ucstShow
4、混合拼接信息输出,如:
invoke RtlInitUnicodeString,addr ucstShow,$CTW0("hello,I was born in") invoke DbgPrint,$CTA0("%wZ %x"),addr ucstShow,dwShow
实际上就是printf,sprintf,wsprintf的用法,很简单~~
还有很多输出方式,如下表(网上找的):
以下是随便写的测试代码:
;/**; *************************************************************************; * 文件名称: Driver.asm; * 版 本:; * 描 述: 学习DbgPrint的用法; * 作 者: zzydog; * 创建日期: 2010; *************************************************************************; */.386.model flat, stdcalloption casemap:noneinclude Strings.macinclude w2k\ntstatus.incinclude w2k\ntddk.incinclude w2k\ntoskrnl.incincludelib ntoskrnl.libincludelib ntdll.lib;************************************************************************************;函数定义DriverEntry proto pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING DirverUnload proto pDriverObject:PDRIVER_OBJECT;************************************************************************************.data ucstShow UNICODE_STRING <?> szShowLoad db "The Dirver has been loaded!",NULL szShowUnLoad db "The Driver has been Unloaded!",NULL dwShow dd 1990h.codeDriverEntry proc pDriverObject:PDRIVER_OBJECT,pusRegistryPath:PUNICODE_STRING invoke DbgPrint,addr szShowLoad invoke DbgPrint,$CTA0("This is the first debug Information.") invoke DbgPrint,$CTA0("%s"),$CTA0("This is the second debug Information.") invoke DbgPrint,$CTA0("%ws"),$CTW0("This is the third debug Information.") invoke DbgPrint,$CTA0("%S"),$CTW0("This is the forth debug Information.") invoke RtlInitUnicodeString,addr ucstShow,$CTW0("This is the fifth debug Information.") invoke DbgPrint,$CTA0("%wZ"),addr ucstShow invoke RtlInitUnicodeString,addr ucstShow,$CTW0("hello,I was born in") invoke DbgPrint,$CTA0("%wZ %x"),addr ucstShow,dwShow assume edx:ptr DRIVER_OBJECT mov edx,[pDriverObject] mov [edx].DriverUnload,offset DriverUnload mov eax,STATUS_SUCCESS retDriverEntry endpDriverUnload proc pDriverObject:PDRIVER_OBJECT invoke DbgPrint,$CTA0("%s"),addr szShowUnLoad mov eax,STATUS_SUCCESS retDriverUnload endpend DriverEntry
- 开发驱动时用到的内核打印函数KdPrint 的使用方法
- 开发驱动时用到的内核打印函数KdPrint 的使用方法
- 开发驱动时用到的内核打印函数KdPrint 的使用方法
- KdPrint的使用方法
- 驱动开发用到的派遣函数序号(wdm.h)
- 解决windows7驱动调试KdPrint不能输出的问题
- KdPrint使用方法
- KdPrint使用方法
- KdPrint使用方法
- 开发中经常用到的一些函数
- iOS开发可能用到的函数
- windows KdPrint打印中文文件夹的问题,应该是DbgPrint的BUG
- Linux内核打印函数printk的使用说明
- 编写自己的内核打印函数
- Linux内核打印函数printk的使用说明 .
- 【内核编程】【Makefile】:嵌入式驱动开发时驱动模块于内核版本不匹配的解决
- 解决win7/win8.1 驱动调试KdPrint不能输出的问题
- WinDBG实时打印Windows驱动或者内核信息的方法
- HDU 2553 N皇后问题(还是DFS呀)
- Gym 100917 F - Find the Length
- 蓝桥杯系统题集部分(带java版参考答案)
- Objective-C中@property和@synthesize的用法
- vim快捷键
- 开发驱动时用到的内核打印函数KdPrint 的使用方法
- 《精通iOS开发·第六版》数据持久化基础知识之对象归档持久化
- 一种动态为apk写入信息的方案
- CodeForces 635C XOR Equation(数论)
- C++初始化顺序
- springMVC json自动将date类型转换为long
- Android TextView使用HTML处理字体样式、显示图片等
- Properties android 操作本地文件
- SLF4J: Class path contains multiple SLF4J bindings.