摘要:本文從驅(qū)動級過濾多輸入的數(shù)據(jù),提供了一種方法用來支持一臺計算機的多輸入設備的實時運行,如多鼠標、多鍵盤運行,將此方法實現(xiàn)為多設備輸入接口,并使用此接口制作了計算機的多鼠標實時操控過濾驅(qū)動,命名為MouFi。
關鍵詞:計算機;多輸入設備;原理
中圖分類號:TP391.1 文獻標識碼:A 文章編號:1007-9599 (2012) 10-0000-02
隨著團隊協(xié)作工作和人機交互的進一步發(fā)展,支持多人同時操作同一計算機顯得十分有意義,使用多個同類輸入設備(如多個鼠標)對同一主機進行實時操控,獨立完成各項操作互不影響,可使多人同時共享一臺電腦的各項資源,特別在電腦緊缺或不方便聯(lián)網(wǎng)的情況,提高電腦的利用率,并在單機多人游戲領域顯示其優(yōu)勢。本文從驅(qū)動級過濾多輸入的數(shù)據(jù),提供了一種方法用來支持一臺計算機的多輸入設備的實時運行,如多鼠標、多鍵盤運行,將此方法實現(xiàn)為多設備輸入接口,并使用此接口制作了計算機的多鼠標實時操控過濾驅(qū)動,命名為MouFi。
主要貢獻有以下幾個方面:1.本文所提供的內(nèi)核級信號過濾方法普適于所有人機交互輸入設備(human interface devices input)。2.本方法主要用于提供內(nèi)核級信號過濾接口,在此基礎上,可編寫多種應用程序?qū)崿F(xiàn)多輸入的用戶級應用。3.本文所提供的方法實現(xiàn)接口后,內(nèi)核運行在系統(tǒng)進程,屬于驅(qū)動程序級別,更貼近底層,過濾效率高,系統(tǒng)資源占用較少。4.本文所實現(xiàn)的范例系統(tǒng)可以支持2到6部甚至更多鼠標獨立工作。
相關工作:目前國內(nèi)外已有不少支持多輸入的軟件,但大都存在不足有待改進。TeamPlayer軟件支持同一電腦多鼠標、多鍵盤的操作。但降低了輸入設備的靈活性,并不適用于一些高速游戲。且鼠標操作中會有沖突,僅能實現(xiàn)鼠標的分時控制。MultiPointer以軟件形式,通過切換當前的操作鼠標為默認指針的方式,支持同一電腦的最多5個鼠標的同時操作。但不同鼠標的同時操作會產(chǎn)生閃爍,并無法支持同時點擊,鼠標拖曳操作也會受到其他移動中鼠標的影響。而此類多個輸入設備同時控制不同對象的問題則可以通過本文提供的接口編程解決。
系統(tǒng)設計:
相關定義:
IRP(I/O request packets):I/O請求包,內(nèi)核模式的結(jié)構(gòu)體,Windows驅(qū)動模型和Windows NT設備驅(qū)動間通過傳遞此結(jié)構(gòu)體與操作系統(tǒng)進行信息交流。
MOUSE_INPUT_DATA:IRP包中的一個結(jié)構(gòu)體,包含了鼠標輸入數(shù)據(jù)。當鼠標器產(chǎn)生一個中斷時,此數(shù)據(jù)結(jié)構(gòu)中的各參數(shù)值將被設置,并包含在IRP中傳回操作系統(tǒng),操作系統(tǒng)根據(jù)其數(shù)值產(chǎn)生相應消息,插入消息隊列等待執(zhí)行。
相關原理:
鼠標工作原理:鼠標設備接入計算機后,操作系統(tǒng)為了獲取一次鼠標操作,首先會產(chǎn)生一個鼠標相關的I/O請求包(IRP_MJ_READ(MouClass)),分層級發(fā)送到鼠標物理驅(qū)動的設備棧,驅(qū)動收到此IRP后會一直保持為等待(pending)狀態(tài)。當鼠標器有動作引發(fā)中斷時,鼠標物理驅(qū)動就會將鼠標事件的相關數(shù)據(jù)以系統(tǒng)定義的MOUSE_INPUT_DATA數(shù)據(jù)結(jié)構(gòu)形式填入IRP中,并完成這個IRP,由驅(qū)動設備自底向上傳送。操作系統(tǒng)獲取該鼠標操作,產(chǎn)生Windows消息插入消息隊列中,之后立即產(chǎn)生下一個鼠標相關I/O請求包,進入下一輪等待。
鼠標工作驅(qū)動設置:Windows操作系統(tǒng)利用mouclass驅(qū)動將不同類型(如PS2、USB或觸板等)鼠標進行抽象,在系統(tǒng)進程讀取鼠標數(shù)據(jù)的時候,并不對具體端口進行區(qū)分。在驅(qū)動結(jié)構(gòu)中,每個mouclass驅(qū)動中都有若干PointerClass設備,其數(shù)量由系統(tǒng)鼠標總數(shù)決定,每個PointerClass設備都依附于其獨有的鼠標接口設備PointerPort。
鼠標數(shù)據(jù)過濾方法:指在操作系統(tǒng)獲取鼠標操作、產(chǎn)生消息并插入消息隊列、供用戶程序處理的全過程中,通過特定過濾方法,使得流過的數(shù)據(jù)經(jīng)指定處理后傳遞給上一層。過濾方法主要分為內(nèi)核級過濾和用戶級過濾。內(nèi)核級過濾是指在分層驅(qū)動模型中允許某一驅(qū)動構(gòu)造一個匿名的設備對象,在相應層級接受分層傳遞的IRP,使得該IRP經(jīng)該對象的過濾設備驅(qū)動程序處理后再繼續(xù)向上傳遞。用戶級過濾方法主要有消息鉤子(Message Hook)等,利用應用程序接口(API)以消息為單位進行過濾,在用戶程序處理之前對該消息進行指定處理。比較實現(xiàn)方式原理可知,內(nèi)核級過濾方法更高效并具有更強的可靠性。
實現(xiàn)方法:
為了高效的支持多輸入設備的運行并簡化用戶級程序的操作,本方法采取內(nèi)核級過濾方式對設備的輸入數(shù)據(jù)進行過濾修改繼續(xù)上傳,并根據(jù)過濾獲得的鼠標事件真實數(shù)據(jù)進行模擬操作,創(chuàng)建了WDM式過濾驅(qū)動MouFi。
過濾驅(qū)動的初始化
計算機啟動后,操作系統(tǒng)載入系統(tǒng)驅(qū)動時由DriverEntry入口進入該過濾驅(qū)動程序,將其載入系統(tǒng),設置在接口驅(qū)動及鼠標類驅(qū)動之間,過濾驅(qū)動MouFi創(chuàng)建主設備(MainDevice)及其符號鏈接,并初始化各種狀態(tài)變量。在計算機運行過程中,若有新的鼠標器設備接入主機,過濾驅(qū)動MouFi使用AddDevice在該鼠標類設備PointerClass及其對應端口類設備PointerPort之間創(chuàng)建過濾設備,邏輯上插入了二者之間,接受和發(fā)送IRP,此后過濾驅(qū)動MouFi主要進行以下兩方面的操作。
數(shù)據(jù)過濾
1.各鼠標器設備下層對應設置的過濾設備接收下級端口驅(qū)動設備對象上傳的IRP,將IRP鼠標數(shù)據(jù)傳遞到主設備,將包中MOUSE_INPUT_DATA數(shù)據(jù)放入主設備緩沖區(qū)等待用戶程序調(diào)用,并根據(jù)IRP中的MOUSE_INPUT_DATA數(shù)據(jù)結(jié)構(gòu)的硬件編號將原IRP包中MOUSE_INPUT_DATA的對應鼠標實例的位置信息、操作信息等全部項清零。
2.將清零后的IRP包向上傳遞到鼠標器驅(qū)動設備對象PointerClass進行進一步處理。操作系統(tǒng)接收返回的IRP,分析清零后的MOUSE_INPUT_DATA產(chǎn)生無效果的Windows消息,隨即產(chǎn)生下次IRP操作。
事件模擬
用戶程序從主設備緩存獲取真實MOUSE_INPUT_DATA數(shù)據(jù)結(jié)構(gòu),對數(shù)據(jù)結(jié)構(gòu)參數(shù)值(硬件編號、X軸Y軸位移量、按鍵等數(shù)據(jù))進行提取。依據(jù)所提取參數(shù)值使用Win32 API mouse_event來模擬響應的動作。對于涉及鼠標移動的動作,得到動作響應后確定當前系統(tǒng)默認鼠標的指針圖標HCURSOR,并利用BitBlt等API函數(shù)將指針畫在該鼠標實例的指針層窗體上。
在過濾驅(qū)動運行過程中,操作系統(tǒng)始終無法獲得有效的鼠標操作數(shù)據(jù),因而鼠標指針不受操作系統(tǒng)支配。只有某個用戶級的應用程序通過讀取過濾驅(qū)動的主設備,才可獲得真實的鼠標操作數(shù)據(jù),進而根據(jù)硬件編號進行區(qū)分,根據(jù)偏移和按鍵進行實踐模擬,依次產(chǎn)生相應響應動作。用戶體驗近似多鼠標控制計算機,模擬支持多輸入設備工作。
系統(tǒng)演示:對本文提供的接口經(jīng)上述過程編程完成了多鼠標過濾驅(qū)動MouFi的實現(xiàn),點擊安裝后重啟計算機,即完成了過濾驅(qū)動的初始化,插入多個鼠標設備后,計算機顯示器上則會顯示多個鼠標器指針,可同時獨立完成多項操作。
討論:本文所提供的接口程序在理論上可用以支持無限多個人機交互設備同時運行,但在實際運行中會存在硬件資源限制、計算機處理時間遲延等約束,使得所支持的輸入設備存在上限。以鼠標器為例,Windows操作系統(tǒng)采樣兩次鼠標器中斷的最短時間間隔T為15.625ms,而系統(tǒng)處理一次鼠標器操作的時間為Min{cpu處理一個中斷的時間t1,算法模擬一次鼠標器操作時間t2}。鼠標器個數(shù)最大值為n = T / t
總結(jié):本文提供了一種基于內(nèi)核級數(shù)據(jù)過濾的多設備輸入支持方法,并基于此方法實現(xiàn)了多設備輸入的接口,可用于實現(xiàn)多個設備對同一計算機的獨立操作,開發(fā)用戶可在此基礎上編寫程序,實現(xiàn)多個輸入設備同時獨立控制多個對象。為了進一步展示此接口的用途,本文利用此接口實現(xiàn)了多鼠標輸入的系統(tǒng),可以同時支持2到6部甚至更多鼠標器設備在同一計算機上運行。
參考文獻:
[1]王淼,沈超.輸入消息截獲方法對鼠標動力學識別的影響[D].西安交通大學博士生論文,2011
[2]譚文,楊瀟,邵堅磊.Windows內(nèi)核安全編程[M].北京:電子工業(yè)出版社,2009:17-83
[3]SARGENT,M,SHOEMAKER, R.L.The personal computer from the inside out (3rd ed.).New York, Addison-Wesley.1995
[4]SEGALOWITZ,S.,GRAVES,R. .Suitability of the IBM XT, AT, and PS/2 keyboard, mouse, and game port as response devices in reaction time paradigms.Behavior Research Methods, Instruments, Computers,1990: 283–289