IVdsPack::CreateVolume 方法 (vds.h)

[从Windows 8和Windows Server 2012开始,虚拟磁盘服务 COM 接口由 Windows 存储管理 API 取代。]

在包中创建卷。 可以通过通过 ppAsync 参数调用 IVdsAsync::Wait 来检索新卷对象的接口指针。 返回 的 VDS_ASYNC_OUTPUT 结构包含 cv.pVolumeUnk 成员中的卷对象接口指针。

语法

HRESULT CreateVolume(
  [in]  VDS_VOLUME_TYPE type,
  [in]  VDS_INPUT_DISK  *pInputDiskArray,
  [in]  LONG            lNumberOfDisks,
  [in]  ULONG           ulStripeSize,
  [out] IVdsAsync       **ppAsync
);

参数

[in] type

由 VDS_VOLUME_TYPE 枚举的卷类型。 基本磁盘上的卷只能有一个盘区,并且只有 VDS_VT_SIMPLE 标志有效。

[in] pInputDiskArray

指向 VDS_INPUT_DISK 结构的数组的指针;每个磁盘的一个结构。 磁盘只能包含在数组中一次。 必须使用数组中的所有磁盘,否则方法将失败。 调用方必须分配和初始化数组,并在调用返回时释放内存。

[in] lNumberOfDisks

参与卷的磁盘总数。

注意 VDS 对具有奇偶校验的跨区、条带化和条带化 (RAID-5) 卷施加 32 个磁盘的限制。
 

[in] ulStripeSize

如果卷已条带化,则每个条带的大小(以字节为单位)。 为VDS_VT_SIMPLE、VDS_VT_SPANVDS_VT_MIRROR传递零字节;VDS_VT_STRIPEVDS_VT_PARITY为 64 千字节。

[out] ppAsync

VDS 在返回时初始化 的 IVdsAsync 接口指针的地址。 调用方必须释放 接口。 使用此指针可以取消、等待或查询操作的状态。

如果在此方法上调用 IVdsAsync::Wait 并返回成功的 HRESULT 值,则必须通过在每个接口指针上调用 IUnknown::Release 方法释放VDS_ASYNC_OUTPUT结构中返回的接口。 但是,如果 Wait 返回失败的 HRESULT 值,或者如果 WaitpHrResult 参数收到失败的 HRESULT 值,则 VDS_ASYNC_OUTPUT 结构中的接口指针为 NULL,不需要释放。 可以使用 Winerror.h 中定义的 SUCCEEDEDFAILED 宏测试成功或失败的 HRESULT 值。

返回值

此方法可以返回标准 HRESULT 值,例如E_INVALIDARG或E_OUTOFMEMORY,以及 特定于 VDS 的返回值。 它还可以使用 HRESULT_FROM_WIN32 宏返回转换的系统错误代码。 错误可能源自 VDS 本身或正在使用的基础 VDS 提供程序 。 可能的返回值包括以下内容。

返回代码/值 说明
S_OK
已成功创建卷。
VDS_S_NO_NOTIFICATION
0x00042517L
未收到卷到达通知。 可能需要调用 IVdsService::Refresh
VDS_S_UPDATE_BOOTFILE_FAILED
0x00042434L
已成功创建卷,但 VDS 未能更新启动配置数据 (BCD) 存储中的启动选项。

Windows Server 2003: 启动选项存储在 x86 或 x64 系统上的 boot.ini 文件中,或者存储在 Itanium 系统上的 NVRAM 中。

VDS_E_DISK_NOT_FOUND_IN_PACK
0x8004252DL
指定的磁盘不属于同一个包。
VDS_E_DMADMIN_METHOD_CALL_FAILED
0x80042420L
LDM 服务使方法失败。
VDS_E_EXTENT_SIZE_LESS_THAN_MIN
0x80042433L
传入的盘区大小太小。
VDS_E_INVALID_DISK_COUNT
0x80042526L
指定的磁盘数对于此操作无效。
VDS_E_INVALID_MEMBER_COUNT
0x80042522L
卷的成员计数必须大于零。
VDS_E_INVALID_MEMBER_ORDER
0x80042524L
成员索引必须单调递增,并且从零开始。
VDS_E_INVALID_OPERATION
0x80042415L
传入的磁盘是 CD-ROM 或 DVD 设备。
VDS_E_INVALID_PACK
0x8004251AL
不允许对此磁盘包执行此操作。
VDS_E_INVALID_PLEX_COUNT
0x80042521L
卷的 plex 计数必须大于零。
VDS_E_INVALID_PLEX_ORDER
0x80042523L
plex 索引必须单调递增,并且从零开始。
VDS_E_INVALID_STRIPE_SIZE
0x80042525L
对于条带化卷和 RAID-5 卷类型,条带大小(以字节为单位)必须为 2 的幂,对于所有其他卷类型,条带大小必须为零。
VDS_E_MISSING_DISK
0x80042454L
缺少指定的磁盘。
VDS_E_NO_MEDIA
0x80042412L
通过磁盘阵列传入的可移动驱动器中没有媒体。
VDS_E_NOT_ENOUGH_SPACE
0x8004240FL
其中一个磁盘上没有足够的空间。
VDS_E_NOT_SUPPORTED
0x80042400L
卷类型不受支持,或者传递到 方法的可移动磁盘上已存在卷。 一个可移动磁盘只能有一个卷。
VDS_E_OBJECT_NOT_FOUND
0x80042405L
找不到至少一个传入的磁盘。
VDS_E_ONE_EXTENT_PER_DISK
0x80042531L
单个磁盘不能参与同一卷的多个成员或多个丛。
VDS_E_PACK_OFFLINE
0x80042444L
无法访问目标包。
VDS_E_PARTITION_LIMIT_REACHED
0x80042407L
调用方尝试创建其他主分区或扩展分区时,已存在 (主分区或具有扩展分区) 的主分区的最大分区数。
VDS_E_PROVIDER_CACHE_CORRUPT
0x8004241FL
动态提供程序缓存已损坏。
VDS_E_VOLUME_DISK_COUNT_MAX_EXCEEDED
0x80042529L
每个卷允许的磁盘不超过 32 个。
VDS_E_VOLUME_TOO_SMALL
0x8004242CL
卷大小太小。

注解

注意 此方法不能用于在可移动磁盘上创建卷。
 
调用方使用此方法在当前包中使用奇偶校验 (RAID-5) 卷创建新的简单、跨区、条带、镜像或条带化卷。 简单卷和跨卷只有一个 plex 和一个成员。 条带化卷和 RAID-5 卷具有多个列和成员。 镜像卷由多个丛组成。

基本磁盘只能包含简单卷。 动态磁盘可以包含所有类型的卷,只要操作系统支持绑定操作;非服务器平台不支持容错绑定操作。 所有新创建的卷都缺少驱动器号。

在基本磁盘上,此方法创建主分区。 如果磁盘上已有三个主分区,则会创建一个扩展分区,以覆盖磁盘上剩余的最大连续可用磁盘空间范围,然后在扩展分区中创建逻辑驱动器。

一个磁盘不能参与同一卷的多个 plex;但是,单个磁盘可以用于多个卷。 一个简单的卷只有一个 VDS_INPUT_DISK 结构,而跨卷、条带卷、镜像卷和 RAID-5 卷对于每个贡献的磁盘都有一个结构。

VDS_INPUT_DISK 结构中指定的磁盘大小可以是完整磁盘或磁盘的一部分。 当两个磁盘形成镜像卷时,VDS 使用最小的磁盘来计算镜像的大小。 (提供程序策略确定在给定输入磁盘上分配的实际偏移量、长度和磁盘盘区数。) 使用 IVdsPack::QueryVolumes 方法确定所创建卷的确切大小。

若要创建具有可选对齐参数的逻辑卷,请使用 IVdsPack2::CreateVolume2 方法或使用 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vds\Alignment 注册表项指定对齐值(以字节为单位)。

Windows 7、Windows Server 2008 R2、Windows Vista 和 Windows Server 2008: 在基本磁盘上,CreateVolume 方法会忽略 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vds\Alignment 注册表项。 这是一个已知问题,正在解决。 解决方法是使用 IVdsAdvancedDisk::CreatePartitionIVdsCreatePartitionEx::CreatePartitionEx 方法在基本磁盘上创建分区,以便它们正确对齐。

动态分区和卷使用以下注册表项下的值进行对齐:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\vds\Alignment

如果磁盘为 4 GB 或更大,则默认对齐方式为 1 MB;如果磁盘小于 4 GB,则默认对齐方式为 64 KB。

无论调用是否启动异步操作,实现者都必须返回指向此方法的 IVdsAsync 接口的指针。

要求

要求
最低受支持的客户端 Windows Vista [仅限桌面应用]
最低受支持的服务器 Windows Server 2003 [仅限桌面应用]
目标平台 Windows
标头 vds.h
Library Uuid.lib

另请参阅

IVdsAsync

IVdsAsync::Wait

IVdsPack

IVdsPack2::CreateVolume2

IVdsPack::QueryVolumes

VDS_ASYNC_OUTPUT

VDS_INPUT_DISK

VDS_VOLUME_TYPE