Windows驱动开发 - 设备对象初步学习
新建一個myhellodevice.c;
代碼如下;makefile和sources如前文;
#include <ntddk.h>#define NTDEVICE_NAME_STRING L"\\Device\\MytestDevice"typedef struct _DEVICE_EXTENSION {PDEVICE_OBJECT Self;LIST_ENTRY EventQueueHead; // where all the user notification requests are queuedKSPIN_LOCK QueueLock; } DEVICE_EXTENSION, *PDEVICE_EXTENSION;VOID DriverUnload(PDRIVER_OBJECT driver) {DbgPrint("goodbye"); }// DriverEntry,入口函數。相當于main。 NTSTATUS DriverEntry(PDRIVER_OBJECT driver, PUNICODE_STRING reg_path) {PDEVICE_OBJECT deviceObject;UNICODE_STRING ntDeviceName;UNICODE_STRING str1;NTSTATUS status;(void) RtlInitUnicodeString( &str1, L"my test str AAAA");//DbgPrint(str1);DbgPrint("%ws", str1.Buffer);//創建設備對象RtlInitUnicodeString(&ntDeviceName, NTDEVICE_NAME_STRING);status = IoCreateDevice(driver, // DriverObjectsizeof(DEVICE_EXTENSION), // DeviceExtensionSize&ntDeviceName, // DeviceNameFILE_DEVICE_UNKNOWN, // DeviceTypeFILE_DEVICE_SECURE_OPEN, // DeviceCharacteristicsFALSE, // Not Exclusive&deviceObject // DeviceObject);if (!NT_SUCCESS(status)) {DbgPrint(("\tIoCreateDevice returned 0x%x\n", status));return(status);}// 設置一個卸載函數便于這個函數能退出。driver->DriverUnload = DriverUnload;return STATUS_SUCCESS; }驅動開發首先要了解的基本概念是驅動對象;然后就是設備對象;
DEVICE_OBJECT結構體是操作系統用來表示某個具體的設備對象,一個設備對象是一個邏輯上的,或者虛擬的,或者物理上的設備的具體抽象,驅動通過設備對象來處理I/O請求;
備對象用于保存設備特征和狀態的相關信息。設備對象的I/O請求由一個驅動對象操控著。每一個內核模式的驅動必須創建設備對象,它通過調用IoCreateDevice函數一次或多次來創建。
設備對象用結構體DEVICE_OBJECT表示。每個設備對象有一個指針(NextDevice)指向下一個設備對象,從而形成一個設備對象鏈表。
在NT式驅動中創建設備對象是由IoCreateDevice內核函數完成的;
NTSTATUS IoCreateDevice{
IN PDRIVER_OBJECT DriverObject,
IN ULONG DeviceExtensionSize,
IN PUNICODE_STRING DeviceName OPTIONAL,
IN DEVICE_TYPE DeviceType,
IN ULONG DeviceCharateristics,
OUT PDEVICE_OBJECT* DeviceObject
};
參數;
DriverObject:輸入參數,每個驅動程序中,會有唯一的驅動對象與之對應
? ? IoCreateDevice函數的第一個參數是本驅動的驅動對象;
DeviceExtensionSize:
? ? 輸入參數,設備擴展的大小,
? ? I/O管理器會根據這個大小,在內存中創建設備擴展,并與驅動對象關聯;
DeviceName:
? ? 輸入參數,設備對象的名字
DeviceCharacteristics:
? ? 輸入參數,設置設備對象的特征
Exclusive:
? ? 輸入參數,設置設備對象是否為內核模式下使用,一般為TRUE;
DeviceObject:
? ? 輸入參數,I/O管理器負責創建這個設備對象,并返回設備對象的地址;
返回值:返回此函數的調用狀態;
?
設備名稱用UNICODE字符串指定,并且字符串必須是"\Device\[設備名]"的形式;
在windows下,所有設備都是以類似名字命名的;
例如C盤、D盤、E盤,以如下方式命名
"\Device\HarddiskVolume1" ?"\Device\HarddiskVolume2" ?"\Device\HarddiskVolume3"
?
也可以不指定不指定設備名字,如果是這樣,
I/O管理器會自動分配一個數字作為設備的設備名,
例如"\Device\00000001" ?"\Device\00000002" ? "\Device\00000003"
?
若指定了設備名,只能被內核模式下的其他驅動所識別。但是在用戶模式下的應用程序無法識別這個設備;
代碼先來創建一個設備對象;看build是否成功;空閑再加載和調試;萬一掛了,還有其他工作要做;
? ? build成功;也許設備對象創建成功;但要完整運行,應該還有更多設備對象相關的代碼;
?
?
?
總結
以上是生活随笔為你收集整理的Windows驱动开发 - 设备对象初步学习的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: tomcat基本使用和超图基本jsp例子
- 下一篇: WPF基础入门3 - Panel和 Ca