如何以编程方式扩展卷

问题描述 投票:3回答:1

我的要求是通过程序扩展驱动器容量。当我在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来执行相同过程的正确方法。

c windows winapi ntfs
1个回答
2
投票

需要了解磁盘驱动程序与磁盘系统之间的区别,磁盘驱动程序维护有关磁盘布局和分区的信息(磁盘大小,与磁盘开始位置的偏移量,样式(gpt或mbr))和安装此分区的文件系统。

IOCTL_DISK_GROW_PARTITION-此ioctl由磁盘驱动器和扩展分区处理,但这对不处理此ioctl并且完全不知道分区已扩展的文件系统无效。因此,您需要额外的ioctl使用IOCTL_DISK_GROW_PARTITION-此ioctl已经发送并处理到文件系统。

因此,如果我们必须执行后续步骤

  1. 发送FSCTL_EXTEND_VOLUMEFSCTL_EXTEND_VOLUME作为输入缓冲区
  2. [IOCTL_DISK_GROW_PARTITIONIOCTL_DISK_GROW_PARTITION一起发送作为输出缓冲区
  3. 发送DISK_GROW_PARTITIONDISK_GROW_PARTITION作为输出以获得实际大小立即分区。
  4. 计算卷的新大小,以扇区为单位

    IOCTL_DISK_UPDATE_DRIVE_SIZE

    ((dg在步骤2和PartitionEntry在步骤3)

  5. 最终使用IOCTL_DISK_UPDATE_DRIVE_SIZE

完整的代码可以像下一个

DISK_GEOMETRY
© www.soinside.com 2019 - 2024. All rights reserved.