盘符,示例:C:\、D:\等
device路径,示例:\Device\HarddiskVolume?
物理路径,示例:\\.\PHYSICALDRIVE?
卷路径,示例:\\?\Volume{a7210e4f-0000-0000-0000-010000000000}\
VHD路径,示例:E:\test.vhd
扩展(diskpart)
Select vdisk file=”E:\\expand.vhd”
Expand vdisk maximum=200
Attach vdisk
List volume //找到对应volume
Select volume ?
Extend
创建VHD文件
使用diskpart命令执行以下脚本
CREATE VDISK FILE="C:\Users\mounto\AppData\Local\Temp\vm_TT_zhangsan_999.vhd" MAXIMUM=50 TYPE=expandable //创建文件
SELECT VDISK FILE="C:\Users\mounto\AppData\Local\Temp\vm_TT_zhangsan_999.vhd" //选择VHD文件
ATTACH VDISK //挂载磁盘
CREATE PARTITION PRIMARY //创建主分区
FORMAT FS=NTFS LABEL="TT" QUICK //格式化并取名,其中TT为磁盘名字
ASSIGN LETTER="H" //挂载到某盘符,其中H为磁盘盘符
DETACH VDISK //卸载磁盘
挂载VHD文件
首先要找到一个没有使用的盘符,使用GetLogicalDrives()获取已使用的盘符
而后使用OpenVirtualDisk和attachVirtualDisk打开
分配盘符时,通过GetVirtualDiskPhysicalPath获取VHD对应的物理地址,记为physicalA,然后使用 FindFirstVolume和FindNextVolume遍历所有卷路径volume_path,形式为“\\?\Volume{a7210e4f-0000-0000-0000-010000000000}\”,volume_path变为“\\?\Volume{a7210e4f-0000-0000-0000-010000000000}”使用createFile打开获得handle,然后用DeviceControl获得该句柄的VOLUME_DISK_EXTENTS信息,volume_disk_extents.extent[0].DiskNumber即为physicalA中的A数值,记为B。如果A==B,则我们得到volume_path即为我们所需要的东西。并使用SetVolumeMountPoint将volume_path挂载于某个盘符
如果我们知道volume_path,格式为“\\?\Volume{a7210e4f-0000-0000-0000-010000000000}\”,我们将其变换为“Volume{a7210e4f-0000-0000-0000-010000000000}”,然后使用QueryDosDevice可以得到device路径
通过volume_path我们可以用GetVolumePathNamesForVolumeName得到它的盘符
通过盘符,我们可以用QueryDosDevice可以得到device路径
文件唯一标识
每个文件可以通过CreateFile打开文件,然后用GetFileInformationByHandle获取一个BY_HANDLE_FILE_INFORMATION结构体,该结构体中{nFileIndexHigh,nFileIndexLow,dwVolumeSerialNumber}可以唯一标识文件