WDM初步 埠讀寫

2021-04-01 08:02:49 字數 1886 閱讀 9070

眾所周知,

win2k

下使用者態程式不能操作硬體,所以要讀寫埠可以通過

wdm驅動來實現;對埠的讀寫可能是最簡單的驅動程式了,但通過這個程式可以大體了解一下

wdm工作流程,下面簡單介紹一下埠讀寫驅動程式的實現方法。

我編制驅動的環境是

win2k+sp4/win2k ddk/driver studio 3.1

。用driverwizards

可以生成驅動程式框架。我採用的是

deviceiocontrol

函式完成應用程式與驅動程式的通訊

,在driverwizards

內加入兩個

control code

,mothed

選擇為buffered,

意為系統分配乙個緩衝區用於輸入輸出。

下面是讀操作的處理函式:

ntstatus ndcarddevice::ndcard_ioctl_800_handler(kirp i)//

讀操作其中

t 是類

kdebugonlytrace

的乙個例項,其作用於

trace

類似,只不過要用

driverstudio

自帶的drivermoniter

才能顯示輸出的資訊。這是個非常有用的東東,對驅動程式的除錯有莫大的幫助。

函式內的

datatransfer

是個自定義的結構,在

deviceiocontrol

函式呼叫時傳遞

datatransfer

型別的指標,作為緩衝區,當然你也可以自己定義其他結構。

typedef struct tagdatatransfer datatransfer,*pdatatransfer;

devicecontrol

函式根據

irp的

control code

來呼叫相應的處理函式;

ndcard_ioctl_800

即為乙個

control code

,它有如下定義:

#define ndcard_ioctl_800 ctl_code(file_device_unknown, 0x800, method_buffered, file_read_data)

函式中,通過

i.ioctlbuffer()

來獲取輸入緩衝區的指標,取得埠和字長,據此呼叫輸入函式;

m_ioportrange0

是類kiorange

的例項,用它來初始化並操作裝置驅動所占用的埠。

在*(pdatatransfer)(i.ioctlbuffer())=ds

中,i.ioctlbuffer()

獲取的是輸出緩衝區的指標。另外在函式返回前要設定

i.information()

的值,意為傳輸的位元組數。

以上是核心態的部分,使用者態的程式要呼叫

deviceiocontrol

函式:void test_ndcard_ioctl_800(void)

printf(

"ds.data = %d"

,ds.data);

}deviceiocontrol

函式引數的意義已在注釋中列出,更詳細的內容請參考

msdn。最後

printf(

"ds.data = %d"

,ds.data);

語句可以顯示讀入的資料。

以上是讀操作,寫操作與此類似,不再贅述。

以上是完成乙個可以使用的最簡單的

wdm驅動程式的流程,雖然功能簡單卻很實用。其實對於埠讀寫,用

io.dll

也可以完成,而且更方便,我寫此文意在總結

wdm

C 檔案讀寫初步

c 中讀寫檔案主要涉及到file,fileinfo,filestream三個類,它們都是system.io 的類,streamreader是用於從流讀取和寫入流的類,使用之前都需using system.io。先定義乙個txt文件路徑 string txtpath d url livebaby.cn...

C 檔案讀寫初步

c 中讀寫檔案主要涉及到file,fileinfo,filestream三個類,它們都是system.io 的類,streamreader是用於從流讀取和寫入流的類,使用之前都需using system.io。先定義乙個txt文件路徑 string txtpath d url livebaby.cn...

中斷與埠讀寫

中斷 cpu不再接著剛執行完的指令向下執行,而是轉去處理中斷資訊 內中斷 由cpu內部發生的事件而引起的中斷 如 除法錯誤,單步執行,執行into指令,執行int n指令 外中斷 由外部裝置發生的事件引起的中斷 1 從中斷資訊中取得中斷型別碼n 2 pushf 標誌暫存器的值入棧 中斷過程中要改變標...