[DISKPART] Identify system and boot volumes

This commit is contained in:
Eric Kohl
2026-01-10 17:54:55 +01:00
parent 1628f5e682
commit 41d6aeb72a
15 changed files with 111 additions and 1 deletions

View File

@@ -250,6 +250,9 @@ typedef struct _VOLENTRY
ULONG SectorsPerAllocationUnit;
ULONG BytesPerSector;
BOOL IsSystem;
BOOL IsBoot;
PVOLUME_DISK_EXTENTS pExtents;
} VOLENTRY, *PVOLENTRY;

View File

@@ -210,6 +210,8 @@ BEGIN
IDS_STATUS_ONLINE "Online"
IDS_STATUS_OFFLINE "Offline"
IDS_STATUS_NO_MEDIA "No Media"
IDS_INFO_BOOT "Start"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -210,6 +210,8 @@ BEGIN
IDS_STATUS_ONLINE "Online"
IDS_STATUS_OFFLINE "Offline"
IDS_STATUS_NO_MEDIA "No Media"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -217,6 +217,8 @@ BEGIN
IDS_STATUS_ONLINE "Online"
IDS_STATUS_OFFLINE "Offline"
IDS_STATUS_NO_MEDIA "Nessun Media"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -210,6 +210,8 @@ BEGIN
IDS_STATUS_ONLINE "Online"
IDS_STATUS_OFFLINE "Offline"
IDS_STATUS_NO_MEDIA "Brak nośnika"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -212,6 +212,8 @@ BEGIN
IDS_STATUS_ONLINE "Activo"
IDS_STATUS_OFFLINE "Inactivo"
IDS_STATUS_NO_MEDIA "sem disco"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -218,6 +218,8 @@ BEGIN
IDS_STATUS_ONLINE "conectat"
IDS_STATUS_OFFLINE "neconectat"
IDS_STATUS_NO_MEDIA "inexistent"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -212,6 +212,8 @@ BEGIN
IDS_STATUS_ONLINE "В сети"
IDS_STATUS_OFFLINE "Вне сети"
IDS_STATUS_NO_MEDIA "Нет носителя"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -214,6 +214,8 @@ BEGIN
IDS_STATUS_ONLINE "Online"
IDS_STATUS_OFFLINE "Offline"
IDS_STATUS_NO_MEDIA "Ska Media"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -220,6 +220,8 @@ BEGIN
IDS_STATUS_ONLINE "Çevrim İçi"
IDS_STATUS_OFFLINE "Çevrim Dışı"
IDS_STATUS_NO_MEDIA "Ortam Yok"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -219,6 +219,8 @@ BEGIN
IDS_STATUS_ONLINE "联机"
IDS_STATUS_OFFLINE "脱机"
IDS_STATUS_NO_MEDIA "没有媒体"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -219,6 +219,8 @@ BEGIN
IDS_STATUS_ONLINE "在線"
IDS_STATUS_OFFLINE "離線"
IDS_STATUS_NO_MEDIA "沒有媒體"
IDS_INFO_BOOT "Boot"
IDS_INFO_SYSTEM "System"
END
/* CMD Messages for commands */

View File

@@ -474,6 +474,7 @@ PrintVolume(
ULONGLONG VolumeSize;
PWSTR pszSizeUnit;
PWSTR pszVolumeType;
WCHAR szInfoBuffer[16];
VolumeSize = VolumeEntry->Size.QuadPart;
if (VolumeSize >= SIZE_10TB) /* 10 TB */
@@ -514,6 +515,12 @@ PrintVolume(
break;
}
szInfoBuffer[0] = UNICODE_NULL;
if (VolumeEntry->IsSystem)
LoadStringW(GetModuleHandle(NULL), IDS_INFO_SYSTEM, szInfoBuffer, ARRAYSIZE(szInfoBuffer));
else if (VolumeEntry->IsBoot)
LoadStringW(GetModuleHandle(NULL), IDS_INFO_BOOT, szInfoBuffer, ARRAYSIZE(szInfoBuffer));
ConResPrintf(StdOut, IDS_LIST_VOLUME_FORMAT,
(CurrentVolume == VolumeEntry) ? L'*' : L' ',
VolumeEntry->VolumeNumber,
@@ -522,7 +529,8 @@ PrintVolume(
(VolumeEntry->pszFilesystem) ? VolumeEntry->pszFilesystem : L"",
pszVolumeType,
VolumeSize, pszSizeUnit,
L"", L"");
L"",
szInfoBuffer);
}

View File

@@ -1829,6 +1829,78 @@ GetVolumeSize(
}
static
VOID
IsVolumeSystem(
_In_ PVOLENTRY VolumeEntry)
{
WCHAR szSystemPartition[MAX_PATH];
HKEY hKey;
DWORD dwError, dwLength;
DPRINT1("IsVolumeSystem()\n");
VolumeEntry->IsSystem = FALSE;
dwError = RegOpenKeyExW(HKEY_LOCAL_MACHINE,
L"SYSTEM\\Setup",
0,
KEY_READ,
&hKey);
if (dwError != ERROR_SUCCESS)
{
DPRINT1("\n");
return;
}
dwLength = sizeof(szSystemPartition);
dwError = RegQueryValueExW(hKey,
L"SystemPartition",
NULL,
NULL,
(PBYTE)szSystemPartition,
&dwLength);
RegCloseKey(hKey);
if (dwError != ERROR_SUCCESS)
{
DPRINT1("\n");
return;
}
DPRINT1("SystemPartition: %S\n", szSystemPartition);
DPRINT1("DeviceName: %S\n", VolumeEntry->DeviceName);
if (_wcsnicmp(szSystemPartition, VolumeEntry->DeviceName, wcslen(szSystemPartition)) == 0)
VolumeEntry->IsSystem = TRUE;
}
static
VOID
IsVolumeBoot(
_In_ PVOLENTRY VolumeEntry)
{
WCHAR szSystemDir[MAX_PATH];
DPRINT1("IsVolumeBoot()\n");
VolumeEntry->IsBoot = FALSE;
if (VolumeEntry->DriveLetter == UNICODE_NULL)
return;
GetSystemDirectoryW(szSystemDir,
ARRAYSIZE(szSystemDir));
DPRINT1("SystemDirectory: %S\n", szSystemDir);
DPRINT1("DriveLetter: %C\n", VolumeEntry->DriveLetter);
if (szSystemDir[0] == VolumeEntry->DriveLetter)
VolumeEntry->IsBoot = TRUE;
}
static
VOID
AddVolumeToList(
@@ -1958,6 +2030,9 @@ AddVolumeToList(
}
}
IsVolumeSystem(VolumeEntry);
IsVolumeBoot(VolumeEntry);
InsertTailList(&VolumeListHead,
&VolumeEntry->ListEntry);
}

View File

@@ -146,6 +146,8 @@
#define IDS_STATUS_ONLINE 36
#define IDS_STATUS_OFFLINE 37
#define IDS_STATUS_NO_MEDIA 38
#define IDS_INFO_BOOT 39
#define IDS_INFO_SYSTEM 40
#define IDS_MSG_ARG_SYNTAX_ERROR 41