• <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++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            驅動的入口 DriverEntry() 函數

            NTSTATUS?DriverEntry(IN?PDRIVER_OBJECT?DriverObject,?IN?PUNICODE_STRING?RegistryPath)
            {
            }


            1. 驅動對象 DriverObject
            DRIVER_OBJECT 對應 .sys? 文件?
            DRIVER_OBJECT?對象是操作系統在加載驅動時所分配的.
            RegisteryPath 也是操作系統用于記錄驅動相關參數的注冊表路徑.

            DriverObject 重要之處,在于它有一組函數指針,稱之為 dispatch functions
            開發驅動的主要任務就是自己實現這些 dispatch functions, 當系統用到你的驅動時,就會向你的驅動發送 IRP, 可以在 dispatch functions 中處理這些 IRP, 可以讓IRP 失敗,也可以讓它返回成功,甚至可以修改或自己發出IRP。(如何把驅動關聯到系統中,讓它可以通知到呢?)

            2. 設備對象 DeviceObject 簡稱?DO?
            IRP 是由 DeviceObject 發出的,只有針對該驅動所生成的 DeviceObject? 的 IRP,操作系統才會發給該驅動來處理。具體的 dispatch function 決定于 DeviceObject? 下的 DriverObject 成員

            3. 文件系統 File System 簡稱 FS

            4. 控制設備 Control Device Object?簡稱 CDO
            ??? CDO主要任務是修改整個驅動的內部配置,因此一個驅動只對應一個 CDO

            5. Symbolic Link 符號鏈接
            ??? 可以通過 Symbolic links viewer 工具查看操作系統的所有符號鏈接
            ??? 可以看到 C:?? 對應 \Device\HarddiskVolume1
            ??? 這里可以看出,文件系統驅動是針對每個 Volume 來生成一個 DeviceObject ,則不是針對文件。實際上對某個 Volume? 的文件讀寫,都發到這個 Volume 設備對象上面去了.

            6. 可以使用 IoCreateDevice() 函數來創建 控制設備對象(控制設備對象的作用?)

            7. 指定 DriverObject 的處理函數
            ??? for(i = 0; i<= IRP_MJ_MAXIMUM_FUNCTION; i++)
            ??? {
            ??????? DriverObject->MajorFunction[i] = SfPassThrough;
            ??? }
            ??? 處理函數里面最簡單的處理就是什么都不做,傳給操作系統的其它驅動處理,使用下面的代碼
            ??? IoSkipCurrentIrpStackLocation(Irp);
            ??? return IoCallDriver( ((PSFILTER_DEVICE_EXTENSION)DeviceObject->DeviceExtension)->AttachedToDeviceObject, Irp);

            8. 文件系統的驅動,除了要處理正常的IRP之外,還要處理 FastIo
            ??? (a. FastIo 是操作系統的 Cache Manager 調用所觸發的沒有 IRP 的請求
            ???? b. FastIo 是獨立于普通IRP分發函數之外的另一組接口,作用跟普通的IRP是一樣的
            ???? c. 如果是一個文件過濾驅動,那么普通的IRP分發函數 和 FastIo 都有可能被調用,所以最好是同時過濾這兩套接口
            ???? d. fastio 的分發函數直接返回 FALSE 不做任何事,這樣這些請求都會通過IRP重新發送,有一定的效率損失,但不是很大。? )
            ???
            FastIo 的函數可以通過 Driver->FastIoDispatch 來指定

            9. 驅動中的內存分配
            ??? 并不是簡單的 new, 而是調用函數 ExAllocatePoolWithTag() 函數來分配
            ??? 內存清零則使用 RtlZeroMemory() 函數

            10. 操作系統 保存了 目前所有的驅動設備對象,并且用類似于“鏈表”的方式,這個“鏈表”稱為設備棧

            任何來自應用層(Ring3)的請求,都會被 Windows?系統的 IO管理器翻譯成 IRP,然后發給設備棧中最頂端的那個設備

            原始 IRP????????????????????????? IRP????????????????????????????? IRP
            -------------->???????????? ----------->????????????????? --------->
            ??????????????????? 最頂端的設備?????????? 排第二的設備??????????????? ....
            <--------------???????????? <-----------????????????????? <---------
            原始IRP返回????????????????? IRP返回???????????????????? IRP返回

            箭頭表示IRP請求的發送過程
            a.?只要我們在這個設備棧的頂端再綁定一個設備,那么發給這個設備的請求,自然就會先發給我們的設備來處理(可以通過 IoAttachDeviceToDeviceStack)

            11. 某些 dispatch function 里開頭有 PAGED_CODE();?的作用是?
            ?????
            12. 先用 IoCreateDevice() 創建一個 Device Object?, 然后調用 IoAttachDeviceToDeviceStack() 綁定到? \Device\HarddiskVolume1? 這個設備,那么所有發給 C:\ 的IRP,都必然先發送給我們的驅動,這樣一來就可以捕獲所有對文件的操作了。

            13. 當一個新的存儲媒介被系統發現(如U盤)并生成一個Volume的過程稱為? Mounting, 此時,文件系統的CDO會得到一個IRP, 這個IRP是 IRP_MJ_FILE_SYSTEM_CONTROL, MinorFunctionCode == IRP_MN_MOUNT

            14. IoRegisterFsRegistrationChange() 注冊一個回調函數,當操作系統中有任何文件系統被激活或者是被注銷時,注冊過的回調函數會被調用。
            (注意,這里說的文件系統是指 NTFS, FAT32, CDFS 這些文件系統
            win2k以前的系統,對已經激活的文件系統不會調用回調,但2K以后的系統會對已經存在的文件系統重新枚舉一次, 所以在2K下需要自己枚舉已經加載的文件系統)
            (注冊這個回調有什么作用?直接綁定 RawDisk 和處理 IRP_MN_MOUNT
            ?不就得了?)

            15. 當收到文件系統的 notify 時,綁定設備前,需要一個宏的判斷是否是文件系統類型的設備
            #define IS_DESIRED_DEVICE_TYPE(_type) \
            ??? (((_type) == FILE_DEVICE_DISK_FILE_SYSTEM) || \
            ???? ((_type) == FILE_DEVICE_CD_ROM_FILE_SYSTEM) || \
            ???? ((_type) == FILE_DEVICE_NETWORK_FILE_SYSTEM))

            (難道阿貓阿狗的設備增加時,都會觸發 fs system notify?)

            15. 初始化完后,需要設置一個標志位
            ????? DeviceObject->Flags &= ~DO_DEVICE_INITIALIZING;
            ?????
            作用?原因?

            久久无码AV一区二区三区| 午夜久久久久久禁播电影| 99久久亚洲综合精品成人| 亚洲av日韩精品久久久久久a| 亚洲精品NV久久久久久久久久 | 色99久久久久高潮综合影院| 国产精品久久久久久影院| 日韩十八禁一区二区久久| www性久久久com| 影音先锋女人AV鲁色资源网久久| 国产一区二区精品久久| 无码人妻久久一区二区三区蜜桃 | 久久精品国产99久久久古代| 久久久久一级精品亚洲国产成人综合AV区| 久久久av波多野一区二区| 97久久天天综合色天天综合色hd| 久久最新精品国产| 精品一二三区久久aaa片| 国产成人无码精品久久久久免费 | 精品永久久福利一区二区| 东京热TOKYO综合久久精品| 97久久精品国产精品青草| 久久国产精品免费一区二区三区| 久久婷婷色香五月综合激情| 精品久久久久成人码免费动漫| 国产成人综合久久综合 | 99久久无码一区人妻| 久久99久久99精品免视看动漫 | 亚洲乱码中文字幕久久孕妇黑人 | 亚洲色大成网站www久久九 | 国产精品久久久香蕉| 色88久久久久高潮综合影院 | 久久精品国产精品青草| 国内精品久久久久影院一蜜桃| 久久精品国产亚洲AV忘忧草18| 国内精品久久国产| 亚洲色欲久久久久综合网| 久久亚洲欧洲国产综合| 亚洲AV无一区二区三区久久 | 久久精品国产99国产精品| 国产国产成人久久精品|