//+------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1992 - 1994. // // File: winmain.cxx // // Contents: Main DFS Administrator file // // History: 05-May-93 WilliamW Created // 11-Jul-95 WayneSc Bug Fixes // //-------------------------------------------------------------------------- #include "headers.hxx" #pragma hdrstop #include "cmd.hxx" #include "myutil.hxx" // // Debug flag // DECLARE_INFOLEVEL(DfsAdmin) ////////////////////////////////////////////////////////////////////////////// HINSTANCE g_hInstance; #define MAX_ARGS 25 ////////////////////////////////////////////////////////////////////////////// //+------------------------------------------------------------------------- // // Function: WinMain // // Synopsis: main routine for the Sharing app. // // History: 11-May-93 WilliamW Created. // 16-Sep-93 DavidMun Added load & free of ccsvr.dll; move // InfoLevel init inside #if DBG. // // The command line accepted by this program is described in message // MSG_USAGE, in messages.mc. In addition to that, the following options are // accepted in debug builds. These must preceed any retail options. // // Debug options: // /debug // -- dump basic error information // /fulldebug // -- dump all error and trace information // //-------------------------------------------------------------------------- int APIENTRY WinMain( IN HINSTANCE hInst, IN HINSTANCE hPrevInstance, IN LPSTR lpszCommandLineAnsi, IN int cmdShow ) { HRESULT hr; HACCEL hAccel; MSG msg; PWSTR pszInitialDfs = NULL; PWSTR pszCommandLine = GetCommandLine(); // get the unicode command line BOOLEAN fBatch = FALSE; BOOLEAN fRestore = FALSE; // // Store the current instance away. // g_hInstance = hInst; #if DBG == 1 DebugInitialize(); // // Set debug info level // DfsAdminInfoLevel = DEB_ERROR | DEB_WARN; if (NULL != wcsstr(pszCommandLine, L"/debug")) { DfsAdminInfoLevel = DEB_ERROR | DEB_WARN | DEB_TRACE ; } if (NULL != wcsstr(pszCommandLine, L"/fulldebug")) { DfsAdminInfoLevel = DEB_ERROR | DEB_WARN | DEB_TRACE | DEB_IERROR | DEB_IWARN | DEB_ITRACE ; } // For some reason, the MessageBox call done for ASSRT_POPUP // is failing with error 2 (???), and although the assert message gets // printed, it doesn't break. DebugSetAssertLevel(ASSRT_MESSAGE | ASSRT_BREAK); #endif // // Parse the command line. First, break everything out into separate // strings (kind of like argv/argc). Note that the program name doesn't // appear in pszCommandLine. // DWORD cArgs = 0; DWORD iArg; LPWSTR apszArgs[MAX_ARGS]; LPWSTR pT = pszCommandLine; if (NULL != pT) { for (; cArgs < MAX_ARGS;) { while (L' ' == *pT || L'\t' == *pT) { pT++; } // eat whitespace if (L'\0' == *pT) { break; } // We found a parameter. Find how long it is, allocate a string // to store it, and copy it. If the argument begins with a double // quote, we continue until we find the next double quote. To allow // double-quotes within strings, we allow these two special // sequences: // \" => " backslash escapes quotes // \\ => \ backslash escapes backslash // \x => x backslash escapes anything! // First, determine the string size DWORD cchArg = 0; BOOL fQuoted = (L'"' == *pT); if (fQuoted) { ++pT; } // count the # of characters in the string LPWSTR pT2 = pT; if (fQuoted) { while (L'"' != *pT2 && L'\0' != *pT2) { if (L'\\' == *pT2 && L'"' == *(pT2+1)) { pT2 += 2; } else { pT2 += 1; } ++cchArg; } if (L'\0' == *pT2) { // no trailing quotes Usage(); } else { // we're on a ", so skip it ++pT2; if (L' ' != *pT2 && L'\t' != *pT2 && L'\0' != *pT2) { // garbage after the " Usage(); } } } else { while (L' ' != *pT2 && L'\t' != *pT2 && L'\0' != *pT2) { ++pT2; ++cchArg; } } // allocate storage for the parameter LPWSTR pszNew = new WCHAR[cchArg + 1]; if (NULL == pszNew) { ErrorMessage(MSG_OUTOFMEMORY); } LPWSTR pCopy = pszNew; // copy the string pT2 = pT; if (fQuoted) { while (L'"' != *pT2 && L'\0' != *pT2) { if (L'\\' == *pT2 && L'"' == *(pT2+1)) { ++pT2; // skip the backslash } *pCopy++ = *pT2++; } if (L'\0' == *pT2) { // no trailing quotes appAssert(FALSE); } else { // we're on a ", so skip it ++pT2; if (L' ' != *pT2 && L'\t' != *pT2 && L'\0' != *pT2) { // garbage after the " appAssert(FALSE); } } } else { while (L' ' != *pT2 && L'\t' != *pT2 && L'\0' != *pT2) { *pCopy++ = *pT2++; } } *pCopy = L'\0'; apszArgs[cArgs++] = pszNew; pT = pT2; } if (cArgs >= MAX_ARGS) { Usage(); } // // We've got the arguments parsed out now, so do something with them // iArg = 1; // skip the first one, which is the program name #if DBG == 1 for (; iArg < cArgs; ) { if ( 0 == _wcsicmp(apszArgs[iArg], L"/debug") || 0 == _wcsicmp(apszArgs[iArg], L"/fulldebug") ) { ++iArg; // skip it } else { break; } } #endif // DBG == 1 if (iArg < cArgs) { if ( 0 == _wcsicmp(apszArgs[iArg], L"/help") || 0 == _wcsicmp(apszArgs[iArg], L"/h") || 0 == _wcsicmp(apszArgs[iArg], L"/?") || 0 == _wcsicmp(apszArgs[iArg], L"-help") || 0 == _wcsicmp(apszArgs[iArg], L"-h") || 0 == _wcsicmp(apszArgs[iArg], L"-?") ) { Usage(); } else if (0 == _wcsicmp(apszArgs[iArg], L"/map")) { LPWSTR pszComment = NULL; if ( iArg + 2 > cArgs - 1 || iArg + 4 < cArgs - 1) { Usage(); } if (iArg + 3 <= cArgs - 1) { if (0 == _wcsicmp(apszArgs[iArg + 3], L"/restore")) fRestore = TRUE; else pszComment = apszArgs[iArg + 3]; } if (iArg + 4 <= cArgs - 1) { if (0 == _wcsicmp(apszArgs[iArg + 4], L"/restore")) fRestore = TRUE; else if (pszComment != NULL) Usage(); else pszComment = apszArgs[iArg + 4]; } CmdMap(apszArgs[iArg + 1], apszArgs[iArg + 2], pszComment, fRestore); } else if (0 == _wcsicmp(apszArgs[iArg], L"/unmap")) { if (iArg + 1 != cArgs - 1) { Usage(); } CmdUnmap(apszArgs[iArg + 1]); } else if (0 == _wcsicmp(apszArgs[iArg], L"/add")) { if (iArg + 2 > cArgs - 1 || iArg + 3 < cArgs - 1) { Usage(); } if (iArg + 3 <= cArgs - 1) { if (0 == _wcsicmp(apszArgs[iArg + 3], L"/restore")) fRestore = TRUE; else Usage(); } CmdAdd(apszArgs[iArg + 1], apszArgs[iArg + 2], fRestore); } else if (0 == _wcsicmp(apszArgs[iArg], L"/remove")) { if (iArg + 2 != cArgs - 1) { Usage(); } CmdRemove(apszArgs[iArg + 1], apszArgs[iArg + 2]); } else if (0 == _wcsicmp(apszArgs[iArg], L"/view")) { if ( iArg + 1 > cArgs - 1 || iArg + 2 < cArgs - 1 ) { Usage(); } DWORD level = 1; if (iArg + 2 == cArgs - 1) { if (0 == _wcsicmp(apszArgs[iArg + 2], L"/partial")) { level = 2; } else if (0 == _wcsicmp(apszArgs[iArg + 2], L"/full")) { level = 3; } else if (0 == _wcsicmp(apszArgs[iArg + 2], L"/batch")) { fBatch = TRUE; level = 3; } else if (0 == _wcsicmp(apszArgs[iArg + 2], L"/batchrestore")) { fBatch = TRUE; fRestore = TRUE; level = 3; } else { Usage(); } } CmdView(apszArgs[iArg + 1], level, fBatch, fRestore); } #ifdef MOVERENAME else if (0 == _wcsicmp(apszArgs[iArg], L"/move")) { if (iArg + 2 != cArgs - 1) { Usage(); } CmdMove(apszArgs[iArg + 1], apszArgs[iArg + 2]); } else if (0 == _wcsicmp(apszArgs[iArg], L"/rename")) { if (iArg + 2 != cArgs - 1) { Usage(); } CmdRename(apszArgs[iArg + 1], apszArgs[iArg + 2]); } #endif else { Usage(); } } else { Usage(); } } else { Usage(); } StatusMessage(MSG_SUCCESSFUL); return 0; }