日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

文件过滤驱动 VPB 卷参数块 生命周期 IoGetRelatedDeviceObject

發布時間:2023/12/14 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 文件过滤驱动 VPB 卷参数块 生命周期 IoGetRelatedDeviceObject 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文件過濾驅動中,VPB(卷參數塊),它將文件系統卷設備和磁盤設備卷設備聯系起來,結構如下:
typedef struct _VPB {
?? ?CSHORT Type;
?? ?CSHORT Size;
?? ?USHORT Flags;
?? ?USHORT VolumeLabelLength; // in bytes
?? ?struct _DEVICE_OBJECT *DeviceObject;
?? ?struct _DEVICE_OBJECT *RealDevice;
?? ?ULONG SerialNumber;
?? ?ULONG ReferenceCount;
?? ?WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)];
} VPB, *PVPB;
realdevice 指向磁盤設備產生的卷設備,deviceobject指向文件系統產生的卷設備。
下面討論幾個問題。
1. 哪些結構擁有VPB指針?
?FILE_OBJECT, DEVICE_OBJECT
2. 所有的設備對象都需要VPB這個結構嗎?
?只有磁盤設備,虛擬磁盤設備,cd-rom設備,磁帶設備擁有,即設備類型是FILE_DEVICE_DISK, FILE_DEVICE_VIRTUAL_DISK,FILE_DEVICE_CD_ROM,FILE_DEVICE_TAPE。
3. VPB是如何誕生的?
根據2的解釋,顧名思義,是在創建2中描述的設備成功后,誕生的,具體的可以參考reactos的代碼,即iocreatedevice里面產生這個對象的。并且進行了初始化,
NTSTATUS NTAPI IopCreateVpb(PDEVICE_OBJECT DeviceObject)
{
PVPB Vpb;
?? ? ? ?Vpb = ExAllocatePoolWithTag(NonPagedPool, sizeof(VPB), TAG_VPB);
if (!Vpb) return STATUS_UNSUCCESSFUL;

?? ? ? ?RtlZeroMemory(Vpb, sizeof(VPB));
?? ? ? ?Vpb->RealDevice = DeviceObject;
?? ? ? ?Vpb->Type = IO_TYPE_VPB;
?? ? ? ?Vpb->Size = sizeof(VPB);
?? ? ? ?DeviceObject->Vpb = Vpb;
?? ? ? ?return STATUS_SUCCESS;
}
這里初始化了vpb,也初始化了磁盤設備的VPB,文件系統卷設備的初始化,是在該設備掛載完成后,完成前Vpb->DeviceObject是無效的。

Vpb的銷毀沒試過,我猜是磁盤設備卸載后才會銷毀,否則一直存在,而且同一磁盤卷設備,vpb只有一份,無論是fileobject還是deviceobject里面的。

注意:文件系統卷設備不是2中的類型,故Vpb 為null。

4. Vpb的使用
1)?IoGetRelatedDeviceObject函數中,先看實現:
?


對于非2中的那些設備類型,該函數直接該文件對象結構中的設備對象。
對于2中的那些設備類型,如果文件系統卷設備已經掛載完成,則fileobject->vpb是存在的,那么直接可以返回fileobject->vpb->deviceobject,即文件系統卷設備;如果文件系統卷設備掛載還在進行中,那么fileobject->vpb可能不存在,返回fileobject->devieobject->vpb->deviceobject,還是文件系統卷設備。
文件系統卷設備掛載完成后,
fileobject->vpb = fileobject->deviceobject->vpb;
fileobject->deviceobject=fileobject->vpb->realdevice

2) 在做文件系統過濾驅動時,當需要動態綁定新增的磁盤時,即文件系統控制設備收到irp_mj_file_system_control的IRP時,irpSp->Parameters.MoutVolume.Vpb字段即是上面討論的掛載過程中的vpb,該vpb還不穩定,vpb->deviceobject還未初始化,必須掛載完成后才會初始化。

這里先討論下這個irp和vpb,這個irp的來源,當然是磁盤卷設備,即磁盤卷設備創建后,創建了vpb,完成了部分初始化,然后通知文件系統開始裝載這個卷,根據設備系統,來通知對應的文件系統,這里涉及到文件系統識別器,它來負責激活對應的文件系統,當文件系統激活后,創建一個irp,發給對應的控制設備,在這個irp的創建過程中,會將磁盤設備對象的vpb初始化到irpSp->Parameters.MoutVolume.Vpb字段上,將該irp發給文件系統控制設備。

sfilter的代碼中,我們自己會創建設備,來attach這個文件系統控制設備上,目的是為了攔截這個irp,然后在vpb->deviceobject這個對象掛載完成后,再進行attach。

注意:這個IRP完成之前,白書上說,irpSp->Parameters.MoutVolume.Vpb可能會被設備棧的其他設備修改,故該指針不能一直使用,不過我們可以取出里面的realdevice,即磁盤的真實卷設備,然后在該irp完成之后,再根據devieobject->vpb,取出vpb->devieobject,即文件系統產生的卷設備,然后進行attach即可。













總結

以上是生活随笔為你收集整理的文件过滤驱动 VPB 卷参数块 生命周期 IoGetRelatedDeviceObject的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。