日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

Windows驱动开发 - 设备对象初步学习

發(fā)布時間:2025/4/14 windows 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Windows驱动开发 - 设备对象初步学习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

新建一個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);//創(chuàng)建設備對象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; }

驅動開發(fā)首先要了解的基本概念是驅動對象;然后就是設備對象;

DEVICE_OBJECT結構體是操作系統(tǒng)用來表示某個具體的設備對象,一個設備對象是一個邏輯上的,或者虛擬的,或者物理上的設備的具體抽象,驅動通過設備對象來處理I/O請求;
備對象用于保存設備特征和狀態(tài)的相關信息。設備對象的I/O請求由一個驅動對象操控著。每一個內核模式的驅動必須創(chuàng)建設備對象,它通過調用IoCreateDevice函數一次或多次來創(chuàng)建。
設備對象用結構體DEVICE_OBJECT表示。每個設備對象有一個指針(NextDevice)指向下一個設備對象,從而形成一個設備對象鏈表。

在NT式驅動中創(chuàng)建設備對象是由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管理器會根據這個大小,在內存中創(chuàng)建設備擴展,并與驅動對象關聯(lián);

DeviceName:

? ? 輸入參數,設備對象的名字

DeviceCharacteristics:

? ? 輸入參數,設置設備對象的特征

Exclusive:

? ? 輸入參數,設置設備對象是否為內核模式下使用,一般為TRUE;

DeviceObject:

? ? 輸入參數,I/O管理器負責創(chuàng)建這個設備對象,并返回設備對象的地址;

返回值:返回此函數的調用狀態(tài);

?

設備名稱用UNICODE字符串指定,并且字符串必須是"\Device\[設備名]"的形式;

在windows下,所有設備都是以類似名字命名的;

例如C盤、D盤、E盤,以如下方式命名

"\Device\HarddiskVolume1" ?"\Device\HarddiskVolume2" ?"\Device\HarddiskVolume3"

?

也可以不指定不指定設備名字,如果是這樣,

I/O管理器會自動分配一個數字作為設備的設備名,

例如"\Device\00000001" ?"\Device\00000002" ? "\Device\00000003"

?

若指定了設備名,只能被內核模式下的其他驅動所識別。但是在用戶模式下的應用程序無法識別這個設備;

代碼先來創(chuàng)建一個設備對象;看build是否成功;空閑再加載和調試;萬一掛了,還有其他工作要做;

? ? build成功;也許設備對象創(chuàng)建成功;但要完整運行,應該還有更多設備對象相關的代碼;
?

?

?

總結

以上是生活随笔為你收集整理的Windows驱动开发 - 设备对象初步学习的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。