windows-nt/Source/XPSP1/NT/admin/wmi/wbem/tools/wmic/precomp.h
2020-09-26 16:20:57 +08:00

667 lines
17 KiB
C++

#if !defined __PCH_H
#define __PCH_H
#define SECURITY_WIN32 1
// The debugger can't handle symbols more than 255 characters long.
// STL often creates symbols longer than that.
// When symbols are longer than 255 characters, the warning is issued.
#pragma warning(disable:4786)
//////////////////////////////////////////////////////////////////////
// HEADER INCLUDES //
//////////////////////////////////////////////////////////////////////
#include "resource.h"
#include <windows.h>
#include <vector>
#include <map>
#include <tchar.h>
#include <comdef.h>
#include <wbemidl.h>
#include <iostream>
#include <msxml2.h>
#include <lmcons.h>
#include <conio.h>
#include <math.h>
#include <chstring.h>
#include <shlwapi.h>
#include <winsock2.h>
#include <security.h>
#include <Provexce.h>
using namespace std;
class CParsedInfo;
class CWMICommandLine;
extern CWMICommandLine g_wmiCmd;
#ifdef _WIN64
typedef __int64 WMICLIINT;
#else
typedef int WMICLIINT;
#endif
#ifdef _WIN64
typedef UINT_PTR WMICLIUINT;
#else
typedef UINT WMICLIUINT;
#endif
#ifdef _WIN64
typedef DWORD_PTR WMICLIULONG;
#else
typedef ULONG WMICLIULONG;
#endif
//////////////////////////////////////////////////////////////////////
// USER DEFINED CONSTANTS //
//////////////////////////////////////////////////////////////////////
#define MAX_BUFFER 4095
#define BUFFER32 32
#define BUFFER64 64
#define BUFFER512 512
#define BUFFER255 255
#define BUFFER1024 1024
#define CLI_ROLE_DEFAULT _T("root\\cli")
#define CLI_NAMESPACE_DEFAULT _T("root\\cimv2")
#define CLI_LOCALE_DEFAULT _T("ms_409")
#define CLI_TOKEN_W _T("W")
#define CLI_TOKEN_CLASS _T("CLASS")
#define CLI_TOKEN_PATH _T("PATH")
#define CLI_TOKEN_WHERE _T("WHERE")
#define CLI_TOKEN_EXIT _T("EXIT")
#define CLI_TOKEN_RESTORE _T("RESTORE")
#define CLI_TOKEN_QUIT _T("QUIT")
#define CLI_TOKEN_CONTEXT _T("CONTEXT")
#define CLI_TOKEN_GET _T("GET")
#define CLI_TOKEN_LIST _T("LIST")
#define CLI_TOKEN_SET _T("SET")
#define CLI_TOKEN_DUMP _T("DUMP")
#define CLI_TOKEN_CALL _T("CALL")
#define CLI_TOKEN_ASSOC _T("ASSOC")
#define CLI_TOKEN_CREATE _T("CREATE")
#define CLI_TOKEN_DELETE _T("DELETE")
#define CLI_TOKEN_HELP _T("?")
#define CLI_TOKEN_NAMESPACE _T("NAMESPACE")
#define CLI_TOKEN_ROLE _T("ROLE")
#define CLI_TOKEN_NODE _T("NODE")
#define CLI_TOKEN_IMPLEVEL _T("IMPLEVEL")
#define CLI_TOKEN_AUTHLEVEL _T("AUTHLEVEL")
#define CLI_TOKEN_LOCALE _T("LOCALE")
#define CLI_TOKEN_PRIVILEGES _T("PRIVILEGES")
#define CLI_TOKEN_TRACE _T("TRACE")
#define CLI_TOKEN_RECORD _T("RECORD")
#define CLI_TOKEN_INTERACTIVE _T("INTERACTIVE")
#define CLI_TOKEN_FAILFAST _T("FAILFAST")
#define CLI_TOKEN_USER _T("USER")
#define CLI_TOKEN_PASSWORD _T("PASSWORD")
#define CLI_TOKEN_OUTPUT _T("OUTPUT")
#define CLI_TOKEN_APPEND _T("APPEND")
#define CLI_TOKEN_AGGREGATE _T("AGGREGATE")
#define CLI_TOKEN_COLON _T(":")
#define CLI_TOKEN_COMMA _T(",")
#define CLI_TOKEN_FSLASH _T("/")
#define CLI_TOKEN_HYPHEN _T("-")
#define CLI_TOKEN_HASH _T("#")
#define CLI_TOKEN_SPACE _T(" ")
#define CLI_TOKEN_DOT _T(".")
#define CLI_TOKEN_2DOT _T("..")
#define CLI_TOKEN_EQUALTO _T("=")
#define CLI_TOKEN_NULL _T("")
#define CLI_TOKEN_BSLASH _T("\\")
#define CLI_TOKEN_2BSLASH _T("\\\\")
#define CLI_TOKEN_LEFT_PARAN _T("(")
#define CLI_TOKEN_RIGHT_PARAN _T(")")
#define CLI_TOKEN_ONE _T("1")
#define CLI_TOKEN_TWO _T("2")
#define CLI_TOKEN_SINGLE_QUOTE _T("\'")
#define CLI_TOKEN_DOUBLE_QUOTE _T("\"")
#define CLI_TOKEN_TAB _T("\t")
#define CLI_TOKEN_SEMICOLON _T(";")
#define CLI_TOKEN_NEWLINE _T("\n")
#define CLI_TOKEN_TABLE _T("TABLE")
#define CLI_TOKEN_MOF _T("MOF")
#define CLI_TOKEN_TEXTVALUE _T("TEXTVALUE")
#define CLI_TOKEN_ENABLE _T("ENABLE")
#define CLI_TOKEN_DISABLE _T("DISABLE")
#define CLI_TOKEN_ON _T("ON")
#define CLI_TOKEN_OFF _T("OFF")
#define CLI_TOKEN_BRIEF _T("BRIEF")
#define CLI_TOKEN_FULL _T("FULL")
#define CLI_TOKEN_STDOUT _T("STDOUT")
#define CLI_TOKEN_CLIPBOARD _T("CLIPBOARD")
#define CLI_TOKEN_VALUE _T("VALUE")
#define CLI_TOKEN_ALL _T("ALL")
#define CLI_TOKEN_FORMAT _T("FORMAT")
#define CLI_TOKEN_EVERY _T("EVERY")
#define CLI_TOKEN_REPEAT _T("REPEAT")
#define CLI_TOKEN_TRANSLATE _T("TRANSLATE")
#define CLI_TOKEN_NONINTERACT _T("NOINTERACTIVE")
#define CLI_TOKEN_DUMP _T("DUMP")
#define CLI_TOKEN_FROM _T("FROM")
#define CLI_TOKEN_WHERE _T("WHERE")
#define XSL_FORMAT_TABLE _T("WmiCliTableFormat.xsl")
#define XSL_FORMAT_MOF _T("WmiCliMofFormat.xsl")
#define XSL_FORMAT_VALUE _T("WmiCliValueFormat.xsl")
#define XSL_FORMAT_TEXTVALUE _T("TextValueList.xsl")
#define TEMP_BATCH_FILE _T("TempWmicBatchFile.bat")
#define CLI_XSLMAPPINGS_FILE _T("XSL-Mappings.xml")
#define CLI_XSLSECTION_NAME _T("XSLMAPPINGS")
#define WBEM_LOCATION _T("\\wbem\\")
#define RESPONSE_YES _T("Y")
#define RESPONSE_NO _T("N")
#define RESPONSE_HELP _T("?")
#define EXEC_NAME _T("wmic")
#define CLI_TOKEN_AND _T(" AND ")
#define CLI_TOKEN_WRITE _T("Write")
#define WMISYSTEM_CLASS _T("__CLASS")
#define WMISYSTEM_DERIVATION _T("__DERIVATION")
#define WMISYSTEM_DYNASTY _T("__DYNASTY")
#define WMISYSTEM_GENUS _T("__GENUS")
#define WMISYSTEM_NAMESPACE _T("__NAMESPACE")
#define WMISYSTEM_PATH _T("__PATH")
#define WMISYSTEM_PROPERTYCOUNT _T("__PROPERTYCOUNT")
#define WMISYSTEM_REPLATH _T("__RELPATH")
#define WMISYSTEM_SERVER _T("__SERVER")
#define WMISYSTEM_SUPERCLASS _T("__SUPERCLASS")
#define MULTINODE_XMLSTARTTAG _T("<CIM>")
#define MULTINODE_XMLENDTAG _T("</CIM>")
#define MULTINODE_XMLASSOCSTAG1 _T("<ASSOC.OBJECTARRAY>")
#define MULTINODE_XMLASSOCETAG1 _T("</ASSOC.OBJECTARRAY>")
#define MULTINODE_XMLASSOCSTAG2 _T("<VALUE.OBJECT>")
#define MULTINODE_XMLASSOCETAG2 _T("</VALUE.OBJECT>")
#define CLI_TOKEN_RESULTCLASS _T("RESULTCLASS")
#define CLI_TOKEN_RESULTROLE _T("RESULTROLE")
#define CLI_TOKEN_ASSOCCLASS _T("ASSOCCLASS")
#define CLI_TOKEN_LOCALHOST _T("LOCALHOST")
#define NULL_STRING _T("\0")
#define NULL_CSTRING "\0"
#define BACK_SPACE 0x08
#define BLANK_CHAR 0x00
#define CARRIAGE_RETURN 0x0D
#define ASTERIX _T( "*" )
#define BEEP_SOUND _T( "\a" )
#define NULL_CHAR _T( '\0' )
#define TOKEN_NA _T("N/A")
#define MAXPASSWORDSIZE BUFFER64
#define FORMAT_STRING( buffer, format, value ) \
wsprintf( buffer, format, value )
#define EXCLUDESYSPROP _T("ExcludeSystemProperties")
#define NODESCAVLBL _T("<<Descripiton - Not Available>>")
#define UNICODE_SIGNATURE "\xFF\xFE"
#define UNICODE_BIGEND_SIGNATURE "\xFE\xFF"
#define UTF8_SIGNATURE "\xEF\xBB"
//////////////////////////////////////////////////////////////////////
// NUMERIC CONSTANTS //
//////////////////////////////////////////////////////////////////////
const WMICLIINT OUT_OF_MEMORY = 48111;
const WMICLIINT UNKNOWN_ERROR = 44520;
const WMICLIINT MOFCOMP_ERROR = 49999;
const WMICLIINT SET_CONHNDLR_ROUTN_FAIL = 48112;
const WMICLIINT NOINTERACTIVE = 0;
const WMICLIINT INTERACTIVE = 1;
const WMICLIINT DEFAULTMODE = 2;
const WMICLIINT DEFAULT_SCR_BUF_HEIGHT = 300;
const WMICLIINT DEFAULT_SCR_BUF_WIDTH = 1500;
//////////////////////////////////////////////////////////////////////
// ENUMERATED DATA TYPES //
//////////////////////////////////////////////////////////////////////
// IMPERSONATION LEVEL
typedef enum tag_IMPERSONATIONLEVEL
{
IMPDEFAULT = 0,
IMPANONYMOUS = 1,
IMPIDENTIFY = 2,
IMPERSONATE = 3,
IMPDELEGATE = 4
}IMPLEVEL;
// AUTHENTICATION LEVEL
typedef enum tag_AUTHENTICATIONLEVEL
{
AUTHDEFAULT = 0,
AUTHNONE = 1,
AUTHCONNECT = 2,
AUTHCALL = 3,
AUTHPKT = 4,
AUTHPKTINTEGRITY = 5,
AUTHPKTPRIVACY = 6
}AUTHLEVEL;
// HELP OPTION
typedef enum tag_HELPOPTION
{
HELPBRIEF = 0,
HELPFULL = 1
}HELPOPTION;
// ENUMERATED RETURN CODES for PARSER ENGINE
typedef enum tag_RETCODE
{
PARSER_ERROR = 0,
PARSER_DISPHELP = 1,
PARSER_EXECCOMMAND = 2,
PARSER_MESSAGE = 3,
PARSER_CONTINUE = 4,
PARSER_ERRMSG = 5,
PARSER_OUTOFMEMORY = 6
} RETCODE;
// ENUMERATED HELP OPTION POSSIBILITES
typedef enum tag_HELPTYPE
{
GlblAllInfo,
Namespace,
Role,
Node,
User,
Password,
Locale,
RecordPath,
Privileges,
Level,
AuthLevel,
Interactive,
Trace,
CmdAllInfo,
GETVerb,
SETVerb,
LISTVerb,
CALLVerb,
DUMPVerb,
ASSOCVerb,
CREATEVerb,
DELETEVerb,
AliasVerb,
PATH,
WHERE,
CLASS,
PWhere,
EXIT,
TRANSLATE,
EVERY,
FORMAT,
VERBSWITCHES,
DESCRIPTION,
GETSwitchesOnly,
LISTSwitchesOnly,
CONTEXTHELP,
GLBLCONTEXT,
ASSOCSwitchesOnly,
RESULTCLASShelp,
RESULTROLEhelp,
ASSOCCLASShelp,
FAILFAST,
REPEAT,
OUTPUT,
APPEND,
Aggregate
} HELPTYPE;
// ENUMERATED TOKEN LEVELS
typedef enum tag_TOKENLEVEL
{
LEVEL_ONE = 1,
LEVEL_TWO = 2
} TOKENLEVEL;
// ENUMERATED SESSION RETURN CODES.
typedef enum tag_SESSIONRETCODE
{
SESSION_ERROR = 0,
SESSION_SUCCESS = 1,
SESSION_QUIT = 2,
} SESSIONRETCODE;
// Property In or Out type for parameters
typedef enum tag_INOROUT
{
INP = 0,
OUTP = 1,
UNKNOWN = 2
} INOROUT;
typedef enum tag_GLBLSWITCHFLAG
{
NAMESPACE = 1,
NODE = 2,
USER = 4,
PASSWORD = 8,
LOCALE = 16
} GLBLSWITCHFLAG;
typedef enum tag_VERBTYPE
{
CLASSMETHOD = 0,
STDVERB = 1,
CMDLINE = 2,
NONALIAS = 3
} VERBTYPE;
typedef enum tag_ERRLOGOPT
{
NO_LOGGING = 0,
ERRORS_ONLY = 1,
EVERY_OPERATION = 2
} ERRLOGOPT;
// ENUMERATED Assoc Switches POSSIBILITES
typedef enum tag_ASSOCSwitch
{
RESULTCLASS = 0,
RESULTROLE = 1,
ASSOCCLASS = 2
} ASSOCSwitch;
// ENUMERATED Output or Append option
typedef enum tag_OUTPUTSPEC
{
STDOUT = 0,
CLIPBOARD = 1,
FILEOUTPUT = 2
} OUTPUTSPEC;
// ENUMERATED Interactive Option POSSIBILITES
typedef enum tag_INTEROPTION
{
NO = 0,
YES = 1,
HELP= 2
} INTEROPTION;
// ENUMERATED values for File types
typedef enum tag_FILETYPE
{
ANSI_FILE = 0,
UNICODE_FILE = 1,
UNICODE_BIGENDIAN_FILE = 2,
UTF8_FILE = 3
} FILETYPE;
//////////////////////////////////////////////////////////////////////
// TYPE DEFINITIONS //
//////////////////////////////////////////////////////////////////////
typedef vector<_TCHAR*> CHARVECTOR;
typedef vector<LPSTR> LPSTRVECTOR;
typedef map<_bstr_t, _bstr_t, less<_bstr_t> > BSTRMAP;
typedef map<_TCHAR*, _TCHAR*, less<_TCHAR*> > CHARMAP;
typedef basic_string<_TCHAR> STRING;
typedef map<_bstr_t, WMICLIINT> CHARINTMAP;
typedef vector<_bstr_t> BSTRVECTOR;
typedef map<_bstr_t, BSTRVECTOR, less<_bstr_t> > QUALDETMAP;
typedef struct tag_PROPERTYDETAILS
{
_bstr_t Derivation; // Derivation - actual property name.
_bstr_t Description; // Description about the property.
_bstr_t Type; // Type of property CIMTYPE.
_bstr_t Operation; // Read or Write flag for the property.
_bstr_t Default; // Default values in case of method parameters
INOROUT InOrOut; // Specifies Input or Output parameter in case
// of method arguments.
QUALDETMAP QualDetMap; // Qualifiers associated with the property.
} PROPERTYDETAILS;
typedef map<_bstr_t, PROPERTYDETAILS, less<_bstr_t> > PROPDETMAP;
typedef struct tag_METHODDETAILS // or VERBDETAILS
{
_bstr_t Description; // Desription.
_bstr_t Status; // Implemented or Not.
PROPDETMAP Params; // In and Out parameters and types of the method.
} METHODDETAILS;
typedef map<_bstr_t, METHODDETAILS, less<_bstr_t> > METHDETMAP;
typedef map<_bstr_t, BSTRVECTOR, less<_bstr_t> > ALSFMTDETMAP;
// For cascading transforms.
typedef struct tag_XSLTDET
{
_bstr_t FileName;
BSTRMAP ParamMap;
} XSLTDET;
typedef vector<XSLTDET> XSLTDETVECTOR;
//////////////////////////////////////////////////////////////////////
// USER DEFINED MACROS //
//////////////////////////////////////////////////////////////////////
// SAFEIRELEASE(pIObj)
#define SAFEIRELEASE(pIObj) \
if (pIObj) \
{ \
pIObj->Release(); \
pIObj = NULL; \
}
// SAFEBSTRFREE(bstrVal)
#define SAFEBSTRFREE(bstrVal) \
if(bstrVal) \
{ \
SysFreeString(bstrVal); \
bstrVal = NULL; \
}
// SAFEADESTROY(psaNames)
#define SAFEADESTROY(psaNames) \
if(psaNames) \
{ \
SafeArrayDestroy(psaNames); \
psaNames= NULL; \
}
// SAFEDELETE(pszVal)
#define SAFEDELETE(pszVal) \
if(pszVal) \
{ \
delete [] pszVal; \
pszVal = NULL; \
}
// VARIANTCLEAR(v)
#define VARIANTCLEAR(v) \
VariantClear(&v); \
// ONFAILTHROWERROR(hr)
#define ONFAILTHROWERROR(hr) \
if (FAILED(hr)) \
_com_issue_error(hr);
//////////////////////////////////////////////////////////////////////
// GLOBAL FUNCTIONS //
//////////////////////////////////////////////////////////////////////
// Compare two strings (ignore case) and returns TRUE if
// they are equal
BOOL CompareTokens(_TCHAR* pszToken1, _TCHAR* pszToken2);
// Connect to the WMI on the specified machine with input
// user credentials.
HRESULT Connect(IWbemLocator* pILocator, IWbemServices** pISvc,
BSTR bstrNS, BSTR bstrUser, BSTR bstrPwd,
BSTR bstrLocale, CParsedInfo& rParsedInfo);
// Set the security privileges at the interface level
HRESULT SetSecurity(IUnknown* pIUnknown, _TCHAR* pszAuthority,
_TCHAR* pszDomain, _TCHAR* pszUser,
_TCHAR* pszPassword, UINT uAuthLevel,
UINT uImpLevel);
// Parse Authority string into user and domain info.
SCODE ParseAuthorityUserArgs(BSTR& bstrAuthArg, BSTR& bstrUserArg,
BSTR& bstrAuthority, BSTR& bstrUser);
// Converts the UNICODE string to MBCS string
BOOL ConvertWCToMBCS(LPTSTR lpszMsg, LPVOID* lpszDisp, UINT uCP);
// Finds a string in the CHARVECTOR.
BOOL Find(CHARVECTOR& cvVector,
_TCHAR* pszStrToFind,
CHARVECTOR::iterator& theIterator);
// Finds a property in the PROPDETMAP.
BOOL Find(PROPDETMAP& pdmPropDetMap,
_TCHAR* pszPropToFind,
PROPDETMAP::iterator& theIterator,
BOOL bExcludeNumbers = FALSE);
// Finds a property in the BSTRMAP.
BOOL Find(BSTRMAP& bmBstrMap,
_TCHAR* pszStrToFind,
BSTRMAP::iterator& theIterator);
// Frames the XSL File path and updates the rParsedInfo object.
BOOL FrameFileAndAddToXSLTDetVector(XSLTDET xdXSLTDet,
CParsedInfo& rParsedInfo);
// Unquotes the string enclosed in double quotes.
void UnQuoteString(_TCHAR*& pszString);
// Display contents of a VARIANT type data object.
void DisplayVARIANTContent(VARIANT vtObject);
// Get Attributes of property
HRESULT GetPropertyAttributes(IWbemClassObject* pIObj,
BSTR bstrProp,
PROPERTYDETAILS& pdPropDet,
BOOL bTrace);
// Convert CIMTYPE to VariantType
HRESULT ConvertCIMTYPEToVarType( VARIANT& varDest, VARIANT& varSrc,
_TCHAR* bstrCIMType );
// Displays the localized string
void DisplayMessage(LPTSTR lpszMsg, UINT uCP = CP_OEMCP,
BOOL bIsError = FALSE, BOOL bIsLog = FALSE);
// Free memory held by
void CleanUpCharVector(CHARVECTOR& cvCharVector);
void FindAndReplaceAll(STRING& strString, _TCHAR* pszFromStr,
_TCHAR* pszToStr);
// Search and replace all the occurences of entity references.
void FindAndReplaceEntityReferences(_bstr_t& bstrString);
BOOL IsSysProp(_TCHAR* pszProp);
void EraseMessage(UINT uID);
//To display the trace of COM methods invoked
void WMITRACEORERRORLOG(HRESULT hr, INT nLine, char* pszFile, _bstr_t bstrMsg,
DWORD dwThreadId, CParsedInfo& rParsedInfo, BOOL bTrace,
DWORD dwError = 0, _TCHAR* pszResult = NULL);
// Displays wi32 error.
void DisplayWin32Error();
// Accepts password in invisible mode.
void AcceptPassword(_TCHAR* pszPassword);
// Checks for output redirection.
BOOL IsRedirection();
// Checks for value set or not.
BOOL IsValueSet(_TCHAR* pszFromValue, _TCHAR& cValue1, _TCHAR& cValue2);
// Handler routine to handle CTRL + C so as free
// the memory allocated during the program execution.
BOOL CtrlHandler(DWORD fdwCtrlType);
void DisplayString(UINT uID, UINT uCP, LPTSTR lpszParam = NULL,
BOOL bIsError = FALSE, BOOL bIsLog = FALSE);
void SubstituteEscapeChars(CHString& sTemp, LPCWSTR lpszSub);
void RemoveEscapeChars(CHString& sTemp);
//Frames the Namespace
void FrameNamespace(_TCHAR* pszRoleOrNS, _TCHAR* pszRoleOrNSToUpdate);
// Set the buffer size of the command line
void SetScreenBuffer(SHORT nHeight = DEFAULT_SCR_BUF_HEIGHT,
SHORT nWidth = DEFAULT_SCR_BUF_WIDTH);
// Get the buffer size of the command line
void GetScreenBuffer(SHORT& nHeight, SHORT& nWidth);
// Formats the resource string with parameter substitution.
void WMIFormatMessage(UINT uID, WMICLIINT nParamCount, _bstr_t& bstrMsg,
LPTSTR lpszParam, ...);
// Validates a node by using socket functions.
BOOL PingNode(_TCHAR* pszNode);
// If pszNodeName == NULL then check for GetNode() else pszNodeName itself.
BOOL IsFailFastAndNodeExist(CParsedInfo& rParsedInfo, _TCHAR* pszNodeName = NULL);
// Initilaizes windows socket interface.
BOOL InitWinsock ();
// Uninitializes windows socket interface.
BOOL TermWinsock ();
// Get _bstr_t object equivalent to Varaint passed.
void GetBstrTFromVariant(VARIANT& vtVar, _bstr_t& bstrObj,
_TCHAR* pszType = NULL);
// Close the output file.
BOOL CloseOutputFile();
// Close the append file.
BOOL CloseAppendFile();
// Checks if the next token indicates the presence
// of '/' or '-'
BOOL IsOption(_TCHAR* pszToken);
// Copy string to global memory.
HGLOBAL CopyStringToHGlobal(LPTSTR psz);
// Copy data to clip board.
void CopyToClipBoard(_bstr_t& bstrClipBoardBuffer);
// Checks file is valid or not.
RETCODE IsValidFile(_TCHAR* pszFileName);
// It checks whether the current operation is class
// level operation or instance level operation
BOOL IsClassOperation(CParsedInfo& rParsedInfo);
// Enable or Disable all privileges
HRESULT ModifyPrivileges(BOOL bEnable);
#endif