// create_vhd.cpp : Defines the entry point for the console application.
// #include "stdafx.h"
#include <Windows.h>
#include <Shlwapi.h>
#include <initguid.h>
#include <virtdisk.h>
#include <sddl.h> DWORD
SampleCreateVirtualDisk(
_In_ LPCWSTR VirtualDiskPath,
_In_opt_ LPCWSTR ParentPath,
_In_ CREATE_VIRTUAL_DISK_FLAG Flags,
_In_ ULONGLONG FileSize,
_In_ DWORD BlockSize,
_In_ DWORD LogicalSectorSize,
_In_ DWORD PhysicalSectorSize)
{
VIRTUAL_STORAGE_TYPE storageType;
CREATE_VIRTUAL_DISK_PARAMETERS parameters;
HANDLE vhdHandle = INVALID_HANDLE_VALUE;
DWORD opStatus;
GUID uniqueId; if (RPC_S_OK != UuidCreate((UUID*)&uniqueId))
{
opStatus = ERROR_NOT_ENOUGH_MEMORY;
goto Cleanup;
} //
// Specify UNKNOWN for both device and vendor so the system will use the
// file extension to determine the correct VHD format.
// storageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
storageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN; memset(&parameters, , sizeof(parameters)); //
// CREATE_VIRTUAL_DISK_VERSION_2 allows specifying a richer set a values and returns
// a V2 handle.
//
// VIRTUAL_DISK_ACCESS_NONE is the only acceptable access mask for V2 handle opens.
//
// Valid BlockSize values are as follows (use 0 to indicate default value):
// Fixed VHD: 0
// Dynamic VHD: 512kb, 2mb (default)
// Differencing VHD: 512kb, 2mb (if parent is fixed, default is 2mb; if parent is dynamic or differencing, default is parent blocksize)
// Fixed VHDX: 0
// Dynamic VHDX: 1mb, 2mb, 4mb, 8mb, 16mb, 32mb (default), 64mb, 128mb, 256mb
// Differencing VHDX: 1mb, 2mb (default), 4mb, 8mb, 16mb, 32mb, 64mb, 128mb, 256mb
//
// Valid LogicalSectorSize values are as follows (use 0 to indicate default value):
// VHD: 512 (default)
// VHDX: 512 (for fixed or dynamic, default is 512; for differencing, default is parent logicalsectorsize), 4096
//
// Valid PhysicalSectorSize values are as follows (use 0 to indicate default value):
// VHD: 512 (default)
// VHDX: 512, 4096 (for fixed or dynamic, default is 4096; for differencing, default is parent physicalsectorsize)
//
parameters.Version = CREATE_VIRTUAL_DISK_VERSION_2;
parameters.Version2.UniqueId = uniqueId;
parameters.Version2.MaximumSize = FileSize;
parameters.Version2.BlockSizeInBytes = BlockSize;
parameters.Version2.SectorSizeInBytes = LogicalSectorSize;
parameters.Version2.PhysicalSectorSizeInBytes = PhysicalSectorSize;
parameters.Version2.ParentPath = ParentPath; opStatus = CreateVirtualDisk(
&storageType,
VirtualDiskPath,
VIRTUAL_DISK_ACCESS_NONE,
NULL,
Flags,
,
&parameters,
NULL,
&vhdHandle); if (opStatus != ERROR_SUCCESS)
{
goto Cleanup;
} Cleanup: if (opStatus == ERROR_SUCCESS)
{
wprintf(L"Create success\n");
}
else
{
wprintf(L"Create error = %u\n", opStatus);
} if (vhdHandle != INVALID_HANDLE_VALUE)
{
printf("%s: Handle closed.\n", __func__);
CloseHandle(vhdHandle);
} return opStatus;
} int make_vhd()
{
GUID myGUID;
HRESULT h = CoCreateGuid(&myGUID);
if (h != S_OK)
printf("Failed to generate GUID.\n"); OLECHAR* guidString;
StringFromCLSID(myGUID, &guidString);
printf("%ls\n", guidString); VIRTUAL_STORAGE_TYPE VirtualStorageType;
VirtualStorageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
VirtualStorageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN; PCWSTR Path = L"c:\\vhd_test.vhd"; VIRTUAL_DISK_ACCESS_MASK VirtualDiskAccessMask = VIRTUAL_DISK_ACCESS_NONE; PSECURITY_DESCRIPTOR SecurityDescriptor = NULL; CREATE_VIRTUAL_DISK_FLAG Flags = CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION;
//CREATE_VIRTUAL_DISK_FLAG Flags = CREATE_VIRTUAL_DISK_FLAG_NONE; ULONG ProviderSpecificFlags = ; printf("sizeof(PCREATE_VIRTUAL_DISK_PARAMETERS) %zd\n", sizeof(_CREATE_VIRTUAL_DISK_PARAMETERS));
PCREATE_VIRTUAL_DISK_PARAMETERS Parameters = (PCREATE_VIRTUAL_DISK_PARAMETERS)malloc(sizeof(_CREATE_VIRTUAL_DISK_PARAMETERS));
memset(Parameters, , sizeof(_CREATE_VIRTUAL_DISK_PARAMETERS)); Parameters->Version = CREATE_VIRTUAL_DISK_VERSION_2; Parameters->Version2.UniqueId = myGUID;
StringFromCLSID(Parameters->Version2.UniqueId, &guidString);
printf("Parameters->Version2.UniqueId %ls\n", guidString); Parameters->Version2.MaximumSize = 0x200000000;
Parameters->Version2.BlockSizeInBytes = ;
Parameters->Version2.SectorSizeInBytes = ;
Parameters->Version2.PhysicalSectorSizeInBytes = ;
Parameters->Version2.OpenFlags = OPEN_VIRTUAL_DISK_FLAG_NONE;
Parameters->Version2.ParentPath = NULL;
Parameters->Version2.SourcePath = NULL; LPOVERLAPPED Overlapped = NULL; PHANDLE Handle = NULL; DWORD ret = CreateVirtualDisk(
&VirtualStorageType,
Path,
VirtualDiskAccessMask,
SecurityDescriptor,
Flags,
ProviderSpecificFlags,
Parameters,
Overlapped,
Handle
); if(ret != ERROR_SUCCESS)
{
printf("%s: CreateVirtualDisk failed (%d)\n", __func__, ret);
} return ;
} DWORD
SampleAttachVirtualDisk(
_In_ LPCWSTR VirtualDiskPath,
_In_ BOOLEAN ReadOnly)
{
OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
VIRTUAL_DISK_ACCESS_MASK accessMask;
ATTACH_VIRTUAL_DISK_PARAMETERS attachParameters;
PSECURITY_DESCRIPTOR sd;
VIRTUAL_STORAGE_TYPE storageType;
LPCTSTR extension;
HANDLE vhdHandle;
ATTACH_VIRTUAL_DISK_FLAG attachFlags;
DWORD opStatus; vhdHandle = INVALID_HANDLE_VALUE;
sd = NULL; //
// Specify UNKNOWN for both device and vendor so the system will use the
// file extension to determine the correct VHD format.
// storageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
storageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN; memset(&openParameters, , sizeof(openParameters)); extension = ::PathFindExtension(VirtualDiskPath); if (extension != NULL && _wcsicmp(extension, L".iso") == )
{
//
// ISO files can only be mounted read-only and using the V1 API.
// if (ReadOnly != TRUE)
{
opStatus = ERROR_NOT_SUPPORTED;
goto Cleanup;
} openParameters.Version = OPEN_VIRTUAL_DISK_VERSION_1;
accessMask = VIRTUAL_DISK_ACCESS_READ;
}
else
{
//
// VIRTUAL_DISK_ACCESS_NONE is the only acceptable access mask for V2 handle opens.
// openParameters.Version = OPEN_VIRTUAL_DISK_VERSION_2;
openParameters.Version2.GetInfoOnly = FALSE;
accessMask = VIRTUAL_DISK_ACCESS_NONE;
} //
// Open the VHD or ISO.
//
// OPEN_VIRTUAL_DISK_FLAG_NONE bypasses any special handling of the open.
// opStatus = OpenVirtualDisk(
&storageType,
VirtualDiskPath,
accessMask,
OPEN_VIRTUAL_DISK_FLAG_NONE,
&openParameters,
&vhdHandle); if (opStatus != ERROR_SUCCESS)
{
goto Cleanup;
} //
// Create the world-RW SD.
// if (!::ConvertStringSecurityDescriptorToSecurityDescriptor(
L"O:BAG:BAD:(A;;GA;;;WD)",
SDDL_REVISION_1,
&sd,
NULL))
{
opStatus = ::GetLastError();
goto Cleanup;
} //
// Attach the VHD/VHDX or ISO.
// memset(&attachParameters, , sizeof(attachParameters));
attachParameters.Version = ATTACH_VIRTUAL_DISK_VERSION_1; //
// A "Permanent" surface persists even when the handle is closed.
// attachFlags = ATTACH_VIRTUAL_DISK_FLAG_PERMANENT_LIFETIME; if (ReadOnly)
{
// ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY specifies a read-only mount.
attachFlags |= ATTACH_VIRTUAL_DISK_FLAG_READ_ONLY;
} opStatus = AttachVirtualDisk(
vhdHandle,
sd,
attachFlags,
,
&attachParameters,
NULL); if (opStatus != ERROR_SUCCESS)
{
goto Cleanup;
} Cleanup: if (opStatus == ERROR_SUCCESS)
{
wprintf(L"Attach success\n");
}
else
{
wprintf(L"Attach error = %u\n", opStatus);
} if (sd != NULL)
{
LocalFree(sd);
sd = NULL;
} if (vhdHandle != INVALID_HANDLE_VALUE)
{
printf("%s: Handle closed.\n", __func__);
CloseHandle(vhdHandle);
} return opStatus;
} HANDLE DoOpenVHD(LPCWSTR VirtualDiskPath, BOOL GetInfoOnly)
{
HANDLE vhdHandle;
OPEN_VIRTUAL_DISK_PARAMETERS openParameters;
openParameters.Version = OPEN_VIRTUAL_DISK_VERSION_2;
openParameters.Version2.GetInfoOnly = GetInfoOnly; VIRTUAL_STORAGE_TYPE storageType;
storageType.DeviceId = VIRTUAL_STORAGE_TYPE_DEVICE_UNKNOWN;
storageType.VendorId = VIRTUAL_STORAGE_TYPE_VENDOR_UNKNOWN; int ret = OpenVirtualDisk(&storageType, VirtualDiskPath,
VIRTUAL_DISK_ACCESS_NONE, OPEN_VIRTUAL_DISK_FLAG_NONE,
&openParameters, &vhdHandle);
if (ret != ERROR_SUCCESS) {
// If return value of OpenVirtualDisk isn't ERROR_SUCCESS, there was a problem opening the VHD
printf("Failed to open VHD %ls. (%d)\n", VirtualDiskPath, ret);
return NULL;
}
return vhdHandle;
} int getPhyDrive(HANDLE vhdHandle)
{
wchar_t physicalDrive[MAX_PATH];
ULONG bufferSize = sizeof(physicalDrive);
GetVirtualDiskPhysicalPath(vhdHandle, &bufferSize, physicalDrive); printf("physicalDrive %ls\n", physicalDrive); if (vhdHandle != INVALID_HANDLE_VALUE)
{
printf("%s: Handle closed.\n", __func__);
CloseHandle(vhdHandle);
} char name[];
memset(name, , );
snprintf(name, , "%ls", physicalDrive);
DWORD driveNumber = name[strlen(name) - ] - '';
printf("Drive idx %d\n", driveNumber);
return driveNumber;
} int __cdecl wmain(_In_ int argc, _In_reads_(argc) WCHAR *argv[])
{
int rc = ;
LPCWSTR virtualDiskPath = argv[];
LPCWSTR parentPath = NULL; ULONGLONG fileSize = _wtoi64(argv[]);
DWORD blockSize = _wtoi(argv[]);
DWORD logicalSectorSize = _wtoi(argv[]);
DWORD physicalSectorSize = _wtoi(argv[]); /*rc = SampleCreateVirtualDisk(
virtualDiskPath,
parentPath,
CREATE_VIRTUAL_DISK_FLAG_FULL_PHYSICAL_ALLOCATION,
fileSize,
blockSize,
logicalSectorSize,
physicalSectorSize); printf("SampleCreateVirtualDisk %d\n", rc); rc = SampleAttachVirtualDisk(virtualDiskPath, FALSE);
printf("SampleAttachVirtualDisk %d\n", rc);*/ //wchar_t physicalDrive[MAX_PATH];
//ULONG bufferSize = sizeof(physicalDrive);
HANDLE vhdHandle = DoOpenVHD(virtualDiskPath, TRUE);
int drive_idx = getPhyDrive(vhdHandle);
/*char name[1024];
memset(name, 0, 1024);
snprintf(name, 1024, "%ls", physicalDrive);
DWORD driveNumber = name[strlen(name) - 1] - '0';
printf("Drive idx %d\n", driveNumber);*/
//MountVol(drive_idx); getchar();
return ;
}

Windows VHD Create, Attach, 获得Disk序号的更多相关文章

  1. 准备好要上传到 Azure 的 Windows VHD 或 VHDX

    在将 Windows 虚拟机 (VM) 从本地上传到 Azure 之前,必须准备好虚拟硬盘(VHD 或 VHDX). Azure 仅支持采用 VHD 文件格式且具有固定大小磁盘的第 1 代 VM. V ...

  2. 从 Azure 下载 Windows VHD

    本文介绍如何使用 Azure 门户从 Azure 下载 Windows 虚拟硬盘 (VHD) 文件. Azure 中的虚拟机 (VM) 将磁盘用作存储操作系统.应用程序和数据的位置. 所有 Azure ...

  3. [Windows Azure] Create a Virtual Network for Site-to-Site Cross-Premises Connectivity

    Create a Virtual Network for Site-to-Site Cross-Premises Connectivity This tutorial walks you throug ...

  4. [Windows Azure] Create a Virtual Network in Windows Azure

    Create a Virtual Network in Windows Azure This tutorial walks you through the steps to create a basi ...

  5. [Windows Azure] Create and use a reporting service in Windows Azure SQL Reporting

    Create and use a reporting service in Windows Azure SQL Reporting In this tutorial you will learn ab ...

  6. Windows性能计数器--磁盘性能分析Disk

    Physical Disk: 单次IO大小 Avg.Disk Bytes/Read Avg.Disk Bytes/Write IO响应时间 Avg.Disk sec/Read Avg.Disk sec ...

  7. 教你一招:解决windows xp系统开机出现“disk checking has been canceled”

    问题重现: 问题分析: 系统的注册表被修改了. 问题解决: 1.(临时解决)开机时,按ESC或ENTER键取消. 2.(彻底解决)修改注册表文件. Win + R 打开运行 Regedit ,进入注册 ...

  8. windows目录create、isExsit、remove

    RemoveDirectoryA( __in LPCSTR lpPathName ); PathFileExistsA(LPCSTR pszPath); CreateDirectoryA(strDir ...

  9. windows 基于命令行制作vhd虚拟磁盘

    什么是VHD? VHD是Virtual Hard Disk的简称,就是虚拟硬盘,就是能把VHD文件直接虚拟成一个硬盘,在其中能像真实硬盘一样操作,读取.写入.创建分区.格式化.如果你用过虚拟机,就会知 ...

随机推荐

  1. Java中使用RSA算法加密

    Java中使用RSA算法加密 概述 RSA加密算法是一种非对称加密算法 RSA加密的方式 使用公钥加密的数据,利用私钥进行解密 使用私钥加密的数据,利用公钥进行解密 RSA是一对密钥.分别是公钥和私钥 ...

  2. localStorage应用(写的时间缓存在本地浏览器)

    最近用了下localStorage,于是想记录加深下映象: 有关更详细的介绍,可以去看https://www.cnblogs.com/st-leslie/p/5617130.html: 我这引用了这个 ...

  3. 面试刷题32:你对tomcat做了哪些性能调优?

    背景 java程序员的开发的java应用程序,一般都会选择使用tomcat发布,但是: 如何充分的掌控tomcat,并让它发挥最优性能呢? 这也是面试的热点问题,结合多年的工作实践,我是李福春,今天总 ...

  4. CountDownLatch是个啥?

    文章篇幅较短,对于一些AQS的顶级方法例如releaseShared并没有做过深的讲解,因为这些算是AQS的范畴,关于AQS可以看下另一篇文章--AQS.  CountDownLatch一般被称作&q ...

  5. PTA数据结构与算法题目集(中文) 7-39魔法优惠券 (25 分)

    PTA数据结构与算法题目集(中文)  7-39魔法优惠券 (25 分) 7-39 魔法优惠券 (25 分)   在火星上有个魔法商店,提供魔法优惠券.每个优惠劵上印有一个整数面值K,表示若你在购买某商 ...

  6. Linux - ubuntu下Vim安装失败,报The following packages have unmet dependencies: vim : Depends: vim-common

    错误命令行 root@ubuntu:/etc/apt# apt install vim Reading package lists... Done Building dependency tree R ...

  7. php设计模式总结

    #1 使用设计模式(如建造者.外观.原型和模板模式)更快速.更有效地创建对象 #2 使用数据访问对象和代理设计模式分离体系结构 #3 使用委托.工厂和单元素设计模式改善代码流和控制 #4 在不修改对象 ...

  8. Linux基础篇,正则表达式

    一.正则表达式特殊符号: 二.grep的用法 grep [-A|B|a|c|i|n|v] [--color=auto] '搜索字串' filename -A ===> after缩写,后面接数字 ...

  9. 多数据源系统接入mybatis-plus, 实现动态数据源、动态事务。

    目录: 实现思想 导入依赖.配置说明 代码实现 问题总结 一.实现思想 接手一个旧系统,SpringBoot 使用的是纯粹的 mybatis ,既没有使用规范的代码生成器,也没有使用 JPA 或者 m ...

  10. 让 .NET 轻松构建中间件模式代码(二)

    让 .NET 轻松构建中间件模式代码(二)--- 支持管道的中断和分支 Intro 上次实现了一个基本的构建中间件模式的中间件构建器,现在来丰富一下功能,让它支持中断和分支,分别对应 asp.net ...