///////////////////////////////////////////////////////////////////////////////////////////////////////// // // Microsoft WMIOLE DB Provider // (C) Copyright 1999 Microsoft Corporation. All Rights Reserved. // // UtilProp.h - Header file for classes for managing properties ///////////////////////////////////////////////////////////////////////////////////////////////////////// #ifndef _UTILPROP_H_ #define _UTILPROP_H_ extern const GUID DBPROPSET_WMIOLEDB_DBINIT; extern const GUID DBPROPSET_WMIOLEDB_ROWSET; extern const GUID DBPROPSET_WMIOLEDB_COLUMN; extern const GUID DBPROPSET_WMIOLEDB_COMMAND; //////////////////////////////////////////////////////////////////////// // PRivileges property values //////////////////////////////////////////////////////////////////////// #define DBPROPVAL_CREATE_TOKEN 0x01 #define DBPROPVAL_ASSIGNPRIMARYTOKEN 0x02 #define DBPROPVAL_LOCK_MEMORY 0x04 #define DBPROPVAL_INCREASE_QUOTA 0x08 #define DBPROPVAL_MACHINE_ACCOUNT 0x10 #define DBPROPVAL_TCB 0x20 #define DBPROPVAL_SECURITY 0x40 #define DBPROPVAL_TAKE_OWNERSHIP 0x80 #define DBPROPVAL_LOAD_DRIVER 0x100 #define DBPROPVAL_SYSTEM_PROFILE 0x200 #define DBPROPVAL_SYSTEMTIME 0x400 #define DBPROPVAL_PROF_SINGLE_PROCESS 0x800 #define DBPROPVAL_INC_BASE_PRIORITY 0x1000 #define DBPROPVAL_CREATE_PAGEFILE 0x2000 #define DBPROPVAL_CREATE_PERMANENT 0x4000 #define DBPROPVAL_BACKUP 0x8000 #define DBPROPVAL_RESTORE 0x10000 #define DBPROPVAL_SHUTDOWN 0x20000 #define DBPROPVAL_DEBUG 0x40000 #define DBPROPVAL_AUDIT 0x80000 #define DBPROPVAL_SYSTEM_ENVIRONMENT 0x100000 #define DBPROPVAL_CHANGE_NOTIFY 0x200000 #define DBPROPVAL_REMOTE_SHUTDOWN 0x400000 #define DBPROPVAL_UNDOCK 0x800000 #define DBPROPVAL_SYNC_AGENT 0x1000000 #define DBPROPVAL_ENABLE_DELEGATION 0x2000000 #define NUMBEROF_PRIVELAGES 26 #define NUMBEROF_SEARCHPREF 14 //DBPROP_WMIOLEDB_OBJECTTYPE property values #define DBPROPVAL_NOOBJ 0 #define DBPROPVAL_SCOPEOBJ 1 #define DBPROPVAL_CONTAINEROBJ 2 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // // simple table used to store property information. Used in // our read-only implementation of IDBProperties::GetPropertyInfo and IRowsetInfo::GetProperties // ///////////////////////////////////////////////////////////////////////////////////////////////////////// struct _tagPROPSTRUCT { DBPROPID dwPropertyID; DBPROPFLAGS dwFlags; VARTYPE vtType; BOOL boolVal; SLONG longVal; PWSTR pwstrVal; PWSTR pwstrDescBuffer; ~_tagPROPSTRUCT() { // Only for Datasource , string will allocated by the utility if( vtType == VT_BSTR && pwstrVal != NULL && DBPROP_INIT_DATASOURCE == dwPropertyID ) { // SysFreeString((BSTR)pwstrVal); SAFE_DELETE_ARRAY(pwstrVal); pwstrVal = NULL; } } }; typedef _tagPROPSTRUCT PROPSTRUCT; ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Property ID of the WMIOLEDB custom properties ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define DBPROP_WMIOLEDB_FETCHDEEP 0x1000 #define DBPROP_WMIOLEDB_QUALIFIERS 0x1001 #define DBPROP_WMIOLEDB_QUALIFIERFLAVOR 0x1002 #define DBPROP_WMIOLEDB_SYSTEMPROPERTIES 0x1003 #define DBPROP_WMIOLEDB_OBJECTTYPE 0x1005 #define DBPROP_WMIOLEDB_PREV_CREATE_TOKEN 0x1006 #define DBPROP_WMIOLEDB_PREV_ASSIGNPRIMARYTOKEN 0x1007 #define DBPROP_WMIOLEDB_PREV_LOCK_MEMORY 0x1008 #define DBPROP_WMIOLEDB_PREV_INCREASE_QUOTA 0x1009 #define DBPROP_WMIOLEDB_PREV_MACHINE_ACCOUNT 0x100a #define DBPROP_WMIOLEDB_PREV_TCB 0x100b #define DBPROP_WMIOLEDB_PREV_SECURITY 0x100c #define DBPROP_WMIOLEDB_PREV_TAKE_OWNERSHIP 0x100d #define DBPROP_WMIOLEDB_PREV_LOAD_DRIVER 0x100e #define DBPROP_WMIOLEDB_PREV_SYSTEM_PROFILE 0x100f #define DBPROP_WMIOLEDB_PREV_SYSTEMTIME 0x1010 #define DBPROP_WMIOLEDB_PREV_PROF_SINGLE_PROCESS 0x1011 #define DBPROP_WMIOLEDB_PREV_INC_BASE_PRIORITY 0x1012 #define DBPROP_WMIOLEDB_PREV_CREATE_PAGEFILE 0x1013 #define DBPROP_WMIOLEDB_PREV_CREATE_PERMANENT 0x1014 #define DBPROP_WMIOLEDB_PREV_BACKUP 0x1015 #define DBPROP_WMIOLEDB_PREV_RESTORE 0x1016 #define DBPROP_WMIOLEDB_PREV_SHUTDOWN 0x1017 #define DBPROP_WMIOLEDB_PREV_DEBUG 0x1018 #define DBPROP_WMIOLEDB_PREV_AUDIT 0x1019 #define DBPROP_WMIOLEDB_PREV_SYSTEM_ENVIRONMENT 0x101a #define DBPROP_WMIOLEDB_PREV_CHANGE_NOTIFY 0x101b #define DBPROP_WMIOLEDB_PREV_REMOTE_SHUTDOWN 0x101c #define DBPROP_WMIOLEDB_PREV_UNDOCK 0x101d #define DBPROP_WMIOLEDB_PREV_SYNC_AGENT 0x101e #define DBPROP_WMIOLEDB_PREV_ENABLE_DELEGATION 0x101f #define DBPROP_WMIOLEDB_DS_DEREFALIAS 0x1020 #define DBPROP_WMIOLEDB_DS_SIZELIMIT 0x1021 #define DBPROP_WMIOLEDB_DS_PAGEDTIMELIMIT 0x1022 #define DBPROP_WMIOLEDB_DS_TOMBSTONE 0x1023 #define DBPROP_WMIOLEDB_DS_SEARCHSCOPE 0x1024 #define DBPROP_WMIOLEDB_DS_TIMEOUT 0x1025 #define DBPROP_WMIOLEDB_DS_PAGESIZE 0x1026 #define DBPROP_WMIOLEDB_DS_TIMELIMIT 0x1027 #define DBPROP_WMIOLEDB_DS_CHASEREF 0x1028 #define DBPROP_WMIOLEDB_DS_ATTRIBUTES 0x1029 #define DBPROP_WMIOLEDB_DS_CACHERESULTS 0x102a #define DBPROP_WMIOLEDB_DS_FILTER 0x102b #define DBPROP_WMIOLEDB_DS_ATTRIBONLY 0x102c #define DBPROP_WMIOLEDB_DS_ASYNCH 0x102d #define DBPROP_WMIOLEDB_ISMETHOD 0x102e #define DBPROP_WMIOLEDB_AUTHORITY 0x102f #define DBPROP_WMIOLEDB_QUERYLANGUAGE 0x1030 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // DBPROP_WMIOLEDB_QUALIFIERS property values ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define DBPROP_WM_CLASSQUALIFIERS 0x1 #define DBPROP_WM_PROPERTYQUALIFIERS 0x2 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // DBPROP_WMIOLEDB_QUALIFIERFLAVOR property values ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define DBPROPVAL_FLAVOR_PROPOGAGTE_TO_INSTANCE WBEM_FLAVOR_FLAG_PROPAGATE_TO_INSTANCE #define DBPROPVAL_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS WBEM_FLAVOR_FLAG_PROPAGATE_TO_DERIVED_CLASS #define DBPROPVAL_FLAVOR_NOT_OVERRIDABLE WBEM_FLAVOR_NOT_OVERRIDABLE #define DBPROPVAL_FLAVOR_OVERRIDABLE WBEM_FLAVOR_OVERRIDABLE #define DBPROPVAL_FLAVOR_AMENDED WBEM_FLAVOR_AMENDED ///////////////////////////////////////////////////////////////////////////////////////////////////////// // flags for IDBProperties::GetPropertyInfo ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define FLAGS_ROWSETRO (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ) #define FLAGS_ROWSETRW (DBPROPFLAGS_ROWSET | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define FLAGS_DATASRCINF (DBPROPFLAGS_DATASOURCEINFO | DBPROPFLAGS_READ) #define FLAGS_DBINITRW (DBPROPFLAGS_DBINIT | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) #define FLAGS_COLUMNSRW (DBPROPFLAGS_COLUMN | DBPROPFLAGS_READ | DBPROPFLAGS_WRITE) enum PROPERTYTYPE { DATASOURCEPROP, SESSIONPROP, ROWSETPROP, COMMANDPROP, BINDERPROP, COLUMNPROP, }; ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Number of supported properties per property set ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES 9 #define NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES 10 #define NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES 25 #define NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES 18 #define NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES 0 #define NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES 29 #define NUMBER_OF_SUPPORTED_SESSION_PROPERTIES 0 #define NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES 3 #define NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES 1 #define NUMBER_OF_PREVILAGE_PROPERTIES 26 #define START_OF_PREVILAGE_PROPERTIES START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES + 2 // 2 other // WMIOLEDB_INIT properties #define NUMBER_OF_SUPPORTED_PROPERTY_SETS 7 #define START_OF_SUPPORTED_DBINIT_PROPERTIES 0 #define START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES #define START_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES (START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES +NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES) #define START_OF_SUPPORTED_SESSION_PROPERTIES (START_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES) #define START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES (START_OF_SUPPORTED_SESSION_PROPERTIES + NUMBER_OF_SUPPORTED_SESSION_PROPERTIES) #define START_OF_SUPPORTED_ROWSET_PROPERTIES (START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES) #define START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES (START_OF_SUPPORTED_ROWSET_PROPERTIES + NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES) #define START_OF_SUPPORTED_COLUMN_PROPERTIES (START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES) #define START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES (START_OF_SUPPORTED_COLUMN_PROPERTIES + NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES) #define NUMBER_OF_SUPPORTED_PROPERTIES \ ( NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES + \ NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + \ NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES + \ NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES + \ NUMBER_OF_SUPPORTED_SESSION_PROPERTIES + \ NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES + \ NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + \ NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES + \ NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES) ////////////////////////////////////////////////////////////////////////// // Index of properties returned by function GetConnectionInitProperties ////////////////////////////////////////////////////////////////////////// #define IDX_DBPROP_INIT_DATASOURCE 0 #define IDX_DBPROP_INIT_PROTECTION_LEVEL 1 #define IDX_DBPROP_INIT_IMPERSONATION_LEVEL 2 #define IDX_DBPROP_AUTH_USERID 3 #define IDX_DBPROP_AUTH_PASSWORD 4 #define IDX_DBPROP_INIT_LCID 5 #define IDX_DBPROP_WMIOLEDB_AUTHORITY 6 #define NUMBER_OF_CONNECTIONINIT_PROP 7 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // Flags for different Rowset Properties ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define CANHOLDROWS 0x1 #define CANSCROLLBACKWARDS 0x2 #define CANFETCHBACKWARDS 0x4 #define OTHERUPDATEDELETE 0x8 #define OWNINSERT 0x10 #define REMOVEDELETED 0x20 #define OTHERINSERT 0x40 #define OWNUPDATEDELETE 0x80 #define LITERALIDENTITY 0x100 #define IROWSETCHANGE 0x200 #define BOOKMARKPROP 0x400 #define FETCHDEEP 0x800 #define IROWSETLOCATE 0x1000 #define IGETROW 0x2000 #define IROWSETREFRESH 0x4000 #define ICHAPTEREDROWSET 0x8000 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // description size ///////////////////////////////////////////////////////////////////////////////////////////////////////// #define CCH_GETPROPERTYINFO_DESCRIP_BUFFER_SIZE 50 #define MAXOPENROWS 2048 ///////////////////////////////////////////////////////////////////////////////////////////////////////// // flags for Get and Set Properties ///////////////////////////////////////////////////////////////////////////////////////////////////////// const DWORD PROPSET_DSO = 0x0001; const DWORD PROPSET_INIT = 0x0002; const DWORD PROPSET_DSOINIT = PROPSET_DSO | PROPSET_INIT; const DWORD PROPSET_SESSION = 0x0004; const DWORD PROPSET_ROWSET = 0x0008; const DWORD PROPSET_COLUMN = 0x0010; const DWORD PROPSET_COMMAND = 0x0020; ///////////////////////////////////////////////////////////////////////////////////////////////////////// class CPropertyMemoryMgr { public: //================================================================================ // //================================================================================ HRESULT AllocDESCRIPTBuffer(WCHAR *& pDescBuffer, WCHAR** ppDescBuffer, ULONG cProperties); HRESULT AllocDBPROPINFOSET(DBPROPINFOSET *& pPropInfoSet, const ULONG cProps); HRESULT AllocDBPROPINFO(DBPROPINFO *& pPropInfo, DBPROPINFOSET * pPropInfoSet,ULONG ulPropSets); HRESULT AllocDBPROPSET(DBPROPSET*& ppPropSet, const ULONG cPropSets); HRESULT AllocateDBPROP(DBPROP*& ppProp, const ULONG cProperties); HRESULT AllocDBCOLUMNDESC(DBCOLUMNDESC*& ppCOLUMNDESC, const ULONG cColumnDescs); void FreeDBPROPINFOSET(DBPROPINFOSET *& pPropInfoSet, const ULONG cProps); void FreeDESCRIPTBuffer(WCHAR *& pDescBuffer, WCHAR** ppDescBuffer); void FreeDBPROPINFO(DBPROPINFO *& pPropInfo, const ULONG cProps); // static void FreeDBPROPSET( ULONG cPropertySets, DBPROPSET *& prgPropertySets); void FreeDBCOLUMNDESC(DBCOLUMNDESC rgColumnDescs[], LONG cColumns); HRESULT CopyDBPROPSET(DBPROPSET*& pDestination, DBPROPSET*& pSource); HRESULT CopyDBCOLUMNDESC(DBCOLUMNDESC*& pDestination, DBCOLUMNDESC*& pSource); HRESULT SetDefaultValueForStringProperties(PROPSTRUCT * prgPropeties,ULONG cProperties); static void CPropertyMemoryMgr::FreeDBPROPSET( ULONG cPropertySets, DBPROPSET *& prgPropertySets) { //============================================================================== // Free the memory //============================================================================== if (prgPropertySets){ for( ULONG i = 0; i < cPropertySets; i++ ){ for(ULONG ulIndex=0; ulIndexFree(prgPropertySets[i].rgProperties); } g_pIMalloc->Free(prgPropertySets); } } }; ///////////////////////////////////////////////////////////////////////////////////////////////////////// class CUtilProp { protected: PROPSTRUCT * m_prgproperties; PROPERTYTYPE m_propType ; ULONG m_cProperties; ULONG m_nPropStartIndex ; HRESULT CheckPropertyIDSets ( BOOL & fIsNotSpecialGUID, BOOL & fIsSpecialGUID, ULONG cPropertyIDSets, const DBPROPIDSET rgPropertyIDSets[] ) ; BOOL GetPropIndex( DBPROPID dwPropertyID,ULONG* pulIndex); //Gets index of entry for a given property in property set BOOL GetPropIndexFromAllSupportedProps( DBPROPID dwPropertyID,ULONG* pulIndex); //Gets index of entry for a given property in global property table BOOL LoadDBPROPINFO(PROPSTRUCT* pPropStruct,DBPROPINFO* pPropInfo ); //Loads fields of DBPROPINFO struct. Helper for GetPropertyInfo BOOL LoadDBPROP(PROPSTRUCT* pPropStruct,DBPROP* pPropSupport); //Loads fields of DBPROP struct. Helper for GetProperties HRESULT IsValidValue(DBPROP* pDBProp ); //Checks to see if the value is valid. Helper for SetProperties BOOL IsPropertySetSupported(const GUID guidPropset); ULONG GetNumberofPropInfoToBeReturned( BOOL bDSOInitialized, ULONG cPropertyIDSets, const DBPROPIDSET rgPropertyIDSets[]); void FillPropertySets(BOOL fDSOInitialized, const DBPROPIDSET rgPropIDSets[], ULONG cPropIDSets, DBPROPINFOSET* pPropInfoSet, ULONG &cProperties); public: CUtilProp(); CUtilProp(PROPERTYTYPE propType); ~CUtilProp(void); CPropertyMemoryMgr m_PropMemMgr; HRESULT FInit(PROPERTYTYPE propType); HRESULT SetPropertiesArgChk(const ULONG cProperties, const DBPROPSET rgProperties[] ,BOOL bDSOInitialized = TRUE); HRESULT GetPropertiesArgChk( DWORD dwBitMask, const ULONG cPropertySets, const DBPROPIDSET rgPropertySets[], ULONG* pcProperties, DBPROPSET** prgProperties,BOOL bDSOInitialized = TRUE); STDMETHODIMP GetProperties ( DWORD dwBitMask, ULONG cPropertySets, const DBPROPIDSET rgPropertySets[], ULONG* pcProperties, DBPROPSET** prgProperties ); STDMETHODIMP GetPropertyInfo (BOOL fDSOInitialized, ULONG cPropertySets, const DBPROPIDSET rgPropertySets[], ULONG* pcPropertyInfoSets, DBPROPINFOSET** prgPropertyInfoSets,WCHAR** ppDescBuffer); STDMETHODIMP SetProperties( const DWORD dwBitMask, const ULONG cProperties,DBPROPSET rgProperties[]); // DWORD GetImpLevel(DWORD dwImpPropVal); // DWORD GetAuthnLevel(DWORD dwAuthnPropVal); HRESULT ResetProperties(); ULONG GetNumberOfPropertySets(BOOL fDSOInitialized,const DBPROPIDSET rgPropIDSets[],ULONG cPropIDSets); ULONG GetNumberOfPropertySets(BOOL fDSOInitialized,DWORD dwBitMask); HRESULT IsValidPropertySet(BOOL fDSOInitialized,const GUID guidPropset); HRESULT FillPropStruct(BOOL fDSOInitialized,DWORD dwBitMask,DBPROPSET* pPropSet); HRESULT GetConnectionInitProperties(DBPROPSET** pprgPropertySets); HRESULT SetDefaultValueForStringProperties(PROPSTRUCT * prgPropeties,ULONG cProperties); }; typedef CUtilProp *PCUTILPROP; class CPreviligeToken { TOKEN_PRIVILEGES *m_pPrevTokenPrev; int m_nMemAllocated; void OpenToken(HANDLE &hToken); public: CPreviligeToken(); ~CPreviligeToken(); // NTRaid: 136443 // 07/05/00 HRESULT FInit(); BOOL AdjustTokenPrivileges(ULONG cProps , DBPROP rgProp[]); void SetDBPROPForPrivileges(ULONG cProps , DBPROP *rgProp); void ConvertDBPropToPriveleges(ULONG cProps , DBPROP rgProp[]); BOOL AdjustTokenPrivileges(ULONG ulProperty); void SetDBPROPForPrivileges(ULONG &ulProperty); void ConvertDBPropToPriveleges(ULONG ulProperty); void GetCurrentPrivelegeToken(); BOOL GetPropIndex (ULONG cProps ,DBPROP rgProp[],DBPROPID dwPropertyID,LONG* pulIndex); }; #endif