驱动开发-01-加载、卸载、输出调试信息
2014-06-30 10:34
288 查看
在驱动程序中,不能使用windows系统中的用户API。自然也是没有像c\c++中可以方便的向控制台打印字符输出调试信息的print函数,在驱动中,输出调试信息的函数为
DbgPrint,用法与c\c++中的printf 类似,但是没有控制台或文件接受数据,只能通过专门的软件DebugView查看驱动调试信息。
KdPrint是一个宏,该宏在FREE(发布版)中什么都不做,Checked调试版替换为DbgPrint。
例子:
KdPrint(("调试信息"));
在调试版中等价于:
DbgPrint("调试信息");
DbgPrint的用法与printf基本一致,DbgPrint更支持ANSI_STRING和UNICODE_STRING的直接输出
Unicode格式(%C, %S, %lc, %ls, %wc, %ws, and %wZ)只能在 IRQL = PASSIVE_LEVEL时才能使用.
ANSI_STRING和UNICODE_STRING的相关函数:
RtlInitAnsiString,RtlInitString和RtlInitUnicodeString//根据参数字符串设置String的Length长度和MaximumLength最大长度,并将Buffer(缓冲)指向字符串
ExAllocatePool//申请内存
RtlFreeAnsiString、RtlFreeUnicodeString、ExFreePool//清理内存
RtlCopyUnicodeString、RtlCopyString//字符串复制
RtlCompareString、RtlEqualString、RtlCompareUnicodeString、RtlEqualUnicodeString//字符串比较
RtlUpperString、RtlUpcaseUnicodeString//字符串转化成大写(如果申请了内存,就要自行释放)
RtlUnicodeStringToInteger、RtlIntegerToUnicodeString//字符串与整形数字相互转换
RtlUnicodeStringToAnsiString、RtlAnsiStringToUnicodeString//ANSI_STRING 和 UNICODE_STRING字符串相互转换(如果申请了内存,就要自行释放)
驱动程序的入口函数为DriverEntry,入口函数的参数为驱动对象DriverObject和注册表路径RegistryPath。
如果入口函数调用成功,它必须返回STATUS_SUCCESS。否则,它必须返回ntstatus.h中定义的错误状态之一。
DbgPrint,用法与c\c++中的printf 类似,但是没有控制台或文件接受数据,只能通过专门的软件DebugView查看驱动调试信息。
KdPrint是一个宏,该宏在FREE(发布版)中什么都不做,Checked调试版替换为DbgPrint。
例子:
KdPrint(("调试信息"));
在调试版中等价于:
DbgPrint("调试信息");
DbgPrint的用法与printf基本一致,DbgPrint更支持ANSI_STRING和UNICODE_STRING的直接输出
Unicode格式(%C, %S, %lc, %ls, %wc, %ws, and %wZ)只能在 IRQL = PASSIVE_LEVEL时才能使用.
UNICODE_STRING str = RTL_CONSTANT_STRING(L"Hello\0Hello\0"); KdPrint(("Buffer:%ws\nMaxinumLength:%d\nLength:%d", str.Buffer, str.MaximumLength, str.Length)); DbgPrint("Buffer:%wZ",&str); ANSI_STRING astr= RTL_CONSTANT_STRING(L"Hello\0Hello\0"); KdPrint(("Buffer:%ls\nMaxinumLength:%d\nLength:%d", astr.Buffer, astr.MaximumLength, astr.Length)); DbgPrint("Buffer:%Z",&astr);
ANSI_STRING和UNICODE_STRING的相关函数:
RtlInitAnsiString,RtlInitString和RtlInitUnicodeString//根据参数字符串设置String的Length长度和MaximumLength最大长度,并将Buffer(缓冲)指向字符串
ExAllocatePool//申请内存
RtlFreeAnsiString、RtlFreeUnicodeString、ExFreePool//清理内存
RtlCopyUnicodeString、RtlCopyString//字符串复制
RtlCompareString、RtlEqualString、RtlCompareUnicodeString、RtlEqualUnicodeString//字符串比较
RtlUpperString、RtlUpcaseUnicodeString//字符串转化成大写(如果申请了内存,就要自行释放)
RtlUnicodeStringToInteger、RtlIntegerToUnicodeString//字符串与整形数字相互转换
RtlUnicodeStringToAnsiString、RtlAnsiStringToUnicodeString//ANSI_STRING 和 UNICODE_STRING字符串相互转换(如果申请了内存,就要自行释放)
驱动程序的入口函数为DriverEntry,入口函数的参数为驱动对象DriverObject和注册表路径RegistryPath。
如果入口函数调用成功,它必须返回STATUS_SUCCESS。否则,它必须返回ntstatus.h中定义的错误状态之一。
#include <ntddk.h> #define INITCODE code_seg void ddk_unload(IN PDRIVER_OBJECT pDriverObject); NTSTATUS DriverEntry(_In_ struct _DRIVER_OBJECT *DriverObject,_In_ PUNICODE_STRING RegistryPath) { // ... DbgPrint("ddk_sys驱动加载了"); DriverObject->DriverUnload=ddk_unload;//设置卸载函数 return STATUS_SUCCESS; } void ddk_unload(IN PDRIVER_OBJECT pDriverObject){ DbgPrint("ddk_sys驱动卸载了"); }
相关文章推荐
- 转 :WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动
- 转:WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动
- Android手机在开发调试时logcat不显示输出信息的解决办法
- Android手机在开发调试时logcat不显示输出信息的解决办法
- 华为手机在开发Android调试时logcat不显示输出信息的解决办法
- 转:WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动
- 华为手机在开发Android调试时logcat不显示输出信息的解决办法
- 华为手机在开发Android调试时logcat不显示输出信息的解决办法
- C++ 用条件编译 控制开发过程中输出调试信息
- 手机在开发Android调试时logcat不显示输出信息的解决办法
- WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动(转)
- Android手机在开发调试时logcat不显示输出信息的解决办法
- Android手机在开发调试时logcat不显示输出信息的解决办法
- Android手机在开发调试时logcat不显示输出信息的解决办法
- WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动
- WINCE流驱动的动态加载调试与用EVC快速开发WINCE的流驱动
- Android手机在开发调试时logcat不显示输出信息的解决办法
- Windows 驱动:向 DbgPrintf 一样将调试信息输出到文件
- Android手机在开发调试时logcat不显示输出信息的解决办法