眾所周知,
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 標誌暫存器的值入棧 中斷過程中要改變標...