白话VPB(volume parameter block)
為什么要綁定FS的CDO設備?
楚狂人在《Windows文件系統過濾驅動開發教程(第二版)》中寫道:
“一個新的存儲媒質被系統發現并在文件系統中生成一個Volume的過程稱為Mounting.其過程開始的時候,FS的CDO將得到一個IRP,其Major Function Code為IRP_MJ_FILE_SYSTEM_CONTROL,Minor Function Code為IRP_MN_MOUNT。換句話說,如果我們已經生成了一個設備綁定文件系統的CDO,那么我們就可以得到這樣的IRP,在其中知道一個新的Volume正在Mount.這時候我們可以執行上邊所說的操作”
我們以微軟源碼sfilter進行分析
在我的另一篇《windows內核編程 白話設備棧》(http://blog.csdn.net/sqqsongqiqi/article/details/42297229)一文中截取一幅圖
圖1
?
如圖1,我們的Sfilter!FiDO綁定在Ntfs!CDO之上。
在DriverEntry中設置IRP_MJ_FILE_SYSTEM_CONTROL的IRP處理函數:
??????? DriverObject->MajorFunction[IRP_MJ_FILE_SYSTEM_CONTROL]=SfFsControl;
?
下面我們用WinDBG來分析 SfFsControl 函數在函數
NTSTATUS
SfFsControl(
?? ? ?? IN PDEVICE_OBJECT DeviceObject,
??????? IN PIRP Irp
??? )中 傳入的 參數信息:
圖2
DeviceObject的地址是0x86337998,是綁定在Ntfs!CDO上的FiDO的地址。這時候說明我們已經截獲了發送給FS的IRP_MJ_FILE_SYSTEM_CONTROL。
?
我們記錄下storageStackDeviceObject= irpSp->Parameters.MountVolume.Vpb->RealDevice;
圖3
?
typedef struct_VPB {
??? CSHORT Type;
??? CSHORT Size;
??? USHORT Flags;
??? USHORT VolumeLabelLength;// inbytes
??? struct _DEVICE_OBJECT *DeviceObject;????? //文件系統上的卷設備對象
??? struct _DEVICE_OBJECT *RealDevice;????????? //實際存儲媒介設備對象
??? ULONG SerialNumber;
??? ULONG ReferenceCount;
??? WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH/sizeof(WCHAR)];
} VPB, *PVPB;
?
這里截取的IRP我們只能取出RealDevice,DeviceObject這個設備要到文件系統處理完之后才能取得。
新建一個FiDO
status = IoCreateDevice( ???????????? ?gSFilterDriverObject,
????????????????????????????sizeof( SFILTER_DEVICE_EXTENSION ),
????????????????????????????NULL,
????????????????????????????DeviceObject->DeviceType,
????????????????????????????0,
????????????????????????????FALSE,
????????????????????????????&newDeviceObject );
圖4
newDeviceObject的地址是0x861b73f8
?
newDevExt =newDeviceObject->DeviceExtension;
newDevExt->StorageStackDeviceObject =storageStackDeviceObject;
調用ObQueryNameString查詢StorageStackDeviceObject 的設備名
圖5
接下來調用 status= IoCallDriver( devExt->AttachedToDeviceObject, Irp );交給Ntfs!CDO處理
圖6
Ntfs!CDO處理完之后生成VPB->VDO(0x8626a020)
圖7
NTFS!VDO->NextDevice(0x862c8270)正是NTFS!CDO(0x862c8270)
圖8
?綁定FiDO到NTFS!VDO設備上
status = SfAttachDeviceToDeviceStack(
???????????????????? vpb->DeviceObject,
???? ??????????????? FiDO,
???????????????????? &newDevExt->AttachedToDeviceObject );
圖9
?
最后我們繪制出FiDO附著在VDO上的全圖圖10
?
總結
以上是生活随笔為你收集整理的白话VPB(volume parameter block)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【考研计算机组成原理】课堂笔记目录汇总—
- 下一篇: Pascal VOC Dataset 下