1 /* 2 * PROJECT: ReactOS DiskPart 3 * LICENSE: GPL - See COPYING in the top level directory 4 * FILE: base/system/diskpart/diskpart.c 5 * PURPOSE: Manages all the partitions of the OS in an interactive way. 6 * PROGRAMMERS: Lee Schroeder 7 */ 8 9 /* INCLUDES ******************************************************************/ 10 11 #include "diskpart.h" 12 13 /* FUNCTIONS ******************************************************************/ 14 15 VOID 16 ShowHeader(VOID) 17 { 18 WCHAR szComputerName[MAX_STRING_SIZE]; 19 DWORD comp_size = MAX_STRING_SIZE; 20 21 /* Get the name of the computer for us and change the value of comp_name */ 22 GetComputerNameW(szComputerName, &comp_size); 23 24 /* TODO: Remove this section of code when program becomes stable enough for production use. */ 25 ConPuts(StdOut, L"\n*WARNING*: This program is incomplete and may not work properly.\n"); 26 27 /* Print the header information */ 28 ConPuts(StdOut, L"\n"); 29 ConResPuts(StdOut, IDS_APP_HEADER); 30 ConPuts(StdOut, L"\n"); 31 ConResPuts(StdOut, IDS_APP_LICENSE); 32 ConResPrintf(StdOut, IDS_APP_CURR_COMPUTER, szComputerName); 33 } 34 35 /* 36 * RunScript(const char *filename): 37 * opens the file, reads the contents, convert the text into readable 38 * code for the computer, and then execute commands in order. 39 */ 40 BOOL 41 RunScript(LPCWSTR filename) 42 { 43 FILE *script; 44 WCHAR tmp_string[MAX_STRING_SIZE]; 45 46 /* Open the file for processing */ 47 script = _wfopen(filename, L"r"); 48 if (script == NULL) 49 { 50 /* if there was problems opening the file */ 51 ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, filename); 52 return FALSE; /* if there is no script, exit the program */ 53 } 54 55 /* Read and process the script */ 56 while (fgetws(tmp_string, MAX_STRING_SIZE, script) != NULL) 57 { 58 if (InterpretScript(tmp_string) == FALSE) 59 { 60 fclose(script); 61 return FALSE; 62 } 63 } 64 65 /* Close the file */ 66 fclose(script); 67 68 return TRUE; 69 } 70 71 /* 72 * wmain(): 73 * Main entry point of the application. 74 */ 75 int wmain(int argc, const LPWSTR argv[]) 76 { 77 LPCWSTR script = NULL; 78 LPCWSTR tmpBuffer = NULL; 79 WCHAR appTitle[50]; 80 int index, timeout; 81 int result = EXIT_SUCCESS; 82 83 /* Initialize the Console Standard Streams */ 84 ConInitStdStreams(); 85 86 /* Sets the title of the program so the user will have an easier time 87 determining the current program, especially if diskpart is running a 88 script */ 89 K32LoadStringW(GetModuleHandle(NULL), IDS_APP_HEADER, appTitle, ARRAYSIZE(appTitle)); 90 SetConsoleTitleW(appTitle); 91 92 /* Sets the timeout value to 0 just in case the user doesn't 93 specify a value */ 94 timeout = 0; 95 96 CreatePartitionList(); 97 98 /* If there are no command arguments, then go straight to the interpreter */ 99 if (argc < 2) 100 { 101 ShowHeader(); 102 InterpretMain(); 103 } 104 /* If there are command arguments, then process them */ 105 else 106 { 107 for (index = 1; index < argc; index++) 108 { 109 /* checks for flags */ 110 if ((argv[index][0] == '/')|| 111 (argv[index][0] == '-')) 112 { 113 tmpBuffer = argv[index] + 1; 114 } 115 else 116 { 117 /* If there is no flag, then return an error */ 118 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, argv[index]); 119 result = EXIT_FAILURE; 120 goto done; 121 } 122 123 /* Checks for the /? flag first since the program 124 exits as soon as the usage list is shown. */ 125 if (_wcsicmp(tmpBuffer, L"?") == 0) 126 { 127 ConResPuts(StdOut, IDS_APP_USAGE); 128 result = EXIT_SUCCESS; 129 goto done; 130 } 131 /* Checks for the script flag */ 132 else if (_wcsicmp(tmpBuffer, L"s") == 0) 133 { 134 if ((index + 1) < argc) 135 { 136 index++; 137 script = argv[index]; 138 } 139 } 140 /* Checks for the timeout flag */ 141 else if (_wcsicmp(tmpBuffer, L"t") == 0) 142 { 143 if ((index + 1) < argc) 144 { 145 index++; 146 timeout = _wtoi(argv[index]); 147 148 /* If the number is a negative number, then 149 change it so that the time is executed properly. */ 150 if (timeout < 0) 151 timeout = 0; 152 } 153 } 154 else 155 { 156 /* Assume that the flag doesn't exist. */ 157 ConResPrintf(StdErr, IDS_ERROR_MSG_BAD_ARG, tmpBuffer); 158 result = EXIT_FAILURE; 159 goto done; 160 } 161 } 162 163 /* Shows the program information */ 164 ShowHeader(); 165 166 /* Now we process the filename if it exists */ 167 if (script != NULL) 168 { 169 /* if the timeout is greater than 0, then assume 170 that the user specified a specific time. */ 171 if (timeout > 0) 172 Sleep(timeout * 1000); 173 174 if (RunScript(script) == FALSE) 175 { 176 result = EXIT_FAILURE; 177 goto done; 178 } 179 } 180 else 181 { 182 /* Exit failure since the user wanted to run a script */ 183 ConResPrintf(StdErr, IDS_ERROR_MSG_NO_SCRIPT, script); 184 result = EXIT_FAILURE; 185 goto done; 186 } 187 } 188 189 /* Let the user know the program is exiting */ 190 ConResPuts(StdOut, IDS_APP_LEAVING); 191 192 done: 193 DestroyPartitionList(); 194 195 return result; 196 } 197