From 41d6aeb72aca0489ff72801a5e39a83a014d7c61 Mon Sep 17 00:00:00 2001 From: Eric Kohl Date: Sat, 10 Jan 2026 17:54:55 +0100 Subject: [PATCH] [DISKPART] Identify system and boot volumes --- base/system/diskpart/diskpart.h | 3 ++ base/system/diskpart/lang/de-DE.rc | 2 + base/system/diskpart/lang/en-US.rc | 2 + base/system/diskpart/lang/it-IT.rc | 2 + base/system/diskpart/lang/pl-PL.rc | 2 + base/system/diskpart/lang/pt-PT.rc | 2 + base/system/diskpart/lang/ro-RO.rc | 2 + base/system/diskpart/lang/ru-RU.rc | 2 + base/system/diskpart/lang/sq-AL.rc | 2 + base/system/diskpart/lang/tr-TR.rc | 2 + base/system/diskpart/lang/zh-CN.rc | 2 + base/system/diskpart/lang/zh-TW.rc | 2 + base/system/diskpart/list.c | 10 +++- base/system/diskpart/partlist.c | 75 ++++++++++++++++++++++++++++++ base/system/diskpart/resource.h | 2 + 15 files changed, 111 insertions(+), 1 deletion(-) diff --git a/base/system/diskpart/diskpart.h b/base/system/diskpart/diskpart.h index 778468c607a..a74a4c55a33 100644 --- a/base/system/diskpart/diskpart.h +++ b/base/system/diskpart/diskpart.h @@ -250,6 +250,9 @@ typedef struct _VOLENTRY ULONG SectorsPerAllocationUnit; ULONG BytesPerSector; + BOOL IsSystem; + BOOL IsBoot; + PVOLUME_DISK_EXTENTS pExtents; } VOLENTRY, *PVOLENTRY; diff --git a/base/system/diskpart/lang/de-DE.rc b/base/system/diskpart/lang/de-DE.rc index 2e7210f1926..97c53ba1796 100644 --- a/base/system/diskpart/lang/de-DE.rc +++ b/base/system/diskpart/lang/de-DE.rc @@ -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 */ diff --git a/base/system/diskpart/lang/en-US.rc b/base/system/diskpart/lang/en-US.rc index f88e0d68303..754a90a2e89 100644 --- a/base/system/diskpart/lang/en-US.rc +++ b/base/system/diskpart/lang/en-US.rc @@ -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 */ diff --git a/base/system/diskpart/lang/it-IT.rc b/base/system/diskpart/lang/it-IT.rc index d15c3c6911d..13ca8fcab20 100644 --- a/base/system/diskpart/lang/it-IT.rc +++ b/base/system/diskpart/lang/it-IT.rc @@ -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 */ diff --git a/base/system/diskpart/lang/pl-PL.rc b/base/system/diskpart/lang/pl-PL.rc index 1f2484bbfc2..2703fb4aff0 100644 --- a/base/system/diskpart/lang/pl-PL.rc +++ b/base/system/diskpart/lang/pl-PL.rc @@ -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 */ diff --git a/base/system/diskpart/lang/pt-PT.rc b/base/system/diskpart/lang/pt-PT.rc index ce4673624cb..3c21155988e 100644 --- a/base/system/diskpart/lang/pt-PT.rc +++ b/base/system/diskpart/lang/pt-PT.rc @@ -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 */ diff --git a/base/system/diskpart/lang/ro-RO.rc b/base/system/diskpart/lang/ro-RO.rc index 418c463b296..145f49ff321 100644 --- a/base/system/diskpart/lang/ro-RO.rc +++ b/base/system/diskpart/lang/ro-RO.rc @@ -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 */ diff --git a/base/system/diskpart/lang/ru-RU.rc b/base/system/diskpart/lang/ru-RU.rc index a0adb3f60e1..76ce6acdc9d 100644 --- a/base/system/diskpart/lang/ru-RU.rc +++ b/base/system/diskpart/lang/ru-RU.rc @@ -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 */ diff --git a/base/system/diskpart/lang/sq-AL.rc b/base/system/diskpart/lang/sq-AL.rc index 0b62fc9d6a5..316418ad7f6 100644 --- a/base/system/diskpart/lang/sq-AL.rc +++ b/base/system/diskpart/lang/sq-AL.rc @@ -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 */ diff --git a/base/system/diskpart/lang/tr-TR.rc b/base/system/diskpart/lang/tr-TR.rc index 5983c66cf0e..43f592fa33d 100644 --- a/base/system/diskpart/lang/tr-TR.rc +++ b/base/system/diskpart/lang/tr-TR.rc @@ -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 */ diff --git a/base/system/diskpart/lang/zh-CN.rc b/base/system/diskpart/lang/zh-CN.rc index d665c5dd216..032a234f8a5 100644 --- a/base/system/diskpart/lang/zh-CN.rc +++ b/base/system/diskpart/lang/zh-CN.rc @@ -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 */ diff --git a/base/system/diskpart/lang/zh-TW.rc b/base/system/diskpart/lang/zh-TW.rc index 8c9fe9cf416..8a4e44fb2b0 100644 --- a/base/system/diskpart/lang/zh-TW.rc +++ b/base/system/diskpart/lang/zh-TW.rc @@ -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 */ diff --git a/base/system/diskpart/list.c b/base/system/diskpart/list.c index a7293a3fe7e..254d619cfd3 100644 --- a/base/system/diskpart/list.c +++ b/base/system/diskpart/list.c @@ -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); } diff --git a/base/system/diskpart/partlist.c b/base/system/diskpart/partlist.c index 2f82e817a30..671305e0b65 100644 --- a/base/system/diskpart/partlist.c +++ b/base/system/diskpart/partlist.c @@ -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); } diff --git a/base/system/diskpart/resource.h b/base/system/diskpart/resource.h index 313d75fe1f0..9bc532e0288 100644 --- a/base/system/diskpart/resource.h +++ b/base/system/diskpart/resource.h @@ -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