mirror of
https://github.com/reactos/reactos.git
synced 2024-09-08 03:40:17 +00:00
260 lines
6.8 KiB
C
260 lines
6.8 KiB
C
/*
|
|
* PROJECT: ReactOS DiskPart
|
|
* LICENSE: GPL - See COPYING in the top level directory
|
|
* FILE: base/system/diskpart/list.c
|
|
* PURPOSE: Manages all the partitions of the OS in an interactive way.
|
|
* PROGRAMMERS: Lee Schroeder
|
|
*/
|
|
|
|
#include "diskpart.h"
|
|
|
|
#define NDEBUG
|
|
#include <debug.h>
|
|
|
|
/* FUNCTIONS ******************************************************************/
|
|
|
|
static
|
|
ULONGLONG
|
|
RoundingDivide(
|
|
IN ULONGLONG Dividend,
|
|
IN ULONGLONG Divisor)
|
|
{
|
|
return (Dividend + Divisor / 2) / Divisor;
|
|
}
|
|
|
|
|
|
static
|
|
VOID
|
|
ListDisk(VOID)
|
|
{
|
|
PLIST_ENTRY Entry;
|
|
PDISKENTRY DiskEntry;
|
|
ULONGLONG DiskSize;
|
|
ULONGLONG FreeSize;
|
|
LPWSTR lpSizeUnit;
|
|
LPWSTR lpFreeUnit;
|
|
|
|
/* Header labels */
|
|
ConResPuts(StdOut, IDS_LIST_DISK_HEAD);
|
|
ConResPuts(StdOut, IDS_LIST_DISK_LINE);
|
|
|
|
Entry = DiskListHead.Flink;
|
|
while (Entry != &DiskListHead)
|
|
{
|
|
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
|
|
|
|
DiskSize = DiskEntry->SectorCount.QuadPart *
|
|
(ULONGLONG)DiskEntry->BytesPerSector;
|
|
|
|
if (DiskSize >= 10737418240) /* 10 GB */
|
|
{
|
|
DiskSize = RoundingDivide(DiskSize, 1073741824);
|
|
lpSizeUnit = L"GB";
|
|
}
|
|
else
|
|
{
|
|
DiskSize = RoundingDivide(DiskSize, 1048576);
|
|
if (DiskSize == 0)
|
|
DiskSize = 1;
|
|
lpSizeUnit = L"MB";
|
|
}
|
|
|
|
/* FIXME */
|
|
FreeSize = 0;
|
|
lpFreeUnit = L"B";
|
|
|
|
ConResPrintf(StdOut, IDS_LIST_DISK_FORMAT,
|
|
(CurrentDisk == DiskEntry) ? L'*': ' ',
|
|
DiskEntry->DiskNumber,
|
|
L"Online",
|
|
DiskSize,
|
|
lpSizeUnit,
|
|
FreeSize,
|
|
lpFreeUnit,
|
|
L" ",
|
|
L" ");
|
|
|
|
Entry = Entry->Flink;
|
|
}
|
|
|
|
ConPuts(StdOut, L"\n\n");
|
|
}
|
|
|
|
static
|
|
VOID
|
|
ListPartition(VOID)
|
|
{
|
|
PLIST_ENTRY Entry;
|
|
PPARTENTRY PartEntry;
|
|
ULONGLONG PartSize;
|
|
ULONGLONG PartOffset;
|
|
LPWSTR lpSizeUnit;
|
|
LPWSTR lpOffsetUnit;
|
|
ULONG PartNumber = 1;
|
|
|
|
if (CurrentDisk == NULL)
|
|
{
|
|
ConResPuts(StdOut, IDS_LIST_PARTITION_NO_DISK);
|
|
return;
|
|
}
|
|
|
|
/* Header labels */
|
|
ConResPuts(StdOut, IDS_LIST_PARTITION_HEAD);
|
|
ConResPuts(StdOut, IDS_LIST_PARTITION_LINE);
|
|
|
|
Entry = CurrentDisk->PrimaryPartListHead.Flink;
|
|
while (Entry != &CurrentDisk->PrimaryPartListHead)
|
|
{
|
|
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
|
|
|
|
if (PartEntry->PartitionType != 0)
|
|
{
|
|
PartSize = PartEntry->SectorCount.QuadPart * CurrentDisk->BytesPerSector;
|
|
|
|
if (PartSize >= 10737418240) /* 10 GB */
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1073741824);
|
|
lpSizeUnit = L"GB";
|
|
}
|
|
else if (PartSize >= 10485760) /* 10 MB */
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1048576);
|
|
lpSizeUnit = L"MB";
|
|
}
|
|
else
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1024);
|
|
lpSizeUnit = L"KB";
|
|
}
|
|
|
|
PartOffset = PartEntry->StartSector.QuadPart * CurrentDisk->BytesPerSector;
|
|
|
|
if (PartOffset >= 10737418240) /* 10 GB */
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1073741824);
|
|
lpOffsetUnit = L"GB";
|
|
}
|
|
else if (PartOffset >= 10485760) /* 10 MB */
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1048576);
|
|
lpOffsetUnit = L"MB";
|
|
}
|
|
else
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1024);
|
|
lpOffsetUnit = L"KB";
|
|
}
|
|
|
|
ConResPrintf(StdOut, IDS_LIST_PARTITION_FORMAT,
|
|
(CurrentPartition == PartEntry) ? L'*': ' ',
|
|
PartNumber++,
|
|
IsContainerPartition(PartEntry->PartitionType) ? L"Extended" : L"Primary",
|
|
PartSize,
|
|
lpSizeUnit,
|
|
PartOffset,
|
|
lpOffsetUnit);
|
|
}
|
|
|
|
Entry = Entry->Flink;
|
|
}
|
|
|
|
Entry = CurrentDisk->LogicalPartListHead.Flink;
|
|
while (Entry != &CurrentDisk->LogicalPartListHead)
|
|
{
|
|
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
|
|
|
|
if (PartEntry->PartitionType != 0)
|
|
{
|
|
PartSize = PartEntry->SectorCount.QuadPart * CurrentDisk->BytesPerSector;
|
|
|
|
if (PartSize >= 10737418240) /* 10 GB */
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1073741824);
|
|
lpSizeUnit = L"GB";
|
|
}
|
|
else if (PartSize >= 10485760) /* 10 MB */
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1048576);
|
|
lpSizeUnit = L"MB";
|
|
}
|
|
else
|
|
{
|
|
PartSize = RoundingDivide(PartSize, 1024);
|
|
lpSizeUnit = L"KB";
|
|
}
|
|
|
|
PartOffset = PartEntry->StartSector.QuadPart * CurrentDisk->BytesPerSector;
|
|
|
|
if (PartOffset >= 10737418240) /* 10 GB */
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1073741824);
|
|
lpOffsetUnit = L"GB";
|
|
}
|
|
else if (PartOffset >= 10485760) /* 10 MB */
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1048576);
|
|
lpOffsetUnit = L"MB";
|
|
}
|
|
else
|
|
{
|
|
PartOffset = RoundingDivide(PartOffset, 1024);
|
|
lpOffsetUnit = L"KB";
|
|
}
|
|
|
|
ConResPrintf(StdOut, IDS_LIST_PARTITION_FORMAT,
|
|
(CurrentPartition == PartEntry) ? L'*': ' ',
|
|
PartNumber++,
|
|
L"Logical",
|
|
PartSize,
|
|
lpSizeUnit,
|
|
PartOffset,
|
|
lpOffsetUnit);
|
|
}
|
|
|
|
Entry = Entry->Flink;
|
|
}
|
|
|
|
ConPuts(StdOut, L"\n");
|
|
}
|
|
|
|
static
|
|
VOID
|
|
ListVolume(VOID)
|
|
{
|
|
ConResPuts(StdOut, IDS_LIST_VOLUME_HEAD);
|
|
}
|
|
|
|
static
|
|
VOID
|
|
ListVdisk(VOID)
|
|
{
|
|
ConPuts(StdOut, L"List VDisk!!\n");
|
|
}
|
|
|
|
BOOL
|
|
list_main(
|
|
INT argc,
|
|
LPWSTR *argv)
|
|
{
|
|
/* gets the first word from the string */
|
|
if (argc == 1)
|
|
{
|
|
ConResPuts(StdOut, IDS_HELP_CMD_LIST);
|
|
return TRUE;
|
|
}
|
|
|
|
/* determines which to list (disk, partition, etc.) */
|
|
if (!wcsicmp(argv[1], L"disk"))
|
|
ListDisk();
|
|
else if (!wcsicmp(argv[1], L"partition"))
|
|
ListPartition();
|
|
else if (!wcsicmp(argv[1], L"volume"))
|
|
ListVolume();
|
|
else if (!wcsicmp(argv[1], L"vdisk"))
|
|
ListVdisk();
|
|
else
|
|
ConResPuts(StdOut, IDS_HELP_CMD_LIST);
|
|
|
|
return TRUE;
|
|
}
|