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