/**************************************************************************** Copyright information : Copyright (c) 1998-1999 Microsoft Corporation File Name : wcmain.cpp Project Name : WMI Command Line Author Name : Ch. Sriramachandramurthy Date of Creation (dd/mm/yy) : 27th-September-2000 Version Number : 1.0 Brief Description : The _tmain function is the entry point of the WMICli program. Revision History : Last Modified by :Biplab Mistry Last Modified date :4/11/00 ****************************************************************************/ // wcmain.cpp :main function implementation file #include "Precomp.h" #include "CommandSwitches.h" #include "GlobalSwitches.h" #include "HelpInfo.h" #include "ErrorLog.h" #include "ParsedInfo.h" #include "CmdTokenizer.h" #include "CmdAlias.h" #include "ParserEngine.h" #include "ExecEngine.h" #include "ErrorInfo.h" #include "WmiCliXMLLog.h" #include "FormatEngine.h" #include "WmiCmdLn.h" CWMICommandLine g_wmiCmd; _TCHAR* g_pszBuffer = NULL; /*------------------------------------------------------------------------ Name :_tmain Synopsis :This function takes the error code as input and return an error string Type :Member Function Input parameters : argc :argument count argv :Pointer to string array storing command line arguments Output parameters :None Return Type :Integer Global Variables :None Calling Syntax : Calls :CWMICommandLine::Initialize, CWMICommandLine::UnInitialize, CFormatEngine::DisplayResults, CWMICommandLine::ProcessCommandAndDisplayResults Called by :None Notes :None ------------------------------------------------------------------------*/ __cdecl _tmain(WMICLIINT argc, _TCHAR **argv) { SESSIONRETCODE ssnRetCode = SESSION_SUCCESS; BOOL bFileEmpty = FALSE; BOOL bIndirectionInput = FALSE; FILE *fpInputFile = NULL; WMICLIUINT uErrLevel = 0; try { _bstr_t bstrBuf; // Initailize the CWMICommandLine object. if (g_wmiCmd.Initialize()) { HANDLE hStd=GetStdHandle(STD_INPUT_HANDLE); if(hStd != (HANDLE)0x00000003 && hStd != INVALID_HANDLE_VALUE && hStd != (HANDLE)0x0000000f) { if (!(g_wmiCmd.ReadXMLOrBatchFile(hStd)) || (fpInputFile = _tfopen(TEMP_BATCH_FILE, _T("r"))) == NULL) { g_wmiCmd.SetSessionErrorLevel(SESSION_ERROR); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); g_wmiCmd.Uninitialize(); return uErrLevel; } bIndirectionInput = TRUE; } // If no command line arguments are specified. if (argc == 1) { // Allocate memory for the g_pszBuffer g_pszBuffer = new _TCHAR[MAX_BUFFER]; // If memory allocation successfull if (g_pszBuffer) { while (TRUE) { OUTPUTSPEC opsOutOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); OUTPUTSPEC opsSavedOutOpt = opsOutOpt; CHString chsSavedOutFileName; if ( opsSavedOutOpt == FILEOUTPUT ) chsSavedOutFileName = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFileName(TRUE); // Make propmt to be diplayed to stdout. if ( opsOutOpt != STDOUT ) { g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendOption(STDOUT, TRUE); } // Preserve append file pointer. FILE* fpAppend = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); // Set append file pointer = null. g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendFilePointer(NULL, FALSE); // Display the prompt; bstrBuf = _bstr_t(EXEC_NAME); bstrBuf += _bstr_t(":"); bstrBuf += _bstr_t(g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject().GetRole()); bstrBuf += _bstr_t(">"); DisplayMessage(bstrBuf, CP_OEMCP, FALSE, FALSE); // To handle Ctrl+C at propmt, Start accepting command g_wmiCmd.SetAcceptCommand(TRUE); // To handle batch input from file. _TCHAR *pBuf = NULL; while(TRUE) { if ( bIndirectionInput == TRUE ) pBuf = _fgetts(g_pszBuffer, MAX_BUFFER-1, fpInputFile); else pBuf = _fgetts(g_pszBuffer, MAX_BUFFER-1, stdin); if(pBuf != NULL) { if ( bIndirectionInput == TRUE ) { DisplayMessage(g_pszBuffer, CP_OEMCP, FALSE, FALSE); } LONG lInStrLen = lstrlen(g_pszBuffer); if(g_pszBuffer[lInStrLen - 1] == _T('\n')) g_pszBuffer[lInStrLen - 1] = _T('\0'); break; } // Indicates end of file if (pBuf == NULL) { // Set the bFileEmpty flag to TRUE bFileEmpty = TRUE; break; } } // To handle Ctrl+C at propmt, End accepting command // and start of executing command g_wmiCmd.SetAcceptCommand(FALSE); // Set append file pointer = saved. g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendFilePointer(fpAppend, FALSE); // Redirect the output back to file specified. if ( opsOutOpt != STDOUT ) { g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendOption(opsOutOpt, TRUE); } // Set the error level to success. g_wmiCmd.SetSessionErrorLevel(SESSION_SUCCESS); // If all the commands in the batch file got executed. if (bFileEmpty) { SAFEDELETE(g_pszBuffer); break; } // Set Break Event to False g_wmiCmd.SetBreakEvent(FALSE); // Clear the clipboard. g_wmiCmd.EmptyClipBoardBuffer(); // Process the command and display results. ssnRetCode = g_wmiCmd.ProcessCommandAndDisplayResults (g_pszBuffer); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); // Break the loop if "QUIT" keyword is keyed-in. if(ssnRetCode == SESSION_QUIT) { SAFEDELETE(g_pszBuffer); break; } opsOutOpt = g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). GetOutputOrAppendOption(TRUE); if ( opsOutOpt == CLIPBOARD ) CopyToClipBoard(g_wmiCmd.GetClipBoardBuffer()); if ( ( opsOutOpt != FILEOUTPUT && CloseOutputFile() == FALSE ) || CloseAppendFile() == FALSE ) { SAFEDELETE(g_pszBuffer); break; } if ( g_wmiCmd.GetParsedInfoObject(). GetCmdSwitchesObject(). GetOutputSwitchFlag() == TRUE ) { if ( opsOutOpt == FILEOUTPUT && CloseOutputFile() == FALSE ) { SAFEDELETE(g_pszBuffer); break; } g_wmiCmd.GetParsedInfoObject(). GetCmdSwitchesObject(). SetOutputSwitchFlag(FALSE); if ( opsOutOpt == FILEOUTPUT ) g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendFileName(NULL, TRUE); g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendOption(opsSavedOutOpt , TRUE); if ( opsSavedOutOpt == FILEOUTPUT ) g_wmiCmd.GetParsedInfoObject(). GetGlblSwitchesObject(). SetOutputOrAppendFileName( _bstr_t((LPCWSTR)chsSavedOutFileName), TRUE); } } } else { ssnRetCode = SESSION_ERROR; g_wmiCmd.GetParsedInfoObject().GetCmdSwitchesObject(). SetErrataCode(OUT_OF_MEMORY); g_wmiCmd.SetSessionErrorLevel(ssnRetCode); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); } } // If command line arguments are specified. else { // Obtain the command line string g_pszBuffer = GetCommandLine(); if (g_pszBuffer != NULL) { // Set the error level to success. g_wmiCmd.SetSessionErrorLevel(SESSION_SUCCESS); // Process the command and display results. while( *(++g_pszBuffer) != _T(' ')); ssnRetCode = g_wmiCmd.ProcessCommandAndDisplayResults(g_pszBuffer); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); } } // Call the uninitialize function of the CWMICommandLine object. g_wmiCmd.Uninitialize(); if ( bIndirectionInput == TRUE ) { fclose(fpInputFile); DeleteFile(TEMP_BATCH_FILE); } } else { ssnRetCode = SESSION_ERROR; // If COM error. if (g_wmiCmd.GetParsedInfoObject(). GetCmdSwitchesObject().GetCOMError()) { g_wmiCmd.GetFormatObject(). DisplayResults(g_wmiCmd.GetParsedInfoObject()); } g_wmiCmd.SetSessionErrorLevel(ssnRetCode); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); g_wmiCmd.Uninitialize(); } } catch(...) { ssnRetCode = SESSION_ERROR; g_wmiCmd.GetParsedInfoObject().GetCmdSwitchesObject(). SetErrataCode(UNKNOWN_ERROR); g_wmiCmd.SetSessionErrorLevel(ssnRetCode); DisplayString(IDS_E_WMIC_UNKNOWN_ERROR, CP_OEMCP, NULL, TRUE, TRUE); uErrLevel = g_wmiCmd.GetSessionErrorLevel(); g_wmiCmd.Uninitialize(); SAFEDELETE(g_pszBuffer); if ( bIndirectionInput == TRUE ) { fclose(fpInputFile); DeleteFile(TEMP_BATCH_FILE); } } return uErrLevel; } /*------------------------------------------------------------------------ Name :CtrlHandler Synopsis :Handler routine to handle CTRL + C so as free the memory allocated during the program execution. Type :Global Function Input parameters : fdwCtrlType - control handler type Output parameters :None Return Type :BOOL Global Variables : g_pszBuffer - command buffer g_wmiCmd - wmi command line object Notes :None ------------------------------------------------------------------------*/ BOOL CtrlHandler(DWORD fdwCtrlType) { BOOL bRet = FALSE; switch (fdwCtrlType) { case CTRL_C_EVENT: // if at command propmt if ( g_wmiCmd.GetAcceptCommand() == TRUE ) { SAFEDELETE(g_pszBuffer); g_wmiCmd.Uninitialize(); bRet = FALSE; } else // executing command { g_wmiCmd.SetBreakEvent(TRUE); bRet = TRUE; } break; case CTRL_CLOSE_EVENT: default: SAFEDELETE(g_pszBuffer); g_wmiCmd.Uninitialize(); bRet = FALSE; break; } return bRet; } /*------------------------------------------------------------------------ Name :CloseOutputFile Synopsis :Close the output file. Type :Global Function Input parameters :None Output parameters :None Return Type :BOOL Global Variables : g_wmiCmd - wmi command line object Calling Syntax :CloseOutputFile() Notes :None ------------------------------------------------------------------------*/ BOOL CloseOutputFile() { BOOL bRet = TRUE; // TRUE for getting output file pointer. FILE* fpOutputFile = g_wmiCmd.GetParsedInfoObject().GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(TRUE); // If currently output is going to file close the file. if ( fpOutputFile != NULL ) { if ( fclose(fpOutputFile) == EOF ) { DisplayString(IDS_E_CLOSE_OUT_FILE_ERROR, CP_OEMCP, NULL, TRUE, TRUE); bRet = FALSE; } else // TRUE for setting output file pointer. g_wmiCmd.GetParsedInfoObject().GetGlblSwitchesObject(). SetOutputOrAppendFilePointer(NULL, TRUE); } return bRet; } /*------------------------------------------------------------------------ Name :CloseAppendFile Synopsis :Close the append file. Type :Global Function Input parameters :None Output parameters :None Return Type :BOOL Global Variables : g_wmiCmd - wmi command line object Calling Syntax :CloseAppendFile() Notes :None ------------------------------------------------------------------------*/ BOOL CloseAppendFile() { BOOL bRet = TRUE; // FALSE for getting append file pointer. FILE* fpAppendFile = g_wmiCmd.GetParsedInfoObject().GetGlblSwitchesObject(). GetOutputOrAppendFilePointer(FALSE); if ( fpAppendFile != NULL ) { if ( fclose(fpAppendFile) == EOF ) { DisplayString(IDS_E_CLOSE_APPEND_FILE_ERROR, CP_OEMCP, NULL, TRUE, TRUE); bRet = FALSE; } else // FASLE for setting output file pointer. g_wmiCmd.GetParsedInfoObject().GetGlblSwitchesObject(). SetOutputOrAppendFilePointer(NULL, FALSE); } return bRet; } /*------------------------------------------------------------------------ Name :CopyToClipBoard Synopsis :Copy data to clip board. Type :Global Function Input parameters : bstrClipBoardBuffer - reference to object of type _bstr_t. Output parameters :None Return Type :void Global Variables :None Calling Syntax :CopyToClipBoard(bstrClipBoardBuffer) Notes :None ------------------------------------------------------------------------*/ void CopyToClipBoard(_bstr_t& bstrClipBoardBuffer) { HGLOBAL hMem = CopyStringToHGlobal(bstrClipBoardBuffer); if (hMem != NULL) { if (OpenClipboard(NULL)) { EmptyClipboard(); SetClipboardData(CF_UNICODETEXT, hMem); CloseClipboard(); } else GlobalFree(hMem); //We must clean up. } } /*------------------------------------------------------------------------ Name :CopyStringToHGlobal Synopsis :Copy string to global memory. Type :Global Function Input parameters : psz - LPTSTR type, specifying string to get memory allocated. Output parameters :None Return Type :HGLOBAL Global Variables :None Calling Syntax :CopyStringToHGlobal(psz) Notes :None ------------------------------------------------------------------------*/ HGLOBAL CopyStringToHGlobal(LPTSTR psz) { HGLOBAL hMem; LPTSTR pszDst; hMem = GlobalAlloc(GHND, (DWORD) (lstrlen(psz)+1) * sizeof(TCHAR)); if (hMem != NULL) { pszDst = (LPTSTR) GlobalLock(hMem); lstrcpy(pszDst, psz); GlobalUnlock(hMem); } return hMem; }