[DISKPART]

- Use the partition list code from usetup. Scan all harddisks at startup and keep the list alive as long as diskpart is running.
- Use the partiton list in the 'select disk' and 'list disk' commands.
- Implement the 'list disk' and 'list partition' commmands.
- Add required strings.

svn path=/trunk/; revision=68473
This commit is contained in:
Eric Kohl 2015-07-20 19:17:06 +00:00
parent afe5b2c7bf
commit 062fc062d2
12 changed files with 1640 additions and 162 deletions

View file

@ -28,6 +28,7 @@ list(APPEND SOURCE
merge.c
offline.c
online.c
partlist.c
recover.c
remove.c
repair.c

View file

@ -17,6 +17,7 @@
#include <winuser.h>
/* FUNCTIONS ******************************************************************/
VOID
PrintResourceString(INT resID, ...)
{
@ -95,17 +96,20 @@ int wmain(int argc, const LPWSTR argv[])
LPCWSTR tmpBuffer = NULL;
WCHAR appTitle[50];
int index, timeout;
int result = EXIT_SUCCESS;
/* Sets the title of the program so the user will have an easier time
determining the current program, especially if diskpart is running a
script */
LoadStringW(GetModuleHandle(NULL), IDS_APP_HEADER, (LPWSTR)appTitle, 50);
SetConsoleTitleW(appTitle);
/* Sets the timeout value to 0 just in case the user doesn't
specify a value */
timeout = 0;
CreatePartitionList();
/* If there are no command arguments, then go straight to the interpreter */
if (argc < 2)
{
@ -127,7 +131,8 @@ int wmain(int argc, const LPWSTR argv[])
{
/* If there is no flag, then return an error */
PrintResourceString(IDS_ERROR_MSG_BAD_ARG, argv[index]);
return EXIT_FAILURE;
result = EXIT_FAILURE;
goto done;
}
/* Checks for the /? flag first since the program
@ -135,7 +140,8 @@ int wmain(int argc, const LPWSTR argv[])
if (_wcsicmp(tmpBuffer, L"?") == 0)
{
PrintResourceString(IDS_APP_USAGE);
return EXIT_SUCCESS;
result = EXIT_SUCCESS;
goto done;
}
/* Checks for the script flag */
else if (_wcsicmp(tmpBuffer, L"s") == 0)
@ -164,7 +170,8 @@ int wmain(int argc, const LPWSTR argv[])
{
/* Assume that the flag doesn't exist. */
PrintResourceString(IDS_ERROR_MSG_BAD_ARG, tmpBuffer);
return EXIT_FAILURE;
result = EXIT_FAILURE;
goto done;
}
}
@ -180,18 +187,25 @@ int wmain(int argc, const LPWSTR argv[])
Sleep(timeout * 1000);
if (RunScript(script) == FALSE)
return EXIT_FAILURE;
{
result = EXIT_FAILURE;
goto done;
}
}
else
{
/* Exit failure since the user wanted to run a script */
PrintResourceString(IDS_ERROR_MSG_NO_SCRIPT, script);
return EXIT_FAILURE;
result = EXIT_FAILURE;
goto done;
}
}
/* Let the user know the program is exiting */
PrintResourceString(IDS_APP_LEAVING);
return EXIT_SUCCESS;
done:
DestroyPartitionList();
return result;
}

View file

@ -17,6 +17,11 @@
#define WIN32_NO_STATUS
#include <windef.h>
#include <winbase.h>
#include <winreg.h>
#include <winuser.h>
#include <wincon.h>
/*
#define NTOS_MODE_USER
#include <ndk/exfuncs.h>
#include <ndk/iofuncs.h>
@ -24,6 +29,19 @@
#include <ndk/psfuncs.h>
#include <ndk/rtlfuncs.h>
#include <ndk/umfuncs.h>
*/
#define NTOS_MODE_USER
#include <ndk/cmfuncs.h>
#include <ndk/exfuncs.h>
#include <ndk/iofuncs.h>
#include <ndk/kefuncs.h>
#include <ndk/mmfuncs.h>
#include <ndk/obfuncs.h>
#include <ndk/psfuncs.h>
#include <ndk/rtlfuncs.h>
#include <ndk/setypes.h>
#include <ndk/umfuncs.h>
#include "resource.h"
@ -50,10 +68,115 @@ extern COMMAND cmds[];
#define MAX_STRING_SIZE 1024
#define MAX_ARGS_COUNT 256
typedef enum _FORMATSTATE
{
Unformatted,
UnformattedOrDamaged,
UnknownFormat,
Preformatted,
Formatted
} FORMATSTATE, *PFORMATSTATE;
typedef struct _PARTENTRY
{
LIST_ENTRY ListEntry;
struct _DISKENTRY *DiskEntry;
ULARGE_INTEGER StartSector;
ULARGE_INTEGER SectorCount;
BOOLEAN BootIndicator;
UCHAR PartitionType;
ULONG HiddenSectors;
ULONG PartitionNumber;
ULONG PartitionIndex;
CHAR DriveLetter;
CHAR VolumeLabel[17];
CHAR FileSystemName[9];
BOOLEAN LogicalPartition;
/* Partition is partitioned disk space */
BOOLEAN IsPartitioned;
/* Partition is new. Table does not exist on disk yet */
BOOLEAN New;
/* Partition was created automatically. */
BOOLEAN AutoCreate;
FORMATSTATE FormatState;
/* Partition must be checked */
BOOLEAN NeedsCheck;
struct _FILE_SYSTEM_ITEM *FileSystem;
} PARTENTRY, *PPARTENTRY;
typedef struct _BIOSDISKENTRY
{
LIST_ENTRY ListEntry;
ULONG DiskNumber;
ULONG Signature;
ULONG Checksum;
BOOLEAN Recognized;
CM_DISK_GEOMETRY_DEVICE_DATA DiskGeometry;
CM_INT13_DRIVE_PARAMETER Int13DiskData;
} BIOSDISKENTRY, *PBIOSDISKENTRY;
typedef struct _DISKENTRY
{
LIST_ENTRY ListEntry;
ULONGLONG Cylinders;
ULONG TracksPerCylinder;
ULONG SectorsPerTrack;
ULONG BytesPerSector;
ULARGE_INTEGER SectorCount;
ULONG SectorAlignment;
ULONG CylinderAlignment;
BOOLEAN BiosFound;
ULONG BiosDiskNumber;
// ULONG Signature;
// ULONG Checksum;
ULONG DiskNumber;
USHORT Port;
USHORT Bus;
USHORT Id;
/* Has the partition list been modified? */
BOOLEAN Dirty;
BOOLEAN NewDisk;
BOOLEAN NoMbr; /* MBR is absent */
UNICODE_STRING DriverName;
PDRIVE_LAYOUT_INFORMATION LayoutBuffer;
PPARTENTRY ExtendedPartition;
LIST_ENTRY PrimaryPartListHead;
LIST_ENTRY LogicalPartListHead;
} DISKENTRY, *PDISKENTRY;
/* GLOBAL VARIABLES ***********************************************************/
ULONG CurrentDisk;
ULONG CurrentPartition;
extern LIST_ENTRY DiskListHead;
extern LIST_ENTRY BiosDiskListHead;
extern PDISKENTRY CurrentDisk;
extern PPARTENTRY CurrentPartition;
/* PROTOTYPES *****************************************************************/
@ -144,6 +267,13 @@ BOOL offline_main(INT argc, LPWSTR *argv);
/* online.c */
BOOL online_main(INT argc, LPWSTR *argv);
/* partlist.c */
NTSTATUS
CreatePartitionList(VOID);
VOID
DestroyPartitionList(VOID);
/* recover.c */
BOOL recover_main(INT argc, LPWSTR *argv);

View file

@ -40,6 +40,10 @@ BEGIN
IDS_LIST_DISK_HEAD "\n Disk ### Status Size Free Dyn Gpt\n"
IDS_LIST_DISK_LINE " -------- ---------- ------- ------- --- ---\n"
IDS_LIST_DISK_FORMAT "%c %7lu %-10s %4I64u %-2s %4I64u %-2s %1s %1s\n"
IDS_LIST_PARTITION_HEAD "\n Partition Type Size Offset\n"
IDS_LIST_PARTITION_LINE " ------------- ---------------- ------- -------\n"
IDS_LIST_PARTITION_FORMAT "%c Partition %2lu %-16s %4I64u %-2s %4I64u %-2s\n"
IDS_LIST_PARTITION_NO_DISK "\nThere is no disk for listing partitions.\nPlease select a disk and try again.\n\n"
IDS_LIST_VOLUME_HEAD " Volume ### Ltr Label\n"
END
@ -48,10 +52,13 @@ STRINGTABLE
BEGIN
IDS_SELECT_NO_DISK "\nThere is no disk currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_DISK "\nDisk %lu is now the selected disk.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
IDS_SELECT_DISK_INVALID "\nInvalid disk.\n\n"
IDS_SELECT_NO_PARTITION "\nThere is no partition currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION "\nPartition %lu is now the selected partition.\n\n"
IDS_SELECT_PARTITION_NO_DISK "\nThere is no disk for selecting a partition.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION_INVALID "\nInvalid partition.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
END
/* Disk Status */
@ -122,7 +129,6 @@ BEGIN
IDS_ERROR_MSG_NO_SCRIPT "Error opening script: %s\n"
IDS_ERROR_MSG_BAD_ARG "Error processing argument: %s\n"
IDS_ERROR_INVALID_ARGS "Invalid arguments\n"
IDS_ERROR_INVALID_DISK "Invalid disk\n"
END
/* Active help descriptions */

View file

@ -41,6 +41,10 @@ BEGIN
IDS_LIST_DISK_HEAD "\n Disc ### Stare Dimensiune Liber Dyn Gpt\n"
IDS_LIST_DISK_LINE " -------- ---------- ---------- ------- --- ---\n"
IDS_LIST_DISK_FORMAT "%c %7lu %-10s %4I64u %-2s %4I64u %-2s %1s %1s\n"
IDS_LIST_PARTITION_HEAD "\n Partition Type Size Offset\n"
IDS_LIST_PARTITION_LINE " ------------- ---------------- ------- -------\n"
IDS_LIST_PARTITION_FORMAT "%c Partition %2lu %-16s %4I64u %-2s %4I64u %-2s\n"
IDS_LIST_PARTITION_NO_DISK "\nThere is no disk for listing partitions.\nPlease select a disk and try again.\n\n"
IDS_LIST_VOLUME_HEAD "Volum ###\tLtr\tEtichetă\n"
END
@ -49,10 +53,13 @@ STRINGTABLE
BEGIN
IDS_SELECT_NO_DISK "\nThere is no disk currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_DISK "\nDisk %lu is now the selected disk.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
IDS_SELECT_DISK_INVALID "\nInvalid disk.\n\n"
IDS_SELECT_NO_PARTITION "\nThere is no partition currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION "\nPartition %lu is now the selected partition.\n\n"
IDS_SELECT_PARTITION_NO_DISK "\nThere is no disk for selecting a partition.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION_INVALID "\nInvalid partition.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
END
/* Disk Status */
@ -123,7 +130,6 @@ BEGIN
IDS_ERROR_MSG_NO_SCRIPT "Eroare la deschiderea fișierului script: %s\n"
IDS_ERROR_MSG_BAD_ARG "Eroare la prelucrarea argumentului: %s\n"
IDS_ERROR_INVALID_ARGS "Invalid arguments\n"
IDS_ERROR_INVALID_DISK "Invalid disk\n"
END
/* Active help descriptions */

View file

@ -42,6 +42,10 @@ BEGIN
IDS_LIST_DISK_HEAD "\n Диск ### Состояние Размер Свободно Дин GPT\n"
IDS_LIST_DISK_LINE " -------- ---------- ------- -------- --- ---\n"
IDS_LIST_DISK_FORMAT "%c %7lu %-10s %4I64u %-2s %4I64u %-2s %1s %1s\n"
IDS_LIST_PARTITION_HEAD "\n Partition Type Size Offset\n"
IDS_LIST_PARTITION_LINE " ------------- ---------------- ------- -------\n"
IDS_LIST_PARTITION_FORMAT "%c Partition %2lu %-16s %4I64u %-2s %4I64u %-2s\n"
IDS_LIST_PARTITION_NO_DISK "\nThere is no disk for listing partitions.\nPlease select a disk and try again.\n\n"
IDS_LIST_VOLUME_HEAD "Том ###\tИмя\tМетка\n"
END
@ -50,10 +54,13 @@ STRINGTABLE
BEGIN
IDS_SELECT_NO_DISK "\nThere is no disk currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_DISK "\nDisk %lu is now the selected disk.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
IDS_SELECT_DISK_INVALID "\nInvalid disk.\n\n"
IDS_SELECT_NO_PARTITION "\nThere is no partition currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION "\nPartition %lu is now the selected partition.\n\n"
IDS_SELECT_PARTITION_NO_DISK "\nThere is no disk for selecting a partition.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION_INVALID "\nInvalid partition.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
END
/* Disk Status */
@ -124,7 +131,6 @@ BEGIN
IDS_ERROR_MSG_NO_SCRIPT "Ошибка открытия скрипта: %s\n"
IDS_ERROR_MSG_BAD_ARG "Ошибка обработки параметров: %s\n"
IDS_ERROR_INVALID_ARGS "Invalid arguments\n"
IDS_ERROR_INVALID_DISK "Invalid disk\n"
END
/* Active help descriptions */

View file

@ -44,6 +44,10 @@ BEGIN
IDS_LIST_DISK_HEAD "\n Disk ### Status Size Free Dyn Gpt\n"
IDS_LIST_DISK_LINE " -------- ---------- ------- ------- --- ---\n"
IDS_LIST_DISK_FORMAT "%c %7lu %-10s %4I64u %-2s %4I64u %-2s %1s %1s\n"
IDS_LIST_PARTITION_HEAD "\n Partition Type Size Offset\n"
IDS_LIST_PARTITION_LINE "%c ------------- ---------------- ------- -------\n"
IDS_LIST_PARTITION_FORMAT " Partition %2lu %-16s %4I64u %-2s %4I64u %-2s\n"
IDS_LIST_PARTITION_NO_DISK "\nThere is no disk for listing partitions.\nPlease select a disk and try again.\n\n"
IDS_LIST_VOLUME_HEAD "Volume ###\tLtr\tLabel\n"
END
@ -52,10 +56,13 @@ STRINGTABLE
BEGIN
IDS_SELECT_NO_DISK "\nThere is no disk currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_DISK "\nDisk %lu is now the selected disk.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
IDS_SELECT_DISK_INVALID "\nInvalid disk.\n\n"
IDS_SELECT_NO_PARTITION "\nThere is no partition currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION "\nPartition %lu is now the selected partition.\n\n"
IDS_SELECT_PARTITION_NO_DISK "\nThere is no disk for selecting a partition.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION_INVALID "\nInvalid partition.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
END
/* Disk Status */
@ -126,7 +133,6 @@ BEGIN
IDS_ERROR_MSG_NO_SCRIPT "Error në hapjen e skriptes: %s\n"
IDS_ERROR_MSG_BAD_ARG "Error argumenti i procesimit: %s\n"
IDS_ERROR_INVALID_ARGS "Invalid arguments\n"
IDS_ERROR_INVALID_DISK "Invalid disk\n"
END
/* Active help descriptions */

View file

@ -42,6 +42,10 @@ BEGIN
IDS_LIST_DISK_HEAD "\n Disk ### Durum Boyut Boş Dev Gpt\n"
IDS_LIST_DISK_LINE " -------- ---------- ------- ------- --- ---\n"
IDS_LIST_DISK_FORMAT "%c %7lu %-10s %4I64u %-2s %4I64u %-2s %1s %1s\n"
IDS_LIST_PARTITION_HEAD "\n Partition Type Size Offset\n"
IDS_LIST_PARTITION_LINE " ------------- ---------------- ------- -------\n"
IDS_LIST_PARTITION_FORMAT "%c Partition %2lu %-16s %4I64u %-2s %4I64u %-2s\n"
IDS_LIST_PARTITION_NO_DISK "\nThere is no disk for listing partitions.\nPlease select a disk and try again.\n\n"
IDS_LIST_VOLUME_HEAD "Birim ###\tHarf\tEtiket\n"
END
@ -50,10 +54,13 @@ STRINGTABLE
BEGIN
IDS_SELECT_NO_DISK "\nThere is no disk currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_DISK "\nDisk %lu is now the selected disk.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
IDS_SELECT_DISK_INVALID "\nInvalid disk.\n\n"
IDS_SELECT_NO_PARTITION "\nThere is no partition currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION "\nPartition %lu is now the selected partition.\n\n"
IDS_SELECT_PARTITION_NO_DISK "\nThere is no disk for selecting a partition.\nPlease select a disk and try again.\n\n"
IDS_SELECT_PARTITION_INVALID "\nInvalid partition.\n\n"
IDS_SELECT_NO_VOLUME "\nThere is no volume currently selected.\nPlease select a disk and try again.\n\n"
IDS_SELECT_VOLUME "\nVolume %lu is now the selected volume.\n\n"
END
/* Disk Status */
@ -124,7 +131,6 @@ BEGIN
IDS_ERROR_MSG_NO_SCRIPT "Betik açmada yanlışlık: %s\n"
IDS_ERROR_MSG_BAD_ARG "Değiştirgen işlemede yanlışlık: %s\n"
IDS_ERROR_INVALID_ARGS "Invalid arguments\n"
IDS_ERROR_INVALID_DISK "Invalid disk\n"
END
/* Active help descriptions */

View file

@ -11,6 +11,8 @@
#define NDEBUG
#include <debug.h>
/* FUNCTIONS ******************************************************************/
static
ULONGLONG
RoundingDivide(
@ -25,115 +27,54 @@ static
VOID
ListDisk(VOID)
{
WCHAR Buffer[MAX_PATH];
OBJECT_ATTRIBUTES ObjectAttributes;
SYSTEM_DEVICE_INFORMATION Sdi;
IO_STATUS_BLOCK Iosb;
DISK_GEOMETRY DiskGeometry;
ULONG ReturnSize;
ULONG DiskNumber;
UNICODE_STRING Name;
HANDLE FileHandle;
NTSTATUS Status;
ULARGE_INTEGER DiskSize;
ULARGE_INTEGER FreeSize;
PLIST_ENTRY Entry;
PDISKENTRY DiskEntry;
ULONGLONG DiskSize;
ULONGLONG FreeSize;
LPWSTR lpSizeUnit;
LPWSTR lpFreeUnit;
Status = NtQuerySystemInformation(SystemDeviceInformation,
&Sdi,
sizeof(SYSTEM_DEVICE_INFORMATION),
&ReturnSize);
if (!NT_SUCCESS(Status))
{
return;
}
/* Header labels */
PrintResourceString(IDS_LIST_DISK_HEAD);
PrintResourceString(IDS_LIST_DISK_LINE);
for (DiskNumber = 0; DiskNumber < Sdi.NumberOfDisks; DiskNumber++)
Entry = DiskListHead.Flink;
while (Entry != &DiskListHead)
{
swprintf(Buffer,
L"\\Device\\Harddisk%d\\Partition0",
DiskNumber);
RtlInitUnicodeString(&Name,
Buffer);
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
InitializeObjectAttributes(&ObjectAttributes,
&Name,
0,
NULL,
NULL);
DiskSize = DiskEntry->SectorCount.QuadPart *
(ULONGLONG)DiskEntry->BytesPerSector;
Status = NtOpenFile(&FileHandle,
FILE_READ_DATA | FILE_READ_ATTRIBUTES | SYNCHRONIZE,
&ObjectAttributes,
&Iosb,
FILE_SHARE_READ,
FILE_SYNCHRONOUS_IO_NONALERT);
if (NT_SUCCESS(Status))
if (DiskSize >= 10737418240) /* 10 GB */
{
Status = NtDeviceIoControlFile(FileHandle,
NULL,
NULL,
NULL,
&Iosb,
IOCTL_DISK_GET_DRIVE_GEOMETRY,
NULL,
0,
&DiskGeometry,
sizeof(DISK_GEOMETRY));
if (NT_SUCCESS(Status))
{
DiskSize.QuadPart = DiskGeometry.Cylinders.QuadPart *
(ULONGLONG)DiskGeometry.TracksPerCylinder *
(ULONGLONG)DiskGeometry.SectorsPerTrack *
(ULONGLONG)DiskGeometry.BytesPerSector;
if (DiskSize.QuadPart >= 10737418240) /* 10 GB */
{
DiskSize.QuadPart = RoundingDivide(DiskSize.QuadPart, 1073741824);
lpSizeUnit = L"GB";
}
else
{
DiskSize.QuadPart = RoundingDivide(DiskSize.QuadPart, 1048576);
if (DiskSize.QuadPart == 0)
DiskSize.QuadPart = 1;
lpSizeUnit = L"MB";
}
/* FIXME */
FreeSize.QuadPart = 0;
lpFreeUnit = L"B";
PrintResourceString(IDS_LIST_DISK_FORMAT,
(CurrentDisk == DiskNumber) ? L'*': ' ',
DiskNumber,
L"Online",
DiskSize.QuadPart,
lpSizeUnit,
FreeSize.QuadPart,
lpFreeUnit,
L" ",
L" ");
}
else
{
printf("Status 0x%lx\n", Status);
}
NtClose(FileHandle);
DiskSize = RoundingDivide(DiskSize, 1073741824);
lpSizeUnit = L"GB";
}
else
{
printf("Status 0x%lx\n", Status);
DiskSize = RoundingDivide(DiskSize, 1048576);
if (DiskSize == 0)
DiskSize = 1;
lpSizeUnit = L"MB";
}
/* FIXME */
FreeSize = 0;
lpFreeUnit = L"B";
PrintResourceString(IDS_LIST_DISK_FORMAT,
(CurrentDisk == DiskEntry) ? L'*': ' ',
DiskEntry->DiskNumber,
L"Online",
DiskSize,
lpSizeUnit,
FreeSize,
lpFreeUnit,
L" ",
L" ");
Entry = Entry->Flink;
}
wprintf(L"\n\n");
@ -143,7 +84,137 @@ static
VOID
ListPartition(VOID)
{
printf("List Partition!!\n");
PLIST_ENTRY Entry;
PPARTENTRY PartEntry;
ULONGLONG PartSize;
ULONGLONG PartOffset;
LPWSTR lpSizeUnit;
LPWSTR lpOffsetUnit;
ULONG PartNumber = 1;
if (CurrentDisk == NULL)
{
PrintResourceString(IDS_LIST_PARTITION_NO_DISK);
return;
}
/* Header labels */
PrintResourceString(IDS_LIST_PARTITION_HEAD);
PrintResourceString(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";
}
PrintResourceString(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";
}
PrintResourceString(IDS_LIST_PARTITION_FORMAT,
(CurrentPartition == PartEntry) ? L'*': ' ',
PartNumber++,
L"Logical",
PartSize,
lpSizeUnit,
PartOffset,
lpOffsetUnit);
}
Entry = Entry->Flink;
}
wprintf(L"\n");
}
static

File diff suppressed because it is too large Load diff

View file

@ -35,14 +35,21 @@
#define IDS_LIST_DISK_HEAD 3300
#define IDS_LIST_DISK_LINE 3301
#define IDS_LIST_DISK_FORMAT 3302
#define IDS_LIST_VOLUME_HEAD 3303
#define IDS_LIST_PARTITION_HEAD 3303
#define IDS_LIST_PARTITION_LINE 3304
#define IDS_LIST_PARTITION_FORMAT 3305
#define IDS_LIST_PARTITION_NO_DISK 3306
#define IDS_LIST_VOLUME_HEAD 3307
#define IDS_SELECT_NO_DISK 4400
#define IDS_SELECT_DISK 4401
#define IDS_SELECT_NO_VOLUME 4402
#define IDS_SELECT_VOLUME 4403
#define IDS_SELECT_NO_PARTITION 4404
#define IDS_SELECT_PARTITION 4405
#define IDS_SELECT_DISK_INVALID 4402
#define IDS_SELECT_NO_PARTITION 4403
#define IDS_SELECT_PARTITION 4404
#define IDS_SELECT_PARTITION_NO_DISK 4405
#define IDS_SELECT_PARTITION_INVALID 4406
#define IDS_SELECT_NO_VOLUME 4407
#define IDS_SELECT_VOLUME 4408
#define IDS_STATUS_YES 31
#define IDS_STATUS_NO 32
@ -135,4 +142,3 @@
#define IDS_HELP_CMD_UNIQUEID 140
#define IDS_ERROR_INVALID_ARGS 211
#define IDS_ERROR_INVALID_DISK 212

View file

@ -11,10 +11,7 @@
#define NDEBUG
#include <debug.h>
ULONG CurrentDisk = (ULONG)-1;
ULONG CurrentPartition = (ULONG)-1;
/* FUNCTIONS ******************************************************************/
static
VOID
@ -22,10 +19,9 @@ SelectDisk(
INT argc,
LPWSTR *argv)
{
SYSTEM_DEVICE_INFORMATION Sdi;
ULONG ReturnSize;
NTSTATUS Status;
LONG value;
PLIST_ENTRY Entry;
PDISKENTRY DiskEntry;
LONG lValue;
LPWSTR endptr = NULL;
DPRINT("Select Disk()\n");
@ -38,40 +34,40 @@ SelectDisk(
if (argc == 2)
{
if (CurrentDisk == (ULONG)-1)
if (CurrentDisk == NULL)
PrintResourceString(IDS_SELECT_NO_DISK);
else
PrintResourceString(IDS_SELECT_DISK, CurrentDisk);
PrintResourceString(IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return;
}
value = wcstol(argv[2], &endptr, 10);
if (((value == 0) && (endptr == argv[2])) ||
(value < 0))
lValue = wcstol(argv[2], &endptr, 10);
if (((lValue == 0) && (endptr == argv[2])) ||
(lValue < 0))
{
PrintResourceString(IDS_ERROR_INVALID_ARGS);
return;
}
Status = NtQuerySystemInformation(SystemDeviceInformation,
&Sdi,
sizeof(SYSTEM_DEVICE_INFORMATION),
&ReturnSize);
if (!NT_SUCCESS(Status))
CurrentDisk = NULL;
Entry = DiskListHead.Flink;
while (Entry != &DiskListHead)
{
return;
DiskEntry = CONTAINING_RECORD(Entry, DISKENTRY, ListEntry);
if (DiskEntry->DiskNumber == (ULONG)lValue)
{
CurrentDisk = DiskEntry;
CurrentPartition = NULL;
PrintResourceString(IDS_SELECT_DISK, CurrentDisk->DiskNumber);
return;
}
Entry = Entry->Flink;
}
if ((ULONG)value >= Sdi.NumberOfDisks)
{
PrintResourceString(IDS_ERROR_INVALID_DISK);
return;
}
CurrentDisk = (ULONG)value;
CurrentPartition = (ULONG)-1;
PrintResourceString(IDS_SELECT_DISK, CurrentDisk);
PrintResourceString(IDS_SELECT_DISK_INVALID);
}
@ -81,8 +77,11 @@ SelectPartition(
INT argc,
LPWSTR *argv)
{
LONG value;
PLIST_ENTRY Entry;
PPARTENTRY PartEntry;
LONG lValue;
LPWSTR endptr = NULL;
ULONG PartNumber = 1;
DPRINT("Select Partition()\n");
@ -92,28 +91,69 @@ SelectPartition(
return;
}
if (CurrentDisk == NULL)
{
PrintResourceString(IDS_SELECT_PARTITION_NO_DISK);
return;
}
if (argc == 2)
{
if (CurrentPartition == (ULONG)-1)
if (CurrentPartition == NULL)
PrintResourceString(IDS_SELECT_NO_PARTITION);
else
PrintResourceString(IDS_SELECT_PARTITION, CurrentPartition);
return;
}
value = wcstol(argv[2], &endptr, 10);
if (((value == 0) && (endptr == argv[2])) ||
(value < 0))
lValue = wcstol(argv[2], &endptr, 10);
if (((lValue == 0) && (endptr == argv[2])) ||
(lValue < 0))
{
PrintResourceString(IDS_ERROR_INVALID_ARGS);
return;
}
/* FIXME: Check the new partition number */
Entry = CurrentDisk->PrimaryPartListHead.Flink;
while (Entry != &CurrentDisk->PrimaryPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
CurrentPartition = (ULONG)value;
if (PartEntry->PartitionType != 0)
{
if (PartNumber == (ULONG)lValue)
{
CurrentPartition = PartEntry;
PrintResourceString(IDS_SELECT_PARTITION, PartNumber);
return;
}
PrintResourceString(IDS_SELECT_PARTITION, CurrentPartition);
PartNumber++;
}
Entry = Entry->Flink;
}
Entry = CurrentDisk->LogicalPartListHead.Flink;
while (Entry != &CurrentDisk->LogicalPartListHead)
{
PartEntry = CONTAINING_RECORD(Entry, PARTENTRY, ListEntry);
if (PartEntry->PartitionType != 0)
{
if (PartNumber == (ULONG)lValue)
{
CurrentPartition = PartEntry;
PrintResourceString(IDS_SELECT_PARTITION, PartNumber);
return;
}
PartNumber++;
}
Entry = Entry->Flink;
}
PrintResourceString(IDS_SELECT_PARTITION_INVALID);
}