您的位置:首页 > 其它

驱动开发-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时才能使用.

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驱动卸载了");
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: