- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我设法创建了一个 VHD 并将其附加。之后,我创建了一个磁盘(IOCTL CREATE_DISK)并使用 IOCTL_DISK_SET_DRIVE_LAYOUT_EX 设置其布局。现在,当我通过磁盘管理检查磁盘时。预计我有一个 14MB 的分区和一个 7MB 的分区。
int sign = 80001;
CREATE_DISK disk;
disk.Mbr.Signature = sign;
disk.PartitionStyle = PARTITION_STYLE_MBR;
auto res = DeviceIoControl(device_handle, IOCTL_DISK_CREATE_DISK, &disk, sizeof(disk), NULL, 0, NULL, NULL);
res = DeviceIoControl(device_handle, IOCTL_DISK_UPDATE_PROPERTIES, 0, 0, NULL, 0, NULL, NULL);
LARGE_INTEGER partition_size;
partition_size.QuadPart = 0xF00;
DWORD driver_layout_ex_len = sizeof(DRIVE_LAYOUT_INFORMATION_EX);
DRIVE_LAYOUT_INFORMATION_EX driver_layout_info;
memset(&driver_layout_info, 0, sizeof(DRIVE_LAYOUT_INFORMATION_EX));
driver_layout_info.Mbr.Signature = sign;
driver_layout_info.PartitionCount = 1;
driver_layout_info.PartitionStyle = PARTITION_STYLE_MBR;
PARTITION_INFORMATION_EX part_info;
PARTITION_INFORMATION_MBR mbr_info;
part_info.StartingOffset.QuadPart = 32256;
part_info.RewritePartition = TRUE;
part_info.PartitionLength.QuadPart = partition_size.QuadPart/2 * 4096;
part_info.PartitionNumber = 1;
part_info.PartitionStyle = PARTITION_STYLE_MBR;
mbr_info.BootIndicator = TRUE;
mbr_info.HiddenSectors = 32256 / 512;
mbr_info.PartitionType = PARTITION_FAT32;
mbr_info.RecognizedPartition = 1;
part_info.Mbr = mbr_info;
driver_layout_info.PartitionEntry[0] = part_info;
auto res_layout = DeviceIoControl(device_handle, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, &driver_layout_info, sizeof(driver_layout_info), NULL, 0, NULL, NULL);
现在,我如何将这个磁盘分成两个分区?我想从磁盘的未分区部分(基本上是另一半)创建另一个分区。它在文档中说 PartitionEntry 是一个可变大小的数组(不,它不是一个大小为 1 的数组。)我是否为我想创建的每个分区调用 set layout IOCTL?如果是这样,您将如何处理?是否可以通过 WINAPI 接口(interface)进行多分区?
P.S:我知道人们通常会为这行工作调用 diskpart。
编辑:添加第二个分区两个布局搞乱了我的堆栈,所以我选择了另一条路线(堆)。
DWORD driver_layout_ex_len = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX); // one layout+partition + partition
PDRIVE_LAYOUT_INFORMATION_EX driver_layout_info = (PDRIVE_LAYOUT_INFORMATION_EX) std::calloc(1, driver_layout_ex_len);
driver_layout_info->Mbr.Signature = sign;
driver_layout_info->PartitionCount = 2;
driver_layout_info->PartitionStyle = PARTITION_STYLE_MBR;
// omitted here..
PARTITION_INFORMATION_EX part_info2;
part_info2.StartingOffset.QuadPart = 32256 + part_info.PartitionLength.QuadPart;
part_info2.RewritePartition = TRUE;
part_info2.PartitionLength.QuadPart = partition_size.QuadPart / 2 * 4096;
part_info2.PartitionNumber = 2;
part_info2.PartitionStyle = PARTITION_STYLE_MBR;
part_info2.Mbr = mbr_info;
driver_layout_info->PartitionEntry[0] = part_info;
driver_layout_info->PartitionEntry[1] = part_info2;
auto res_layout = DeviceIoControl(device_handle, IOCTL_DISK_SET_DRIVE_LAYOUT_EX, driver_layout_info, driver_layout_ex_len, NULL, 0, NULL, NULL);
auto res_err = GetLastError();
因为它覆盖了我的 device_handle
我根本无法使用 IOCTL。这种改进消除了这一点。不要忘记在此更改后传递 driver_layout_info 而不是 &driver_layout_info。
最佳答案
It says in the documentation is that PartitionEntry is an array of variable size(No, it is not it is an array of size 1.)
“一些 Windows 结构是可变大小的,以固定标题开头,然后是可变大小的数组。当这些结构被宣布,他们经常声明一个大小为 1 的数组,其中可变大小的数组应该是。”请参阅 @Raymond blog。
在这里DRIVE_LAYOUT_INFORMATION_EX structure是一个例子:
typedef struct _DRIVE_LAYOUT_INFORMATION_EX {
DWORD PartitionStyle;
DWORD PartitionCount;
union {
DRIVE_LAYOUT_INFORMATION_MBR Mbr;
DRIVE_LAYOUT_INFORMATION_GPT Gpt;
} DUMMYUNIONNAME;
PARTITION_INFORMATION_EX PartitionEntry[1];
} DRIVE_LAYOUT_INFORMATION_EX, *PDRIVE_LAYOUT_INFORMATION_EX;
使用此声明,您将为这样的一个分配内存可变大小的 DRIVE_LAYOUT_INFORMATION_EX 结构如下:
PDRIVE_LAYOUT_INFORMATION_EX driver_layout_info = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[NumberOfPartitions]));
您可以像这样初始化结构(以 2 个分区为例):
DWORD NumberOfPartitions = 2;
LARGE_INTEGER partition_size;
partition_size.QuadPart = 0xF00;
PARTITION_INFORMATION_MBR mbr_info;
mbr_info.BootIndicator = TRUE;
mbr_info.HiddenSectors = 32256 / 512;
mbr_info.PartitionType = PARTITION_FAT32;
mbr_info.RecognizedPartition = TRUE;
PDRIVE_LAYOUT_INFORMATION_EX driver_layout_info = (PDRIVE_LAYOUT_INFORMATION_EX)malloc(FIELD_OFFSET(DRIVE_LAYOUT_INFORMATION_EX, PartitionEntry[NumberOfPartitions]));
for (DWORD Index = 0; Index < NumberOfPartitions ; Index++) {
driver_layout_info->PartitionEntry[Index].PartitionStyle = PARTITION_STYLE_MBR;
driver_layout_info->PartitionEntry[Index].PartitionNumber = Index + 1;
driver_layout_info->PartitionEntry[Index].RewritePartition = TRUE;
driver_layout_info->PartitionEntry[Index].PartitionLength.QuadPart = partition_size.QuadPart / 2 * 4096;
driver_layout_info->PartitionEntry[Index].Mbr = mbr_info;
}
driver_layout_info->Mbr.Signature = sign;
driver_layout_info->PartitionCount = 1;
driver_layout_info->PartitionStyle = PARTITION_STYLE_MBR;
driver_layout_info->PartitionEntry[0].StartingOffset.QuadPart = 32256;
driver_layout_info->PartitionEntry[1].StartingOffset.QuadPart = 32256 + driver_layout_info->PartitionEntry->StartingOffset.QuadPart;
DWORD driver_layout_ex_len = sizeof(DRIVE_LAYOUT_INFORMATION_EX) + sizeof(PARTITION_INFORMATION_EX);
使用完毕后调用free(driver_layout_info);
关于C++ WINAPI 在挂载的 VHD 上创建多个分区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56774073/
我想将一些 VHDX 文件转换为 VHD,以便我可以将它们上传到 Microsoft Azure,因为我必须将公司的一些服务器迁移到云。问题是,我的服务器似乎不知道 PowerShell 中的 VHD
用户可以将 vhd 文件上传到我的服务器。我想验证他们上传的文件,并确保它们实际上是有效的 vhd 文件,而不是使用 .vhd 文件扩展名等重新命名的 jpeg 文件。有没有办法做到这一点? 最佳答案
我正在尝试自动复制一组 VHD,同时跳过正在使用的 VHD。 为此,我尝试创建所有未使用的 VHD 的列表。如果未使用 VHD,我将能够运行 Get-VHD 并检查 .Attached 属性是否为 f
我正在使用虚拟机自动执行基于服务器的产品的集成测试。 我正在开发人员计算机上使用“Windows XP 模式和虚拟 PC”。 我正在使用 PowerShell 做所有事情。我希望: 挂载 VHD(磁盘
我在 C: 驱动器上安装了一台带有磁盘的虚拟机。它令人讨厌地满了,我不得不移动 vhd。到另一个位置: C:\..\VMs\vm1 F:\..\VMs\vm2 然后我像这样为 HD 重新生成了 uui
我尝试使用 convert-vhd 命令将 VHD 转换为 VHDX,但出现以下错误: The Hyper-V Management Tools could not access an expecte
是否可以创建 2 GB 的 vhd , 其中包含 1 GB 数据,其余 1 GB 仅为零。 因为,我可以从 Windows Azure 门户中已有的基本 URL 创建一个 1GB 的磁盘, 但我不确定
我创建了一个 .vhd 镜像并使用 Edge 通过门户进行下载。 门户中的 .vhd 文件显示其大小为 127GB(这是虚拟机上硬盘驱动器的大小)。 实际使用量为 33GB - 如下所示。问题是,除了
启动到 VHD 文件是否可以加密并仍然在 Windows 7 或 Windows Server 2008 R2 下启动? 最佳答案 不符合 requently Asked Questions: Vir
有人可以帮我理解这一点吗?我创建了Virtual Machine in Azure running Windows Server 2012 。我注意到 Azure 自动创建了一个存储帐户。当我进入该存
清理我的 Azure 基础设施后,有一些剩余的 VHD 被列为“已租用”,但我确信它们没有被任何虚拟机/磁盘引用。 我已将每个列出的 VM 与“磁盘”下列出的每个磁盘与存储帐户 Blob 中列出的每个
清理我的 Azure 基础设施后,有一些剩余的 VHD 被列为“已租用”,但我确信它们没有被任何虚拟机/磁盘引用。 我已将每个列出的 VM 与“磁盘”下列出的每个磁盘与存储帐户 Blob 中列出的每个
我正在尝试使用存储 blob 上的现有 VHD 创建虚拟机。我运行了以下命令 Add-AzureDisk -DiskName“Keldc1”-MediaLocation“https://*****.b
我正在使用OpenVirtualDisk和 AttachVirtualDisk函数挂载VHD文件,但我找不到如何在挂载vhd文件时指定驱动器号。 我想指定要安装的驱动器号,例如(G:、H:、K: 等)
我使用 Microsoft Hypervisor 创建了一些虚拟机。我有这些虚拟机的 vhdx 文件。现在我想使用这些相同的 vhdx 文件在其他计算机上或在具有不同名称的同一台计算机上部署新的虚拟机
我想要执行以下操作: 在美国东部的 Azure 中,捕获当前的 Windows VM 镜像(我知道该怎么做) 下载 .vhd 图像(我知道该怎么做) 现在,我想将(我下载的图像)加载到美国西部的第二个
我在同一个 Blob 服务中有 2 个容器。一个包含一个 VHD,另一个包含一个测试 PDF。 在附加 VHD 的虚拟机中运行进程时,我得到以下数字。 VHD 读取: // VHD = e: driv
我的团队有多个运行 Cassandra 的虚拟机,托管在功能相当强大的物理机上。每个虚拟机都被赋予一个动态大小的 VHD。 在我们启用增量备份并开始拍摄快照后不久,我们注意到虚拟机扩展至填满所有可用空
我正在遵循这个脚本http://gallery.technet.microsoft.com/scriptcenter/PowerShell-Script-Sample-0daf6d9d用于备份 vhd
我尝试将 VHD 文件从托管操作系统磁盘从东南亚导出到美国东部位置,但出现错误 403 身份验证失败“读取源时复制失败”。我是订阅租户和所有者的全局管理员。请找到相同的屏幕截图和脚本。 Login-A
我是一名优秀的程序员,十分优秀!