C# 4.0 使用VDS创建UEFI分区

C# 4.0 使用VDS创建UEFI分区,c#-4.0,wmi,vds,uefi,C# 4.0,Wmi,Vds,Uefi,我正在尝试使用该方法创建UEFI分区 在结构参数中,我将PARTITION\u SYSTEM\u GUID(c12a7328-f81f-11d2-ba4b-00a0c93ec93b)作为partitionType传递,并将GPT\u基本数据\u属性\u NO\u DRIVE\u LETTER(0x80000000000000)作为属性传递 但是我得到了一个未知的分区,类型为c12a0000-f81f-11d2-ba4b-00a0c93ec93b 你知道这里有什么不对吗 我还尝试在Win8上使

我正在尝试使用该方法创建UEFI分区

在结构参数中,我将
PARTITION\u SYSTEM\u GUID
(c12a7328-f81f-11d2-ba4b-00a0c93ec93b)作为
partitionType
传递,并将
GPT\u基本数据\u属性\u NO\u DRIVE\u LETTER
(0x80000000000000)作为属性传递

但是我得到了一个未知的分区,类型为c12a0000-f81f-11d2-ba4b-00a0c93ec93b

你知道这里有什么不对吗

我还尝试在Win8上使用WMI创建UEFI分区。 但是我得到了错误值41010-指定的分区类型无效。 这是我的密码

static void Main(string[] args)
{
    try
    {
        var scope = new ManagementScope(@"\\.\Root\Microsoft\Windows\Storage");
        scope.Connect();

        const string query = "SELECT * FROM MSFT_Disk WHERE Number = 7";
        var objectQuery = new ObjectQuery(query);
        var seacher = new ManagementObjectSearcher(scope, objectQuery);
        var disks = seacher.Get();

        var disk = disks.Cast<ManagementObject>().FirstOrDefault();

        if (disk == null)
        {
            throw new NoNullAllowedException("Disk is null");
        }

        var parameters = disk.GetMethodParameters("CreatePartition");
        FillInvocationParameters(parameters, new Dictionary<string, object> { { "Size", 104857600 }, { "Offset", 5ul * 1024 * 1024 * 1024 }, { "Alignment", 512 }, { "AssignDriveLetter", false }, { "GptType", "c12a7328-f81f-11d2-ba4b-00a0c93ec93b" }, { "IsHidden", false } });

        var result = disk.InvokeMethod("CreatePartition", parameters, null);
        var returnValue = result["ReturnValue"];
    }
    catch (Exception exception)
    {
        Debug.Fail(exception.Message);
    }
}
static void FillInvocationParameters(ManagementBaseObject invokeParameters, IDictionary<string, object> parameters)
{
    foreach (var pair in parameters)
    {
        string stringParamValue;

        var managementObjectParam = pair.Value as ManagementObject;
        var arrayParam = pair.Value as string[];

        if (managementObjectParam != null)
        {
            stringParamValue = managementObjectParam.GetText(TextFormat.CimDtd20);
            invokeParameters[pair.Key] = stringParamValue;
        }
        else if (arrayParam != null)
        {
            invokeParameters[pair.Key] = arrayParam;
        }
        else if (pair.Value != null)
        {
            stringParamValue = pair.Value.ToString();
            invokeParameters[pair.Key] = stringParamValue;
        }
    }
}
static void Main(字符串[]args)
{
尝试
{
var scope=new ManagementScope(@“\\.\Root\Microsoft\Windows\Storage”);
scope.Connect();
const string query=“从编号为7的MSFT\U磁盘中选择*”;
var objectQuery=新objectQuery(查询);
var seacher=新的ManagementObjectSearcher(范围,objectQuery);
var disks=seacher.Get();
var disk=disks.Cast().FirstOrDefault();
如果(磁盘==null)
{
抛出新的非ullAllowedException(“磁盘为空”);
}
var参数=disk.GetMethodParameters(“CreatePartition”);
FillInvocationParameters(参数,新字典{{“大小”,104857600},{“偏移量”,5ul*1024*1024*1024},{“对齐”,512},{“赋值驱动字母”,false},{“GptType”,“c12a7328-f81f-11d2-ba4b-00a0c93ec93b},{“IsHidden”,false});
var result=disk.InvokeMethod(“CreatePartition”,参数,null);
var returnValue=结果[“returnValue”];
}
捕获(异常)
{
调试失败(异常消息);
}
}
静态void FillInvocationParameters(ManagementBaseObject invokeParameters、IDictionary参数)
{
foreach(参数中的var对)
{
字符串字符串参数值;
var managementObjectParam=作为ManagementObject的pair.Value;
var arrayParam=pair.Value作为字符串[];
if(managementObjectParam!=null)
{
stringParamValue=managementObjectParam.GetText(TextFormat.CimDtd20);
invokeParameters[pair.Key]=stringParamValue;
}
else if(arrayParam!=null)
{
invokeParameters[pair.Key]=arrayParam;
}
else if(pair.Value!=null)
{
stringParamValue=pair.Value.ToString();
invokeParameters[pair.Key]=stringParamValue;
}
}
}

我最终使用VDS解决了这个问题:我使用IVdsPack::CreateVolume()创建了卷,接收了它的分区,使用IVdsAdvancedDisk::FormatPartition()将它格式化为Fat32,然后
使用IVdsAdvancedDisk2::ChangePartitionType()更改了PartitionType()

将有助于查看进行此调用的代码片段和原始错误本身。