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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

白话VPB(volume parameter block)

發(fā)布時(shí)間:2023/12/14 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 白话VPB(volume parameter block) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

為什么要綁定FSCDO設(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_CONTROLIRP處理函數(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我們只能取出RealDeviceDeviceObject這個(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。