在看了《寒江獨釣--windows核心安全程式設計》一書,根據書中所講編寫,**中只對irp_mj_write進行了過濾處理
//檔名comcap.c
#include
#include
#define ntstrsafe_lib
#define ccp_max_com_id 32
//設定最大com埠個數
//儲存所有過濾裝置指標
static pdevice_object s_fltobj[ccp_max_com_id]= ;
static pdevice_object s_nextobj[ccp_max_com_id] = ;
//與裝置解除安裝相關的引數定義
#define delay_one_microsecond (-10)
#define delay_one_millisecond (delay_one_microsecond*1000)
#define delay_one_second (delay_one_mililisecond*1000)
//生成乙個虛擬裝置,並與真實裝置進行繫結
ntstatus ccpattachdevice(pdriver_object driver, pdevice_object oldobj, pdevice_object *fltobj, pdevice_object *next)
//拷貝重要標誌位,這一步很重要,就是要將生成的虛擬裝置的標誌位與被繫結真實裝置相同的引數選項
if(oldobj->flags & do_buffered_io)
if(oldobj->flags & do_direct_io)
if(oldobj->characteristics & file_device_secure_open)
(*fltobj)->flags |= do_power_pagable;
//將上面生成的虛擬裝置fltobj繫結到另乙個裝置上oldobj上面
topdev = ioattachdevicetodevicestack(*fltobj, oldobj);
if(topdev == null)
*next = topdev;
//設定這個裝置已經啟動
(*fltobj)->flags = (*fltobj)->flags & ~do_device_initializing;
return status_success;
}//開啟乙個埠裝置
pdevice_object ccpopencom(ulong id, ntstatus *status)
;pfile_object fileobj = null;
pdevice_object devobj = null;
//根據id轉換成串的名字
memset(name, 0, sizeof(wchar)*32);
rtlstringcchprintfw(name, 32, l"\\device\\serial%d", id);
rtlinitunicodestring(&name_str, name);
//開啟裝置物件
*status = iogetdeviceobjectpointer(&name_str, file_all_access, &fileobj, &devobj);
//如果開啟成功了,記得一定要把檔案物件解除引用
if(*status == status_success)
//返回裝置物件
return devobj;
}//這個函式繫結所有的串列埠
void ccpattachallcoms(pdriver_object driver)
//在這裡繫結,並不管繫結是否成功
ccpattachdevice(driver, com_ob, &s_fltobj[i], &s_nextobj[i]);}}
//irp過濾處理
ntstatus ccpdispatch(pdevice_object device, pirp irp)
//此外我們只過濾寫請求,寫請求,獲得緩衝區及其長度然後列印
if(irpsp->majorfunction == irp_mj_write)
else
if(buf == null)
//列印內容
for(j=0; j
}//這些請求直接下發執行即可,我們並不禁止止或者改變它
ioskipcurrentirpstacklocation(irp);
return iocalldriver(s_nextobj[i], irp);}}
//如果根本就不在被繫結的裝置中,那是有問題的,直接返回引數錯誤
irp->iostatus.information = 0;
irp->iostatus.status = status_invalid_parameter;
iocompleterequest(irp, io_no_increment);
return status_success;
}//解除安裝例程函式
void ccpunload(pdriver_object drv)
//睡眠5秒,等待所有irp處理結束
interval.quadpart = (5*1000 *delay_one_millisecond);
kedelayexecutionthread(kernelmode, false, &interval);
//刪除這些裝置
for(i=0; i}}
}//驅動入口函式
ntstatus driverentry(pdriver_object driver, punicode_string reg_path)
//支援動態解除安裝
driver->driverunload = ccpunload;
//繫結所有的串列埠
ccpattachallcoms(driver);
//直接返回成功即可
return status_success;
符個截圖看看效果:
乙個簡單的串列埠過濾驅動
學習驅動開發一段時間了,在嘗試著從最簡單的驅動開發著手學習,我再嘗試著編寫乙個最簡單的串列埠過濾驅動,可是多次嘗試都沒有成功,總是一載入就藍屏。看了網上的例子他們都是採用的ioattachdevicetodevicestack,而我採用的是ioattachdevice,現在把網上的 整理成最簡單的形...
乙個驅動如何去呼叫乙個驅動?
這個是入門級問題,以前我剛搞wince的時候也很糾結,不知道怎麼去弄。後來看了wince6.0 6410 s5pv210的 攝像頭驅動就發現原來驅動和驅動之間呼叫和應用程式呼叫驅動是一樣的 一點都沒區別。createfile 開啟另外乙個驅動 deviceiocontrol 去操作另外乙個驅動 go...
如何讀取乙個串列埠
網上有很多關於上位機的介紹,但是很少有關於具體如何讀取乙個串列埠的介紹,在經過反覆查詢後。將關於如何讀取乙個串列埠的零零碎碎知識整理為乙個簡單的流程。首先,串列埠在電腦中被定義為乙個檔案,這個檔案被windows系統管理,我們的程式無法直接進入系統對串列埠進行操作,但是我們可以借助api函式訪問。a...