麥洛克菲內核驅動開發(fā)第六課_第1頁
麥洛克菲內核驅動開發(fā)第六課_第2頁
麥洛克菲內核驅動開發(fā)第六課_第3頁
麥洛克菲內核驅動開發(fā)第六課_第4頁
麥洛克菲內核驅動開發(fā)第六課_第5頁
已閱讀5頁,還剩31頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、1麥洛克菲內核開發(fā)第五課Sfilter文件系統過濾麥洛克菲2提綱n文件系統驅動n綁定與過濾nSfilter基本框架n文件攔截q創(chuàng)建q刪除q修改q重命名n作業(yè)3麥洛克菲麥洛克菲過濾CancelUserBufferMdlAddressSystemBufferIOSTATUSIRP Headern0頭部堆棧IO_STATUS_BLOCKStatusInformationIO_STACK_LOCATIONMajorFunctionMinorFunctionunion struct Read;struct Write;struct DeviceControl; Parameters;DeviceObje

2、ct文件過濾驅動設備文件卷設備磁盤設備IRP驅動設備IRP過濾:分層驅動中再加一層而不影響它的上下層,以過濾它們之間的數據,對數據或行為進行安全控制。過濾是通過設備綁定實現的。4綁定n設備棧綁定的形式。驅動自己生成一個設備(過濾設備),調用系統提供的綁定API,綁定到目標設備上。并返回一個在未綁定之前目標設備所在設備棧的最頂層設備。這樣發(fā)往下層的IRP或者發(fā)往上層的數據都會被過濾設備截獲。n綁定API:qIoAttachDevice()qIoAttachDeviceToDeviceStackSafe(2000 SP4以及XP以上)qIoAttachDeviceToDeviceStack()So

3、urceDeviceFilter2DeviceFilter1Device TargetDeviceSourceDeviceTargetDeviceAttachedDeviceAttachedDeviceIRP5IoAttachDeviceToDeviceStackPDEVICE_OBJECT IoAttachDeviceToDeviceStack(INPDEVICE_OBJECT SourceDevice,INPDEVICE_OBJECT TargetDevice);AttachedDevice需要記錄在DEVICE_EXTENSION中,以便調用IoCallDriver()繼續(xù)下發(fā)IRPSo

4、urceDeviceFilter2DeviceFilter1Device TargetDeviceSourceDeviceTargetDeviceAttachedDeviceAttachedDeviceIRP6文件系統過濾框架nSfilternMinifilter7Sfilter總體流程n創(chuàng)建控制設備n創(chuàng)建控制設備符號鏈接n過濾分發(fā)函數nFastion過濾與綁定q生成一個過濾設備qIoRegisterFsRegistrationChange( DriverObject,SfFsNotification ); (文件系統設備綁定)qSfFsControl (卷設備綁定)q一個驅動,看見幾個文件系

5、統設備,看見幾個卷設備,對應每一個設備就生成相應設備附載上去,然后進行相應處理。 8IoRegisterFsRegistrationChangen里的方法:q枚舉26個盤符,打開文件,獲得DeviceObject.q然后通過自己驅動生成一個過濾設備,Attach過濾設備到DeviceObject上q無法監(jiān)控類似U盤等動態(tài)加載上去的nIoRegisterFsRegistrationChange動態(tài)獲得9fastion文件系統除了處理正常的IRP之外,還要處理所謂的FastIo.nFastIo是Cache Manager調用所引發(fā)的一種沒有irp的請求。換句話說,除了正常的Dispatch Fun

6、ctions之外,你還得為DriverObject撰寫另一組Fast Io Functions.n這組函數的指針在driver-FastIoDispatch 10Sfilter代碼通讀分析nDriverEntrynsfCreate11再次深入理解IRP12過濾驅動與IRP處理方式na.Pending完成例程qIoCopyCurrentIrpStackLocationToNext nb.忽略直接下發(fā)qIoSkipCurrentIrpStackLocation,下層設備拿到的IO_STACKLOCATION 和當前的一樣nc.結束IRP不下發(fā)PIO_STACK_LOCATION irpStack

7、= IoGetCurrentIrpStackLocation (Irp);Irp-IoStatus.Status = STATUS_SUCCESS;Irp-IoStatus.Information = 0;IoCompleteRequest( Irp, IO_NO_INCREMENT );nd.手動構建IRPqIoAllocateIrpqIoGetNextIrpStackLocation13IRP注意事項n在驅動程序將IRP 傳遞個下一個驅動之后,就不再擁有這個IRP,并且不能試圖再去訪問它。否則會導致系統崩潰。那個IRP 會被其它的驅動或者線程釋放或完成。如果驅動需要訪問一個已經在棧里傳下去

8、的IRP,這個驅動必須實現并設置IoCompletion 例程。當I/O管理器調用IoCompletion 例程時,這個驅動就能夠在IoCompletion 例程執(zhí)行期間重新獲得對這一IRP 的所有權。如此,IoCompletion 例程就能夠訪問IRP 中的域。n若是驅動的分發(fā)例程也還須在IRP 被后面的驅動處理完成之后再處理它,這個IoCompletion例程必須返STATUS_MORE_PROCESSING_REQUIRED,以將IRP 的所有權返回給分發(fā)例程。如此一來,I/O 管理器會停止IRP 的處理,將最終完成IRP 的任務留給分發(fā)例程。分發(fā)例程能夠在之后調用ICompleteRe

9、quest 來完成這個IRP,或者還能將這個IRP 標記為等候進一步處理。14Pending完成例程KEVENT event;KeInitializeEvent(&event, NotificationEvent, FALSE);IoCopyCurrentIrpStackLocationToNext(Irp);IoSetCompletionRoutine(Irp,CompRoutine,&event,TRUE,TRUE,TRUE);status = IoCallDriver(DeviceObject, Irp);if (status = STATUS_PENDING) stat

10、us = KeWaitForSingleObject(&event,Executive,KernelMode,FALSE,NULL);ASSERT(NT_SUCCESS(status);status = Irp-IoStatus.Status;NTSTATUSCompRoutine( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp, IN PVOID Context ) Irp-UserIosb-Status = Irp-IoStatus.Status; Irp-UserIosb-Information = Irp-IoStatus.Inform

11、ation; KeSetEvent(Irp-UserEvent, IO_NO_INCREMENT, FALSE); /IoFreeIrp(Irp); return STATUS_MORE_PROCESSING_REQUIRED;15忽略直接下發(fā)對IRP沒有任何改動的時候,比如放行:PDEVICE_EXTENSION deviceExtension;IoSkipCurrentIrpStackLocation(Irp);/拿到保存在設備擴展里的下層設備deviceExtension = (PDEVICE_EXTENSION) DeviceObject-DeviceExtension;/下發(fā)retu

12、rn IoCallDriver(deviceExtension-TargetDeviceObject, Irp);16拷貝直接下發(fā)/ Forward request to next driverIoCopyCurrentIrpStackLocationToNext( Irp );/ Send the IRP downstatus = IoCallDriver( nextDevice, Irp );/ The following is an error because this driver/ no longer owns the IRP.If (status = STATUS_PENDING)

13、IoMarkIrpPending( Irp );/錯誤,無權操作Irp了/ Return the lower drivers statusreturn status;17自己構建IRP下發(fā)nIoAllocateIrp /IoBuildDeviceIoControlRequest nIoGetNextIrpStackLocation n例子:q強制刪除文件qSfilter里查詢文件名字18非過濾驅動中的默CommonDispatchNTSTATUS CommonDispatch(PDEVICE_OBJECT DeviceObject, PIRP Irp) Irp-IoStatus.Status

14、= STATUS_SUCCESS; IoCompleteRequest(Irp,IO_NO_INCREMENT); return STATUS_SUCCESS;19過濾驅動中CommonDispatch寫法NTSTATUS SfPassThrough ( IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp ) PIO_STACK_LOCATION pIrp = IoGetCurrentIrpStackLocation( Irp ); ASSERT(!IS_MY_CONTROL_DEVICE_OBJECT( DeviceObject ); ASSERT(IS_

15、MY_DEVICE_OBJECT( DeviceObject ); if (!IS_MY_DEVICE_OBJECT(DeviceObject) | IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject) NTSTATUS status = Irp-IoStatus.Status = STATUS_INVALID_PARAMETER; IoCompleteRequest( Irp, IO_NO_INCREMENT ); return status; IoSkipCurrentIrpStackLocation( Irp ); return IoCallDriver(

16、(PSFILTER_DEVICE_EXTENSION) DeviceObject-DeviceExtension)-NLExtHeader.AttachedToDeviceObject, Irp );20分發(fā)過濾函數nFilterCreate(創(chuàng)建)nFilterRead(一般不攔,加解密處理)nFilterWrite(修改,加解密處理)nFilterSetInfo(刪,重命名)nFilterClose(一般不攔)nFilterClean(寫關閉等)n等21API流程CreateFilentCreateFilezwCreateFileIRP_MJ_CREATE過濾設備卷設備磁盤設備Create

17、FilterDispatchCreateIRPNtdll.dllring3ring022再次深入理解設備對象23設備對象類別nSfilter自己的設備q控制設備q過濾設備n其它設備q文件系統設備q卷設備n設備類別#define IS_MY_DEVICE_OBJECT(_devObj) (_devObj) != NULL) & (_devObj)-DriverObject = gSFilterDriverObject) & (_devObj)-DeviceExtension != NULL)#define IS_MY_CONTROL_DEVICE_OBJECT(_devObj)

18、(_devObj) = gSFilterControlDeviceObject) ? (ASSERT(_devObj)-DriverObject = gSFilterDriverObject) & (_devObj)-DeviceExtension = NULL), TRUE) : FALSE)#define IS_DESIRED_DEVICE_TYPE(_type) (_type) = ) | (_type) = ) | (_type) = )24三種類型的設備處理NTSTATUS FilterXXX(PDEVICE_OBJECT DeviceObject, PIRP pIrp) N

19、TSTATUS Status = STATUS_SUCCESS; ULONG ulInfomation = 0; IO_STACK_LOCATION* lpIrpStack = IoGetCurrentIrpStackLocation(pIrp); if (IS_MY_CONTROL_DEVICE_OBJECT(DeviceObject) /如果需要與R3交互,這里必須返回成功 pIrp-IoStatus.Status = Status; pIrp-IoStatus.Information = ulInfomation; IoCompleteRequest(lpIrp, IO_NO_INCRE

20、MENT); else if (!IS_MY_DEVICE_OBJECT(DeviceObject) /非法參數 pIrp-IoStatus.Status = Status = STATUS_INVALID_PARAMETER; pIrp-IoStatus.Information = 0; IoCompleteRequest(pIrp, IO_NO_INCREMENT); else /這里才是我們要過濾的操作 IoSkipCurrentIrpStackLocation( pIrp ); Status = IoCallDriver(PSFILTER_DEVICE_EXTENSION)-Devic

21、eExtension)DeviceObject-NLExtHeader.AttachedToDeviceObject, pIrp); return Status;25重要問題:文件路徑的解析與保存nNamelookup.c(構造IRP,不能用 ObQueryNameString)nNLGetFullPathName()nNLPQuery()IRP查詢n在SfCreate里查詢名字,通過與Name保存起來。供其它過濾函數中查詢使用。n保存在哪里?qList_EntryqHASHqTREE26Sfilter安裝測試n原始的Sfilter框架,不支持通信nsfCreate中對自己的控制設備,返回成功

22、n符號鏈接的創(chuàng)建(框架中沒有)nGroupOrder:FSFilter Activity Monitor“nLSFilterDrvnDeviceObjectFlags |= DO_BUFFERED_IOn不要在release版本使用DriverUnload。BSOD27開始過濾28FilterCreate(1)n放:q內核過來的Irp-RequestorMode = KernelMode q本進程的FilterDeviceIoctrl中 PsGetCurrentProcessId()q系統進程的DriverEntry里:PsGetCurrentProcessId()q文件夾ulOptions = IrpStack-Parameters.Create.Options ;FlagOn(IrpStack-Flags, FO_VOLUME_OPEN) |FlagOn(ulOptions, ) |FlagOn(IrpStack-Flags, SL_OPEN_PAGING_FILE)q分頁IO(Irp-Flags & IRP_PA

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論