Windows驱动开发-_驱动对象学习和内核处理字符串初步
新建一個c文件;myhellostr.c;
#include <ntddk.h>VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("goodbye"); }// DriverEntry,入口函數。相當于main。 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {UNICODE_STRING str1;(void) RtlInitUnicodeString( &str1, L"my test str AAAA");//DbgPrint(str1);DbgPrint("%ws", str1.Buffer);// 設置一個卸載函數便于這個函數能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }sources和makefile文件見前文;
先來學習驅動程序入口點和驅動對象;
DriverEntry是驅動程序的入口函數;返回值是NTSTATUS類型;
每個驅動程序會有唯一的驅動對象與之對應,并且這個驅動對象是在驅動加載的時候,被內核中的對象管理程序所創建的,內核對一個驅動只加載一個實例,是由內核中的I/O管理器負責加載的,驅動程序需要在DriverEntry中初始化該驅動對象。
_DRIVER_OBJECT結構體 (來自msdn)
typedef struct _DRIVER_OBJECT {
? ? CSHORT Type;
? ? CSHORT Size;
? ? PDEVICE_OBJECT DeviceObject;//設備對象
?ULONG Flags;
? ? PVOID DriverStart;
? ? ULONG DriverSize;
? ? PVOID DriverSection;
? ? PDRIVER_EXTENSION DriverExtension;
? ? UNICODE_STRING DriverName;
? ? PUNICODE_STRING HardwareDatabase;
? ? PFAST_IO_DISPATCH FastIoDispatch;
? ? PDRIVER_INITIALIZE DriverInit;
? ? PDRIVER_STARTIO DriverStartIo;
? ? PDRIVER_UNLOAD DriverUnload;
? ? PDRIVER_DISPATCH MajorFunction[IRP_MJ_MAXIMUM_FUNCTION + 1];
} DRIVER_OBJECT;
typedef struct _DRIVER_OBJECT *PDRIVER_OBJECT;?
這個是由系統傳給你的驅動程序的;在代碼里寫?driver->xxx ,就能訪問到驅動對象的成員;
部分成員的含義;
PDEVICE_OBJECT DeviceObject
? ? ? ?指向一個由驅動創建的設備對象,當驅動程序調用IoCreateDevice成功時,該成員會自動更新。?
PDRIVER_EXTENSION DriverExtension
? ? 驅動擴展對象指針,該對象唯一能訪問的成員是DriverExtension-> AddDevice,對應的是驅動DriverEntry例程中的AddDevice例程。
PUNICODE_STRING HardwareDatabase
? ? ? ?指向\Registry\Machine\Hardware,該路徑指向的是注冊表中包含該硬件的配置信息。
PFAST_IO_DISPATCH FastIoDispatch
? ? ? ?指向快速I/O入口地址,該成員之用于FSD(文件系統驅動)已經網絡傳輸驅動。
PDRIVER_INITIALIZE DriverInit
? ? ? ?DriverEntry例程的入口點,由I\O管理器設置。
PDRIVER_STARTIO DriverStarIo
? ? ? ?驅動程序中StartIo例程的入口地址(如果有的話),當驅動初始化時,DriverEntry例程負責設置它,如果驅動程序沒有StartIo,該成員為NULL。
PDRIVER_UNLOAD DriverUnload
? ? ? ?驅動程序中Unload例程的入口地址(如果有的話),當驅動初始化時,DriverEntry例程負責設置它,如果驅動程序沒有StartIo,該成員為NULL。
?
RtlInitUnicodeString(),在內核中初始化一個unicode字符串;
來構建一下;如果DbgPrint如第一句,則出錯如下;
? ? //DbgPrint(str1);
?? ?DbgPrint("%ws", str1.Buffer);
使用第二種寫法就對了;
?驅動對象結構體詳情見;
https://docs.microsoft.com/zh-cn/windows-hardware/drivers/ddi/wdm/ns-wdm-_driver_object
加載驅動,捕捉內核打印字符串見;
https://blog.csdn.net/bcbobo21cn/article/details/112212728
空閑再做加載驅動和調試;
總結
以上是生活随笔為你收集整理的Windows驱动开发-_驱动对象学习和内核处理字符串初步的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++11 基于范围的 for 循环
- 下一篇: tomcat基本使用和超图基本jsp例子