• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            S.l.e!ep.¢%

            像打了激速一樣,以四倍的速度運轉,開心的工作
            簡單、開放、平等的公司文化;尊重個性、自由與個人價值;
            posts - 1098, comments - 335, trackbacks - 0, articles - 1
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            sfilter(二) 繼續sfilter的DriverEntry()

            Posted on 2010-02-18 22:51 S.l.e!ep.¢% 閱讀(1011) 評論(0)  編輯 收藏 引用 所屬分類: Windows WDM
            sfilter(一) sfilter的DriverEntry()?? ?的代碼

            1. 如果系統版本號 WINVER >= 0x0501 ?則動態加載如下的函數, 并保存到 gSfDynamicFunctions?這個結構(當然,這個結構是自定義的)
            ??? FsRtlRegisterFileSystemFilterCallbacks???? (詳見 sfilter(二) - 01 注冊FsFilter回調例程?)?
            ??? IoAttachDeviceToDeviceStackSafe?? 可以將我們創建的設備對象 附加 到 目標文件系統或卷的過濾設備堆棧之中,這樣發到目標設備的IRP,都先發到我們的設備對象,實現過濾
            ??? IoEnumerateDeviceObjectList
            ??? IoGetLowerDeviceObject
            ??? IoGetDeviceAttachmentBaseRef
            ??? IoGetDiskDeviceObject
            ??? IoGetAttachedDeviceReference
            ??? RtlGetVersion
            ??? (使用的函數是 MmGetSystemRoutineAddress() 它會從Ntoskrnl.exe 或 HAL 動態獲取到函數地址)

            2. 保存 DriverObject? 到 gSFilterDriverObject (暫不知道用來干嘛...)

            3. 如果系統版本號 WINVER >= 0x0501??且?IoEnumerateDeviceObjectList 這個函數指針不為空...
            ??? 執行 gSFilterDriverObject->DriverUnload = DriverUnload;?? (這里郁悶,干嘛不直接 DriverObject->DriverUnload = DriverUnload;??? ...)

            4. 初始化一個資源變量 gRulesResource (使用的是 ExInitializeResourceLite() 函數)
            ExInitializeResourceLite()

            5. 初始化一個Mutex - gSfilterAttachLock (使用的是 ExInitializeFastMutex() 函數)

            6. 初始化 gFsCtxLookAsideList、gFileNameLookAsideList、gReadWriteCompletionCtxLookAsideList (使用的是 ExInitializeNPagedLookasideList() 函數)
            (不知道這三個用來放什么?)

            7. 創建一個控制設備對象(這個對象代表這個驅動。注意它沒有設備擴展) (用于與應用層通信?)
            ??? 路徑是 file://FileSystem//Filters//SFilterCDO
            ??? 如果創建失敗,原因是路徑不在,那么就嘗試在 file://FileSystem//SFilterCDO?下創建

            8. DriverObject的MajorFunction? 都使用 SfPassThrough() 這個函數來過濾,而
            ??? (1) 下列 IRP 使用 SfCreate() 來過濾
            ??? IRP_MJ_CREATE
            ??? IRP_MJ_CREATE_NAMED_PIPE
            ??? IRP_MJ_CREATE_MAILSLOT?
            ????
            ??? (2) IRP_MJ_FILE_SYSTEM_CONTROL 使用 SfFsControl() 來過濾
            ????
            ?? ?(3) IRP_MJ_CLEANUP = SfCleanup;
            ????
            ??? (4)?IRP_MJ_CLOSE = SfClose;
            ?
            ??? (5) IRP_MJ_READ = SfRead;

            ????(6)?IRP_MJ_WRITE = SfWrite;
            ???
            ??? (7)?IRP_MJ_DIRECTORY_CONTROL = SfDirectoryControl;
            ?
            ??? (8) IRP_MJ_SET_INFORMATION = SfSetInformation;
            ????
            9、填充 FastIoDispatch 結構,并賦給 DriverObject
            ???????FastIoDispatch->FastIoCheckIfPossible = SfFastIoCheckIfPossible;
            ?????? FastIoDispatch->FastIoRead = SfFastIoRead;
            ?????? FastIoDispatch->FastIoWrite = SfFastIoWrite;
            ?????? FastIoDispatch->FastIoQueryBasicInfo = SfFastIoQueryBasicInfo;
            ???????FastIoDispatch->FastIoQueryStandardInfo = SfFastIoQueryStandardInfo;
            ???????FastIoDispatch->FastIoLock = SfFastIoLock;
            ???????FastIoDispatch->FastIoUnlockSingle = SfFastIoUnlockSingle;
            ???????FastIoDispatch->FastIoUnlockAll = SfFastIoUnlockAll;
            ???????FastIoDispatch->FastIoUnlockAllByKey = SfFastIoUnlockAllByKey;
            ???????FastIoDispatch->FastIoDeviceControl = SfFastIoDeviceControl;
            ???????FastIoDispatch->FastIoDetachDevice = SfFastIoDetachDevice;
            ???????FastIoDispatch->FastIoQueryNetworkOpenInfo = SfFastIoQueryNetworkOpenInfo;
            ???????FastIoDispatch->MdlRead = SfFastIoMdlRead;
            ???????FastIoDispatch->MdlReadComplete = SfFastIoMdlReadComplete;
            ???????FastIoDispatch->PrepareMdlWrite = SfFastIoPrepareMdlWrite;
            ???????FastIoDispatch->MdlWriteComplete = SfFastIoMdlWriteComplete;
            ???????FastIoDispatch->FastIoReadCompressed = SfFastIoReadCompressed;
            ???????FastIoDispatch->FastIoWriteCompressed = SfFastIoWriteCompressed;
            ???????FastIoDispatch->MdlReadCompleteCompressed = SfFastIoMdlReadCompleteCompressed;
            ???????FastIoDispatch->MdlWriteCompleteCompressed = SfFastIoMdlWriteCompleteCompressed;
            ???????FastIoDispatch->FastIoQueryOpen = SfFastIoQueryOpen;

            10、如果系統版本 WINVER >= 0x0501 且 RegisterFileSystemFilterCallbacks 這個函數指針不為空
            ??????? 那么通過 RegisterFileSystemFilterCallbacks() 這個函數設置一些 callback (具體做什么還不知道。。。)

            ???FsFilterCallbacks.SizeOfFsFilterCallbacks = sizeof(FS_FILTER_CALLBACKS);
            ???FsFilterCallbacks.PreAcquireForSectionSynchronization = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostAcquireForSectionSynchronization = SfPostFsFilterPassThrough;
            ???FsFilterCallbacks.PreReleaseForSectionSynchronization = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostReleaseForSectionSynchronization = SfPostFsFilterPassThrough;
            ???FsFilterCallbacks.PreAcquireForCcFlush = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostAcquireForCcFlush = SfPostFsFilterPassThrough;
            ???FsFilterCallbacks.PreReleaseForCcFlush = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostReleaseForCcFlush = SfPostFsFilterPassThrough;
            ???FsFilterCallbacks.PreAcquireForModifiedPageWriter = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostAcquireForModifiedPageWriter = SfPostFsFilterPassThrough;
            ???FsFilterCallbacks.PreReleaseForModifiedPageWriter = SfPreFsFilterPassThrough;
            ???FsFilterCallbacks.PostReleaseForModifiedPageWriter = SfPostFsFilterPassThrough;


            11、當一個新的文件系統被裝入或者當任何文件系統被卸載時,注冊的回調函數 SfFsNotification將被調用
            ????????通過? tatus = IoRegisterFsRegistrationChange(DriverObject, SfFsNotification); 這一句來實現

            12、試圖附著到合適的RAW文件系統設備對象 \\Device\\RawDisk?和 \\Device\\RawCdRom,因為他們沒有被IoRegisterFsRegistrationChange枚舉
            ????? (通過 IoGetDeviceObjectPointer() 函數)
            ???????
            13、清除控制設備對象上的初始化標志,因為我們現在成功完成初始化

            14、調用 IoRegisterDriverReinitialization

            15、打完收工!!
            性做久久久久久久久浪潮| 久久亚洲精品中文字幕| 中文字幕亚洲综合久久2| 亚洲综合婷婷久久| 久久se精品一区二区影院| 久久久久久久久久久| 久久久久久久久久久久中文字幕 | 亚洲精品tv久久久久久久久| 一本一本久久a久久综合精品蜜桃| 久久久久久久精品成人热色戒 | 日本一区精品久久久久影院| 中文字幕无码av激情不卡久久| 久久久噜噜噜久久熟女AA片| 久久久久香蕉视频| 久久亚洲精品成人av无码网站| 久久99精品久久久久久不卡| 日韩乱码人妻无码中文字幕久久| 品成人欧美大片久久国产欧美... 品成人欧美大片久久国产欧美 | 国产香蕉97碰碰久久人人| 少妇精品久久久一区二区三区| 精品久久久久久99人妻| 久久精品无码午夜福利理论片| 亚洲精品综合久久| 久久本道综合久久伊人| 99久久99久久久精品齐齐| 久久人人添人人爽添人人片牛牛| 国内精品久久久久影院免费| 午夜精品久久久久久99热| 一个色综合久久| 久久精品国产色蜜蜜麻豆| 久久婷婷是五月综合色狠狠| 久久久久人妻一区精品| 久久精品无码av| 久久久久99精品成人片三人毛片 | 久久久一本精品99久久精品88| 久久人做人爽一区二区三区| 久久久久久国产精品美女| 精品欧美一区二区三区久久久| 亚洲综合久久综合激情久久| 一本伊大人香蕉久久网手机| 麻豆精品久久精品色综合|