文件过滤驱动 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 森林图怎么分析_大地量子 森林火灾 |
- 下一篇: 工信部规范套餐流量提醒 将遏制天价资费来