Skip to content

Commit abc2acf

Browse files
committed
[DISKPART] Implement the filesystems command
Limitations with respect to available file systems and cluster sizes are not implemented yet.
1 parent 7c3d4a0 commit abc2acf

File tree

15 files changed

+149
-130
lines changed

15 files changed

+149
-130
lines changed

base/system/diskpart/diskpart.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -229,6 +229,7 @@ typedef struct _VOLENTRY
229229
ULONG VolumeNumber;
230230
WCHAR VolumeName[MAX_PATH];
231231
WCHAR DeviceName[MAX_PATH];
232+
DWORD SerialNumber;
232233

233234
WCHAR DriveLetter;
234235

@@ -237,6 +238,11 @@ typedef struct _VOLENTRY
237238
VOLUME_TYPE VolumeType;
238239
ULARGE_INTEGER Size;
239240

241+
ULARGE_INTEGER TotalAllocationUnits;
242+
ULARGE_INTEGER AvailableAllocationUnits;
243+
ULONG SectorsPerAllocationUnit;
244+
ULONG BytesPerSector;
245+
240246
PVOLUME_DISK_EXTENTS pExtents;
241247

242248
} VOLENTRY, *PVOLENTRY;

base/system/diskpart/filesystems.c

Lines changed: 38 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -12,145 +12,78 @@
1212
#include <debug.h>
1313

1414
static
15-
BOOL
15+
VOID
1616
ShowFileSystemInfo(
17-
PVOLENTRY VolumeEntry)
17+
_In_ PVOLENTRY VolumeEntry)
1818
{
19-
WCHAR VolumeNameBuffer[MAX_PATH];
20-
UNICODE_STRING VolumeName;
21-
HANDLE VolumeHandle;
22-
OBJECT_ATTRIBUTES ObjectAttributes;
23-
IO_STATUS_BLOCK IoStatusBlock;
24-
ULONG ulSize, ulClusterSize = 0;
25-
FILE_FS_FULL_SIZE_INFORMATION SizeInfo;
26-
FILE_FS_FULL_SIZE_INFORMATION FullSizeInfo;
27-
PFILE_FS_ATTRIBUTE_INFORMATION pAttributeInfo = NULL;
28-
NTSTATUS Status;
29-
BOOL Result = TRUE;
30-
31-
wcscpy(VolumeNameBuffer, VolumeEntry->DeviceName);
32-
wcscat(VolumeNameBuffer, L"\\");
33-
34-
RtlInitUnicodeString(&VolumeName, VolumeNameBuffer);
35-
36-
InitializeObjectAttributes(&ObjectAttributes,
37-
&VolumeName,
38-
0,
39-
NULL,
40-
NULL);
41-
42-
Status = NtOpenFile(&VolumeHandle,
43-
SYNCHRONIZE,
44-
&ObjectAttributes,
45-
&IoStatusBlock,
46-
0,
47-
FILE_DIRECTORY_FILE | FILE_SYNCHRONOUS_IO_NONALERT | FILE_OPEN_FOR_BACKUP_INTENT);
48-
if (!NT_SUCCESS(Status))
49-
{
50-
if (Status == STATUS_NO_MEDIA_IN_DEVICE)
51-
{
52-
ConResPuts(StdOut, IDS_ERROR_NO_MEDIUM);
53-
return FALSE;
54-
}
55-
else if (Status == STATUS_UNRECOGNIZED_VOLUME)
56-
{
57-
ConResPuts(StdOut, IDS_FILESYSTEMS_CURRENT);
58-
ConPuts(StdOut, L"\n");
59-
ConResPrintf(StdOut, IDS_FILESYSTEMS_TYPE, L"RAW");
60-
ConResPrintf(StdOut, IDS_FILESYSTEMS_CLUSTERSIZE, 512);
61-
}
19+
WCHAR szBuffer[32];
20+
PWSTR pszSizeUnit = L"";
21+
ULONG ulClusterSize;
6222

63-
return TRUE;
64-
}
65-
66-
ulSize = sizeof(FILE_FS_ATTRIBUTE_INFORMATION) + 255 * sizeof(WCHAR);
67-
pAttributeInfo = RtlAllocateHeap(RtlGetProcessHeap(),
68-
HEAP_ZERO_MEMORY,
69-
ulSize);
70-
if (pAttributeInfo == NULL)
71-
{
72-
Result = FALSE;
73-
goto done;
74-
}
23+
ConResPuts(StdOut, IDS_FILESYSTEMS_CURRENT);
24+
ConPuts(StdOut, L"\n");
7525

76-
Status = NtQueryVolumeInformationFile(VolumeHandle,
77-
&IoStatusBlock,
78-
pAttributeInfo,
79-
ulSize,
80-
FileFsAttributeInformation);
81-
if (!NT_SUCCESS(Status))
82-
{
83-
Result = FALSE;
84-
goto done;
85-
}
26+
ConResPrintf(StdOut, IDS_FILESYSTEMS_TYPE, VolumeEntry->pszFilesystem);
8627

87-
Status = NtQueryVolumeInformationFile(VolumeHandle,
88-
&IoStatusBlock,
89-
&FullSizeInfo,
90-
sizeof(FILE_FS_FULL_SIZE_INFORMATION),
91-
FileFsFullSizeInformation);
92-
if (NT_SUCCESS(Status))
28+
ulClusterSize = VolumeEntry->SectorsPerAllocationUnit * VolumeEntry->BytesPerSector;
29+
if (ulClusterSize >= SIZE_10MB) /* 10 MB */
9330
{
94-
ulClusterSize = FullSizeInfo.BytesPerSector * FullSizeInfo.SectorsPerAllocationUnit;
31+
ulClusterSize = RoundingDivide(ulClusterSize, SIZE_1MB);
32+
pszSizeUnit = L"MB";
9533
}
96-
else
34+
else if (ulClusterSize >= SIZE_10KB) /* 10 KB */
9735
{
98-
Status = NtQueryVolumeInformationFile(VolumeHandle,
99-
&IoStatusBlock,
100-
&SizeInfo,
101-
sizeof(FILE_FS_SIZE_INFORMATION),
102-
FileFsSizeInformation);
103-
if (NT_SUCCESS(Status))
104-
{
105-
ulClusterSize = SizeInfo.BytesPerSector * SizeInfo.SectorsPerAllocationUnit;
106-
}
36+
ulClusterSize = RoundingDivide(ulClusterSize, SIZE_1KB);
37+
pszSizeUnit = L"KB";
10738
}
10839

109-
110-
ConResPuts(StdOut, IDS_FILESYSTEMS_CURRENT);
111-
ConPuts(StdOut, L"\n");
112-
113-
ConResPrintf(StdOut, IDS_FILESYSTEMS_TYPE, pAttributeInfo->FileSystemName);
114-
ConResPrintf(StdOut, IDS_FILESYSTEMS_CLUSTERSIZE, ulClusterSize);
40+
wsprintf(szBuffer, L"%lu %s", ulClusterSize, pszSizeUnit);
41+
ConResPrintf(StdOut, IDS_FILESYSTEMS_CLUSTERSIZE, szBuffer);
42+
ConResPrintf(StdOut, IDS_FILESYSTEMS_SERIAL_NUMBER, VolumeEntry->SerialNumber);
11543
ConPuts(StdOut, L"\n");
116-
117-
done:
118-
if (pAttributeInfo)
119-
RtlFreeHeap(RtlGetProcessHeap(), 0, pAttributeInfo);
120-
121-
NtClose(VolumeHandle);
122-
123-
return Result;
12444
}
12545

46+
12647
static
12748
VOID
128-
ShowInstalledFileSystems(VOID)
49+
ShowInstalledFileSystems(
50+
_In_ PVOLENTRY VolumeEntry)
12951
{
13052
WCHAR szBuffer[256];
53+
WCHAR szDefault[32];
13154
BOOLEAN ret;
13255
DWORD dwIndex;
13356
UCHAR uMajor, uMinor;
13457
BOOLEAN bLatest;
13558

59+
LoadStringW(GetModuleHandle(NULL),
60+
IDS_FILESYSTEMS_DEFAULT,
61+
szDefault, ARRAYSIZE(szDefault));
62+
13663
ConResPuts(StdOut, IDS_FILESYSTEMS_FORMATTING);
64+
ConPuts(StdOut, L"\n");
13765

13866
for (dwIndex = 0; ; dwIndex++)
13967
{
14068
ret = QueryAvailableFileSystemFormat(dwIndex,
14169
szBuffer,
14270
&uMajor,
14371
&uMinor,
144-
&bLatest);
72+
&bLatest);
14573
if (ret == FALSE)
14674
break;
14775

148-
ConPrintf(StdOut, L" %s\n", szBuffer);
149-
}
76+
if (wcscmp(szBuffer, L"FAT") == 0)
77+
wcscat(szBuffer, szDefault);
15078

151-
ConPuts(StdOut, L"\n");
79+
ConResPrintf(StdOut, IDS_FILESYSTEMS_TYPE, szBuffer);
80+
wcscpy(szBuffer, L"-");
81+
ConResPrintf(StdOut, IDS_FILESYSTEMS_CLUSTERSIZE, szBuffer);
82+
ConPuts(StdOut, L"\n");
83+
}
15284
}
15385

86+
15487
BOOL
15588
filesystems_main(
15689
_In_ INT argc,
@@ -164,10 +97,8 @@ filesystems_main(
16497

16598
ConPuts(StdOut, L"\n");
16699

167-
if (ShowFileSystemInfo(CurrentVolume))
168-
{
169-
ShowInstalledFileSystems();
170-
}
100+
ShowFileSystemInfo(CurrentVolume);
101+
ShowInstalledFileSystems(CurrentVolume);
171102

172103
return TRUE;
173104
}

base/system/diskpart/lang/de-DE.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,10 @@ STRINGTABLE
9393
BEGIN
9494
IDS_FILESYSTEMS_CURRENT "Aktuelles Dateisystem\n"
9595
IDS_FILESYSTEMS_FORMATTING "Zur Formatierung unterstützte Dateisysteme\n"
96-
IDS_FILESYSTEMS_TYPE "Typ : %s\n"
97-
IDS_FILESYSTEMS_CLUSTERSIZE "Größe der Zuordnungseinheit: %lu\n"
96+
IDS_FILESYSTEMS_TYPE " Typ : %s\n"
97+
IDS_FILESYSTEMS_CLUSTERSIZE " Größe der Zuordnungseinheit: %s\n"
98+
IDS_FILESYSTEMS_SERIAL_NUMBER " Kennung : %08lx\n"
99+
IDS_FILESYSTEMS_DEFAULT " (Standard)"
98100
END
99101

100102
STRINGTABLE

base/system/diskpart/lang/en-US.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,10 @@ STRINGTABLE
9393
BEGIN
9494
IDS_FILESYSTEMS_CURRENT "Current Filesystem\n"
9595
IDS_FILESYSTEMS_FORMATTING "Filesystems available for formatting\n"
96-
IDS_FILESYSTEMS_TYPE "Type : %s\n"
97-
IDS_FILESYSTEMS_CLUSTERSIZE "Cluster size: %lu\n"
96+
IDS_FILESYSTEMS_TYPE " Type : %s\n"
97+
IDS_FILESYSTEMS_CLUSTERSIZE " Cluster size : %s\n"
98+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number : %08lx\n"
99+
IDS_FILESYSTEMS_DEFAULT " (Default)"
98100
END
99101

100102
STRINGTABLE

base/system/diskpart/lang/it-IT.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -100,8 +100,10 @@ STRINGTABLE
100100
BEGIN
101101
IDS_FILESYSTEMS_CURRENT "Filesystem corrente\n"
102102
IDS_FILESYSTEMS_FORMATTING "Filesystem disponibili per la formattazione\n"
103-
IDS_FILESYSTEMS_TYPE "Tipo : %s\n"
104-
IDS_FILESYSTEMS_CLUSTERSIZE "Dimensione cluster: %lu\n"
103+
IDS_FILESYSTEMS_TYPE " Tipo : %s\n"
104+
IDS_FILESYSTEMS_CLUSTERSIZE " Dimensione cluster: %s\n"
105+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number : %08lx\n"
106+
IDS_FILESYSTEMS_DEFAULT " (Default)"
105107
END
106108

107109
STRINGTABLE

base/system/diskpart/lang/pl-PL.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,10 @@ STRINGTABLE
9393
BEGIN
9494
IDS_FILESYSTEMS_CURRENT "Bieżący system plików\n"
9595
IDS_FILESYSTEMS_FORMATTING "Systemy plików obsługiwane przy formatowaniu\n"
96-
IDS_FILESYSTEMS_TYPE "Typ : %s\n"
97-
IDS_FILESYSTEMS_CLUSTERSIZE "Rozmiar klastra: %lu\n"
96+
IDS_FILESYSTEMS_TYPE " Typ : %s\n"
97+
IDS_FILESYSTEMS_CLUSTERSIZE " Rozmiar klastra: %s\n"
98+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number : %08lx\n"
99+
IDS_FILESYSTEMS_DEFAULT " (Default)"
98100
END
99101

100102
STRINGTABLE

base/system/diskpart/lang/pt-PT.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ STRINGTABLE
9595
BEGIN
9696
IDS_FILESYSTEMS_CURRENT "Current Filesystem\n"
9797
IDS_FILESYSTEMS_FORMATTING "Filesystems available for formatting\n"
98-
IDS_FILESYSTEMS_TYPE "Type : %s\n"
99-
IDS_FILESYSTEMS_CLUSTERSIZE "Cluster size: %lu\n"
98+
IDS_FILESYSTEMS_TYPE " Type : %s\n"
99+
IDS_FILESYSTEMS_CLUSTERSIZE " Cluster size : %s\n"
100+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number: %08lx\n"
101+
IDS_FILESYSTEMS_DEFAULT " (Default)"
100102
END
101103

102104
STRINGTABLE

base/system/diskpart/lang/ro-RO.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,10 @@ STRINGTABLE
101101
BEGIN
102102
IDS_FILESYSTEMS_CURRENT "Fișierul de sistem curent\n"
103103
IDS_FILESYSTEMS_FORMATTING "Fișiere de sistem disponibile pentru formatare\n"
104-
IDS_FILESYSTEMS_TYPE "Tip : %s\n"
105-
IDS_FILESYSTEMS_CLUSTERSIZE "Mărimea cluster-ului: %lu\n"
104+
IDS_FILESYSTEMS_TYPE " Tip : %s\n"
105+
IDS_FILESYSTEMS_CLUSTERSIZE " Mărimea cluster-ului: %s\n"
106+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number : %08lx\n"
107+
IDS_FILESYSTEMS_DEFAULT " (Default)"
106108
END
107109

108110
STRINGTABLE

base/system/diskpart/lang/ru-RU.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,10 @@ STRINGTABLE
9595
BEGIN
9696
IDS_FILESYSTEMS_CURRENT "Current Filesystem\n"
9797
IDS_FILESYSTEMS_FORMATTING "Filesystems available for formatting\n"
98-
IDS_FILESYSTEMS_TYPE "Type : %s\n"
99-
IDS_FILESYSTEMS_CLUSTERSIZE "Cluster size: %lu\n"
98+
IDS_FILESYSTEMS_TYPE " Type : %s\n"
99+
IDS_FILESYSTEMS_CLUSTERSIZE " Cluster size : %s\n"
100+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number: %08lx\n"
101+
IDS_FILESYSTEMS_DEFAULT " (Default)"
100102
END
101103

102104
STRINGTABLE

base/system/diskpart/lang/sq-AL.rc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,10 @@ STRINGTABLE
9797
BEGIN
9898
IDS_FILESYSTEMS_CURRENT "Current Filesystem\n"
9999
IDS_FILESYSTEMS_FORMATTING "Filesystems available for formatting\n"
100-
IDS_FILESYSTEMS_TYPE "Type : %s\n"
101-
IDS_FILESYSTEMS_CLUSTERSIZE "Cluster size: %lu\n"
100+
IDS_FILESYSTEMS_TYPE " Type : %s\n"
101+
IDS_FILESYSTEMS_CLUSTERSIZE " Cluster size : %s\n"
102+
IDS_FILESYSTEMS_SERIAL_NUMBER " Serial number: %08lx\n"
103+
IDS_FILESYSTEMS_DEFAULT " (Default)"
102104
END
103105

104106
STRINGTABLE

0 commit comments

Comments
 (0)