Я надеюсь, что может быть некоторое понимание и, возможно, помощь в отношении моего запроса.
Я пытаюсь записать последний модуль в настраиваемую среду восстановления Windows на основе WinPE для Windows 10.
В настоящее время решение использует DiskPart для создания разделов диска (согласно рекомендациям Microsoft здесь), с изменением отсутствия раздела WinRE.
После изрядного количества исследований и работы с проектом, найденным в MSDN, мне удалось получить работающий проект, который очищал/разбивал и форматировал диск с помощью WMI (MSFT_Disk, MSFT_Partition и MSFT_Volume). Это полностью работает в Windows 10 на виртуальном диске размером 15 ГБ.
Когда я попробовал это в WinPE (поскольку это будет ОС, на которой он будет использоваться), он не удался на нескольких элементах, хотя методы были указаны там). (MSFT_Disk::Clear, MSFT_Volume::Format).
Изучив результат своей работы в DiskPart, я заметил, что хотя MSFT_Volume::Format возвращало значение 2 «Неизвестная ошибка», на самом деле он отформатировал раздел данных (NTFS, ClusterSize 4096). Однако, когда метод форматирования применяется к ESP (FAT32, размер кластера 512/1024/4096), происходит полный сбой, при этом файловая система по-прежнему отображается как RAW, но применяется AccessPath. «ExtendedStatus» возвращает только ошибку 2 (если я не обращаюсь к ней правильно).
У кого-нибудь еще была эта проблема и удалось исправить проблему? Многочисленные поиски в Google выдали идею о том, что может быть ошибка WMI, но в PowerShell, а не в коде C#/C++. Ниже приведены некоторые фрагменты кода и снимки экрана:
Создание раздела:
try
{
parameters = disk.GetMethodParameters("CreatePartition");
}
catch (Exception e)
{
Console.WriteLine("Exception in Line 88: " + e.Message);
}
if (PartitionType != "PRIMARY")
{
FillInvocationParameters(parameters, new Dictionary<string, object> { { "Size", _partitionSize.ToString() },
{ "AssignDriveLetter", false },
{ "GpTType", _partitionType} });
}
else
{
FillInvocationParameters(parameters, new Dictionary<string, object> { { "UseMaximumSize", true },
{ "AssignDriveLetter", false },
{ "GpTType", _partitionType} });
}
try
{
res = disk.InvokeMethod("CreatePartition", parameters, null);
objresult = res["ReturnValue"]; //write error handliong routine for the objResult.
Int32.TryParse(objresult.ToString(), out intRes);
}
catch (Exception e)
{
Console.WriteLine("Exception in Line 146: " + e.Message);
ErrorID = Marshal.GetLastWin32Error();
return false;
}
if (intRes != 0)
{
Console.Write("CreatePartition {0} failed with the result: {1} Line 111.", PartitionType, objresult.ToString());
Console.ReadKey();
ErrorID = Marshal.GetLastWin32Error();
return false;
}
//this is the format point for EFI System Disk.. MSFTPARTITIONtoVOLUME MSFT VOLUME::FORMAT
Console.Write($"{PartitionType} Partition has been created\r\n");
string partition = ((ManagementBaseObject)res["CreatedPartition"])["__PATH"] as string;
var MSFT_Partition = new ManagementObject(@"root\Microsoft\Windows\Storage", partition, null);
var partitionIndex = partition.IndexOf(@"ObjectId=\");
partition = partition.Substring(partitionIndex);
partitionIndex = partition.IndexOf(@"}\\");
partitionIndex = partitionIndex + 1;
partition = partition.Substring(0, partitionIndex);
var strMSFTPartition = partition;
partition = partition.Replace("root", "ROOT");
var partitionGuid = MSFT_Partition["Guid"] as string;
Console.WriteLine("Line 138: New Partition GUID: " + partitionGuid);
Параметры объявляются как:
ManagementBaseObject parameters = null;
Параметры FillInvokation:
private static void FillInvocationParameters(ManagementBaseObject InvocationParameters, 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);
InvocationParameters[pair.Key] = stringParamValue;
}
else if (arrayParam != null)
InvocationParameters[pair.Key] = arrayParam;
else if (pair.Value != null)
{
stringParamValue = pair.Value.ToString();
InvocationParameters[pair.Key] = stringParamValue;
}
}
}
И вызов метода формата:
try
{
Console.Write("Line 174: Attempting to Format with MSFT_Volume::Format FileSystem {0}, Label: {1}, ClusterSize: {2}\r\n", _FileSystem, _VolumeLable, _allocationUnit.ToString());
parameters = MSFTVolume.GetMethodParameters("Format");
FillInvocationParameters(parameters, new Dictionary<string, object>{ { "FileSystem", _FileSystem },
{ "AllocationUnitSize", _allocationUnit },
{ "FileSystemLabel", _VolumeLable },
{ "Full", false} });
res = MSFTVolume.InvokeMethod("Format", parameters, null);
objresult = res["ReturnValue"];
Int32.TryParse(objresult.ToString(), out intReslt);
}
catch (Exception e)
{
Console.WriteLine("Line: 189 The Following error occured while attmpeting to Format the Volume: " + e.Message);
ErrorID = Marshal.GetLastWin32Error();
return false;
}
Для ESP применяется следующее:
switch(PartitionType)
{
case "EFI":
{
_partitionType = "{c12a7328-f81f-11d2-ba4b-00a0c93ec93b}";
_partitionSize = 260 /*bytes*/ *1024 /*Kilobytes*/ *1024 /*Megabytes*/;
_FileSystem = "FAT32";
_allocationUnit = 1024;
_VolumeLable = "System";
break;
}
}
Скриншоты моего консольного приложения и результаты diskpart:
Форматировать вывод Disk Console
Любая помощь / идеи будут с благодарностью оценены.
С уважением
Ричи
return
не является функцией, поэтому вам не нужно выполнятьreturn (false)
, достаточноreturn false
. И вместоif (!(x == 3))
просто сделайтеif (x != 3)
. - person AustinWBryan   schedule 23.07.2018