我的要求是通过程序扩展驱动器容量。当我在DeviceIO中使用IOCTL_DISK_GROW_PARTITION进行扩展时,磁盘管理将显示新的修改大小,而此PC(“我的电脑”)中驱动器的大小则保持不变。
BOOL DeviceIoControl(
(HANDLE) hDevice, // handle to device
IOCTL_DISK_GROW_PARTITION, // dwIoControlCode
(LPVOID) lpInBuffer, // input buffer
(DWORD) nInBufferSize, // size of the input buffer
NULL, // lpOutBuffer
0, // nOutBufferSize
(LPDWORD) lpBytesReturned, // number of bytes returned
(LPOVERLAPPED) lpOverlapped // OVERLAPPED structure
);
通过一些分析,我发现在使用此API时,磁盘的MBR已修改,但驱动器的群集位图未更改。我想知道使用此DeviceIO扩展卷或其他一些API来执行相同过程的正确方法。
需要了解磁盘驱动程序与磁盘系统之间的区别,磁盘驱动程序维护有关磁盘布局和分区的信息(磁盘大小,与磁盘开始位置的偏移量,样式(gpt或mbr))和安装此分区的文件系统。
IOCTL_DISK_GROW_PARTITION
-此ioctl由磁盘驱动器和扩展分区处理,但这对不处理此ioctl并且完全不知道分区已扩展的文件系统无效。因此,您需要额外的ioctl使用IOCTL_DISK_GROW_PARTITION
-此ioctl已经发送并处理到文件系统。
因此,如果我们必须执行后续步骤
FSCTL_EXTEND_VOLUME
与FSCTL_EXTEND_VOLUME
作为输入缓冲区IOCTL_DISK_GROW_PARTITION
与IOCTL_DISK_GROW_PARTITION
一起发送作为输出缓冲区DISK_GROW_PARTITION
与DISK_GROW_PARTITION
作为输出以获得实际大小立即分区。计算卷的新大小,以扇区为单位
((dg在步骤2和PartitionEntry在步骤3)
最终使用IOCTL_DISK_UPDATE_DRIVE_SIZE
完整的代码可以像下一个
DISK_GEOMETRY