




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1.1編寫目的本詳細(xì)設(shè)計(jì)說明書在已有的需求分析基礎(chǔ)上對項(xiàng)目設(shè)計(jì)進(jìn)行概述性描述,預(yù)期讀者為系統(tǒng)開發(fā)、測試及維護(hù)人員及項(xiàng)目驗(yàn)收方。1?2背景系統(tǒng)名稱:u盤過濾驅(qū)動(dòng)程序設(shè)計(jì)人員:朱黎張稷寧1?3定義WDM:Windows驅(qū)動(dòng)模型Filterdriver:過濾器驅(qū)動(dòng)程序2任務(wù)概述編寫一個(gè)基于Filterdriver(過濾器驅(qū)動(dòng)程序)的U盤控制軟件,實(shí)現(xiàn)以下功能:1)針對本機(jī)當(dāng)前用戶對U盤進(jìn)行讀寫控制??梢粤頤盤處于只讀狀態(tài)。2)監(jiān)控用戶對文件系統(tǒng)的操作。為了防止用戶對文件進(jìn)行非法操作,對文件系統(tǒng)進(jìn)行讀/寫權(quán)限控制,并可以監(jiān)視控制對關(guān)鍵文件的讀寫操作。由管理員指定要保護(hù)的關(guān)鍵文件的具體文件名或文件擴(kuò)展名(不含路徑),控制用戶對這些文件的讀寫權(quán)限。并且將對關(guān)鍵文件的讀寫操作記錄下來。3開發(fā)環(huán)境VisualC++與DDK4開發(fā)語言VisualC++6.05總體設(shè)計(jì)5.1設(shè)計(jì)思路:USB是英文UniversalSerialBus的縮寫,中文含義是“通用串行總線”,具有使用方便,支持熱插撥,傳輸速率高,當(dāng)前的USB2.0規(guī)范,能達(dá)到480Mbps,能獨(dú)立供電,易于擴(kuò)張,基于上面的優(yōu)點(diǎn),這樣給計(jì)算機(jī)的資料造成了不小的威脅。1、應(yīng)用程序通過I/O管理器向硬件設(shè)備驅(qū)動(dòng)發(fā)送IRP。2、硬件設(shè)備過濾驅(qū)動(dòng)攔截發(fā)向硬件設(shè)備驅(qū)動(dòng)的IRP。3、硬件設(shè)備過濾驅(qū)動(dòng)根據(jù)設(shè)備名查找關(guān)鍵設(shè)備HASH表,看是否有權(quán)限進(jìn)行啟/禁,讀/寫操作。4、如果有權(quán)限或者不是關(guān)鍵文件,就把IRP傳送給硬件設(shè)備驅(qū)動(dòng);如果沒有權(quán)限,就直接返回拒絕訪問。5.2模塊結(jié)構(gòu):DeviceloControSCSIPNPAddDevice其它例程例程例程例程例程入口例程:創(chuàng)建控制設(shè)備對象,初始化驅(qū)動(dòng)的例程入口指針,初始化全局變量。分派例程:分派IRP到其他例程。DeviceloContro例程:接收U盤狀態(tài)設(shè)置命令進(jìn)行解析,修改U盤設(shè)置狀態(tài)記錄,與應(yīng)用層進(jìn)行通信。SCSI例程:分析并過濾讀或者寫請求,查詢U盤狀態(tài),若禁止讀則直接返回拒絕訪問。在Windows2000中還要處理MODESENSE請求,對U盤的只讀狀態(tài)進(jìn)行設(shè)置。AddDevice例程:得到屬于USB大容量存儲(chǔ)設(shè)備的功能設(shè)備,對其進(jìn)行綁定。PNP例程:在PNP例程中處理總線關(guān)聯(lián)查詢的請求,綁定USB大容量存儲(chǔ)設(shè)備的物理設(shè)備;其它例程或是請求不作處理。66.碼#pragmaPAGEDCODE#pragmaPAGEDCODE#include"ZLLY_Driver.h"#include<srb.h>#include<scsi.h>*函數(shù)名稱:DriverEntry*功能描述:初始化驅(qū)動(dòng)程序,定位和申請硬件資源,創(chuàng)建內(nèi)核對象*參數(shù)列表:pDriverObject:從I/O管理器中傳進(jìn)來的驅(qū)動(dòng)對象pRegistryPath:驅(qū)動(dòng)程序在注冊表的中的路徑*返回值:返回初始化驅(qū)動(dòng)狀態(tài)#pragmaINITCODE〃用#pragma指明將此例程分派在分頁內(nèi)存中下同extern"C"NTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,INPUNICODE_STRINGRegistryPath){//驅(qū)動(dòng)函數(shù)入口KdPrint(("進(jìn)入驅(qū)動(dòng)函數(shù)入口\n"));DriverObject->DriverUnload=ZLLY_Driver_DriverUnload;〃設(shè)置卸載函數(shù)指針DriverObject->DriverExtension->AddDevice=ZLLY_Driver_AddDevice;〃設(shè)置AddDevice函數(shù)指針for(inti=0;i<arraysize(DriverObject->MajorFunction);++i)DriverObject->MajorFunction[i]=ZLLY_Driver_DispatchAny;〃所有IRP派遣函數(shù)設(shè)為ZLLY_Driver_DispatchAny;DriverObject->MajorFunction[IRP_MJ_POWER]=ZLLY_Driver_DispatchPower;〃對操作系統(tǒng)處理電源消息時(shí)產(chǎn)生的IRP派遣函數(shù)設(shè)為ZLLY_Driver_DispatchPowerDriverObject->MajorFunction[IRP_MJ_PNP]=ZLLY_Driver_DispatchPnp;〃即插即用消息IRP派遣函數(shù)設(shè)為ZLLY_Driver_DispatchPnp;DriverObject->MajorFunction[IRP_MJ_SCSI]=ZLLY_Driver_DispatchForSCSI;〃處理讀寫操作IRP派遣函數(shù)設(shè)為ZLLY_Driver_DispatchForSCSIreturnSTATUS_SUCCESS;}*函數(shù)名稱:ZLLY_Driver_DriverUnload*功能描述:負(fù)責(zé)驅(qū)動(dòng)程序的卸載操作*參數(shù)列表:DriverObject:驅(qū)動(dòng)對象*返回值:void*/}}//“附加”操作失敗VOIDZLLY_Driver_DriverUnload(INPDRIVER_OBJECTDriverobject){PAGED_CODE();KdPrint(("進(jìn)入ZLLY_Driver_DriverUnload\n"));KdPrint(("離開ZLLY_Driver_DriverUnload\n"));}*函數(shù)名稱:ZLLY_Driver_AddDevice*功能描述:添加新設(shè)備*參數(shù)列表:DriverObject:從I/O管理器中傳進(jìn)來的驅(qū)動(dòng)對象pdo:從I/O管理器中傳進(jìn)來的物理設(shè)備對象*返回值:返回添加新設(shè)備狀態(tài)*/NTSTATUSZLLY_Driver_AddDevice(INPDRIVER_OBJECTDriverObject,INPDEVICE_OBJECTpdo){PAGED_CODE();NTSTATUSstatus;PDEVICE_OBJECTfido;status=IoCreateDevice(DriverObject,sizeof(DEVICE_EXTENSION),NULL,ZLLY_Driver_GetDeviceTypeToUse(pdo),0,FALSE,&fido);〃創(chuàng)建設(shè)備對象訐(!NT_SUCCESS(status))〃判斷是否成功創(chuàng)建設(shè)備對象{KdPrint(("創(chuàng)建設(shè)備對象失敗"));returnstatus;//如果不能成功創(chuàng)建設(shè)備對象就返回}PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;〃得到設(shè)備對象擴(kuò)展do{IoInitializeRemoveLock(&pdx->RemoveLock,0,0,0);//初始化自旋鎖pdx->DeviceObject=fido;//設(shè)置擴(kuò)展設(shè)備對象屬于fidopdx->Pdo=pdo;//設(shè)置擴(kuò)展設(shè)備對象的物理設(shè)備對象PDEVICE_OBJECTfdo=IoAttachDeviceToDeviceStack(fido,pdo);//將過濾驅(qū)動(dòng)附加在底層驅(qū)動(dòng)之上if(!fdo){KdPrint(("附加操作失敗\n"));status=STATUS_DEVICE_REMOVED;break;pdx->LowerDeviceObject=fdo;〃記錄底層驅(qū)動(dòng)fido->Flags|=fdo->Flags&(DO_DIRECT_IO|DO_BUFFERED_IO|DO_POWER_PAGABLE);fido->Flags&=~DO_DEVICE_INITIALIZING;〃由于不知道底層驅(qū)動(dòng)是直接IO還是BufferIO,因此將標(biāo)志都置上}while(FALSE);訐(!NT_SUCCESS(status)){〃如果沒有成功,則從設(shè)備堆棧刪除設(shè)備if(pdx->LowerDeviceObject)loDetachDevice(pdx->LowerDeviceObject);IoDeleteDevice(fido);}returnstatus;}*函數(shù)名稱:ZLLY_Driver_CompleteRequest*功能描述:將“睡眠”的線程恢復(fù)運(yùn)行,結(jié)束IRP請求*參數(shù)列表:Irp:當(dāng)前派遣函數(shù)中的IRP數(shù)據(jù)status:IRP完成狀態(tài)info:IRP操作了多少字節(jié)*返回值:返回Irp完成狀態(tài)*/#pragmaLOCKEDCODENTSTATUSZLLY_Driver_CompleteRequest(INPIRPIrp,INNTSTATUSstatus,INULONG_PTRinfo){Irp->IoStatus.Status=status;〃設(shè)置IRP完成狀態(tài)為statusIrp->IoStatus.Information=info;//設(shè)置IRP操作了info字節(jié)IoCompleteRequest(Irp,IO_NO_INCREMENT);〃用IoCompleteRequest結(jié)束IRP請求并返回//IO_NO_INCREMENT不增加優(yōu)先級(jí)returnstatus;}*函數(shù)名稱:ZLLY_Driver_USBSCSICompletion*功能描述:將設(shè)備變?yōu)橹蛔x*參數(shù)列表:DriverObject:從I/O管理器中傳進(jìn)來的驅(qū)動(dòng)對象Irp:當(dāng)前派遣函數(shù)中的IRP數(shù)據(jù)Context:一級(jí)指針*返回值:返回設(shè)備狀態(tài)*/NTSTATUSZLLY_Driver_USBSCSICompletion(INPDEVICE_OBJECTDeviceobject,INPIRPIrp,INPVOIDContext){〃獲取設(shè)備擴(kuò)展PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)DeviceObject->DeviceExtension;〃獲取自旋鎖IoAcquireRemoveLock(&pdx->RemoveLock,Irp);〃獲得當(dāng)前IO堆棧PIO_STACK_LOCATIONirpStack=IoGetCurrentIrpStackLocation(Irp);〃獲取當(dāng)前IRP處理狀態(tài)PSCSI_REQUEST_BLOCKCurSrb=irpStack->Parameters.Scsi.Srb;PCDBcdb=(PCDB)CurSrb->Cdb;UCHARopCode=cdb->CDB6GENERIC.OperationCode;〃獲取操作碼if(opCode==SCSIOP_MODE_SENSE&&CurSrb->DataBuffer&&CurSrb->DataTransferLength>=sizeof(MODE_PARAMETER_HEADER))〃判斷是否是SCSIOP_MODE_SENSE操作{KdPrint(("SCSIOP_MODE_SENSE操作!\n"));PMODE_PARAMETER_HEADERmodeData=(PMODE_PARAMETER_HEADER)CurSrb->DataBuffer;〃得到模式參數(shù)頭modeData->DeviceSpecificParameter|=MODE_DSP_WRITE_PROTECT;〃設(shè)置U盤只讀}訐(Irp->PendingReturned)〃判斷是否需要掛起{IoMarkIrpPending(Irp);//掛起IRP}IoReleaseRemoveLock(&pdx->RemoveLock,Irp);〃釋放自旋鎖returnIrp->IoStatus.Status;*函數(shù)名稱:ZLLY_Driver_DispatchForSCSI*功能描述:對IRP_MJ_SCSI這個(gè)IRP的截獲*參數(shù)列表:fido:過濾器設(shè)備對象Irp:當(dāng)前派遣函數(shù)中的IRP數(shù)據(jù)*返回值:底層設(shè)備對象狀態(tài)*/#pragmaLOCKEDCODENTSTATUSZLLY_Driver_DispatchForSCSI(INPDEVICE_OBJECTfido,INPIRPIrp){//獲得設(shè)備擴(kuò)展PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;〃獲得當(dāng)前I/O堆棧PIO_STACK_LOCATIONirpStack=loGetCurrentlrpStackLocation(lrp);//向下層設(shè)備發(fā)送TRPNTSTATUSstatus;status=IoAcquireRemoveLock(&pdx->RemoveLock,Irp);//獲取自旋鎖訐(!NT_SUCCESS(status))returnZLLY_Driver_CompleteRequest(Irp,status,0);//將“睡眠"的線程恢復(fù)運(yùn)行,結(jié)束IRP請求loCopyCurrentlrpStackLocationToNext(lrp);//將當(dāng)前I/O堆棧復(fù)制到下層I/O堆棧IoSetCompletionRoutine(Irp,ZLLY_Driver_USBSCSICompletion,NULL,TRUE,TRUE,TRUE);〃設(shè)置完成例程status=loCallDriver(pdx->LowerDeviceObject,Irp);//調(diào)用底層設(shè)備對象行IoReleaseRemoveLock(&pdx->RemoveLock,Irp);〃釋放自旋鎖returnstatus;}*函數(shù)名稱:ZLLY_Driver_DispatchAny*功能描述:〃讓IRP穿過本層驅(qū)動(dòng)*參數(shù)列表:fido:過濾器設(shè)備對象Irp:當(dāng)前派遣函數(shù)中的IRP數(shù)據(jù)*返回值:底層設(shè)備對象狀態(tài)*/#pragmaLOCKEDCODENTSTATUSZLLY_Driver_DispatchAny(INPDEVICE_OBJECTfido,INPIRPIrp){PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;//獲得設(shè)備擴(kuò)展
PIO_STACK_LOCATIONstack=loGetCurrentlrpStackLocation(lrp);〃獲得I/O堆棧#ifDBGstaticchar*irpname[]={"IRP_MJ_CREATE","IRP_MJ_CREATE_NAMED_PIPE","IRP_MJ_CLOSE","IRP_MJ_READ","IRP_MJ_WRITE",會(huì)產(chǎn)生此IRP"IRP_MJ_QUERY_INFORMATION","IRP_MJ_SET_INFORMATION","IRP_MJ_QUERY_EA","IRP_MJ_SET_EA","IRP_MJ_FLUSH_BUFFERS","IRP_MJ_QUERY_VOLUME_INFORMATION","IRP_MJ_SET_VOLUME_INFORMATION","IRP_MJ_DIRECTORY_CONTROL","IRP_MJ_FILE_SYSTEM_CONTROL","IRP_MJ_DEVICE_CONTROL","IRP_MJ_INTERNAL_DEVICE_CONTROL","IRP_MJ_SHUTDOWN","IRP_MJ_LOCK_CONTROL","IRP_MJ_CLEANUP","IRP_MJ_CREATE_MAILSLOT","IRP_MJ_QUERY_SECURITY","IRP_MJ_SET_SECURITY","IRP_MJ_POWER",產(chǎn)生此IRP"IRP_MJ_SYSTEM_CONTROL","IRP_MJ_DEVICE_CHANGE","IRP_MJ_QUERY_QUOTA","IRP_MJ_SET_QUOTA","IRP_MJ_PNP",〃創(chuàng)建設(shè)備〃關(guān)閉設(shè)備〃讀取設(shè)備內(nèi)容〃對設(shè)備進(jìn)行〃創(chuàng)建設(shè)備〃關(guān)閉設(shè)備〃讀取設(shè)備內(nèi)容〃對設(shè)備進(jìn)行WriteFile時(shí)//獲取文件長度〃設(shè)置文件長度//系統(tǒng)內(nèi)部產(chǎn)生的控制信息//DeviceloControl函數(shù)會(huì)產(chǎn)生此IRP〃關(guān)閉系統(tǒng)前會(huì)產(chǎn)生此IRP〃清除工作//在操作系統(tǒng)處理電源消息時(shí)//即插即用消息UCHARtype=stack->MajorFunction;if(type>=arraysize(irpname))KdPrint(("存在不明IRP"));#endifNTSTATUSstatus;status=IoAcquireRemoveLock(&pdx->RemoveLock,Irp);〃獲取自旋鎖f(!NT_SUCCESS(status))〃判斷是否成功獲取自選鎖returnZLLY_Driver_CompleteRequest(lrp,status,0);//結(jié)束TRP請求loSkipCurrentlrpStackLocation(lrp);//調(diào)用底層驅(qū)動(dòng)程序status=loCallDriver(pdx->LowerDeviceObject,Irp);//釋放自旋鎖loReleaseRemoveLock(&pdx->RemoveLock,Irp);〃釋放刪除鎖以及目前未處理的刪除操作returnstatus;}*函數(shù)名稱:ZLLY_Driver_DispatchPower*功能描述:處理電源管理器發(fā)出的主功能碼為IRP_MJ_PNP的i/o請求,實(shí)現(xiàn)設(shè)備對電源管理的支持*參數(shù)列表:fido:過濾器設(shè)備對象Irp:當(dāng)前派遣函數(shù)中的IRP數(shù)據(jù)*返回值:底層設(shè)備對象狀態(tài)*/NTSTATUSZLLY_Driver_DispatchPower(INPDEVICE_OBJECTfido,INPIRPIrp){//DispatchPower#ifDBGPIO_STACK_LOCATIONstack=loGetCurrentlrpStackLocation(lrp);ULONGfcn=stack->MinorFunction;〃通過函數(shù)IoGetCurrentIrpStackLocation()得到當(dāng)前的IRP,并由此得到MinorFunction:staticchar*fcnname[]={"IRP_MN_WAIT_WAKE","IRP_MN_POWER_SEQUENCE","IRP_MN_SET_POWER","IRP_MN_QUERY_POWER",};//IRP類型訐(fcn==IRP_MN_SET_POWER||fcn==IRP_MN_QUERY_POWER){staticchar*sysstate[]={"PowerSystemUnspecified","PowerSystemWorking","PowerSystemSleeping1","PowerSystemSleeping2","PowerSystemSleeping3","PowerSystemHibernate","PowerSystemShutdown","PowerSystemMaximum",};//定義SystemPowerStatestaticchar*devstate[]={"PowerDeviceUnspecified","PowerDeviceDO","PowerDeviceD1","PowerDeviceD2","PowerDeviceD3","PowerDeviceMaximum",};//定義DevicePowerStateULONGcontext=stack->Parameters.Power.SystemContext;POWER_STATE_TYPEtype=stack->Parameters.Power.Type;/得到DevicePowerStateKdPrint(("-IRP_MJ_POWER(%s)",fcnname[fcn]));if(type==SystemPowerState)KdPrint((",SystemPowerState=%s\n",sysstate[stack->Parameters.Power.State.SystemState]));elseKdPrint((",DevicePowerState=%s\n",devstate[stack->Parameters.Power.State.DeviceState]));}else訐(fen<arraysize(fcnname))KdPrint(("-IRP_MJ_POWER(%s)\n",fcnname[fcn]));elseKdPrint(("-IRP_MJ_POWER(%2.2X)\n",fcn));#endif//DBGPDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;//指向擴(kuò)展設(shè)備對象PoStartNextPowerlrp(Irp);//表明其已準(zhǔn)備處理下一個(gè)電源IRPNTSTATUSstatus;status=IoAcquireRemoveLock(&pdx->RemoveLock,Irp);//調(diào)用loAcquireRemoveLock來獲得刪除鎖訐(!NT_SUCCESS(status))//失敗returnZLLY_Driver_CompleteRequest(lrp,status,0);//結(jié)束IRP請求IoSkipCurrentIrpStackLocation(Irp);status=PoCallDriver(pdx->LowerDeviceObject,Irp);〃沒有任何處理,直接向下傳遞IRPIoReleaseRemoveLock(&pdx->RemoveLock,Irp);〃釋放刪除鎖以及目前未處理的刪除操作returnstatus;*函數(shù)名稱:ZLLY_Driver_DispatchPnp*功能描述:對即插即用IRP進(jìn)行處理*參數(shù)列表:fido:功能設(shè)備對象Irp:從10請求包*返回值:底層設(shè)備對象狀態(tài)NTSTATUSZLLY_Driver_DispatchPnp(INPDEVICE_OBJECTfido,INPIRPIrp){PIO_STACK_LOCATIONstack=loGetCurrentlrpStackLocation(lrp);ULONGfcn=stack->MinorFunction;〃通過函數(shù)loGetCurrentlrpStackLocation()得到當(dāng)前的IRP,并由此得到MinorFunction:NTSTATUSstatus;PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;〃指向擴(kuò)展設(shè)備對象status=IoAcquireRemoveLock(&pdx->RemoveLock,Irp);//調(diào)用IoAcquireRemoveLock來獲得刪除鎖訐(!NT_SUCCESS(status))//失敗returnZLLY_Driver_CompleteRequest(Irp,status,0);//結(jié)束IRP請求#ifDBGstaticchar*pnpname[]=〃能處理的IRP{"IRP_MN_START_DEVICE","IRP_MN_QUERY_REMOVE_DEVICE","IRP_MN_REMOVE_DEVICE","IRP_MN_CANCEL_REMOVE_DEVICE","IRP_MN_STOP_DEVICE","IRP_MN_QUERY_STOP_DEVICE","IRP_MN_CANCEL_STOP_DEVICE","IRP_MN_QUERY_DEVICE_RELATIONS","IRP_MN_QUERY_INTERFACE","IRP_MN_QUERY_CAPABILITIES","IRP_MN_QUERY_RESOURCES","IRP_MN_QUERY_RESOURCE_REQUIREMENTS","IRP_MN_QUERY_DEVICE_TEXT","IRP_MN_FILTER_RESOURCE_REQUIREMENTS","IRP_MN_READ_CONFIG","IRP_MN_WRITE_CONFIG","IRP_MN_EJECT","IRP_MN_SET_LOCK","IRP_MN_QUERY_ID","IRP_MN_QUERY_PNP_DEVICE_STATE","IRP_MN_QUERY_BUS_INFORMATION","IRP_MN_DEVICE_USAGE_NOTIFICATION","IRP_MN_SURPRISE_REMOVAL","IRP_MN_QUERY_LEGACY_BUS_INFORMATION",};if(fen<arraysize(pnpname))KdPrint(("-IRP_MJ_PNP(%s)\n",pnpname[fen]));elseKdPrint(("-IRP_MJ_PNP(%2.2X)\n",fen));#endif//DBG訐(fen==IRP_MN_DEVICE_USAGE_NOTIFICATION){訐(!fido->AttachedDevice||(fido->AttachedDevice->Flags&DO_POWER_PAGABLE))fido->Flags|=DO_POWER_PAGABLE;loCopyCurrentlrpStackLocationToNext(lrp);〃直接把本層驅(qū)動(dòng)IO堆棧的內(nèi)容設(shè)置為下層驅(qū)動(dòng)IO堆棧指針的指向loSetCompletionRoutine(lrp,(PIO_COMPLETION_ROUTINE)ZLLY_Driver_UsageNotificationCompletionRoutine,(PVOID)pdx,TRUE,TRUE,TRUE);/*注冊一個(gè)IO完成例程(ZLLY_Driver_UsageNotificationCompletionRoutine),這個(gè)完成例程將會(huì)在調(diào)用此函數(shù)的驅(qū)動(dòng)的下一層驅(qū)動(dòng)完成IRP指定的操作請求時(shí)被調(diào)用*/returnloCallDriver(pdx->LowerDeviceObject,Irp);//將PnPIRP交由下層驅(qū)動(dòng)程序處理}訐(fcn==IRP_MN_START_DEVICE)//同上{loCopyCurrentlrpStackLocationToNext(lrp);loSetCompletionRoutine(lrp,(PIO_COMPLETION_ROUTINE)ZLLY_Driver_StartDeviceCompletionRoutine,(PVOID)pdx,TRUE,TRUE,TRUE);returnIoCallDriver(pdx->LowerDeviceObject,Irp);}訐(fcn==IRP_MN_REMOVE_DEVICE){loSkipCurrentlrpStackLocation(lrp);status=IoCallDriver(pdx->LowerDeviceObject,Irp);〃沒有任何處理,直接向下傳遞IRPIoReleaseRemoveLockAndWait(&pdx->RemoveLock,Irp);//來釋放在ZLLY_Driver_DispatchPnp例程中獲取的刪除鎖ZLLY_Driver_RemoveDevice(fido);//移除功能設(shè)備returnstatus;}IoSkipCurrentIrpStackLocation(Irp);status=IoCallDriver(pdx->LowerDeviceObject,Irp);〃沒有任何處理,直接向下傳遞IRPloReleaseRemoveLock(&pdx->RemoveLock,Irp);〃釋放刪除鎖以及目前未處理的刪除操作returnstatus;}*函數(shù)名稱:ZLLY_Driver_GetDeviceTypeToUse*功能描述:得到下一個(gè)較低的設(shè)備的設(shè)備對象的類型*參數(shù)列表:pdo:從I/O管理器中傳進(jìn)來的驅(qū)動(dòng)對象*返回值:下一個(gè)較低的設(shè)備的設(shè)備對象的類型*/#pragmaPAGEDCODEULONGZLLY_Driver_GetDeviceTypeToUse(PDEVICE_OBJECTpdo){PDEVICE_OBJECTldo=IoGetAttachedDeviceReference(pdo);〃獲取設(shè)備對象指針引用訐(!ldo)〃獲取失敗returnFILE_DEVICE_UNKNOWN;ULONGdevtype=ldo->DeviceType;ObDereferenceObject(ldo);〃減少一個(gè)設(shè)備對象的引用計(jì)數(shù)returndevtype;}*函數(shù)名稱:ZLLY_Driver_RemoveDevice*功能描述:對fido功能設(shè)備對象進(jìn)行移除*參數(shù)列表:fido:功能設(shè)備對象*返回值:void*/#pragmaPAGEDCODEVOIDZLLY_Driver_RemoveDevice(INPDEVICE_OBJECTfido){KdPrint(("EnterRemoveDevice"));PAGED_CODE();PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)fido->DeviceExtension;〃指向擴(kuò)展設(shè)備對象if(pdx->LowerDeviceObject)IoDetachDevice(pdx->LowerDeviceObject);〃把fido從設(shè)備棧中脫開IoDeleteDevice(fido);//刪除fido}*函數(shù)名稱:ZLLY_Driver_StartDeviceCompletionRoutine*功能描述:向上傳遞未決的狀態(tài)*參數(shù)列表:fido:功能設(shè)備對象Irp:從10請求包pdx:擴(kuò)展設(shè)備*返回值:返回狀態(tài)#pragmaLOCKEDCODENTSTATUSZLLY_Driver_StartDeviceCompletionRoutine(PDEVICE_OBJECTfido,PIRPIrp,PDEVICE_EXTENSIONpdx){if(Irp->PendingReturned)IoMarkIrpPending(Irp);/*在驅(qū)動(dòng)某一層處理完后標(biāo)記pengding狀態(tài)。建議此時(shí)最好后面就直接returnSTATUS_PENDING了絕對不要returnSTATUS_PENDING前不IoMarkIrpPending,這里我們有點(diǎn)例外*/訐(pdx->LowerDeviceObject->Characteristics&FILE_REMOVABLE_MEDIA)fido->Characteristics|=FIL
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 小紅書運(yùn)營合作協(xié)議書
- 經(jīng)理薪資協(xié)議書
- 用利潤出資入股協(xié)議書
- 礦石礦業(yè)協(xié)議書
- 電梯廣告機(jī)轉(zhuǎn)讓協(xié)議書
- 道具創(chuàng)作協(xié)議書
- 營銷分成協(xié)議書
- 生蠔養(yǎng)殖協(xié)議書
- 幼兒園合伙合作協(xié)議書
- 終結(jié)調(diào)解協(xié)議書
- 中考英語1600核心詞匯
- 空調(diào)維保服務(wù)投標(biāo)方案 (技術(shù)方案)
- CSTM-鋁灰用于替代鋁土礦石技術(shù)規(guī)范編制說明
- 詢價(jià)函模板范文
- 2023年江蘇省南京市中考物理試題(解析版)
- 2023-2024學(xué)年科學(xué)四年級(jí)下冊人教鄂教版2.8《蠶的一生》教學(xué)設(shè)計(jì)
- 防汛應(yīng)急預(yù)案演練說辭
- 教育系統(tǒng)后備干部面試題目
- 河南省鄭州市2023-2024學(xué)年高一下學(xué)期6月期末數(shù)學(xué)試題(無答案)
- 14J936變形縫建筑構(gòu)造
- TD/T 1012-2016 土地整治項(xiàng)目規(guī)劃設(shè)計(jì)規(guī)范(正式版)
評(píng)論
0/150
提交評(píng)論