1 /* 2 * COPYRIGHT: See COPYING in the top level directory 3 * PROJECT: ReactOS net command 4 * FILE: base/applications/network/net/main.c 5 * PURPOSE: 6 * 7 * PROGRAMMERS: Magnus Olsen (greatlord@reactos.org) 8 */ 9 10 #include "net.h" 11 12 #define MAX_BUFFER_SIZE 4096 13 14 typedef struct _COMMAND 15 { 16 WCHAR *name; 17 INT (*func)(INT, WCHAR**); 18 // VOID (*help)(INT, WCHAR**); 19 } COMMAND, *PCOMMAND; 20 21 COMMAND cmds[] = 22 { 23 {L"accounts", cmdAccounts}, 24 {L"computer", cmdComputer}, 25 {L"config", cmdConfig}, 26 {L"continue", cmdContinue}, 27 {L"file", unimplemented}, 28 {L"group", cmdGroup}, 29 {L"help", cmdHelp}, 30 {L"helpmsg", cmdHelpMsg}, 31 {L"localgroup", cmdLocalGroup}, 32 {L"pause", cmdPause}, 33 {L"session", unimplemented}, 34 {L"share", cmdShare}, 35 {L"start", cmdStart}, 36 {L"statistics", cmdStatistics}, 37 {L"stop", cmdStop}, 38 {L"syntax", cmdSyntax}, 39 {L"time", unimplemented}, 40 {L"use", cmdUse}, 41 {L"user", cmdUser}, 42 {L"view", unimplemented}, 43 {NULL, NULL} 44 }; 45 46 HMODULE hModuleNetMsg = NULL; 47 48 49 VOID 50 PrintPaddedResourceString( 51 UINT uID, 52 INT nPaddedLength) 53 { 54 INT nLength; 55 56 nLength = ConResPuts(StdOut, uID); 57 if (nLength < nPaddedLength) 58 PrintPadding(L' ', nPaddedLength - nLength); 59 } 60 61 62 VOID 63 PrintPadding( 64 WCHAR chr, 65 INT nPaddedLength) 66 { 67 INT i; 68 WCHAR szMsgBuffer[MAX_BUFFER_SIZE]; 69 70 for (i = 0; i < nPaddedLength; i++) 71 szMsgBuffer[i] = chr; 72 szMsgBuffer[nPaddedLength] = UNICODE_NULL; 73 74 ConPuts(StdOut, szMsgBuffer); 75 } 76 77 78 VOID 79 PrintMessageStringV( 80 DWORD dwMessage, 81 ...) 82 { 83 PWSTR pBuffer; 84 va_list args = NULL; 85 86 va_start(args, dwMessage); 87 88 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE, 89 hModuleNetMsg, 90 dwMessage, 91 LANG_USER_DEFAULT, 92 (LPWSTR)&pBuffer, 93 0, 94 &args); 95 va_end(args); 96 97 if (pBuffer) 98 { 99 ConPuts(StdOut, pBuffer); 100 LocalFree(pBuffer); 101 pBuffer = NULL; 102 } 103 } 104 105 VOID 106 PrintMessageString( 107 DWORD dwMessage) 108 { 109 PWSTR pBuffer; 110 111 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | 112 FORMAT_MESSAGE_IGNORE_INSERTS, 113 hModuleNetMsg, 114 dwMessage, 115 LANG_USER_DEFAULT, 116 (LPWSTR)&pBuffer, 117 0, 118 NULL); 119 if (pBuffer) 120 { 121 ConPuts(StdOut, pBuffer); 122 LocalFree(pBuffer); 123 pBuffer = NULL; 124 } 125 } 126 127 128 VOID 129 PrintPaddedMessageString( 130 DWORD dwMessage, 131 INT nPaddedLength) 132 { 133 PWSTR pBuffer; 134 DWORD dwLength; 135 136 dwLength = FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | 137 FORMAT_MESSAGE_IGNORE_INSERTS, 138 hModuleNetMsg, 139 dwMessage, 140 LANG_USER_DEFAULT, 141 (LPWSTR)&pBuffer, 142 0, 143 NULL); 144 if (pBuffer) 145 { 146 ConPuts(StdOut, pBuffer); 147 LocalFree(pBuffer); 148 pBuffer = NULL; 149 } 150 151 if (dwLength < (DWORD)nPaddedLength) 152 PrintPadding(L' ', (DWORD)nPaddedLength - dwLength); 153 } 154 155 156 VOID 157 PrintErrorMessage( 158 DWORD dwError) 159 { 160 WCHAR szErrorBuffer[16]; 161 PWSTR pBuffer; 162 PWSTR pErrorInserts[2] = {NULL, NULL}; 163 164 if (dwError >= MIN_LANMAN_MESSAGE_ID && dwError <= MAX_LANMAN_MESSAGE_ID) 165 { 166 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | 167 FORMAT_MESSAGE_IGNORE_INSERTS, 168 hModuleNetMsg, 169 dwError, 170 LANG_USER_DEFAULT, 171 (LPWSTR)&pBuffer, 172 0, 173 NULL); 174 if (pBuffer) 175 { 176 ConPrintf(StdErr, L"%s\n", pBuffer); 177 LocalFree(pBuffer); 178 pBuffer = NULL; 179 } 180 } 181 else 182 { 183 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | 184 FORMAT_MESSAGE_IGNORE_INSERTS, 185 NULL, 186 dwError, 187 LANG_USER_DEFAULT, 188 (LPWSTR)&pBuffer, 189 0, 190 NULL); 191 if (pBuffer) 192 { 193 ConPrintf(StdErr, L"%s\n", pBuffer); 194 LocalFree(pBuffer); 195 pBuffer = NULL; 196 } 197 } 198 199 if (dwError != ERROR_SUCCESS) 200 { 201 /* Format insert for the 3514 message */ 202 swprintf(szErrorBuffer, L"%lu", dwError); 203 pErrorInserts[0] = szErrorBuffer; 204 205 /* Format and print the 3514 message */ 206 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_HMODULE | 207 FORMAT_MESSAGE_ARGUMENT_ARRAY, 208 hModuleNetMsg, 209 3514, 210 LANG_USER_DEFAULT, 211 (LPWSTR)&pBuffer, 212 0, 213 (va_list *)pErrorInserts); 214 if (pBuffer) 215 { 216 ConPrintf(StdErr, L"%s\n", pBuffer); 217 LocalFree(pBuffer); 218 pBuffer = NULL; 219 } 220 } 221 } 222 223 224 VOID 225 PrintNetMessage( 226 DWORD dwMessage) 227 { 228 PWSTR pBuffer; 229 230 FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | 231 FORMAT_MESSAGE_FROM_HMODULE | 232 FORMAT_MESSAGE_IGNORE_INSERTS, 233 GetModuleHandleW(NULL), 234 dwMessage, 235 LANG_USER_DEFAULT, 236 (LPWSTR)&pBuffer, 237 0, 238 NULL); 239 if (pBuffer) 240 { 241 ConPuts(StdOut, pBuffer); 242 ConPuts(StdOut, L"\n"); 243 LocalFree(pBuffer); 244 pBuffer = NULL; 245 } 246 } 247 248 249 VOID 250 ReadFromConsole( 251 LPWSTR lpInput, 252 DWORD dwLength, 253 BOOL bEcho) 254 { 255 DWORD dwOldMode; 256 DWORD dwRead = 0; 257 HANDLE hFile; 258 LPWSTR p; 259 PCHAR pBuf; 260 261 pBuf = HeapAlloc(GetProcessHeap(), 0, dwLength - 1); 262 ZeroMemory(lpInput, dwLength * sizeof(WCHAR)); 263 hFile = GetStdHandle(STD_INPUT_HANDLE); 264 GetConsoleMode(hFile, &dwOldMode); 265 266 SetConsoleMode(hFile, ENABLE_LINE_INPUT | (bEcho ? ENABLE_ECHO_INPUT : 0)); 267 268 ReadFile(hFile, (PVOID)pBuf, dwLength - 1, &dwRead, NULL); 269 270 MultiByteToWideChar(CP_OEMCP, 0, pBuf, dwRead, lpInput, dwLength - 1); 271 HeapFree(GetProcessHeap(), 0, pBuf); 272 273 for (p = lpInput; *p; p++) 274 { 275 if (*p == L'\x0d') 276 { 277 *p = L'\0'; 278 break; 279 } 280 } 281 282 SetConsoleMode(hFile, dwOldMode); 283 } 284 285 286 int wmain(int argc, WCHAR **argv) 287 { 288 WCHAR szDllBuffer[MAX_PATH]; 289 PCOMMAND cmdptr; 290 int nResult = 0; 291 BOOL bRun = FALSE; 292 293 /* Initialize the Console Standard Streams */ 294 ConInitStdStreams(); 295 296 /* Load netmsg.dll */ 297 GetSystemDirectoryW(szDllBuffer, ARRAYSIZE(szDllBuffer)); 298 wcscat(szDllBuffer, L"\\netmsg.dll"); 299 300 hModuleNetMsg = LoadLibrary(szDllBuffer); 301 if (hModuleNetMsg == NULL) 302 { 303 ConPrintf(StdErr, L"Failed to load netmsg.dll\n"); 304 return 1; 305 } 306 307 if (argc < 2) 308 { 309 nResult = 1; 310 goto done; 311 } 312 313 /* Scan the command table */ 314 for (cmdptr = cmds; cmdptr->name; cmdptr++) 315 { 316 if (_wcsicmp(argv[1], cmdptr->name) == 0) 317 { 318 nResult = cmdptr->func(argc, argv); 319 bRun = TRUE; 320 break; 321 } 322 } 323 324 done: 325 if (bRun == FALSE) 326 { 327 PrintMessageString(4381); 328 ConPuts(StdOut, L"\n"); 329 PrintNetMessage(MSG_NET_SYNTAX); 330 } 331 332 if (hModuleNetMsg != NULL) 333 FreeLibrary(hModuleNetMsg); 334 335 return nResult; 336 } 337 338 INT unimplemented(INT argc, WCHAR **argv) 339 { 340 ConPuts(StdOut, L"This command is not implemented yet\n"); 341 return 1; 342 } 343