WINDOWS中CTRL+ALT+DEL控制的實現(DDK版) (轉)

worldblog發表於2008-01-05
WINDOWS中CTRL+ALT+DEL控制的實現(DDK版) (轉)[@more@]

可能大家知道一些透過中DLL來控制的一些方法.但我要寫的是使用DDK技術來實現控制,進而涉及到一些DDK的一些其他技術.我使用的是 SOFTWARE MICROSOFT DEVELOPMENT KIT工具.在使用上比以前版本的DDK好用很多,但是還有一定難度.這可能需要一些程式設計方面的知識.

例如以下一些概念:裝置,虛擬驅動,WINDOWS中0和3環區別等等.

所謂的驅動程式無非是一些按WINDOWS中的標準運轉的程式.這就需要我們知道這些標準.

當然MICRISOFT給我們提供了一些可以讓我們透過學習可以使用的,這些軟體就是WINDOWS標準的體現.學會使用這些軟體也就知道WINDOWS一些內層標準了.常用的有VTOOLS,DDK,WINDRIVERS.等.其中VTOOLS和WINDRIVERS是更VISUAL和EASY化的東東.當然越VISUAL和EASY的東西功能上可能就受限制.就是說更底層的東西是不容易看見和做到的.DDK是更加底層化的開發軟體.可以說基本上滿足的我們的要求.但學會使用他不容易.下面就”WINDOWS中CTRL+ALT+DEL控制的實現”為例說明一下這個東東.

實際上我們要實現”WINDOWS中CTRL+ALT+DEL控制的實現”,可以使用DDK來編寫鍵盤底層的驅動程式(過濾驅動程式).需要的是由DDK中SRC提供的kbfiltr.c和kbfiltr.H主檔案.其他的相應檔案(和編譯相關的)當然也需要.

kbfiltr.H中提供一下涵數:

1. NTSTATUS KbFilter_AddDevice( IN PDRIVER_ DriverObject, IN PDEVICE_OBJECT BusDeviceObject ); 這是增加裝置涵數,主要是用來增加你自己需要的裝置(可能需要和其他裝置通訊) NTSTATUS KbFilter_CreateClose ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); 這是在裝置建立和關閉時的涵數. NTSTATUS KbFilter_DispatchPassThrough( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); 傳輸向下IRP的涵數 NTSTATUS KbFilter_InternIoCtl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); 內部IRP傳輸時IO控制 NTSTATUS KbFilter_IoCtl ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); 和層IO控制 NTSTATUS KbFilter_PnP ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS KbFilter_Power ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ); NTSTATUS KbFilter_InitializationRoutine( IN PDEVICE_OBJECT DeviceObject, // InitializationContext IN PVOID SynchFuncContext, IN PI8042_SYNCH_READ_PORT ReadPort, IN PI8042_SYNCH_WRITE_PORT WritePort, OUT PBOOLEAN TurnTranslationOn ); BOOLEAN KbFilter_IsrHook( PDEVICE_OBJECT DeviceObject, // IsrContext PKEYBOARD_INPUT_DATA CurrentInput, POUTPUT_PACKET CurrentOutput, UCHAR Statyte, PUCHAR DataByte, PBOOLEAN ContinueProcessing, PKEYBOARD_SCAN_STATE ScanState ); VOID KbFilter_ServiceCallback( IN PDEVICE_OBJECT DeviceObject, IN PKEYBOARD_INPUT_DATA InputDataStart, IN PKEYBOARD_INPUT_DATA InputDataEnd, IN OUT PULONG InputDataConsumed ); VOID KbFilter_Unload ( IN PDRIVER_OBJECT DriverObject );


這其中有用的就是KbFilter_ServiceCallback()涵數(針對本例子).這個涵數提供給我們在鍵盤傳輸資料時可以截獲和控制的服務.引數很簡單:

IN PDEVICE_OBJECT DeviceObject裝置.

IN PKEYBOARD_INPUT_DATA InputDataStart,資料開始包.

IN PKEYBOARD_INPUT_DATA InputDataEnd,資料終止包

在InputDataStart和InputDataEnd之間就是當前鍵盤輸入的資料.想怎麼改就怎麼改拉.

設計一個演算法讓CTRL+ALT+DEL失效.COMPLETE!!


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752043/viewspace-996543/,如需轉載,請註明出處,否則將追究法律責任。

相關文章