https://git.reactos.org/?p=reactos.git;a=commitdiff;h=566e8989c311d20e3ae04f...
commit 566e8989c311d20e3ae04fd580fcc6a2fc2cebc5 Author: Eric Kohl eric.kohl@reactos.org AuthorDate: Sun May 15 12:27:53 2022 +0200 Commit: Eric Kohl eric.kohl@reactos.org CommitDate: Sun May 15 12:27:53 2022 +0200
[DISKPART] Improve the command table to support subcommands and start work on the create command
- Extend the command table to support subcommands. - Get rid of the existing subcommand code. - Use the new subcommand suport for the help system. - Start work on the create command.
@Translators: Please do not translate any changes yet, because I will improve help system in one of the next steps. --- base/system/diskpart/create.c | 109 ++++++++++++++++++++++++- base/system/diskpart/detail.c | 58 ++++--------- base/system/diskpart/diskpart.h | 85 ++++++++++++++++++-- base/system/diskpart/help.c | 68 +++++++++++++--- base/system/diskpart/interpreter.c | 161 ++++++++++++++++++++++++++----------- base/system/diskpart/lang/en-US.rc | 55 ++++++++++++- base/system/diskpart/list.c | 61 ++++++-------- base/system/diskpart/misc.c | 12 ++- base/system/diskpart/resource.h | 17 +++- base/system/diskpart/select.c | 76 ++++++----------- base/system/diskpart/uniqueid.c | 53 ++++-------- 11 files changed, 513 insertions(+), 242 deletions(-)
diff --git a/base/system/diskpart/create.c b/base/system/diskpart/create.c index 50e349e082d..a933da2c5ae 100644 --- a/base/system/diskpart/create.c +++ b/base/system/diskpart/create.c @@ -8,7 +8,114 @@
#include "diskpart.h"
-BOOL create_main(INT argc, LPWSTR *argv) +BOOL +CreateExtendedPartition( + INT argc, + PWSTR *argv) { + if (CurrentDisk == NULL) + { + ConResPuts(StdOut, IDS_SELECT_NO_DISK); + return TRUE; + } + + ConPrintf(StdOut, L"Not implemented yet!\n"); + + return TRUE; +} + + +BOOL +CreateLogicalPartition( + INT argc, + PWSTR *argv) +{ + if (CurrentDisk == NULL) + { + ConResPuts(StdOut, IDS_SELECT_NO_DISK); + return TRUE; + } + + ConPrintf(StdOut, L"Not implemented yet!\n"); + + return TRUE; +} + + +BOOL +CreatePrimaryPartition( + INT argc, + PWSTR *argv) +{ + LARGE_INTEGER liSize, liOffset; + INT i; +// BOOL bNoErr = FALSE; + PWSTR pszSuffix = NULL; + + liSize.QuadPart = -1; + liOffset.QuadPart = -1; + +/* + if (CurrentDisk == NULL) + { + ConResPuts(StdOut, IDS_SELECT_NO_DISK); + return TRUE; + } +*/ + + for (i = 3; i < argc; i++) + { + if (HasPrefix(argv[i], L"size=", &pszSuffix)) + { + /* size=<N> (MB) */ + ConPrintf(StdOut, L"Size : %s\n", pszSuffix); + + liSize.QuadPart = _wcstoui64(pszSuffix, NULL, 10); + if (((liSize.QuadPart == 0) && (errno == ERANGE)) || + (liSize.QuadPart < 0)) + { + ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); + return TRUE; + } + } + else if (HasPrefix(argv[i], L"offset=", &pszSuffix)) + { + /* offset=<N> (KB) */ + ConPrintf(StdOut, L"Offset : %s\n", pszSuffix); + + liOffset.QuadPart = _wcstoui64(pszSuffix, NULL, 10); + if (((liOffset.QuadPart == 0) && (errno == ERANGE)) || + (liOffset.QuadPart < 0)) + { + ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); + return TRUE; + } + } + else if (HasPrefix(argv[i], L"id=", &pszSuffix)) + { + /* id=<Byte>|<GUID> */ + ConPrintf(StdOut, L"Id : %s\n", pszSuffix); + } + else if (HasPrefix(argv[i], L"align=", &pszSuffix)) + { + /* align=<N> */ + ConPrintf(StdOut, L"Align : %s\n", pszSuffix); + } + else if (_wcsicmp(argv[i], L"noerr") == 0) + { + /* noerr */ + ConPrintf(StdOut, L"NoErr\n", pszSuffix); +// bNoErr = TRUE; + } + else + { + ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); + return TRUE; + } + } + + ConPrintf(StdOut, L"Size: %I64d\n", liSize.QuadPart); + ConPrintf(StdOut, L"Offset: %I64d\n", liOffset.QuadPart); + return TRUE; } diff --git a/base/system/diskpart/detail.c b/base/system/diskpart/detail.c index 464085149fc..0c0de3e262a 100644 --- a/base/system/diskpart/detail.c +++ b/base/system/diskpart/detail.c @@ -13,24 +13,23 @@
/* FUNCTIONS ******************************************************************/
-static -VOID +BOOL DetailDisk( INT argc, - LPWSTR *argv) + PWSTR *argv) { DPRINT("DetailDisk()\n");
if (argc > 2) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (CurrentDisk == NULL) { ConResPuts(StdOut, IDS_SELECT_NO_DISK); - return; + return TRUE; }
/* TODO: Print more disk details */ @@ -40,14 +39,15 @@ DetailDisk( ConResPrintf(StdOut, IDS_DETAIL_INFO_TARGET, CurrentDisk->TargetId); ConResPrintf(StdOut, IDS_DETAIL_INFO_LUN_ID, CurrentDisk->Lun); ConPuts(StdOut, L"\n"); + + return TRUE; }
-static -VOID +BOOL DetailPartition( INT argc, - LPWSTR *argv) + PWSTR *argv) { PPARTENTRY PartEntry; ULONGLONG PartOffset; @@ -57,19 +57,19 @@ DetailPartition( if (argc > 2) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (CurrentDisk == NULL) { ConResPuts(StdOut, IDS_SELECT_PARTITION_NO_DISK); - return; + return TRUE; }
if (CurrentPartition == NULL) { ConResPuts(StdOut, IDS_SELECT_NO_PARTITION); - return; + return TRUE; }
PartEntry = CurrentPartition; @@ -83,55 +83,31 @@ DetailPartition( ConResPrintf(StdOut, IDS_DETAIL_PARTITION_ACTIVE, PartEntry->BootIndicator ? L"Yes" : L"No"); ConResPrintf(StdOut, IDS_DETAIL_PARTITION_OFFSET, PartOffset); ConPuts(StdOut, L"\n"); + + return TRUE; }
-static -VOID +BOOL DetailVolume( INT argc, - LPWSTR *argv) + PWSTR *argv) { DPRINT("DetailVolume()\n");
if (argc > 2) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (CurrentVolume == NULL) { ConResPuts(StdOut, IDS_SELECT_NO_VOLUME); - return; - } - - /* TODO: Print volume details */ - -} - - -BOOL -detail_main( - INT argc, - LPWSTR *argv) -{ - /* gets the first word from the string */ - if (argc == 1) - { - ConResPuts(StdOut, IDS_HELP_CMD_DETAIL); return TRUE; }
- /* determines which details to print (disk, partition, etc.) */ - if (!wcsicmp(argv[1], L"disk")) - DetailDisk(argc, argv); - else if (!wcsicmp(argv[1], L"partition")) - DetailPartition(argc, argv); - else if (!wcsicmp(argv[1], L"volume")) - DetailVolume(argc, argv); - else - ConResPuts(StdOut, IDS_HELP_CMD_DETAIL); + /* TODO: Print volume details */
return TRUE; } diff --git a/base/system/diskpart/diskpart.h b/base/system/diskpart/diskpart.h index 877f0063351..a3f21d3ccdc 100644 --- a/base/system/diskpart/diskpart.h +++ b/base/system/diskpart/diskpart.h @@ -52,7 +52,9 @@
typedef struct _COMMAND { - LPWSTR name; + PWSTR cmd1; + PWSTR cmd2; + PWSTR cmd3; BOOL (*func)(INT, WCHAR**); INT help; INT help_desc; @@ -233,7 +235,20 @@ BOOL compact_main(INT argc, LPWSTR *argv); BOOL convert_main(INT argc, LPWSTR *argv);
/* create.c */ -BOOL create_main(INT argc, LPWSTR *argv); +BOOL +CreateExtendedPartition( + INT argc, + PWSTR *argv); + +BOOL +CreateLogicalPartition( + INT argc, + PWSTR *argv); + +BOOL +CreatePrimaryPartition( + INT argc, + PWSTR *argv);
/* delete.c */ BOOL delete_main(INT argc, LPWSTR *argv); @@ -242,7 +257,20 @@ BOOL delete_main(INT argc, LPWSTR *argv); BOOL detach_main(INT argc, LPWSTR *argv);
/* detail.c */ -BOOL detail_main(INT argc, LPWSTR *argv); +BOOL +DetailDisk( + INT argc, + PWSTR *argv); + +BOOL +DetailPartition( + INT argc, + PWSTR *argv); + +BOOL +DetailVolume( + INT argc, + PWSTR *argv);
/* diskpart.c */
@@ -266,7 +294,8 @@ BOOL gpt_main(INT argc, LPWSTR *argv);
/* help.c */ BOOL help_main(INT argc, LPWSTR *argv); -VOID help_cmdlist(VOID); +VOID HelpCommandList(VOID); +BOOL HelpCommand(PCOMMAND pCommand);
/* import. c */ BOOL import_main(INT argc, LPWSTR *argv); @@ -280,7 +309,25 @@ BOOL InterpretCmd(INT argc, LPWSTR *argv); VOID InterpretMain(VOID);
/* list.c */ -BOOL list_main(INT argc, LPWSTR *argv); +BOOL +ListDisk( + INT argc, + PWSTR *argv); + +BOOL +ListPartition( + INT argc, + PWSTR *argv); + +BOOL +ListVolume( + INT argc, + PWSTR *argv); + +BOOL +ListVirtualDisk( + INT argc, + PWSTR *argv);
/* merge.c */ BOOL merge_main(INT argc, LPWSTR *argv); @@ -297,7 +344,8 @@ IsHexString( BOOL HasPrefix( _In_ PWSTR pszString, - _In_ PWSTR pszPrefix); + _In_ PWSTR pszPrefix, + _Out_opt_ PWSTR *pszSuffix);
ULONGLONG RoundingDivide( @@ -343,8 +391,26 @@ BOOL retain_main(INT argc, LPWSTR *argv); BOOL san_main(INT argc, LPWSTR *argv);
/* select.c */ -BOOL select_main(INT argc, LPWSTR *argv); +BOOL +SelectDisk( + INT argc, + PWSTR *argv); + +BOOL +SelectPartition( + INT argc, + PWSTR *argv);
+BOOL +SelectVolume( + INT argc, + PWSTR *argv); +/* +BOOL +SelectVirtualDisk( + INT argc, + PWSTR *argv); +*/ /* setid.c */ BOOL setid_main(INT argc, LPWSTR *argv);
@@ -352,6 +418,9 @@ BOOL setid_main(INT argc, LPWSTR *argv); BOOL shrink_main(INT argc, LPWSTR *argv);
/* uniqueid.c */ -BOOL uniqueid_main(INT argc, LPWSTR *argv); +BOOL +UniqueIdDisk( + _In_ INT argc, + _In_ PWSTR *argv);
#endif /* DISKPART_H */ diff --git a/base/system/diskpart/help.c b/base/system/diskpart/help.c index c13b29ff9e6..d11e8f02f54 100644 --- a/base/system/diskpart/help.c +++ b/base/system/diskpart/help.c @@ -9,10 +9,11 @@ #include "diskpart.h"
/* - * help_cmdlist(): + * HelpCommandList(): * shows all the available commands and basic descriptions for diskpart */ -VOID help_cmdlist(VOID) +VOID +HelpCommandList(VOID) { PCOMMAND cmdptr;
@@ -21,36 +22,79 @@ VOID help_cmdlist(VOID) ConPuts(StdOut, L"\n");
/* List all the commands and the basic descriptions */ - for (cmdptr = cmds; cmdptr->name; cmdptr++) - ConResPuts(StdOut, cmdptr->help_desc); + for (cmdptr = cmds; cmdptr->cmd1; cmdptr++) + if (cmdptr->help_desc != IDS_NONE) + ConResPuts(StdOut, cmdptr->help_desc);
ConPuts(StdOut, L"\n"); }
+ +BOOL +HelpCommand( + PCOMMAND pCommand) +{ + if (pCommand->help != IDS_NONE) + { + ConResPuts(StdOut, pCommand->help); +// ConPuts(StdOut, L"\n"); + } + + return TRUE; +} + + /* help_main(char *arg): * main entry point for the help command. Gives help to users who needs it. */ BOOL help_main(INT argc, LPWSTR *argv) { PCOMMAND cmdptr; + PCOMMAND cmdptr1 = NULL; + PCOMMAND cmdptr2 = NULL; + PCOMMAND cmdptr3 = NULL;
if (argc == 1) { - help_cmdlist(); + HelpCommandList(); return TRUE; }
/* Scan internal command table */ - for (cmdptr = cmds; cmdptr->name; cmdptr++) + for (cmdptr = cmds; cmdptr->cmd1; cmdptr++) + { + if ((cmdptr1 == NULL) && + (wcsicmp(argv[1], cmdptr->cmd1) == 0)) + cmdptr1 = cmdptr; + + if ((cmdptr2 == NULL) && + (argc >= 3) && + (wcsicmp(argv[1], cmdptr->cmd1) == 0) && + (wcsicmp(argv[2], cmdptr->cmd2) == 0)) + cmdptr2 = cmdptr; + + if ((cmdptr3 == NULL) && + (argc >= 4) && + (wcsicmp(argv[1], cmdptr->cmd1) == 0) && + (wcsicmp(argv[2], cmdptr->cmd2) == 0) && + (wcsicmp(argv[3], cmdptr->cmd3) == 0)) + cmdptr3 = cmdptr; + } + + if (cmdptr3 != NULL) + { + return HelpCommand(cmdptr3); + } + else if (cmdptr2 != NULL) + { + return HelpCommand(cmdptr2); + } + else if (cmdptr1 != NULL) { - if (_wcsicmp(argv[1], cmdptr->name) == 0) - { - ConResPuts(StdOut, cmdptr->help); - return TRUE; - } + return HelpCommand(cmdptr1); }
- help_cmdlist(); + HelpCommandList();
return TRUE; } diff --git a/base/system/diskpart/interpreter.c b/base/system/diskpart/interpreter.c index dde15688029..4229baf262b 100644 --- a/base/system/diskpart/interpreter.c +++ b/base/system/diskpart/interpreter.c @@ -15,46 +15,72 @@ BOOL rem_main(INT argc, LPWSTR *argv);
COMMAND cmds[] = { - {L"active", active_main, IDS_HELP_CMD_ACTIVE, IDS_HELP_CMD_DESC_ACTIVE}, - {L"add", add_main, IDS_HELP_CMD_ADD, IDS_HELP_CMD_DESC_ADD}, - {L"assign", assign_main, IDS_HELP_CMD_ASSIGN, IDS_HELP_CMD_DESC_ASSIGN}, - {L"attach", attach_main, IDS_HELP_CMD_ATTACH, IDS_HELP_CMD_DESC_ATTACH}, - {L"attributes", attributes_main, IDS_HELP_CMD_ATTRIBUTES, IDS_HELP_CMD_DESC_ATTRIBUTES}, - {L"automount", automount_main, IDS_HELP_CMD_AUTOMOUNT, IDS_HELP_CMD_DESC_AUTOMOUNT}, - {L"break", break_main, IDS_HELP_CMD_BREAK, IDS_HELP_CMD_DESC_BREAK}, - {L"clean", clean_main, IDS_HELP_CMD_CLEAN, IDS_HELP_CMD_DESC_CLEAN}, - {L"compact", compact_main, IDS_HELP_CMD_COMPACT, IDS_HELP_CMD_DESC_COMPACT}, - {L"convert", convert_main, IDS_HELP_CMD_CONVERT, IDS_HELP_CMD_DESC_CONVERT}, - {L"create", create_main, IDS_HELP_CMD_CREATE, IDS_HELP_CMD_DESC_CREATE}, - {L"delete", delete_main, IDS_HELP_CMD_DELETE, IDS_HELP_CMD_DESC_DELETE}, - {L"detail", detail_main, IDS_HELP_CMD_DETAIL, IDS_HELP_CMD_DESC_DETAIL}, - {L"detach", detach_main, IDS_HELP_CMD_DETACH, IDS_HELP_CMD_DESC_DETACH}, - {L"dump", dump_main, IDS_NONE, IDS_NONE}, - {L"exit", NULL, IDS_NONE, IDS_HELP_CMD_DESC_EXIT}, - {L"expand", expand_main, IDS_HELP_CMD_EXPAND, IDS_HELP_CMD_DESC_EXPAND}, - {L"extend", extend_main, IDS_HELP_CMD_EXTEND, IDS_HELP_CMD_DESC_EXTEND}, - {L"filesystems", filesystems_main, IDS_HELP_CMD_FILESYSTEMS, IDS_HELP_CMD_DESC_FS}, - {L"format", format_main, IDS_HELP_CMD_FORMAT, IDS_HELP_CMD_DESC_FORMAT}, - {L"gpt", gpt_main, IDS_HELP_CMD_GPT, IDS_HELP_CMD_DESC_GPT}, - {L"help", help_main, IDS_HELP_CMD_HELP, IDS_HELP_CMD_DESC_HELP}, - {L"import", import_main, IDS_HELP_CMD_IMPORT, IDS_HELP_CMD_DESC_IMPORT}, - {L"inactive", inactive_main, IDS_HELP_CMD_INACTIVE, IDS_HELP_CMD_DESC_INACTIVE}, - {L"list", list_main, IDS_HELP_CMD_LIST, IDS_HELP_CMD_DESC_LIST}, - {L"merge", merge_main, IDS_HELP_CMD_MERGE, IDS_HELP_CMD_DESC_MERGE}, - {L"offline", offline_main, IDS_HELP_CMD_OFFLINE, IDS_HELP_CMD_DESC_OFFLINE}, - {L"online", online_main, IDS_HELP_CMD_ONLINE, IDS_HELP_CMD_DESC_ONLINE}, - {L"recover", recover_main, IDS_HELP_CMD_RECOVER, IDS_HELP_CMD_DESC_RECOVER}, - {L"rem", NULL, IDS_NONE, IDS_HELP_CMD_DESC_REM}, - {L"remove", remove_main, IDS_HELP_CMD_REMOVE, IDS_HELP_CMD_DESC_REMOVE}, - {L"repair", repair_main, IDS_HELP_CMD_REPAIR, IDS_HELP_CMD_DESC_REPAIR}, - {L"rescan", rescan_main, IDS_HELP_CMD_RESCAN, IDS_HELP_CMD_DESC_RESCAN}, - {L"retain", retain_main, IDS_HELP_CMD_RETAIN, IDS_HELP_CMD_DESC_RETAIN}, - {L"san", san_main, IDS_HELP_CMD_SAN, IDS_HELP_CMD_DESC_SAN}, - {L"select", select_main, IDS_HELP_CMD_SELECT, IDS_HELP_CMD_DESC_SELECT}, - {L"setid", setid_main, IDS_HELP_CMD_SETID, IDS_HELP_CMD_DESC_SETID}, - {L"shrink", shrink_main, IDS_HELP_CMD_SHRINK, IDS_HELP_CMD_DESC_SHRINK}, - {L"uniqueid", uniqueid_main, IDS_HELP_CMD_UNIQUEID, IDS_HELP_CMD_DESC_UNIQUEID}, - {NULL, NULL, IDS_NONE, IDS_NONE} + {L"active", NULL, NULL, active_main, IDS_HELP_CMD_ACTIVE, IDS_HELP_CMD_DESC_ACTIVE}, + {L"add", NULL, NULL, add_main, IDS_HELP_CMD_ADD, IDS_HELP_CMD_DESC_ADD}, + {L"assign", NULL, NULL, assign_main, IDS_HELP_CMD_ASSIGN, IDS_HELP_CMD_DESC_ASSIGN}, + {L"attach", NULL, NULL, attach_main, IDS_HELP_CMD_ATTACH, IDS_HELP_CMD_DESC_ATTACH}, + {L"attributes", NULL, NULL, attributes_main, IDS_HELP_CMD_ATTRIBUTES, IDS_HELP_CMD_DESC_ATTRIBUTES}, + {L"automount", NULL, NULL, automount_main, IDS_HELP_CMD_AUTOMOUNT, IDS_HELP_CMD_DESC_AUTOMOUNT}, + {L"break", NULL, NULL, break_main, IDS_HELP_CMD_BREAK, IDS_HELP_CMD_DESC_BREAK}, + {L"clean", NULL, NULL, clean_main, IDS_HELP_CMD_CLEAN, IDS_HELP_CMD_DESC_CLEAN}, + {L"compact", NULL, NULL, compact_main, IDS_HELP_CMD_COMPACT, IDS_HELP_CMD_DESC_COMPACT}, + {L"convert", NULL, NULL, convert_main, IDS_HELP_CMD_CONVERT, IDS_HELP_CMD_DESC_CONVERT}, + + {L"create", NULL, NULL, NULL, IDS_HELP_CMD_CREATE, IDS_HELP_CMD_DESC_CREATE}, + {L"create", L"partition", NULL, NULL, IDS_HELP_CMD_CREATE_PARTITION, IDS_NONE}, + {L"create", L"partition", L"extended", CreateExtendedPartition, IDS_HELP_CMD_CREATE_PARTITION_EXTENDED, IDS_NONE}, + {L"create", L"partition", L"logical", CreateLogicalPartition, IDS_HELP_CMD_CREATE_PARTITION_LOGICAL, IDS_NONE}, + {L"create", L"partition", L"primary", CreatePrimaryPartition, IDS_HELP_CMD_CREATE_PARTITION_PRIMARY, IDS_NONE}, + + {L"delete", NULL, NULL, delete_main, IDS_HELP_CMD_DELETE, IDS_HELP_CMD_DESC_DELETE}, + + {L"detail", NULL, NULL, NULL, IDS_HELP_CMD_DETAIL, IDS_HELP_CMD_DESC_DETAIL}, + {L"detail", L"disk", NULL, DetailDisk, IDS_HELP_CMD_DETAIL_DISK, IDS_NONE}, + {L"detail", L"partition", NULL, DetailPartition, IDS_HELP_CMD_DETAIL_PARTITION, IDS_NONE}, + {L"detail", L"volume", NULL, DetailVolume, IDS_HELP_CMD_DETAIL_VOLUME, IDS_NONE}, + + {L"detach", NULL, NULL, detach_main, IDS_HELP_CMD_DETACH, IDS_HELP_CMD_DESC_DETACH}, + {L"dump", NULL, NULL, dump_main, IDS_NONE, IDS_NONE}, + {L"exit", NULL, NULL, NULL, IDS_NONE, IDS_HELP_CMD_DESC_EXIT}, + {L"expand", NULL, NULL, expand_main, IDS_HELP_CMD_EXPAND, IDS_HELP_CMD_DESC_EXPAND}, + {L"extend", NULL, NULL, extend_main, IDS_HELP_CMD_EXTEND, IDS_HELP_CMD_DESC_EXTEND}, + {L"filesystems", NULL, NULL, filesystems_main, IDS_HELP_CMD_FILESYSTEMS, IDS_HELP_CMD_DESC_FS}, + {L"format", NULL, NULL, format_main, IDS_HELP_CMD_FORMAT, IDS_HELP_CMD_DESC_FORMAT}, + {L"gpt", NULL, NULL, gpt_main, IDS_HELP_CMD_GPT, IDS_HELP_CMD_DESC_GPT}, + {L"help", NULL, NULL, help_main, IDS_HELP_CMD_HELP, IDS_HELP_CMD_DESC_HELP}, + {L"import", NULL, NULL, import_main, IDS_HELP_CMD_IMPORT, IDS_HELP_CMD_DESC_IMPORT}, + {L"inactive", NULL, NULL, inactive_main, IDS_HELP_CMD_INACTIVE, IDS_HELP_CMD_DESC_INACTIVE}, + + {L"list", NULL, NULL, NULL, IDS_HELP_CMD_LIST, IDS_HELP_CMD_DESC_LIST}, + {L"list", L"disk", NULL, ListDisk, IDS_HELP_CMD_LIST_DISK, IDS_NONE}, + {L"list", L"partition", NULL, ListPartition, IDS_HELP_CMD_LIST_PARTITION, IDS_NONE}, + {L"list", L"volume", NULL, ListVolume, IDS_HELP_CMD_LIST_VOLUME, IDS_NONE}, + {L"list", L"vdisk", NULL, ListVirtualDisk, IDS_HELP_CMD_LIST_VDISK, IDS_NONE}, + + {L"merge", NULL, NULL, merge_main, IDS_HELP_CMD_MERGE, IDS_HELP_CMD_DESC_MERGE}, + {L"offline", NULL, NULL, offline_main, IDS_HELP_CMD_OFFLINE, IDS_HELP_CMD_DESC_OFFLINE}, + {L"online", NULL, NULL, online_main, IDS_HELP_CMD_ONLINE, IDS_HELP_CMD_DESC_ONLINE}, + {L"recover", NULL, NULL, recover_main, IDS_HELP_CMD_RECOVER, IDS_HELP_CMD_DESC_RECOVER}, + {L"rem", NULL, NULL, NULL, IDS_NONE, IDS_HELP_CMD_DESC_REM}, + {L"remove", NULL, NULL, remove_main, IDS_HELP_CMD_REMOVE, IDS_HELP_CMD_DESC_REMOVE}, + {L"repair", NULL, NULL, repair_main, IDS_HELP_CMD_REPAIR, IDS_HELP_CMD_DESC_REPAIR}, + {L"rescan", NULL, NULL, rescan_main, IDS_HELP_CMD_RESCAN, IDS_HELP_CMD_DESC_RESCAN}, + {L"retain", NULL, NULL, retain_main, IDS_HELP_CMD_RETAIN, IDS_HELP_CMD_DESC_RETAIN}, + {L"san", NULL, NULL, san_main, IDS_HELP_CMD_SAN, IDS_HELP_CMD_DESC_SAN}, + + {L"select", NULL, NULL, NULL, IDS_HELP_CMD_SELECT, IDS_HELP_CMD_DESC_SELECT}, + {L"select", L"disk", NULL, SelectDisk, IDS_HELP_CMD_SELECT_DISK, IDS_NONE}, + {L"select", L"partition", NULL, SelectPartition, IDS_HELP_CMD_SELECT_PARTITION, IDS_NONE}, + {L"select", L"volume", NULL, SelectVolume, IDS_HELP_CMD_SELECT_VOLUME, IDS_NONE}, +// {L"select", L"vdisk", NULL, SelectVirtualDisk, IDS_HELP_CMD_SELECT_VDISK, IDS_NONE}, + + {L"setid", NULL, NULL, setid_main, IDS_HELP_CMD_SETID, IDS_HELP_CMD_DESC_SETID}, + {L"shrink", NULL, NULL, shrink_main, IDS_HELP_CMD_SHRINK, IDS_HELP_CMD_DESC_SHRINK}, + + {L"uniqueid", NULL, NULL, NULL, IDS_HELP_CMD_UNIQUEID, IDS_HELP_CMD_DESC_UNIQUEID}, + {L"uniqueid", L"disk", NULL, UniqueIdDisk, IDS_HELP_CMD_UNIQUEID_DISK, IDS_NONE}, + + {NULL, NULL, NULL, NULL, IDS_NONE, IDS_NONE} };
@@ -66,9 +92,14 @@ COMMAND cmds[] = * determines which function to invoke. */ BOOL -InterpretCmd(int argc, LPWSTR *argv) +InterpretCmd( + int argc, + LPWSTR *argv) { PCOMMAND cmdptr; + PCOMMAND cmdptr1 = NULL; + PCOMMAND cmdptr2 = NULL; + PCOMMAND cmdptr3 = NULL;
/* If no args provided */ if (argc < 1) @@ -76,20 +107,56 @@ InterpretCmd(int argc, LPWSTR *argv)
/* First, determine if the user wants to exit or to use a comment */ - if(wcsicmp(argv[0], L"exit") == 0) + if (wcsicmp(argv[0], L"exit") == 0) return FALSE;
- if(wcsicmp(argv[0], L"rem") == 0) + if (wcsicmp(argv[0], L"rem") == 0) return TRUE;
/* Scan internal command table */ - for (cmdptr = cmds; cmdptr->name; cmdptr++) + for (cmdptr = cmds; cmdptr->cmd1; cmdptr++) + { + if ((cmdptr1 == NULL) && + (wcsicmp(argv[0], cmdptr->cmd1) == 0)) + cmdptr1 = cmdptr; + + if ((cmdptr2 == NULL) && + (argc >= 2) && + (wcsicmp(argv[0], cmdptr->cmd1) == 0) && + (wcsicmp(argv[1], cmdptr->cmd2) == 0)) + cmdptr2 = cmdptr; + + if ((cmdptr3 == NULL) && + (argc >= 3) && + (wcsicmp(argv[0], cmdptr->cmd1) == 0) && + (wcsicmp(argv[1], cmdptr->cmd2) == 0) && + (wcsicmp(argv[2], cmdptr->cmd3) == 0)) + cmdptr3 = cmdptr; + } + + if (cmdptr3 != NULL) { - if (wcsicmp(argv[0], cmdptr->name) == 0) - return cmdptr->func(argc, argv); + if (cmdptr3->func == NULL) + return HelpCommand(cmdptr3); + else + return cmdptr3->func(argc, argv); + } + else if (cmdptr2 != NULL) + { + if (cmdptr2->func == NULL) + return HelpCommand(cmdptr2); + else + return cmdptr2->func(argc, argv); + } + else if (cmdptr1 != NULL) + { + if (cmdptr1->func == NULL) + return HelpCommand(cmdptr1); + else + return cmdptr1->func(argc, argv); }
- help_cmdlist(); + HelpCommandList();
return TRUE; } diff --git a/base/system/diskpart/lang/en-US.rc b/base/system/diskpart/lang/en-US.rc index 7729fa17897..c869ef128ef 100644 --- a/base/system/diskpart/lang/en-US.rc +++ b/base/system/diskpart/lang/en-US.rc @@ -220,7 +220,25 @@ END STRINGTABLE BEGIN IDS_HELP_CMD_CREATE "\n\ -<Add create command help text here>\n\n" +PARTITION - Create a partition.\n\ +VOLUME - Create a volume.\n\ +VDISK - Create a virtual disk file.\n\n" + + IDS_HELP_CMD_CREATE_PARTITION "\n\ +EFI - Create an EFI system partition.\n\ +EXTENDED - Create an extended partition.\n\ +LOGICAL - Create a logical drive.\n\ +MSR - Create an MSR partition.\n\ +PRIMARY - Create a primary partition.\n\n" + + IDS_HELP_CMD_CREATE_PARTITION_EXTENDED "\n\ + Create an exteded partition.\n\n" + + IDS_HELP_CMD_CREATE_PARTITION_LOGICAL "\n\ + Create a logical drive.\n\n" + + IDS_HELP_CMD_CREATE_PARTITION_PRIMARY "\n\ + Create a primary partition.\n\n" END
/* Delete help description */ @@ -235,6 +253,12 @@ STRINGTABLE BEGIN IDS_HELP_CMD_DETAIL "\n\ <Add detail command help text here>\n\n" + IDS_HELP_CMD_DETAIL_DISK "\n\ +<Add detail disk command help text here>\n\n" + IDS_HELP_CMD_DETAIL_PARTITION "\n\ +<Add detail partition command help text here>\n\n" + IDS_HELP_CMD_DETAIL_VOLUME "\n\ +<Add detail volume command help text here>\n\n" END
/* Detach help description */ @@ -304,7 +328,16 @@ END STRINGTABLE BEGIN IDS_HELP_CMD_LIST "\n\ -<Add list command help text here>\n\n" +DISK - Show a list of disks.\n\ +PARTITION - Show a list of partitions on the selected disk.\n\ +VOLUME - Show a list of volumes.\n\ +VDISK - Show a list of virtual disk files.\n\n" + IDS_HELP_CMD_LIST_DISK "\n\ + Display a list of disks.\n\n\ +Syntax: LIST DISK\n\n\ + Shows a list of disks and additional infomation about the disks.\n\n\ +Example:\n\n\ + LIST DISK\n\n" END
/* Merge help descriptions */ @@ -374,7 +407,18 @@ END STRINGTABLE BEGIN IDS_HELP_CMD_SELECT "\n\ -<Add SELECT command help text here>\n\n" +DISK - Moves the focus to the disk.\n\ +PARTITION - Moves the focus to the partition.\n\ +VOLUME - Moves the focus to the volume.\n\ +VDISK - Moves the focus to the virtual disk.\n\n" + IDS_HELP_CMD_SELECT_DISK "\n\ +<Add SELECT DISK command help text here>\n\n" + IDS_HELP_CMD_SELECT_PARTITION "\n\ +<Add SELECT PARTITION command help text here>\n\n" + IDS_HELP_CMD_SELECT_VOLUME "\n\ +<Add SELECT VOLUME command help text here>\n\n" + IDS_HELP_CMD_SELECT_VDISK "\n\ +<Add SELECT VDISK command help text here>\n\n" END
/* Setid help descriptions */ @@ -395,5 +439,8 @@ END STRINGTABLE BEGIN IDS_HELP_CMD_UNIQUEID "\n\ -<Add UNIQUEID command help text here>\n\n" +DISK - Used to display or set the ID of a GUID partition table\n\ + or the Signature of an MBR partition table.\n\n" + IDS_HELP_CMD_UNIQUEID_DISK "\n\ +<Add UNIQUEID DISK command help text here>\n\n" END diff --git a/base/system/diskpart/list.c b/base/system/diskpart/list.c index a6a2ebfde89..4eb1d8fb823 100644 --- a/base/system/diskpart/list.c +++ b/base/system/diskpart/list.c @@ -13,9 +13,10 @@
/* FUNCTIONS ******************************************************************/
-static -VOID -ListDisk(VOID) +BOOL +ListDisk( + INT argc, + PWSTR *argv) { PLIST_ENTRY Entry; PDISKENTRY DiskEntry; @@ -68,11 +69,15 @@ ListDisk(VOID) }
ConPuts(StdOut, L"\n\n"); + + return TRUE; }
-static -VOID -ListPartition(VOID) + +BOOL +ListPartition( + INT argc, + PWSTR *argv) { PLIST_ENTRY Entry; PPARTENTRY PartEntry; @@ -85,7 +90,7 @@ ListPartition(VOID) if (CurrentDisk == NULL) { ConResPuts(StdOut, IDS_LIST_PARTITION_NO_DISK); - return; + return TRUE; }
/* Header labels */ @@ -205,11 +210,15 @@ ListPartition(VOID) }
ConPuts(StdOut, L"\n"); + + return TRUE; }
-static -VOID -ListVolume(VOID) + +BOOL +ListVolume( + INT argc, + PWSTR *argv) { PLIST_ENTRY Entry; PVOLENTRY VolumeEntry; @@ -253,38 +262,16 @@ ListVolume(VOID) }
ConPuts(StdOut, L"\n\n"); -}
-static -VOID -ListVdisk(VOID) -{ - ConPuts(StdOut, L"List VDisk!!\n"); + return TRUE; }
+ BOOL -list_main( +ListVirtualDisk( INT argc, - LPWSTR *argv) + PWSTR *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); - + ConPuts(StdOut, L"ListVirtualDisk()!\n"); return TRUE; } diff --git a/base/system/diskpart/misc.c b/base/system/diskpart/misc.c index 65ba3a0ddb0..b46651b670b 100644 --- a/base/system/diskpart/misc.c +++ b/base/system/diskpart/misc.c @@ -57,9 +57,17 @@ IsHexString( BOOL HasPrefix( _In_ PWSTR pszString, - _In_ PWSTR pszPrefix) + _In_ PWSTR pszPrefix, + _Out_opt_ PWSTR *ppszSuffix) { - return (_wcsnicmp(pszString, pszPrefix, wcslen(pszPrefix)) == 0); + INT nPrefixLength, ret; + + nPrefixLength = wcslen(pszPrefix); + ret = _wcsnicmp(pszString, pszPrefix, nPrefixLength); + if ((ret == 0) && (ppszSuffix != NULL)) + *ppszSuffix = &pszString[nPrefixLength]; + + return (ret == 0); }
diff --git a/base/system/diskpart/resource.h b/base/system/diskpart/resource.h index 44ad22cdee6..ed77b249e06 100644 --- a/base/system/diskpart/resource.h +++ b/base/system/diskpart/resource.h @@ -127,10 +127,16 @@ #define IDS_HELP_CMD_COMPACT 113 #define IDS_HELP_CMD_CONVERT 114 #define IDS_HELP_CMD_CREATE 115 -#define IDS_HELP_CMD_CREATE_PARTITION 180 +#define IDS_HELP_CMD_CREATE_PARTITION 180 +#define IDS_HELP_CMD_CREATE_PARTITION_EXTENDED 181 +#define IDS_HELP_CMD_CREATE_PARTITION_LOGICAL 182 +#define IDS_HELP_CMD_CREATE_PARTITION_PRIMARY 183 #define IDS_HELP_CMD_DELETE 116 #define IDS_HELP_CMD_DETACH 117 #define IDS_HELP_CMD_DETAIL 118 +#define IDS_HELP_CMD_DETAIL_DISK 184 +#define IDS_HELP_CMD_DETAIL_PARTITION 185 +#define IDS_HELP_CMD_DETAIL_VOLUME 186 #define IDS_HELP_CMD_EXPAND 119 #define IDS_HELP_CMD_EXTEND 120 #define IDS_HELP_CMD_FILESYSTEMS 121 @@ -140,6 +146,10 @@ #define IDS_HELP_CMD_IMPORT 125 #define IDS_HELP_CMD_INACTIVE 126 #define IDS_HELP_CMD_LIST 127 +#define IDS_HELP_CMD_LIST_DISK 190 +#define IDS_HELP_CMD_LIST_PARTITION 191 +#define IDS_HELP_CMD_LIST_VOLUME 192 +#define IDS_HELP_CMD_LIST_VDISK 193 #define IDS_HELP_CMD_MERGE 128 #define IDS_HELP_CMD_OFFLINE 129 #define IDS_HELP_CMD_ONLINE 130 @@ -150,8 +160,13 @@ #define IDS_HELP_CMD_RETAIN 135 #define IDS_HELP_CMD_SAN 136 #define IDS_HELP_CMD_SELECT 137 +#define IDS_HELP_CMD_SELECT_DISK 190 +#define IDS_HELP_CMD_SELECT_PARTITION 191 +#define IDS_HELP_CMD_SELECT_VOLUME 192 +#define IDS_HELP_CMD_SELECT_VDISK 193 #define IDS_HELP_CMD_SETID 138 #define IDS_HELP_CMD_SHRINK 139 #define IDS_HELP_CMD_UNIQUEID 140 +#define IDS_HELP_CMD_UNIQUEID_DISK 141
#define IDS_ERROR_INVALID_ARGS 211 diff --git a/base/system/diskpart/select.c b/base/system/diskpart/select.c index aa2432484ae..dcc9adb8f0d 100644 --- a/base/system/diskpart/select.c +++ b/base/system/diskpart/select.c @@ -13,11 +13,10 @@
/* FUNCTIONS ******************************************************************/
-static -VOID +BOOL SelectDisk( INT argc, - LPWSTR *argv) + PWSTR *argv) { PLIST_ENTRY Entry; PDISKENTRY DiskEntry; @@ -28,7 +27,7 @@ SelectDisk( if (argc > 3) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (argc == 2) @@ -37,20 +36,20 @@ SelectDisk( ConResPuts(StdOut, IDS_SELECT_NO_DISK); else ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber); - return; + return TRUE; }
if (!IsDecString(argv[2])) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
ulValue = wcstoul(argv[2], NULL, 10); if ((ulValue == 0) && (errno == ERANGE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
CurrentDisk = NULL; @@ -65,21 +64,21 @@ SelectDisk( CurrentDisk = DiskEntry; CurrentPartition = NULL; ConResPrintf(StdOut, IDS_SELECT_DISK, CurrentDisk->DiskNumber); - return; + return TRUE; }
Entry = Entry->Flink; }
ConResPuts(StdErr, IDS_SELECT_DISK_INVALID); + return TRUE; }
-static -VOID +BOOL SelectPartition( INT argc, - LPWSTR *argv) + PWSTR *argv) { PLIST_ENTRY Entry; PPARTENTRY PartEntry; @@ -91,13 +90,13 @@ SelectPartition( if (argc > 3) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (CurrentDisk == NULL) { ConResPuts(StdOut, IDS_SELECT_PARTITION_NO_DISK); - return; + return TRUE; }
if (argc == 2) @@ -106,20 +105,20 @@ SelectPartition( ConResPuts(StdOut, IDS_SELECT_NO_PARTITION); else ConResPrintf(StdOut, IDS_SELECT_PARTITION, CurrentPartition); - return; + return TRUE; }
if (!IsDecString(argv[2])) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
ulValue = wcstoul(argv[2], NULL, 10); if ((ulValue == 0) && (errno == ERANGE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
Entry = CurrentDisk->PrimaryPartListHead.Flink; @@ -133,7 +132,7 @@ SelectPartition( { CurrentPartition = PartEntry; ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber); - return; + return TRUE; }
PartNumber++; @@ -153,7 +152,7 @@ SelectPartition( { CurrentPartition = PartEntry; ConResPrintf(StdOut, IDS_SELECT_PARTITION, PartNumber); - return; + return TRUE; }
PartNumber++; @@ -162,14 +161,14 @@ SelectPartition( }
ConResPuts(StdErr, IDS_SELECT_PARTITION_INVALID); + return TRUE; }
-static -VOID +BOOL SelectVolume( INT argc, - LPWSTR *argv) + PWSTR *argv) { PLIST_ENTRY Entry; PVOLENTRY VolumeEntry; @@ -180,7 +179,7 @@ SelectVolume( if (argc > 3) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
if (argc == 2) @@ -189,20 +188,20 @@ SelectVolume( ConResPuts(StdOut, IDS_SELECT_NO_VOLUME); else ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber); - return; + return TRUE; }
if (!IsDecString(argv[2])) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
ulValue = wcstoul(argv[2], NULL, 10); if ((ulValue == 0) && (errno == ERANGE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
CurrentVolume = NULL; @@ -216,37 +215,12 @@ SelectVolume( { CurrentVolume = VolumeEntry; ConResPrintf(StdOut, IDS_SELECT_VOLUME, CurrentVolume->VolumeNumber); - return; + return TRUE; }
Entry = Entry->Flink; }
ConResPuts(StdErr, IDS_SELECT_VOLUME_INVALID); -} - - -BOOL -select_main( - INT argc, - LPWSTR *argv) -{ - /* gets the first word from the string */ - if (argc == 1) - { - ConResPuts(StdOut, IDS_HELP_CMD_SELECT); - return TRUE; - } - - /* determines which to list (disk, partition, etc.) */ - if (!wcsicmp(argv[1], L"disk")) - SelectDisk(argc, argv); - else if (!wcsicmp(argv[1], L"partition")) - SelectPartition(argc, argv); - else if (!wcsicmp(argv[1], L"volume")) - SelectVolume(argc, argv); - else - ConResPuts(StdOut, IDS_HELP_CMD_SELECT); - return TRUE; } diff --git a/base/system/diskpart/uniqueid.c b/base/system/diskpart/uniqueid.c index 28c206ec65d..0637112cdb9 100644 --- a/base/system/diskpart/uniqueid.c +++ b/base/system/diskpart/uniqueid.c @@ -13,18 +13,18 @@
/* FUNCTIONS ******************************************************************/
-static -VOID +BOOL UniqueIdDisk( _In_ INT argc, - _In_ LPWSTR *argv) + _In_ PWSTR *argv) { - ULONG ulLength, ulValue; + PWSTR pszSuffix = NULL; + ULONG ulValue;
if (CurrentDisk == NULL) { ConResPuts(StdOut, IDS_SELECT_NO_DISK); - return; + return TRUE; }
if (argc == 2) @@ -32,39 +32,34 @@ UniqueIdDisk( ConPuts(StdOut, L"\n"); ConPrintf(StdOut, L"Disk ID: %08lx\n", CurrentDisk->LayoutBuffer->Signature); ConPuts(StdOut, L"\n"); - return; + return TRUE; }
if (argc != 3) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; - } - - ulLength = wcslen(argv[2]); - if ((ulLength <= 3) || (ulLength > 11)) - { - ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
- if (!HasPrefix(argv[2], L"ID=")) + if (!HasPrefix(argv[2], L"ID=", &pszSuffix)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
- if (!IsHexString(&argv[2][3])) + if ((pszSuffix == NULL) || + (wcslen(pszSuffix) > 8) || + (IsHexString(pszSuffix) == FALSE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
- ulValue = wcstoul(&argv[2][3], NULL, 16); + ulValue = wcstoul(pszSuffix, NULL, 16); if ((ulValue == 0) && (errno == ERANGE)) { ConResPuts(StdErr, IDS_ERROR_INVALID_ARGS); - return; + return TRUE; }
ConPrintf(StdOut, L"Setting the disk signature is not implemented yet!\n"); @@ -74,23 +69,5 @@ UniqueIdDisk( // SetDiskLayout(CurrentDisk); #endif
-} - - -BOOL uniqueid_main(INT argc, LPWSTR *argv) -{ - /* gets the first word from the string */ - if (argc == 1) - { - ConResPuts(StdOut, IDS_HELP_CMD_UNIQUEID); - return TRUE; - } - - /* determines which details to print (disk, partition, etc.) */ - if (!wcsicmp(argv[1], L"disk")) - UniqueIdDisk(argc, argv); - else - ConResPuts(StdOut, IDS_HELP_CMD_UNIQUEID); - return TRUE; }