VPB是Windows I/O Manager子系统的一个重要的数据结构,全称为 Volume Parameter Block。它的任务是绑定卷设备(如磁盘分区或虚拟磁盘)和接管此卷设备的文件系统(如FastFat,NTFS)。Windows系统上的挂载点(Mount Point,如盘符C:)只能定位至卷设备(如\Device\HarddiskVolume1),Windows Object Manager(对象管理器)在解析路径名时(即Name Parsing过程)还要通过卷设备的VPB信息进一步定位至接管此卷设备的文件系统驱动上。
typedef struct _VPB {
CSHORT Type; //IO_TYPE_VPB
CSHORT Size;
USHORT Flags; // VPB_MOUNTED (1<<0): 此卷已被文件系统识别并已挂载
VPB_LOCKED (1<<1): 此卷已被文件系统锁定,锁定操作由请求FSCTL_LOCK_VOLUME完成
VPB_PERSISTENT (1<<2): 将VPB一直保留在内存中(不释放),即使此VPB引用计数为0
VPB_REMOVE_PENDING (1<<3): 表示此存储设备即将被卸载/删除。此标志由Pnp Manager(即插
即用管理器)管理和使用。此标志在可在处理Pnp请求
IRP_MN_CANCEL_REMOVE_DEVICE时清除
VPB_RAW_MOUNT (1<<4): 指定此卷仅由系统RAW文件系统接管
USHORT VolumeLabelLength; // 卷标长度(in bytes)
struct _DEVICE_OBJECT *DeviceObject; // 未命名的文件系统逻辑卷对象(unnamed logical volume)
struct _DEVICE_OBJECT *RealDevice; // 物理卷设备(如\Device\HarddiskVolume1)
ULONG SerialNumber; // 卷序列号
ULONG ReferenceCount; // VPB的引用计数,用以控制VPB的生命周期
WCHAR VolumeLabel[MAXIMUM_VOLUME_LABEL_LENGTH / sizeof(WCHAR)]; // 卷标,最长32个双字节 #define MAXIMUM_VOLUME_LABEL_LENGTH (32 * sizeof(WCHAR))
} VPB, *PVPB
VPB结构的创建
在IoCreateDevice创建设备时,如果设备类型是:
FILE_DEVICE_DISK (0x07)
FILE_DEVICE_TAPE (0x1f)
FILE_DEVICE_CD_ROM (0x02)
FILE_DEVICE_VIRTUAL_DISK (0x24)
那么就会创建一个VPB结构,其他设备类型是没有的.