3781 lines
132 KiB
C++
3781 lines
132 KiB
C++
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft WMIOLE DB Provider
|
||
|
// (C) Copyright 1999 Microsoft Corporation. All Rights Reserved.
|
||
|
//
|
||
|
// Properties utility object implementation
|
||
|
//
|
||
|
//
|
||
|
// Notes - there are two main methods in this module:
|
||
|
// - CUtilProps::GetPropertyInfo, a helper function for IDBInfo::GetPropertyInfo
|
||
|
// - CUtilProps::GetProperties, a helper function for IRowsetInfo::GetProperties
|
||
|
//
|
||
|
// Our property implementation is simplified considerably by the fact that we
|
||
|
// only support reading\getting the properties, we do not support
|
||
|
// writing\setting them. This makes sense because we are a simple provider,
|
||
|
// and our rowset object always creates all the interfaces it exposes. In
|
||
|
// other words, there are really no properties the consumer could set.
|
||
|
//
|
||
|
// The implementation is very simple - we keep a global table of the
|
||
|
// properties we support in s_rgprop. We search this table sequentially.
|
||
|
//
|
||
|
// Note that a full-featured provider would probably need to use a more
|
||
|
// sophisticated implementation. We keep the entire GUID for each property in
|
||
|
// our struct, which would become a waste of space if we had a lot more
|
||
|
// properties. Similarly, with large numbers of properties some sort of
|
||
|
// hashing would be better than the sequential search used here.
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#include "headers.h"
|
||
|
#include "wmiver.h"
|
||
|
|
||
|
#define __TXT(x) L ## x
|
||
|
#define _TEXT_T(x) __TXT(x)
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Struct containing the properties we know about. The GUID and string fields are
|
||
|
// initialized in the constructor, because C++ makes it awkward to do so at declaration
|
||
|
// time. So, if you change this table, be sure to make parallel changes in CUtilProp::CUtilProp.
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
#define PRIVILEGE_NAMESIZE 255
|
||
|
|
||
|
const GUID DBPROPSET_WMIOLEDB_DBINIT = {0xdd497a71,0x9628,0x11d3,{0x9d,0x5f,0x0,0xc0,0x4f,0x5f,0x11,0x64}};
|
||
|
const GUID DBPROPSET_WMIOLEDB_ROWSET = {0x8d16c220,0x9bbb,0x11d3,{0x9d,0x65,0x0,0xc0,0x4f,0x5f,0x11,0x64}};
|
||
|
const GUID DBPROPSET_WMIOLEDB_COLUMN = {0x3ed51791,0x9c76,0x11d3,{0x9d,0x66,0x0,0xc0,0x4f,0x5f,0x11,0x64}};
|
||
|
const GUID DBPROPSET_WMIOLEDB_COMMAND = {0xda0ff63c,0xad10,0x11d3,{0xb3,0xcb,0x0,0x10,0x4b,0xcc,0x48,0xc4}};
|
||
|
|
||
|
PROPSTRUCT s_rgprop[] =
|
||
|
{
|
||
|
/* 0*/ {DBPROP_INIT_DATASOURCE, FLAGS_DBINITRW, VT_BSTR, FALSE, 0, NULL, L"Data Source"},
|
||
|
/* 1*/ {DBPROP_INIT_HWND, FLAGS_DBINITRW, VT_I4, FALSE, 0, NULL, L"Window Handle"},
|
||
|
/* 2*/ {DBPROP_INIT_PROMPT, FLAGS_DBINITRW, VT_I2, FALSE, 4, NULL, L"Prompt"},
|
||
|
/* 3*/ {DBPROP_INIT_PROTECTION_LEVEL, FLAGS_DBINITRW, VT_I4, FALSE, DB_PROT_LEVEL_CONNECT, NULL, L"Protection Level"},
|
||
|
/* 4*/ {DBPROP_INIT_IMPERSONATION_LEVEL, FLAGS_DBINITRW, VT_I4, FALSE, DB_IMP_LEVEL_IMPERSONATE, NULL, L"Impersonation Level"},
|
||
|
/* 5*/ {DBPROP_INIT_MODE, FLAGS_DBINITRW, VT_I4, TRUE, DB_MODE_READWRITE, NULL, L"Mode"},
|
||
|
/* 6*/ {DBPROP_AUTH_USERID, FLAGS_DBINITRW, VT_BSTR, FALSE, 0, NULL, L"User ID"},
|
||
|
/* 7*/ {DBPROP_AUTH_PASSWORD, FLAGS_DBINITRW, VT_BSTR, FALSE, 0, NULL, L"Password"},
|
||
|
/* 8*/ {DBPROP_INIT_LCID, FLAGS_DBINITRW, VT_I4, FALSE, 0, NULL, L"Locale Identifier"},
|
||
|
|
||
|
/* 9*/ {DBPROP_WMIOLEDB_QUALIFIERS , FLAGS_DBINITRW , VT_I4, FALSE , 0,NULL, L"Qualifiers"},
|
||
|
/* 10*/ {DBPROP_WMIOLEDB_SYSTEMPROPERTIES , FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"System Properties"},
|
||
|
/* 11*/ {DBPROP_WMIOLEDB_AUTHORITY , FLAGS_DBINITRW , VT_BSTR, FALSE , 0,NULL, L"Authority"},
|
||
|
|
||
|
|
||
|
// security priveleges
|
||
|
/* 12*/ {DBPROP_WMIOLEDB_PREV_CREATE_TOKEN, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Create Token Privilege"},
|
||
|
/* 13*/ {DBPROP_WMIOLEDB_PREV_ASSIGNPRIMARYTOKEN, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Assign Primary Token Privilege"},
|
||
|
/* 14*/ {DBPROP_WMIOLEDB_PREV_LOCK_MEMORY, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Lock Memory Privilege"},
|
||
|
/* 15*/ {DBPROP_WMIOLEDB_PREV_INCREASE_QUOTA, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Increase Quota Privilege"},
|
||
|
/* 16*/ {DBPROP_WMIOLEDB_PREV_MACHINE_ACCOUNT, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Machine Account Privilege"},
|
||
|
/* 17*/ {DBPROP_WMIOLEDB_PREV_TCB, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Tcb Privilege"},
|
||
|
/* 18*/ {DBPROP_WMIOLEDB_PREV_SECURITY, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Security Privilege"},
|
||
|
/* 19*/ {DBPROP_WMIOLEDB_PREV_TAKE_OWNERSHIP, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Take Ownership Privilege"},
|
||
|
/* 20*/ {DBPROP_WMIOLEDB_PREV_LOAD_DRIVER, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Load Driver Privilege"},
|
||
|
/* 21*/ {DBPROP_WMIOLEDB_PREV_SYSTEM_PROFILE, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"System Profile Privilege"},
|
||
|
/* 22*/ {DBPROP_WMIOLEDB_PREV_SYSTEMTIME, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Systemtime Privilege"},
|
||
|
/* 23*/ {DBPROP_WMIOLEDB_PREV_PROF_SINGLE_PROCESS, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Profile SingleProcess Privilege"},
|
||
|
/* 24*/ {DBPROP_WMIOLEDB_PREV_INC_BASE_PRIORITY, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Increase BasePriority Privilege"},
|
||
|
/* 25*/ {DBPROP_WMIOLEDB_PREV_CREATE_PAGEFILE , FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Create Pagefile Privilege"},
|
||
|
/* 26*/ {DBPROP_WMIOLEDB_PREV_CREATE_PERMANENT , FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Create Permanent Privilege"},
|
||
|
/* 27*/ {DBPROP_WMIOLEDB_PREV_BACKUP, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Backup Privilege"},
|
||
|
/* 28*/ {DBPROP_WMIOLEDB_PREV_RESTORE, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Restore Privilege"},
|
||
|
/* 29*/ {DBPROP_WMIOLEDB_PREV_SHUTDOWN, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Shutdown Privilege"},
|
||
|
/* 30*/ {DBPROP_WMIOLEDB_PREV_DEBUG, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Debug Privilege"},
|
||
|
/* 31*/ {DBPROP_WMIOLEDB_PREV_AUDIT , FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Audit Privilege"},
|
||
|
/* 32*/ {DBPROP_WMIOLEDB_PREV_SYSTEM_ENVIRONMENT , FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"System Environment Privilege"},
|
||
|
/* 33*/ {DBPROP_WMIOLEDB_PREV_CHANGE_NOTIFY, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Change Notify Privilege"},
|
||
|
/* 34*/ {DBPROP_WMIOLEDB_PREV_REMOTE_SHUTDOWN, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Remote Shutdown Privilege"},
|
||
|
/* 35*/ {DBPROP_WMIOLEDB_PREV_UNDOCK, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Undock Privilege"},
|
||
|
/* 36*/ {DBPROP_WMIOLEDB_PREV_SYNC_AGENT, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"SyncAgent Privilege"},
|
||
|
/* 37*/ {DBPROP_WMIOLEDB_PREV_ENABLE_DELEGATION, FLAGS_DBINITRW , VT_BOOL, FALSE , 0,NULL, L"Enable Delegation Privilege"},
|
||
|
|
||
|
// Session properties should come here
|
||
|
|
||
|
// Data Source properties
|
||
|
|
||
|
/* 38*/ {DBPROP_ACTIVESESSIONS, FLAGS_DATASRCINF, VT_I4, FALSE, 1, NULL, L"Active Sessions"},
|
||
|
/* 39*/ {DBPROP_PERSISTENTIDTYPE, FLAGS_DATASRCINF, VT_I4, FALSE, DBPROPVAL_PT_GUID_PROPID, NULL, L"Persistent ID Type"},
|
||
|
/* 40*/ {DBPROP_PROVIDERFILENAME, FLAGS_DATASRCINF, VT_BSTR, FALSE, 0, L"WMIOLEDB.DLL",L"Provider Name"},
|
||
|
/* 41*/ {DBPROP_PROVIDERFRIENDLYNAME, FLAGS_DATASRCINF, VT_BSTR, FALSE, 0, L"Microsoft WMIOLE DB Provider",L"Provider Friendly Name"},
|
||
|
/* 42*/ {DBPROP_PROVIDEROLEDBVER, FLAGS_DATASRCINF, VT_BSTR, FALSE, 0, L"02.00", L"OLE DB Version"},
|
||
|
/* 43*/ {DBPROP_PROVIDERVER, FLAGS_DATASRCINF, VT_BSTR, FALSE, 0, _TEXT_T(VER_PRODUCTVERSION_STR), L"Provider Version"},
|
||
|
/* 44*/ {DBPROP_GENERATEURL, FLAGS_DATASRCINF, VT_I4, FALSE, DBPROPVAL_GU_NOTSUPPORTED, NULL, L"URL Generation"},
|
||
|
/* 45*/ {DBPROP_ALTERCOLUMN, FLAGS_DATASRCINF, VT_I4, FALSE, DBCOLUMNDESCFLAGS_PROPERTIES, NULL, L"Alter Column Support"},
|
||
|
/* 45*/ {DBPROP_MULTIPLERESULTS, FLAGS_DATASRCINF, VT_I4, FALSE, 0, NULL, L"Multiple Results"},
|
||
|
/* 45*/ {DBPROP_OLEOBJECTS, FLAGS_DATASRCINF, VT_I4, FALSE, DBPROPVAL_OO_ROWOBJECT, NULL, L"OLE Object Support"},
|
||
|
|
||
|
// Command properties should come here
|
||
|
///* 75*/ {DBPROP_WMIOLEDB_ISMETHOD, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Method"},
|
||
|
///* 75*/ {DBPROP_WMIOLEDB_QUERYLANGUAGE, FLAGS_ROWSETRW, VT_BSTR, FALSE, 0, NULL, L"Query Language"},
|
||
|
|
||
|
|
||
|
/* 46*/ {DBPROP_IAccessor, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IAccessor"},
|
||
|
/* 47*/ {DBPROP_IColumnsInfo, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IColumnsInfo"},
|
||
|
/* 48*/ {DBPROP_IConvertType, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IConvertType"},
|
||
|
/* 49*/ {DBPROP_IRowset, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IRowset"},
|
||
|
/* 50*/ {DBPROP_IRowsetChange, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"IRowsetChange"},
|
||
|
/* 51*/ {DBPROP_IRowsetInfo, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IRowsetInfo"},
|
||
|
/* 52*/ {DBPROP_IRowsetIdentity, FLAGS_ROWSETRO, VT_BOOL, TRUE, 0, NULL, L"IRowsetIdentity"},
|
||
|
/* 53*/ {DBPROP_IRowsetLocate, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"IRowsetLocate"},
|
||
|
/* 54*/ {DBPROP_CANHOLDROWS, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"Hold Rows"},
|
||
|
/* 55*/ {DBPROP_LITERALIDENTITY, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"Literal Row Identity"},
|
||
|
/* 56*/ {DBPROP_UPDATABILITY, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Updatability"},
|
||
|
/* 57*/ {DBPROP_OWNUPDATEDELETE, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Own Changes Visible"},
|
||
|
///**/ {DBPROP_IRowsetUpdate, FLAGS_ROWSETRO, VT_BOOL, FALSE, 0, NULL, L"IRowsetUpdate"},
|
||
|
/* 58*/ {DBPROP_ISequentialStream, FLAGS_ROWSETRO, VT_BOOL, FALSE, 0, NULL, L"ISequentialStream"},
|
||
|
/* 59*/ {DBPROP_OTHERUPDATEDELETE, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Others' Changes Visible"},
|
||
|
/* 60*/ {DBPROP_CANFETCHBACKWARDS, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Fetch Backwards"},
|
||
|
/* 61*/ {DBPROP_CANSCROLLBACKWARDS, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Scroll Backwards"},
|
||
|
/* 62*/ {DBPROP_BOOKMARKS, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"Use Bookmarks"},
|
||
|
/* 63*/ {DBPROP_BOOKMARKTYPE, FLAGS_ROWSETRO, VT_I4, TRUE, DBPROPVAL_BMK_NUMERIC, NULL, L"Bookmark Type"},
|
||
|
/* 64*/ {DBPROP_IRow, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"IRow"},
|
||
|
/* 65*/ {DBPROP_IGetRow, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"IGetRow"},
|
||
|
/* 66*/ {DBPROP_IRowsetRefresh, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"IRowsetRefresh"},
|
||
|
/* 67*/ {DBPROP_IChapteredRowset, FLAGS_ROWSETRW, VT_BOOL, TRUE, 0, NULL, L"IChapteredRowset"},
|
||
|
/* 68*/ {DBPROP_REMOVEDELETED, FLAGS_ROWSETRO, VT_BOOL, FALSE, 0, NULL, L"Remove Deleted Rows"},
|
||
|
/* 69*/ {DBPROP_OTHERINSERT, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Others' Inserts Visible"},
|
||
|
/* 70*/ {DBPROP_MAXOPENROWS, FLAGS_ROWSETRW, VT_I4, TRUE, 1024, NULL, L"Maximum Open Rows"},
|
||
|
|
||
|
// WMIOLEDB_ROWSET properties
|
||
|
/* 73*/ {DBPROP_WMIOLEDB_FETCHDEEP, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Get Child Instances"},
|
||
|
/* 74*/ {DBPROP_WMIOLEDB_OBJECTTYPE, FLAGS_ROWSETRW, VT_I4, TRUE, DBPROPVAL_SCOPEOBJ, NULL, L"Type of Object"},
|
||
|
/* 75*/ {DBPROP_WMIOLEDB_ISMETHOD, FLAGS_ROWSETRW, VT_BOOL, FALSE, 0, NULL, L"Method"},
|
||
|
/* 75*/ {DBPROP_WMIOLEDB_QUERYLANGUAGE, FLAGS_ROWSETRW, VT_BSTR, FALSE, 0, NULL, L"Query Language"},
|
||
|
|
||
|
// ADSI Search Preferences
|
||
|
/* 76*/ {DBPROP_WMIOLEDB_DS_DEREFALIAS, FLAGS_ROWSETRW, VT_I4, FALSE, 0, NULL, L"Deref Aliases"},
|
||
|
/* 77*/ {DBPROP_WMIOLEDB_DS_SIZELIMIT, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Size Limit"},
|
||
|
/* 78*/ {DBPROP_WMIOLEDB_DS_SEARCHSCOPE, FLAGS_ROWSETRW, VT_I4, FALSE, 0, NULL, L"SearchScope"},
|
||
|
/* 79*/ {DBPROP_WMIOLEDB_DS_TIMEOUT, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Timeout"},
|
||
|
/* 80*/ {DBPROP_WMIOLEDB_DS_PAGESIZE, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Page Size"},
|
||
|
/* 81*/ {DBPROP_WMIOLEDB_DS_TIMELIMIT, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Time Limit"},
|
||
|
/* 82*/ {DBPROP_WMIOLEDB_DS_CHASEREF, FLAGS_ROWSETRW, VT_I4, TRUE, 0, NULL, L"Chase Referals"},
|
||
|
/* 83*/ {DBPROP_WMIOLEDB_DS_CACHERESULTS, FLAGS_ROWSETRW, VT_BOOL,TRUE, 0, NULL, L"Cache Results"},
|
||
|
/* 84*/ {DBPROP_WMIOLEDB_DS_ASYNCH, FLAGS_ROWSETRW, VT_BOOL,FALSE, 0, NULL, L"Search Asynchronous"},
|
||
|
/* 85*/ {DBPROP_WMIOLEDB_DS_ATTRIBONLY, FLAGS_ROWSETRW, VT_BOOL,FALSE, 0, NULL, L"Attributes Only"},
|
||
|
/* 86*/ {DBPROP_WMIOLEDB_DS_PAGEDTIMELIMIT, FLAGS_ROWSETRW, VT_I4, FALSE, 0, NULL, L"Page size limit"},
|
||
|
/* 87*/ {DBPROP_WMIOLEDB_DS_TOMBSTONE, FLAGS_ROWSETRW, VT_BOOL,FALSE, 0, NULL, L"TombStone"},
|
||
|
/* 88*/ {DBPROP_WMIOLEDB_DS_FILTER, FLAGS_ROWSETRW, VT_BSTR,FALSE, 0, NULL, L"Filter"},
|
||
|
/* 89*/ {DBPROP_WMIOLEDB_DS_ATTRIBUTES, FLAGS_ROWSETRW, VT_BSTR,FALSE, 0, NULL, L"Attributes"},
|
||
|
|
||
|
|
||
|
// Column Properties
|
||
|
/* 90*/ {DBPROP_COL_NULLABLE, FLAGS_COLUMNSRW, VT_BOOL, TRUE, 0, NULL, L"Nullable"},
|
||
|
/* 91*/ {DBPROP_COL_UNIQUE, FLAGS_COLUMNSRW, VT_BOOL, TRUE, 0, NULL, L"Unique"},
|
||
|
/* 92*/ {DBPROP_COL_PRIMARYKEY, FLAGS_COLUMNSRW, VT_BOOL, TRUE, 0, NULL, L"Primary Key"},
|
||
|
|
||
|
// WMIOLEDB_COLUMN Properties
|
||
|
/* 93*/ {DBPROP_WMIOLEDB_QUALIFIERFLAVOR, FLAGS_COLUMNSRW, VT_I4, TRUE, DBPROPVAL_FLAVOR_PROPOGAGTE_TO_INSTANCE, NULL, L"Qualifier Flavor"},
|
||
|
|
||
|
};
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Constructor for this class
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CUtilProp::CUtilProp (void)
|
||
|
{
|
||
|
/* m_prgproperties = NULL;
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_PROPERTIES;
|
||
|
m_prgproperties = (PROPSTRUCT *)g_pIMalloc->Alloc(sizeof(PROPSTRUCT) * m_cProperties);
|
||
|
memcpy(m_prgproperties, &s_rgprop, sizeof(PROPSTRUCT) * m_cProperties );
|
||
|
m_nPropStartIndex = 0;
|
||
|
*/
|
||
|
m_propType = BINDERPROP;
|
||
|
m_prgproperties = NULL;
|
||
|
m_cProperties = 0;
|
||
|
m_nPropStartIndex = 0;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Constructor for this class
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CUtilProp::CUtilProp ( PROPERTYTYPE propType )
|
||
|
{
|
||
|
/*
|
||
|
m_propType = propType;
|
||
|
m_prgproperties = NULL;
|
||
|
m_cProperties = 0;
|
||
|
m_nPropStartIndex = 0;
|
||
|
|
||
|
switch(propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES + \
|
||
|
NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + \
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
m_nPropStartIndex = 0;
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_SESSION_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_SESSION_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
// for command follow through to include even the rowset properties
|
||
|
case COMMANDPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
m_cProperties += NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
// if start index is no set by COMMANDPROP
|
||
|
if(m_nPropStartIndex == 0)
|
||
|
{
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP:
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_PROPERTIES;
|
||
|
m_nPropStartIndex = 0;
|
||
|
break;
|
||
|
|
||
|
case COLUMNPROP:
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
if(m_cProperties > 0)
|
||
|
{
|
||
|
// m_prgproperties = (PROPSTRUCT *)g_pIMalloc->Alloc(sizeof(PROPSTRUCT) * m_cProperties);
|
||
|
m_prgproperties = new PROPSTRUCT[m_cProperties];
|
||
|
memcpy(m_prgproperties, &s_rgprop[m_nPropStartIndex], sizeof(PROPSTRUCT) * m_cProperties );
|
||
|
SetDefaultValueForStringProperties(m_prgproperties,m_cProperties);
|
||
|
}
|
||
|
|
||
|
if( propType == DATASOURCEPROP || propType == BINDERPROP)
|
||
|
{
|
||
|
ULONG lIndex = 0;
|
||
|
|
||
|
// Get the default LCID
|
||
|
if(GetPropIndex(DBPROP_INIT_LCID,&lIndex))
|
||
|
{
|
||
|
m_prgproperties[lIndex].longVal = (SLONG)GetSystemDefaultLCID();
|
||
|
}
|
||
|
|
||
|
CPreviligeToken pvgToken;
|
||
|
DBPROPIDSET rgPropertyIDSets[1];
|
||
|
ULONG cPropertySets;
|
||
|
DBPROPSET* prgPropertySets;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
rgPropertyIDSets[0].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
rgPropertyIDSets[0].rgPropertyIDs = NULL;
|
||
|
rgPropertyIDSets[0].cPropertyIDs = 0;
|
||
|
|
||
|
// NTRaid: 136443
|
||
|
// 07/05/00
|
||
|
hr = pvgToken.FInit();
|
||
|
|
||
|
if(SUCCEEDED(hr) && SUCCEEDED(hr = GetProperties(PROPSET_DSO,1,rgPropertyIDSets,&cPropertySets,&prgPropertySets)))
|
||
|
{
|
||
|
pvgToken.SetDBPROPForPrivileges(prgPropertySets->cProperties ,prgPropertySets[0].rgProperties);
|
||
|
|
||
|
hr = SetProperties(PROPSET_DSO,1,prgPropertySets);
|
||
|
//==========================================================================
|
||
|
// Free memory we allocated to get the namespace property above
|
||
|
//==========================================================================
|
||
|
m_PropMemMgr.FreeDBPROPSET( cPropertySets, prgPropertySets);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
*/
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Destructor for this class
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CUtilProp:: ~CUtilProp (void )
|
||
|
{
|
||
|
SAFE_DELETE_ARRAY(m_prgproperties);
|
||
|
}
|
||
|
|
||
|
|
||
|
HRESULT CUtilProp:: FInit(PROPERTYTYPE propType)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
m_propType = propType;
|
||
|
|
||
|
switch(propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES + \
|
||
|
NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + \
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
m_nPropStartIndex = 0;
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_SESSION_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_SESSION_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
// for command follow through to include even the rowset properties
|
||
|
case COMMANDPROP :
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
m_cProperties += NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
// if start index is no set by COMMANDPROP
|
||
|
if(m_nPropStartIndex == 0)
|
||
|
{
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP:
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_PROPERTIES;
|
||
|
m_nPropStartIndex = 0;
|
||
|
break;
|
||
|
|
||
|
case COLUMNPROP:
|
||
|
m_cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES + NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
m_nPropStartIndex = START_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
if(m_cProperties > 0)
|
||
|
{
|
||
|
// m_prgproperties = (PROPSTRUCT *)g_pIMalloc->Alloc(sizeof(PROPSTRUCT) * m_cProperties);
|
||
|
m_prgproperties = new PROPSTRUCT[m_cProperties];
|
||
|
if(m_prgproperties)
|
||
|
{
|
||
|
memcpy(m_prgproperties, &s_rgprop[m_nPropStartIndex], sizeof(PROPSTRUCT) * m_cProperties );
|
||
|
SetDefaultValueForStringProperties(m_prgproperties,m_cProperties);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (SUCCEEDED(hr) &&( propType == DATASOURCEPROP || propType == BINDERPROP))
|
||
|
{
|
||
|
ULONG lIndex = 0;
|
||
|
|
||
|
// Get the default LCID
|
||
|
if(GetPropIndex(DBPROP_INIT_LCID,&lIndex))
|
||
|
{
|
||
|
m_prgproperties[lIndex].longVal = (SLONG)GetSystemDefaultLCID();
|
||
|
}
|
||
|
|
||
|
CPreviligeToken pvgToken;
|
||
|
DBPROPIDSET rgPropertyIDSets[1];
|
||
|
ULONG cPropertySets;
|
||
|
DBPROPSET* prgPropertySets;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
rgPropertyIDSets[0].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
rgPropertyIDSets[0].rgPropertyIDs = NULL;
|
||
|
rgPropertyIDSets[0].cPropertyIDs = 0;
|
||
|
|
||
|
// NTRaid: 136443
|
||
|
// 07/05/00
|
||
|
hr = pvgToken.FInit();
|
||
|
|
||
|
if(SUCCEEDED(hr) && SUCCEEDED(hr = GetProperties(PROPSET_DSO,1,rgPropertyIDSets,&cPropertySets,&prgPropertySets)))
|
||
|
{
|
||
|
pvgToken.SetDBPROPForPrivileges(prgPropertySets->cProperties ,prgPropertySets[0].rgProperties);
|
||
|
|
||
|
hr = SetProperties(PROPSET_DSO,1,prgPropertySets);
|
||
|
//==========================================================================
|
||
|
// Free memory we allocated to get the namespace property above
|
||
|
//==========================================================================
|
||
|
m_PropMemMgr.FreeDBPROPSET( cPropertySets, prgPropertySets);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Returns index of the given property in the property set
|
||
|
//
|
||
|
// BOOL
|
||
|
// TRUE found match, copied it to pulIndex out-param
|
||
|
// FALSE no match. In this case, pulIndex has no meaning
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CUtilProp::GetPropIndex ( DBPROPID dwPropertyID, //IN PROPID of desired property
|
||
|
ULONG* pulIndex) //OUT index of desired property if return was TRUE
|
||
|
{
|
||
|
ULONG cNumberOfProperties;
|
||
|
BOOL fRc = FALSE;
|
||
|
assert( pulIndex );
|
||
|
|
||
|
for ( cNumberOfProperties = 0; cNumberOfProperties < m_cProperties; cNumberOfProperties++) {
|
||
|
if (dwPropertyID == m_prgproperties[cNumberOfProperties].dwPropertyID ) {
|
||
|
|
||
|
//==============================================================
|
||
|
// found a match
|
||
|
//==============================================================
|
||
|
*pulIndex = cNumberOfProperties;
|
||
|
fRc = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return fRc;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Returns index of the given property in our global table of properties
|
||
|
//
|
||
|
// BOOL
|
||
|
// TRUE found match, copied it to pulIndex out-param
|
||
|
// FALSE no match. In this case, pulIndex has no meaning
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
BOOL CUtilProp::GetPropIndexFromAllSupportedProps ( DBPROPID dwPropertyID, //IN PROPID of desired property
|
||
|
ULONG* pulIndex) //OUT index of desired property if return was TRUE
|
||
|
{
|
||
|
ULONG cNumberOfProperties;
|
||
|
BOOL fRc = FALSE;
|
||
|
assert( pulIndex );
|
||
|
|
||
|
for ( cNumberOfProperties = 0; cNumberOfProperties < NUMBER_OF_SUPPORTED_PROPERTIES; cNumberOfProperties++) {
|
||
|
if (dwPropertyID == s_rgprop[cNumberOfProperties].dwPropertyID ) {
|
||
|
|
||
|
//==============================================================
|
||
|
// found a match
|
||
|
//==============================================================
|
||
|
*pulIndex = cNumberOfProperties;
|
||
|
fRc = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return fRc;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Helper for GetPropertyInfo. Loads field of DBPROPINFO structure.
|
||
|
//
|
||
|
// BOOL
|
||
|
// TRUE Method succeeded
|
||
|
// FALSE Method failed (couldn't allocate memory)
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CUtilProp::LoadDBPROPINFO ( PROPSTRUCT* pPropStruct, DBPROPINFO* pPropInfo )
|
||
|
{
|
||
|
|
||
|
assert( pPropStruct );
|
||
|
assert( pPropInfo );
|
||
|
|
||
|
//=======================================================================
|
||
|
// init the variant
|
||
|
//=======================================================================
|
||
|
VariantInit( &pPropInfo->vValues );
|
||
|
|
||
|
//=======================================================================
|
||
|
// set the easy fields..
|
||
|
//=======================================================================
|
||
|
pPropInfo->dwPropertyID = pPropStruct->dwPropertyID;
|
||
|
pPropInfo->dwFlags = pPropStruct->dwFlags;
|
||
|
pPropInfo->vtType = pPropStruct->vtType;
|
||
|
|
||
|
//=======================================================================
|
||
|
// fill in the description
|
||
|
//=======================================================================
|
||
|
if ( pPropInfo->pwszDescription ){
|
||
|
wcscpy(pPropInfo->pwszDescription, pPropStruct->pwstrDescBuffer);
|
||
|
}
|
||
|
|
||
|
//=======================================================================
|
||
|
// all went well
|
||
|
//=======================================================================
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Helper for GetProperties. Loads field of DBPROP structure.
|
||
|
//
|
||
|
// BOOL
|
||
|
// TRUE Method succeeded
|
||
|
// FALSE Method failed (couldn't allocate memory)
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CUtilProp::LoadDBPROP ( PROPSTRUCT* pPropStruct, DBPROP* pPropSupport )
|
||
|
{
|
||
|
assert( pPropStruct );
|
||
|
assert( pPropSupport );
|
||
|
|
||
|
//========================================================================
|
||
|
// init the variant
|
||
|
//========================================================================
|
||
|
VariantInit( &pPropSupport->vValue );
|
||
|
|
||
|
//========================================================================
|
||
|
// set the easy fields..
|
||
|
//========================================================================
|
||
|
pPropSupport->dwPropertyID = pPropStruct->dwPropertyID;
|
||
|
pPropSupport->colid = DB_NULLID;
|
||
|
pPropSupport->dwStatus = DBPROPSTATUS_OK;
|
||
|
|
||
|
//========================================================================
|
||
|
// set pPropSupport->vValue based on Variant type
|
||
|
//========================================================================
|
||
|
switch (pPropStruct->vtType){
|
||
|
|
||
|
case VT_BOOL:
|
||
|
V_VT( &pPropSupport->vValue ) = VT_BOOL;
|
||
|
if( pPropStruct->boolVal )
|
||
|
V_BOOL( &pPropSupport->vValue ) = VARIANT_TRUE;
|
||
|
else
|
||
|
V_BOOL( &pPropSupport->vValue ) = VARIANT_FALSE;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case VT_I2:
|
||
|
V_VT( &pPropSupport->vValue ) = VT_I2;
|
||
|
V_I2( &pPropSupport->vValue ) = (SHORT)pPropStruct->longVal;
|
||
|
break;
|
||
|
|
||
|
case VT_I4:
|
||
|
V_VT( &pPropSupport->vValue ) = VT_I4;
|
||
|
V_I4( &pPropSupport->vValue ) = pPropStruct->longVal;
|
||
|
break;
|
||
|
|
||
|
case VT_BSTR:
|
||
|
if( pPropStruct->pwstrVal ){
|
||
|
V_VT( &pPropSupport->vValue ) = VT_BSTR;
|
||
|
V_BSTR( &pPropSupport->vValue ) = Wmioledb_SysAllocString( pPropStruct->pwstrVal );
|
||
|
}
|
||
|
/* else
|
||
|
VariantClear( &pPropSupport->vValue );
|
||
|
*/ break;
|
||
|
|
||
|
case VT_UI4:
|
||
|
V_VT( &pPropSupport->vValue ) = VT_I4;
|
||
|
V_UI4( &pPropSupport->vValue ) = pPropStruct->longVal;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
assert( !"LoadDBPROP unknown variant type!\n\r" );
|
||
|
break;
|
||
|
}
|
||
|
// all went well
|
||
|
return TRUE;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Initialize the buffers and check for E_INVALIDARG cases
|
||
|
//
|
||
|
// NOTE: This routine is used by RowsetInfo and IDBProperties
|
||
|
//
|
||
|
// HRESULT indicating the status of the method
|
||
|
// S_OK Properties gathered
|
||
|
// E_INVALIDARG Invalid parameter values
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::GetPropertiesArgChk( DWORD dwBitMask, //IN Mask for object
|
||
|
const ULONG cPropertySets, //IN Number of property Sets
|
||
|
const DBPROPIDSET rgPropertySets[], //IN Property Classes and Ids
|
||
|
ULONG* pcProperties, //OUT Count of structs returned
|
||
|
DBPROPSET** prgProperties, //OUT Array of Properties
|
||
|
BOOL bDSOInitialized )
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
//================================================================
|
||
|
// Initialize values
|
||
|
//================================================================
|
||
|
if( pcProperties ){
|
||
|
*pcProperties = 0;
|
||
|
}
|
||
|
if( prgProperties ){
|
||
|
*prgProperties = NULL;
|
||
|
}
|
||
|
|
||
|
//================================================================
|
||
|
// Check Arguments
|
||
|
//================================================================
|
||
|
if (((cPropertySets > 0) && !rgPropertySets) ||
|
||
|
!pcProperties ||
|
||
|
!prgProperties )
|
||
|
{
|
||
|
hr = E_INVALIDARG ;
|
||
|
}
|
||
|
else{
|
||
|
|
||
|
//=========================================================================
|
||
|
// New argument check for > 1 cPropertyIDs and NULL pointer
|
||
|
// for array of property ids.
|
||
|
//=========================================================================
|
||
|
for(ULONG ul=0; ul<cPropertySets && hr == S_OK; ul++){
|
||
|
|
||
|
if(( rgPropertySets[ul].guidPropertySet == DBPROPSET_PROPERTIESINERROR &&
|
||
|
(rgPropertySets[ul].cPropertyIDs != 0 || rgPropertySets[0].rgPropertyIDs != NULL ||
|
||
|
cPropertySets > 1)) && (dwBitMask == DATASOURCEPROP || dwBitMask == COMMANDPROP))
|
||
|
{
|
||
|
hr = E_INVALIDARG;
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
if( rgPropertySets[ul].cPropertyIDs && !(rgPropertySets[ul].rgPropertyIDs) )
|
||
|
{
|
||
|
hr = E_INVALIDARG;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Check if all the propertysetID's are correct for this object
|
||
|
hr = IsValidPropertySet(bDSOInitialized,rgPropertySets[ul].guidPropertySet);
|
||
|
}
|
||
|
if(FAILED(hr))
|
||
|
{
|
||
|
hr = E_INVALIDARG;
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
hr = S_OK;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Validate that the variant contains legal values for it's particalur type and for the particular PROPID in this
|
||
|
// propset.
|
||
|
//
|
||
|
// HRESULT indicating status
|
||
|
//
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::IsValidValue(DBPROP* pDBProp )
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG lIndex = 0;
|
||
|
|
||
|
//===========================================================================
|
||
|
// Check BOOLEAN values
|
||
|
//===========================================================================
|
||
|
if( (pDBProp->vValue.vt == VT_BOOL) && !((V_BOOL(&(pDBProp->vValue)) == VARIANT_TRUE) ||
|
||
|
(V_BOOL(&(pDBProp->vValue)) == VARIANT_FALSE)) ){
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
else if( pDBProp->vValue.vt != VT_EMPTY && pDBProp->vValue.vt != VT_NULL){
|
||
|
|
||
|
if(GetPropIndex(pDBProp->dwPropertyID,&lIndex) == FALSE)
|
||
|
hr = FALSE;
|
||
|
else
|
||
|
if(pDBProp->vValue.vt != m_prgproperties[lIndex].vtType)
|
||
|
hr = S_FALSE;
|
||
|
else
|
||
|
{
|
||
|
|
||
|
switch( pDBProp->dwPropertyID ) {
|
||
|
case DBPROP_INIT_DATASOURCE:
|
||
|
case DBPROP_AUTH_USERID:
|
||
|
case DBPROP_AUTH_PASSWORD:
|
||
|
case DBPROP_WMIOLEDB_AUTHORITY:
|
||
|
case DBPROP_WMIOLEDB_QUERYLANGUAGE:
|
||
|
if( pDBProp->vValue.vt != VT_BSTR ){
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_HWND:
|
||
|
if( pDBProp->vValue.vt != VT_I4 ){
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_PROMPT:
|
||
|
//===============================================================
|
||
|
// These are the only values we support (from spec).
|
||
|
//===============================================================
|
||
|
if ( (pDBProp->vValue.vt == VT_I2) &&
|
||
|
!(V_I2(&pDBProp->vValue) == DBPROMPT_PROMPT ||
|
||
|
V_I2(&pDBProp->vValue) == DBPROMPT_COMPLETE ||
|
||
|
V_I2(&pDBProp->vValue) == DBPROMPT_COMPLETEREQUIRED ||
|
||
|
V_I2(&pDBProp->vValue) == DBPROMPT_NOPROMPT)){
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_PROTECTION_LEVEL:
|
||
|
if (!( V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_NONE ||
|
||
|
V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_CONNECT ||
|
||
|
V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_CALL ||
|
||
|
V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_PKT ||
|
||
|
V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_PKT ||
|
||
|
V_I4(&pDBProp->vValue) == DB_PROT_LEVEL_PKT_PRIVACY))
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_IMPERSONATION_LEVEL:
|
||
|
if (!( V_I4(&pDBProp->vValue) == DB_IMP_LEVEL_ANONYMOUS ||
|
||
|
V_I4(&pDBProp->vValue) == DB_IMP_LEVEL_IDENTIFY ||
|
||
|
V_I4(&pDBProp->vValue) == DB_IMP_LEVEL_IMPERSONATE ||
|
||
|
V_I4(&pDBProp->vValue) == DB_IMP_LEVEL_DELEGATE )) {
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_MODE:
|
||
|
switch(V_I4(&pDBProp->vValue))
|
||
|
{
|
||
|
case DB_MODE_READ:
|
||
|
case DB_MODE_WRITE:
|
||
|
case DB_MODE_READWRITE:
|
||
|
case DB_MODE_SHARE_DENY_READ:
|
||
|
case DB_MODE_SHARE_EXCLUSIVE:
|
||
|
case DB_MODE_SHARE_DENY_NONE:
|
||
|
case DB_MODE_SHARE_EXCLUSIVE|DB_MODE_SHARE_DENY_NONE:
|
||
|
case DB_MODE_READ|DB_MODE_WRITE|DB_MODE_READWRITE|DB_MODE_SHARE_DENY_READ|DB_MODE_SHARE_DENY_WRITE|DB_MODE_SHARE_EXCLUSIVE|DB_MODE_SHARE_DENY_NONE:
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
hr = S_FALSE;
|
||
|
};
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_QUALIFIERS:
|
||
|
if (!( V_I4(&pDBProp->vValue) == DBPROP_WM_CLASSQUALIFIERS ||
|
||
|
V_I4(&pDBProp->vValue) == DBPROP_WM_PROPERTYQUALIFIERS ||
|
||
|
V_I4(&pDBProp->vValue) == 0 ||
|
||
|
V_I4(&pDBProp->vValue) == (DBPROP_WM_PROPERTYQUALIFIERS | DBPROP_WM_CLASSQUALIFIERS) ))
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_UPDATABILITY:
|
||
|
if (!( V_I4(&pDBProp->vValue) <= (DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_DELETE | DBPROPVAL_UP_INSERT) &&
|
||
|
V_I4(&pDBProp->vValue) >= 0))
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_MAXOPENROWS:
|
||
|
if(V_I4(&pDBProp->vValue) > MAXOPENROWS &&
|
||
|
V_I4(&pDBProp->vValue) <= 0)
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_OBJECTTYPE:
|
||
|
if(!( (V_I4(&pDBProp->vValue) == DBPROPVAL_SCOPEOBJ) ||
|
||
|
(V_I4(&pDBProp->vValue) == DBPROPVAL_CONTAINEROBJ) ||
|
||
|
(V_I4(&pDBProp->vValue) == DBPROPVAL_NOOBJ) ) )
|
||
|
{
|
||
|
hr = S_FALSE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::CheckPropertyIDSets( BOOL & fIsNotSpecialGUID, BOOL & fIsSpecialGUID,
|
||
|
ULONG cPropIDSets, const DBPROPIDSET rgPropIDSets[] ) //IN Array of property sets
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
fIsNotSpecialGUID = FALSE;
|
||
|
fIsSpecialGUID = FALSE;
|
||
|
|
||
|
for(ULONG ul=0; ul<cPropIDSets; ul++){
|
||
|
|
||
|
if( rgPropIDSets[ul].cPropertyIDs && !(rgPropIDSets[ul].rgPropertyIDs) ){
|
||
|
hr = E_INVALIDARG ;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
if (DBPROPSET_ROWSETALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_DATASOURCEALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_DATASOURCEINFOALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_SESSIONALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_COLUMNALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_DBINITALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_CONSTRAINTALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_INDEXALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_SESSIONALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_VIEWALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_TABLEALL == rgPropIDSets[ul].guidPropertySet ||
|
||
|
DBPROPSET_TRUSTEEALL == rgPropIDSets[ul].guidPropertySet )
|
||
|
{
|
||
|
fIsSpecialGUID = TRUE;
|
||
|
}
|
||
|
else{
|
||
|
fIsNotSpecialGUID = TRUE;
|
||
|
}
|
||
|
|
||
|
if(fIsSpecialGUID && fIsNotSpecialGUID){
|
||
|
hr = E_INVALIDARG ;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(fIsSpecialGUID && fIsNotSpecialGUID)
|
||
|
hr = E_INVALIDARG ;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Returns information about rowset and data source properties supported by the provider
|
||
|
//
|
||
|
// HRESULT
|
||
|
// S_OK The method succeeded
|
||
|
// E_INVALIDARG pcPropertyIDSets or prgPropertyInfo was NULL
|
||
|
// E_OUTOFMEMORY Out of memory
|
||
|
//
|
||
|
// NTRaid : 142133 - Testing this , found that getting data source property from ADO was resulting in a crash
|
||
|
// 07/12/00
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CUtilProp::GetPropertyInfo( BOOL fDSOInitialized, //IN if Initialized
|
||
|
ULONG cPropIDSets, //IN # properties
|
||
|
const DBPROPIDSET rgPropIDSets[], //IN Array of property sets
|
||
|
ULONG* pcPropInfoSets, //OUT # DBPROPSET structures
|
||
|
DBPROPINFOSET** prgPropInfoSets,//OUT DBPROPSET structures property information returned
|
||
|
WCHAR** ppDescBuffer //OUT Property descriptions
|
||
|
)
|
||
|
{
|
||
|
BOOL fRet= TRUE;
|
||
|
BOOL fPropsinError, fPropsSucceed, fIsSpecialGUID, fIsNotSpecialGUID;
|
||
|
ULONG cProps = 0;
|
||
|
ULONG cCount = 0;
|
||
|
ULONG ulPropSets = 0;
|
||
|
ULONG cTotalPropSets = 0;
|
||
|
ULONG ulPropSetIndex = 0;
|
||
|
ULONG cPropSetsInSpecialGUID = 0;
|
||
|
|
||
|
WCHAR* pDescBuffer = NULL;
|
||
|
WCHAR* pDescBufferTemp = NULL;
|
||
|
DBPROPINFO* pPropInfo;
|
||
|
DBPROPINFOSET* pPropInfoSet;
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG ulPropertyInfoCount = 0;
|
||
|
|
||
|
//=======================================================================
|
||
|
// init out params and local stuff
|
||
|
//=======================================================================
|
||
|
if (pcPropInfoSets)
|
||
|
*pcPropInfoSets = 0;
|
||
|
if (prgPropInfoSets)
|
||
|
*prgPropInfoSets = NULL;
|
||
|
if (ppDescBuffer)
|
||
|
*ppDescBuffer = NULL;
|
||
|
|
||
|
fPropsinError = fPropsSucceed = fIsSpecialGUID = fIsNotSpecialGUID = FALSE;
|
||
|
cProps = cCount = ulPropSets = ulPropSetIndex = cTotalPropSets = cPropSetsInSpecialGUID = 0;
|
||
|
|
||
|
//=======================================================================
|
||
|
// Check Arguments, on failure post HRESULT to error queue
|
||
|
//=======================================================================
|
||
|
if( ((cPropIDSets > 0) && !rgPropIDSets) || !pcPropInfoSets || !prgPropInfoSets ){
|
||
|
return E_INVALIDARG ;
|
||
|
}
|
||
|
|
||
|
//=======================================================================
|
||
|
// If the consumer does not restrict the property sets by specify an
|
||
|
// array of property sets and a cPropertySets greater than 0, then we
|
||
|
// need to make sure we have some to return
|
||
|
//=======================================================================
|
||
|
|
||
|
if ( (cPropIDSets == 0) ){
|
||
|
if( fDSOInitialized )
|
||
|
cProps = NUMBER_OF_SUPPORTED_PROPERTY_SETS;
|
||
|
else
|
||
|
cProps = 2;
|
||
|
|
||
|
cTotalPropSets = cProps;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//=======================================================================
|
||
|
// New argument check for > 1 cPropIDs and NULL pointer for
|
||
|
// array of property ids.
|
||
|
//=======================================================================
|
||
|
if( S_OK != ( hr = CheckPropertyIDSets(fIsNotSpecialGUID,fIsSpecialGUID,cPropIDSets,rgPropIDSets)) ){
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
if( fIsSpecialGUID == TRUE)
|
||
|
{
|
||
|
cTotalPropSets = GetNumberOfPropertySets(fDSOInitialized,rgPropIDSets,cPropIDSets);
|
||
|
|
||
|
// NTRaid : 142133
|
||
|
// 07/12/00
|
||
|
cProps = cPropIDSets;
|
||
|
}
|
||
|
else
|
||
|
//=======================================================================
|
||
|
// save the count of PropertyIDSets
|
||
|
//=======================================================================
|
||
|
cTotalPropSets = cProps = cPropIDSets;
|
||
|
}
|
||
|
|
||
|
// con.properties
|
||
|
// 07/06/00
|
||
|
if(cTotalPropSets)
|
||
|
{
|
||
|
//=======================================================================
|
||
|
// use task memory allocater to alloc a DBPROPINFOSET struct
|
||
|
//=======================================================================
|
||
|
if( S_OK != (hr = m_PropMemMgr.AllocDBPROPINFOSET(pPropInfoSet,cTotalPropSets))){
|
||
|
return hr;
|
||
|
}
|
||
|
memset(pPropInfoSet,0,cTotalPropSets * sizeof(DBPROPINFOSET));
|
||
|
|
||
|
// Fill the property sets info to be fetched and get the number of properties that will be returned
|
||
|
if(fIsSpecialGUID == TRUE || cPropIDSets == 0)
|
||
|
{
|
||
|
FillPropertySets(fDSOInitialized,rgPropIDSets,cPropIDSets ,pPropInfoSet,ulPropertyInfoCount);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ulPropertyInfoCount = GetNumberofPropInfoToBeReturned(fDSOInitialized,cPropIDSets,rgPropIDSets);
|
||
|
}
|
||
|
|
||
|
//=======================================================================
|
||
|
// Alloc memory for ppDescBuffer
|
||
|
//=======================================================================
|
||
|
if( S_OK != (hr = m_PropMemMgr.AllocDESCRIPTBuffer(pDescBuffer, ppDescBuffer,ulPropertyInfoCount))){
|
||
|
m_PropMemMgr.FreeDBPROPINFOSET(pPropInfoSet,cTotalPropSets);
|
||
|
return hr;
|
||
|
}
|
||
|
pDescBufferTemp = pDescBuffer;
|
||
|
//=======================================================================
|
||
|
// For each supported Property Set
|
||
|
//=======================================================================
|
||
|
for (ulPropSets=0,ulPropSetIndex = 0; ulPropSets < cTotalPropSets; ulPropSets++ )
|
||
|
{
|
||
|
BOOL fGetAllProps = FALSE;
|
||
|
|
||
|
// if the propinfo is not filled manually then get it from the input parameters
|
||
|
if(fIsSpecialGUID == FALSE && cPropIDSets != 0)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = rgPropIDSets[ulPropSets].guidPropertySet;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = rgPropIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_DBINIT &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if( fDSOInitialized )
|
||
|
{
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_DATASOURCEINFO &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_ROWSET &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_COLUMN &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
/* if (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND &&
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0 )
|
||
|
{
|
||
|
fGetAllProps = TRUE;
|
||
|
pPropInfoSet[ulPropSetIndex].cPropertyInfos = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
}
|
||
|
*/
|
||
|
// else if (rgPropIDSets[ulPropSets].cPropertyIDs == 0)
|
||
|
else if (pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0)
|
||
|
fPropsinError = TRUE;
|
||
|
}
|
||
|
// else if (rgPropIDSets[ulPropSets].cPropertyIDs == 0)
|
||
|
else if (pPropInfoSet[ulPropSetIndex].cPropertyInfos == 0)
|
||
|
{
|
||
|
|
||
|
//===============================================================
|
||
|
// Since we do not support it should return a error with 0 & NULL
|
||
|
//===============================================================
|
||
|
fPropsinError = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (pPropInfoSet[ulPropSetIndex].cPropertyInfos){
|
||
|
|
||
|
//===============================================================
|
||
|
// use task memory allocater to alloc array of DBPROPINFO structs
|
||
|
//===============================================================
|
||
|
hr = m_PropMemMgr.AllocDBPROPINFO(pPropInfo,pPropInfoSet,ulPropSetIndex);
|
||
|
if (!pPropInfo) {
|
||
|
m_PropMemMgr.FreeDBPROPINFOSET(pPropInfoSet,cTotalPropSets);
|
||
|
pDescBuffer = pDescBufferTemp;
|
||
|
m_PropMemMgr.FreeDESCRIPTBuffer(pDescBuffer,ppDescBuffer);
|
||
|
return E_OUTOFMEMORY ;
|
||
|
}
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].rgPropertyInfos = &pPropInfo[0];
|
||
|
|
||
|
memset( pPropInfo, 0,
|
||
|
(pPropInfoSet[ulPropSetIndex].cPropertyInfos * sizeof( DBPROPINFO )));
|
||
|
}
|
||
|
|
||
|
if(!IsPropertySetSupported(pPropInfoSet[ulPropSetIndex].guidPropertySet))
|
||
|
{
|
||
|
for (cCount=0; cCount < pPropInfoSet[ulPropSetIndex].cPropertyInfos; cCount++)
|
||
|
{
|
||
|
pPropInfo[cCount].dwPropertyID = rgPropIDSets[ulPropSets].rgPropertyIDs[cCount];
|
||
|
pPropInfo[cCount].dwFlags = DBPROPFLAGS_NOTSUPPORTED;
|
||
|
fPropsinError = TRUE;
|
||
|
pPropInfo[cCount].pwszDescription = NULL;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
//===============================================================
|
||
|
// for each prop in our table..
|
||
|
//===============================================================
|
||
|
for (cCount=0; cCount < pPropInfoSet[ulPropSetIndex].cPropertyInfos; cCount++){
|
||
|
|
||
|
//===========================================================
|
||
|
// init the Variant right up front that way we can
|
||
|
// VariantClear with no worried (if we need to)
|
||
|
//===========================================================
|
||
|
VariantInit( &pPropInfo[cCount].vValues );
|
||
|
|
||
|
//===========================================================
|
||
|
// set the description pointer
|
||
|
//===========================================================
|
||
|
pPropInfo[cCount].pwszDescription = pDescBuffer;
|
||
|
|
||
|
//===========================================================
|
||
|
// Check supported property sets
|
||
|
//===========================================================
|
||
|
if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_DBINIT) && (fGetAllProps) ){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_DBINIT_PROPERTIES + cCount], &pPropInfo[cCount] );
|
||
|
}
|
||
|
else
|
||
|
if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT) && (fGetAllProps) ){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES + cCount], &pPropInfo[cCount] );
|
||
|
}
|
||
|
else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_DATASOURCEINFO) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + cCount], &pPropInfo[cCount] );
|
||
|
}
|
||
|
|
||
|
else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_ROWSET) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_ROWSET_PROPERTIES + cCount],&pPropInfo[cCount] );
|
||
|
}
|
||
|
else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount],&pPropInfo[cCount] );
|
||
|
}
|
||
|
else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_COLUMN) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_COLUMN_PROPERTIES + cCount],&pPropInfo[cCount] );
|
||
|
}
|
||
|
else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES + cCount],&pPropInfo[cCount] );
|
||
|
}
|
||
|
/* else if ( (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND) && fGetAllProps && fDSOInitialized){
|
||
|
|
||
|
//=======================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=======================================================
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES + cCount],&pPropInfo[cCount] );
|
||
|
}
|
||
|
*/ else{
|
||
|
ULONG ulIndex;
|
||
|
|
||
|
pPropInfo[cCount].dwPropertyID = rgPropIDSets[ulPropSets].rgPropertyIDs[cCount];
|
||
|
pPropInfo[cCount].dwFlags = DBPROPFLAGS_NOTSUPPORTED;
|
||
|
|
||
|
if ( (GetPropIndexFromAllSupportedProps(rgPropIDSets[ulPropSets].rgPropertyIDs[cCount], &ulIndex)) &&
|
||
|
(fDSOInitialized || (pPropInfoSet[ulPropSetIndex].guidPropertySet == DBPROPSET_DBINIT)) ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROPINFO( &s_rgprop[ulIndex], &pPropInfo[cCount] );
|
||
|
}
|
||
|
else{
|
||
|
fPropsinError = TRUE;
|
||
|
pPropInfo[cCount].pwszDescription = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!fRet){
|
||
|
|
||
|
m_PropMemMgr.FreeDBPROPINFOSET(pPropInfoSet,cTotalPropSets);
|
||
|
|
||
|
if ( ppDescBuffer ){
|
||
|
*ppDescBuffer = NULL;
|
||
|
}
|
||
|
g_pIMalloc->Free( pDescBufferTemp );
|
||
|
return E_FAIL ;
|
||
|
}
|
||
|
|
||
|
//===========================================================
|
||
|
// move the description pointer to the next
|
||
|
//===========================================================
|
||
|
if ( pPropInfo[cCount].pwszDescription ){
|
||
|
pDescBuffer += (wcslen(pPropInfo[cCount].pwszDescription) + sizeof(CHAR));
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
//===============================================================
|
||
|
// Set local back to FALSE
|
||
|
//===============================================================
|
||
|
fGetAllProps = FALSE;
|
||
|
|
||
|
// cPropSetsInSpecialGUID--;
|
||
|
ulPropSetIndex++;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(fIsSpecialGUID && ulPropSetIndex == 0)
|
||
|
{
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = DB_E_ERRORSOCCURRED;
|
||
|
}
|
||
|
|
||
|
|
||
|
if(ulPropSetIndex)
|
||
|
{
|
||
|
//===================================================================
|
||
|
// set count of properties and property information
|
||
|
//===================================================================
|
||
|
*pcPropInfoSets = ulPropSetIndex;
|
||
|
*prgPropInfoSets = pPropInfoSet;
|
||
|
}
|
||
|
|
||
|
if(SUCCEEDED(hr))
|
||
|
{
|
||
|
if ( !fPropsSucceed && fPropsinError ){
|
||
|
if ( ppDescBuffer ){
|
||
|
*ppDescBuffer = NULL;
|
||
|
}
|
||
|
g_pIMalloc->Free( pDescBufferTemp );
|
||
|
hr = DB_E_ERRORSOCCURRED ;
|
||
|
}
|
||
|
else if ( fPropsSucceed && fPropsinError )
|
||
|
hr = DB_S_ERRORSOCCURRED ;
|
||
|
else
|
||
|
hr = S_OK ;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Returns current settings of all properties supported by the DSO/rowset
|
||
|
//
|
||
|
// HRESULT
|
||
|
// S_OK The method succeeded
|
||
|
// E_INVALIDARG pcProperties or prgPropertyInfo was NULL
|
||
|
// E_OUTOFMEMORY Out of memory
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CUtilProp::GetProperties( DWORD dwBitMask, //IN Mask if Initialized
|
||
|
ULONG cPropertyIDSets, //IN # of restiction property IDs
|
||
|
const DBPROPIDSET rgPropertyIDSets[], //IN restriction guids
|
||
|
ULONG* pcPropertySets, //OUT count of properties returned
|
||
|
DBPROPSET** prgPropertySets //OUT property information returned
|
||
|
)
|
||
|
{
|
||
|
BOOL fRet = TRUE;
|
||
|
BOOL fPropsinError = FALSE;
|
||
|
BOOL fPropsSucceed = FALSE;
|
||
|
ULONG cProps = 0;
|
||
|
ULONG cCount = 0;
|
||
|
ULONG ulPropertySets= 0;
|
||
|
DBPROP* pProp;
|
||
|
DBPROPSET* pPropSet;
|
||
|
BOOL bDSOInitialized = FALSE;
|
||
|
ULONG ulIndex = 0;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
//======================================================================
|
||
|
// save the count of PropertyIDSets
|
||
|
//======================================================================
|
||
|
cProps = cPropertyIDSets;
|
||
|
|
||
|
//======================================================================
|
||
|
// If the consumer does not restrict the property sets by specify an
|
||
|
// array of property sets and a cPropertySets greater than 0, then we
|
||
|
// need to make sure we have some to return
|
||
|
//======================================================================
|
||
|
|
||
|
if ( (dwBitMask & PROPSET_DSOINIT) == PROPSET_DSOINIT )
|
||
|
bDSOInitialized = TRUE;
|
||
|
|
||
|
if( cPropertyIDSets == 0 ){
|
||
|
|
||
|
//=================================================================
|
||
|
// only allow the DBINIT and DATASOURCE if Initialized
|
||
|
//=================================================================
|
||
|
cProps = GetNumberOfPropertySets(bDSOInitialized,dwBitMask);
|
||
|
}
|
||
|
|
||
|
//=====================================================================
|
||
|
// use task memory allocater to alloc a DBPROPSET struct
|
||
|
//=====================================================================
|
||
|
pPropSet = (DBPROPSET*) g_pIMalloc->Alloc(cProps * sizeof( DBPROPSET ));
|
||
|
if ( !pPropSet )
|
||
|
return E_OUTOFMEMORY ;
|
||
|
|
||
|
memset( pPropSet, 0, (cProps * sizeof( DBPROPSET )));
|
||
|
|
||
|
if(cPropertyIDSets == 0)
|
||
|
{
|
||
|
FillPropStruct(bDSOInitialized,dwBitMask,pPropSet);
|
||
|
}
|
||
|
|
||
|
if(pcPropertySets)
|
||
|
{
|
||
|
*pcPropertySets = 0;
|
||
|
}
|
||
|
if(prgPropertySets)
|
||
|
{
|
||
|
*prgPropertySets = NULL;
|
||
|
}
|
||
|
//=====================================================================
|
||
|
// For each supported Property Set
|
||
|
//=====================================================================
|
||
|
for (ulPropertySets=0; ulPropertySets < cProps; ulPropertySets++){
|
||
|
BOOL fGetAllProps = FALSE;
|
||
|
|
||
|
|
||
|
|
||
|
//=====================================================================
|
||
|
// If no restrictions return all properties from the three supported
|
||
|
// property sets
|
||
|
//=====================================================================
|
||
|
if ( cPropertyIDSets == 0 ){
|
||
|
fGetAllProps = TRUE;
|
||
|
|
||
|
/* //=============================================================
|
||
|
// only do this once
|
||
|
//=============================================================
|
||
|
if ( ulPropertySets == 0 ){
|
||
|
|
||
|
if( !(dwBitMask & PROPSET_SESSION) ){
|
||
|
|
||
|
if ( !(dwBitMask & PROPSET_ROWSET) ){
|
||
|
pPropSet[0].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropSet[0].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
if( dwBitMask & PROPSET_INIT ){
|
||
|
pPropSet[1].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropSet[1].cProperties = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
}
|
||
|
else{
|
||
|
pPropSet[0].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[0].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
*/ }
|
||
|
else
|
||
|
{
|
||
|
pPropSet[ulPropertySets].guidPropertySet = rgPropertyIDSets[ulPropertySets].guidPropertySet;
|
||
|
|
||
|
// if propertyset is supported by provider , but not available for the current OLEDB object ,
|
||
|
// then throw error
|
||
|
// if the requested number of propertysets is more than one then , the other properties should be
|
||
|
// fetched and DB_S_ERRORSOCCURRED should be thrown
|
||
|
if((S_OK != (hr = IsValidPropertySet(bDSOInitialized,pPropSet[ulPropertySets].guidPropertySet))) &&
|
||
|
IsPropertySetSupported(pPropSet[ulPropertySets].guidPropertySet) &&
|
||
|
rgPropertyIDSets[ulPropertySets].cPropertyIDs == 0)
|
||
|
{
|
||
|
if(cProps > 1)
|
||
|
{
|
||
|
fPropsinError = TRUE;
|
||
|
continue;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*pcPropertySets = 1;
|
||
|
*prgPropertySets = pPropSet;
|
||
|
return DB_E_ERRORSOCCURRED;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
pPropSet[ulPropertySets].cProperties = rgPropertyIDSets[ulPropertySets].cPropertyIDs;
|
||
|
|
||
|
if( rgPropertyIDSets[ulPropertySets].cPropertyIDs == 0 &&
|
||
|
rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_PROPERTIESINERROR )
|
||
|
{
|
||
|
fPropsSucceed = TRUE;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if( rgPropertyIDSets[ulPropertySets].cPropertyIDs == 0 ){
|
||
|
fGetAllProps = TRUE;
|
||
|
|
||
|
if( rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT ){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if( rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT ){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
}
|
||
|
else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCEINFO) &&
|
||
|
((dwBitMask & PROPSET_DSOINIT) == PROPSET_DSOINIT) ){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_ROWSET) &&
|
||
|
(dwBitMask & PROPSET_ROWSET)){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET) &&
|
||
|
(dwBitMask & PROPSET_ROWSET)){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_COLUMN) &&
|
||
|
(dwBitMask & PROPSET_COLUMN)){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN) &&
|
||
|
(dwBitMask & PROPSET_COLUMN)){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
/* else if( (rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND) &&
|
||
|
(dwBitMask & PROPSET_COMMAND)){
|
||
|
pPropSet[ulPropertySets].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
}
|
||
|
*/ else{
|
||
|
fGetAllProps = FALSE;
|
||
|
fPropsinError = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if( pPropSet[ulPropertySets].cProperties ){
|
||
|
|
||
|
//=============================================================
|
||
|
// use task memory allocater to alloc array of DBPROP structs
|
||
|
//=============================================================
|
||
|
pProp = (DBPROP*) g_pIMalloc->Alloc(sizeof( DBPROP ) * pPropSet[ulPropertySets].cProperties);
|
||
|
|
||
|
if (!pProp){
|
||
|
|
||
|
for(ULONG ul=0; ul<ulPropertySets; ul++){
|
||
|
|
||
|
for(ULONG ul2=0; ul2<pPropSet[ul].cProperties; ul2++)
|
||
|
VariantClear( &pPropSet[ul].rgProperties[ul2].vValue );
|
||
|
|
||
|
g_pIMalloc->Free( pPropSet[ul].rgProperties );
|
||
|
}
|
||
|
g_pIMalloc->Free( pPropSet );
|
||
|
|
||
|
return E_OUTOFMEMORY ;
|
||
|
}
|
||
|
|
||
|
pPropSet[ulPropertySets].rgProperties = &pProp[0];
|
||
|
|
||
|
memset( pProp, 0, (pPropSet[ulPropertySets].cProperties * sizeof( DBPROP )));
|
||
|
}
|
||
|
|
||
|
//=================================================================
|
||
|
// for each prop in our table..
|
||
|
//=================================================================
|
||
|
for (cCount=0; cCount < pPropSet[ulPropertySets].cProperties; cCount++){
|
||
|
|
||
|
//=============================================================
|
||
|
// init the Variant right up front
|
||
|
// that way we can VariantClear with no worried (if we need to)
|
||
|
//=============================================================
|
||
|
VariantInit( &pProp[cCount].vValue );
|
||
|
|
||
|
//=============================================================
|
||
|
// Check supported property sets
|
||
|
//=============================================================
|
||
|
if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT && fGetAllProps ) {
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROP from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_DBINIT_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_DBINIT_PROPERTIES + cCount],&pProp[cCount] );
|
||
|
}
|
||
|
else
|
||
|
if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT && fGetAllProps ) {
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROP from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES + cCount],&pProp[cCount] );
|
||
|
}
|
||
|
else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCEINFO && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES + cCount],&pProp[cCount] );
|
||
|
}
|
||
|
else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_ROWSET && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_ROWSET_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_ROWSET_PROPERTIES + cCount], &pProp[cCount] );
|
||
|
}
|
||
|
else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount], &pProp[cCount] );
|
||
|
}
|
||
|
else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_COLUMN && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_COLUMN_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount], &pProp[cCount] );
|
||
|
}
|
||
|
else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount], &pProp[cCount] );
|
||
|
}
|
||
|
/* else if ( pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND && fGetAllProps ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
|
||
|
//=========================================================
|
||
|
// load up their DBPROPINFO from our table
|
||
|
//=========================================================
|
||
|
pProp[cCount].dwPropertyID = s_rgprop[START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES + cCount].dwPropertyID;
|
||
|
// fRet = LoadDBPROP( &s_rgprop[START_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES + cCount], &pProp[cCount] );
|
||
|
}
|
||
|
*/ else
|
||
|
{
|
||
|
|
||
|
pProp[cCount].dwPropertyID = rgPropertyIDSets[ulPropertySets].rgPropertyIDs[cCount];
|
||
|
pProp[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
}
|
||
|
if(GetPropIndex(pProp[cCount].dwPropertyID, &ulIndex))
|
||
|
{
|
||
|
fPropsSucceed = FALSE;
|
||
|
|
||
|
switch(dwBitMask)
|
||
|
{
|
||
|
case PROPSET_DSO:
|
||
|
case PROPSET_DSOINIT:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT ||
|
||
|
((pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCE ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCEINFO) &&
|
||
|
bDSOInitialized == TRUE)){
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case PROPSET_INIT:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT) {
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PROPSET_SESSION:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_SESSION){
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case PROPSET_COMMAND:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_ROWSET ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET) {
|
||
|
// || pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND){
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PROPSET_ROWSET:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_ROWSET ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET){
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case PROPSET_COLUMN:
|
||
|
if(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_COLUMN ||
|
||
|
pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN){
|
||
|
fPropsSucceed = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
fPropsSucceed = FALSE;
|
||
|
|
||
|
};
|
||
|
|
||
|
if(fPropsSucceed == TRUE)
|
||
|
{
|
||
|
fRet = LoadDBPROP( &m_prgproperties[ulIndex], &pProp[cCount] );
|
||
|
}
|
||
|
else
|
||
|
fPropsinError = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
pProp[cCount].dwPropertyID = rgPropertyIDSets[ulPropertySets].rgPropertyIDs[cCount];
|
||
|
pProp[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fPropsinError = TRUE;
|
||
|
}
|
||
|
|
||
|
|
||
|
/* if( (GetPropIndex(pProp[cCount].dwPropertyID, &ulIndex)) &&
|
||
|
((((dwBitMask & PROPSET_DSO) || (dwBitMask & PROPSET_INIT)) &&
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT)) ||
|
||
|
(((dwBitMask & PROPSET_DSO) || (dwBitMask & PROPSET_INIT))&&
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT)) ||
|
||
|
(((dwBitMask & PROPSET_DSOINIT) == PROPSET_DSOINIT) &&
|
||
|
((pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCE) ||
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCEINFO))) ||
|
||
|
((dwBitMask & PROPSET_SESSION) &&
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_SESSION)) ||
|
||
|
((dwBitMask & PROPSET_ROWSET) &&
|
||
|
((pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_ROWSET) ||
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET))) ||
|
||
|
((dwBitMask & PROPSET_COLUMN) &&
|
||
|
((pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_COLUMN) ||
|
||
|
(pPropSet[ulPropertySets].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN))) ) ){
|
||
|
fPropsSucceed = TRUE;
|
||
|
fRet = LoadDBPROP( &m_prgproperties[ulIndex], &pProp[cCount] );
|
||
|
}
|
||
|
else
|
||
|
fPropsinError = TRUE;
|
||
|
|
||
|
*/
|
||
|
if (!fRet){
|
||
|
ULONG ulFor;
|
||
|
|
||
|
//=========================================================
|
||
|
// something went wrong
|
||
|
// clear all variants used so far..
|
||
|
//=========================================================
|
||
|
for (ulFor = 0; ulFor < cCount; ulFor++){
|
||
|
VariantClear( &pProp[ulFor].vValue );
|
||
|
}
|
||
|
|
||
|
//=========================================================
|
||
|
// .. delete the pPropInfo array, return failure
|
||
|
//=========================================================
|
||
|
g_pIMalloc->Free( pProp );
|
||
|
g_pIMalloc->Free( pPropSet );
|
||
|
return E_FAIL ;
|
||
|
}
|
||
|
}
|
||
|
//=================================================================
|
||
|
// Set local back to FALSE
|
||
|
//=================================================================
|
||
|
fGetAllProps = FALSE;
|
||
|
}
|
||
|
|
||
|
//=====================================================================
|
||
|
// set count of properties and property information
|
||
|
//=====================================================================
|
||
|
if(cProps > 0)
|
||
|
{
|
||
|
*pcPropertySets = cProps;
|
||
|
*prgPropertySets = pPropSet;
|
||
|
}
|
||
|
|
||
|
if ( (!fPropsSucceed && cPropertyIDSets) || (!fPropsSucceed && fPropsinError) )
|
||
|
{
|
||
|
/* g_pIMalloc->Free( pProp );
|
||
|
g_pIMalloc->Free( pPropSet );
|
||
|
*pcPropertySets = 0;
|
||
|
*prgPropertySets = NULL;
|
||
|
*/ return DB_E_ERRORSOCCURRED ;
|
||
|
}
|
||
|
else if ( fPropsSucceed && fPropsinError )
|
||
|
return DB_S_ERRORSOCCURRED ;
|
||
|
else
|
||
|
return S_OK ;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Initialize the buffers and check for E_INVALIDARG cases
|
||
|
//
|
||
|
// HRESULT indicating the status of the method
|
||
|
// S_OK Properties gathered
|
||
|
// E_INVALIDARG Invalid parameter values
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::SetPropertiesArgChk( const ULONG cPropertySets, //IN Count of structs returned
|
||
|
const DBPROPSET rgPropertySets[],//IN Array of Properties Sets
|
||
|
BOOL bDSOInitialized)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
//================================================================
|
||
|
// Argument Checking
|
||
|
//================================================================
|
||
|
if ((cPropertySets > 0) && !rgPropertySets)
|
||
|
return E_INVALIDARG ;
|
||
|
|
||
|
//================================================================
|
||
|
// New argument check for > 1 cPropertyIDs and NULL pointer for
|
||
|
// array of property ids.
|
||
|
//================================================================
|
||
|
for(ULONG ul=0; ul<cPropertySets && hr == S_OK; ul++){
|
||
|
|
||
|
// Setting a error property set is not allowed
|
||
|
if(rgPropertySets[ul].guidPropertySet == DBPROPSET_PROPERTIESINERROR )
|
||
|
{
|
||
|
hr = E_INVALIDARG;
|
||
|
}
|
||
|
else
|
||
|
if( rgPropertySets[ul].cProperties && !(rgPropertySets[ul].rgProperties) )
|
||
|
{
|
||
|
hr = E_INVALIDARG ;
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// Check if all the propertysetID is correct for this object
|
||
|
hr = IsValidPropertySet(bDSOInitialized,rgPropertySets[ul].guidPropertySet);
|
||
|
}
|
||
|
if(FAILED(hr))
|
||
|
break;
|
||
|
else
|
||
|
hr = S_OK;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
return hr ;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Set current settings of properties supported by the DSO/rowset
|
||
|
//
|
||
|
// HRESULT
|
||
|
// S_OK The method succeeded
|
||
|
// E_INVALIDARG pcProperties or prgPropertyInfo was NULL
|
||
|
// E_OUTOFMEMORY Out of memory
|
||
|
//
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
STDMETHODIMP CUtilProp::SetProperties ( const DWORD dwBitMask, //IN Type of PropSet
|
||
|
const ULONG cPropertyIDSets, //IN # of DBPROPSET
|
||
|
DBPROPSET rgPropertyIDSets[] //IN Array of property sets
|
||
|
)
|
||
|
{
|
||
|
ULONG ulPropertySets = 0;
|
||
|
ULONG cCount = 0;
|
||
|
BOOL fSetAllProps = TRUE;
|
||
|
BOOL fOnePropSet = FALSE;
|
||
|
BOOL fWarn = FALSE;
|
||
|
ULONG cNoOfProps = 0;
|
||
|
BOOL fFail = FALSE;
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
//====================================================================
|
||
|
// For each supported Property Set
|
||
|
//====================================================================
|
||
|
for (ulPropertySets=0; ulPropertySets < cPropertyIDSets; ulPropertySets++){
|
||
|
ULONG ulIndex = 0;
|
||
|
|
||
|
//================================================================
|
||
|
// for each prop in the propset
|
||
|
//================================================================
|
||
|
for (cCount=0; cCount < rgPropertyIDSets[ulPropertySets].cProperties; cCount++) {
|
||
|
|
||
|
cNoOfProps++;
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_OK;
|
||
|
|
||
|
//============================================================
|
||
|
// only allow the DBINIT and DATASOURCE
|
||
|
//============================================================
|
||
|
if ( (dwBitMask & PROPSET_DSO) && ((rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_DBINIT) &&
|
||
|
(dwBitMask & PROPSET_INIT)) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSETTABLE;
|
||
|
fSetAllProps = FALSE;
|
||
|
}
|
||
|
else if ( ((dwBitMask & PROPSET_DSO) &&
|
||
|
(rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_DATASOURCE &&
|
||
|
rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_DATASOURCEINFO &&
|
||
|
rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_WMIOLEDB_DBINIT &&
|
||
|
rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_DBINIT)) ||
|
||
|
((rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCE ||
|
||
|
rgPropertyIDSets[ulPropertySets].guidPropertySet == DBPROPSET_DATASOURCEINFO) &&
|
||
|
!(dwBitMask & PROPSET_INIT)) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
//============================================================
|
||
|
// only allow the SESSION
|
||
|
//============================================================
|
||
|
else if ( (dwBitMask & PROPSET_SESSION) && (rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_SESSION) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
//============================================================
|
||
|
// only allow the ROWSET
|
||
|
//============================================================
|
||
|
else if ( (dwBitMask & PROPSET_ROWSET) && (rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_ROWSET) &&
|
||
|
(rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_WMIOLEDB_ROWSET) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
//============================================================
|
||
|
// only allow the COLUMN
|
||
|
//============================================================
|
||
|
else if ( (dwBitMask & PROPSET_COLUMN) && (rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_COLUMN) &&
|
||
|
(rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_WMIOLEDB_COLUMN) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
else if ( (dwBitMask & PROPSET_COMMAND) && (rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_ROWSET) &&
|
||
|
(rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_WMIOLEDB_ROWSET) ) {
|
||
|
// && (rgPropertyIDSets[ulPropertySets].guidPropertySet != DBPROPSET_WMIOLEDB_COMMAND)){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
else{
|
||
|
|
||
|
//========================================================
|
||
|
// get the index in the array
|
||
|
//========================================================
|
||
|
if ( GetPropIndex(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwPropertyID, &ulIndex) ){
|
||
|
|
||
|
//====================================================
|
||
|
// arg checking for the prop
|
||
|
//====================================================
|
||
|
if ( (DBPROPOPTIONS_OPTIONAL != rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions) &&
|
||
|
(DBPROPOPTIONS_REQUIRED != rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions) ){
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_BADOPTION;
|
||
|
fSetAllProps = FALSE;
|
||
|
}
|
||
|
else if ( !(m_prgproperties[ulIndex].dwFlags & DBPROPFLAGS_WRITE) &&
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt == m_prgproperties[ulIndex].vtType){
|
||
|
|
||
|
// Check if it is been tried to set to default value
|
||
|
if (((rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt == VT_BOOL) &&
|
||
|
((rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.boolVal == VARIANT_TRUE) != m_prgproperties[ulIndex].boolVal)) ||
|
||
|
((rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt == VT_I4) &&
|
||
|
(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.lVal != m_prgproperties[ulIndex].longVal)) ||
|
||
|
((rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt == VT_BSTR) &&
|
||
|
(wcscmp(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.bstrVal,m_prgproperties[ulIndex].pwstrVal))) )
|
||
|
{
|
||
|
|
||
|
fSetAllProps = FALSE;
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSETTABLE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
else
|
||
|
fOnePropSet = TRUE;
|
||
|
|
||
|
}
|
||
|
else if ( ((m_prgproperties[ulIndex].vtType != rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt) &&
|
||
|
(VT_EMPTY != rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt)) ||
|
||
|
(IsValidValue(&rgPropertyIDSets[ulPropertySets].rgProperties[cCount]) == S_FALSE)) {
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_BADVALUE;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
fOnePropSet = TRUE;
|
||
|
|
||
|
if( rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.vt == VT_EMPTY )
|
||
|
{
|
||
|
memcpy( &m_prgproperties[ulIndex], &s_rgprop[m_nPropStartIndex + ulIndex], sizeof(PROPSTRUCT));
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
// switch on the propid
|
||
|
switch( m_prgproperties[ulIndex].dwPropertyID )
|
||
|
{
|
||
|
case DBPROP_INIT_DATASOURCE:
|
||
|
case DBPROP_AUTH_USERID:
|
||
|
case DBPROP_AUTH_PASSWORD:
|
||
|
case DBPROP_WMIOLEDB_DS_FILTER:
|
||
|
case DBPROP_WMIOLEDB_DS_ATTRIBUTES:
|
||
|
case DBPROP_WMIOLEDB_AUTHORITY:
|
||
|
case DBPROP_WMIOLEDB_QUERYLANGUAGE:
|
||
|
SAFE_DELETE_ARRAY(m_prgproperties[ulIndex].pwstrVal);
|
||
|
m_prgproperties[ulIndex].pwstrVal = new WCHAR [ SysStringLen(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.bstrVal) +1];
|
||
|
if(m_prgproperties[ulIndex].pwstrVal)
|
||
|
{
|
||
|
wcscpy(m_prgproperties[ulIndex].pwstrVal , rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue.bstrVal);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
fFail = TRUE;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case DBPROP_INIT_HWND:
|
||
|
case DBPROP_INIT_MODE:
|
||
|
case DBPROP_UPDATABILITY:
|
||
|
case DBPROP_WMIOLEDB_QUALIFIERS:
|
||
|
case DBPROP_WMIOLEDB_QUALIFIERFLAVOR:
|
||
|
case DBPROP_INIT_PROTECTION_LEVEL:
|
||
|
case DBPROP_INIT_IMPERSONATION_LEVEL:
|
||
|
case DBPROP_WMIOLEDB_OBJECTTYPE:
|
||
|
case DBPROP_INIT_LCID:
|
||
|
case DBPROP_WMIOLEDB_DS_DEREFALIAS:
|
||
|
case DBPROP_WMIOLEDB_DS_SIZELIMIT:
|
||
|
case DBPROP_WMIOLEDB_DS_PAGEDTIMELIMIT:
|
||
|
case DBPROP_WMIOLEDB_DS_SEARCHSCOPE:
|
||
|
case DBPROP_WMIOLEDB_DS_TIMEOUT:
|
||
|
case DBPROP_WMIOLEDB_DS_PAGESIZE:
|
||
|
case DBPROP_WMIOLEDB_DS_TIMELIMIT:
|
||
|
case DBPROP_WMIOLEDB_DS_CHASEREF:
|
||
|
|
||
|
m_prgproperties[ulIndex].longVal = V_I4(&rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue);
|
||
|
break;
|
||
|
|
||
|
case DBPROP_IRowsetChange:
|
||
|
case DBPROP_CANHOLDROWS:
|
||
|
case DBPROP_LITERALIDENTITY:
|
||
|
case DBPROP_OWNUPDATEDELETE:
|
||
|
case DBPROP_OTHERUPDATEDELETE:
|
||
|
case DBPROP_CANFETCHBACKWARDS:
|
||
|
case DBPROP_CANSCROLLBACKWARDS:
|
||
|
case DBPROP_BOOKMARKS:
|
||
|
case DBPROP_WMIOLEDB_FETCHDEEP:
|
||
|
case DBPROP_IRow:
|
||
|
case DBPROP_COL_NULLABLE:
|
||
|
case DBPROP_COL_UNIQUE:
|
||
|
case DBPROP_COL_PRIMARYKEY:
|
||
|
case DBPROP_IRowsetLocate:
|
||
|
case DBPROP_WMIOLEDB_SYSTEMPROPERTIES:
|
||
|
case DBPROP_IGetRow:
|
||
|
case DBPROP_IRowsetRefresh:
|
||
|
case DBPROP_IChapteredRowset:
|
||
|
// case DBPROP_OTHERINSERT:
|
||
|
case DBPROP_REMOVEDELETED:
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_TOKEN :
|
||
|
case DBPROP_WMIOLEDB_PREV_ASSIGNPRIMARYTOKEN :
|
||
|
case DBPROP_WMIOLEDB_PREV_LOCK_MEMORY :
|
||
|
case DBPROP_WMIOLEDB_PREV_INCREASE_QUOTA :
|
||
|
case DBPROP_WMIOLEDB_PREV_MACHINE_ACCOUNT :
|
||
|
case DBPROP_WMIOLEDB_PREV_TCB :
|
||
|
case DBPROP_WMIOLEDB_PREV_SECURITY :
|
||
|
case DBPROP_WMIOLEDB_PREV_TAKE_OWNERSHIP :
|
||
|
case DBPROP_WMIOLEDB_PREV_LOAD_DRIVER :
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEM_PROFILE :
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEMTIME :
|
||
|
case DBPROP_WMIOLEDB_PREV_PROF_SINGLE_PROCESS :
|
||
|
case DBPROP_WMIOLEDB_PREV_INC_BASE_PRIORITY :
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_PAGEFILE :
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_PERMANENT :
|
||
|
case DBPROP_WMIOLEDB_PREV_BACKUP :
|
||
|
case DBPROP_WMIOLEDB_PREV_RESTORE :
|
||
|
case DBPROP_WMIOLEDB_PREV_SHUTDOWN :
|
||
|
case DBPROP_WMIOLEDB_PREV_DEBUG :
|
||
|
case DBPROP_WMIOLEDB_PREV_AUDIT :
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEM_ENVIRONMENT :
|
||
|
case DBPROP_WMIOLEDB_PREV_CHANGE_NOTIFY :
|
||
|
case DBPROP_WMIOLEDB_PREV_REMOTE_SHUTDOWN :
|
||
|
case DBPROP_WMIOLEDB_PREV_UNDOCK :
|
||
|
case DBPROP_WMIOLEDB_PREV_SYNC_AGENT :
|
||
|
case DBPROP_WMIOLEDB_PREV_ENABLE_DELEGATION :
|
||
|
case DBPROP_WMIOLEDB_DS_ASYNCH:
|
||
|
case DBPROP_WMIOLEDB_DS_CACHERESULTS:
|
||
|
case DBPROP_WMIOLEDB_DS_ATTRIBONLY:
|
||
|
case DBPROP_WMIOLEDB_DS_TOMBSTONE:
|
||
|
case DBPROP_WMIOLEDB_ISMETHOD:
|
||
|
m_prgproperties[ulIndex].boolVal = V_BOOL(&rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue);
|
||
|
break;
|
||
|
|
||
|
|
||
|
case DBPROP_INIT_PROMPT:
|
||
|
m_prgproperties[ulIndex].longVal = V_I2(&rgPropertyIDSets[ulPropertySets].rgProperties[cCount].vValue);
|
||
|
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwStatus = DBPROPSTATUS_NOTSUPPORTED;
|
||
|
fSetAllProps = FALSE;
|
||
|
|
||
|
if(rgPropertyIDSets[ulPropertySets].rgProperties[cCount].dwOptions == DBPROPOPTIONS_OPTIONAL)
|
||
|
fWarn = TRUE;
|
||
|
else
|
||
|
{
|
||
|
fFail = TRUE;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
if(fFail)
|
||
|
{
|
||
|
hr = hr == S_OK ? DB_E_ERRORSOCCURRED: hr;
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
// Figure out the retcode
|
||
|
if ( fSetAllProps )
|
||
|
return S_OK ;
|
||
|
else if (fOnePropSet && !fSetAllProps)
|
||
|
return DB_S_ERRORSOCCURRED ;
|
||
|
else if((fSetAllProps == FALSE && fOnePropSet == FALSE &&
|
||
|
fWarn == TRUE && cNoOfProps == 1) &&
|
||
|
(m_propType == ROWSETPROP || m_propType == BINDERPROP))
|
||
|
return DB_S_ERRORSOCCURRED ;
|
||
|
else
|
||
|
return DB_E_ERRORSOCCURRED ;
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Gets the number of propertysets to be returned when a special GUID is passed
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
ULONG CUtilProp::GetNumberOfPropertySets(BOOL fDSOInitialized,const DBPROPIDSET rgPropIDSets[],ULONG cPropIDSets)
|
||
|
{
|
||
|
ULONG cPropSets = 0;
|
||
|
|
||
|
|
||
|
for( ULONG ulIndex = 0 ; ulIndex < cPropIDSets ; ulIndex++)
|
||
|
{
|
||
|
|
||
|
if( DBPROPSET_DBINITALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
cPropSets += 2;
|
||
|
}
|
||
|
else
|
||
|
if(fDSOInitialized)
|
||
|
{
|
||
|
if(DBPROPSET_ROWSETALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
cPropSets += 2;
|
||
|
}
|
||
|
else
|
||
|
if( DBPROPSET_DATASOURCEALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
cPropSets += 0; // as of now there are no datasource info properties
|
||
|
}
|
||
|
else
|
||
|
if( DBPROPSET_DATASOURCEINFOALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
cPropSets += 1;
|
||
|
}
|
||
|
else
|
||
|
if( DBPROPSET_SESSIONALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
cPropSets += 0; // session properties is yet to be added
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_COLUMNALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
cPropSets += 2; // Columns and WMioledb_columns propertysets
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return cPropSets;
|
||
|
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Fills the propertysets informations to be returned when a special GUID is passed for GetPropertyInfo
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CUtilProp::FillPropertySets(BOOL fDSOInitialized,
|
||
|
const DBPROPIDSET rgPropIDSets[],
|
||
|
ULONG cPropIDSets,
|
||
|
DBPROPINFOSET* pPropInfoSet,
|
||
|
ULONG &cProperties)
|
||
|
{
|
||
|
cProperties = 0;
|
||
|
ULONG ulIndex = 0;
|
||
|
ULONG ulPropSetIndex = 0;
|
||
|
|
||
|
if(cPropIDSets == 0)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
|
||
|
if(fDSOInitialized)
|
||
|
{
|
||
|
|
||
|
/* pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COMMAND;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
*/
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_COLUMN;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COLUMN;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
for( ; ulIndex < cPropIDSets ;ulIndex++)
|
||
|
{
|
||
|
if( fDSOInitialized == FALSE &&
|
||
|
DBPROPSET_DBINITALL != rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = rgPropIDSets[ulIndex].guidPropertySet;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_ROWSETALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if( DBPROPSET_DATASOURCEINFOALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if( DBPROPSET_DBINITALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_COLUMNALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_COLUMN;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COLUMN;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
// NTRaid : 142133
|
||
|
// 07/12/00
|
||
|
// since we don't support any of the property in the following Special GUIL
|
||
|
// this is been commented
|
||
|
/* else
|
||
|
if(DBPROPSET_DATASOURCEALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_DATASOURCEALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_CONSTRAINTALL == rgPropIDSets[ulIndex].guidPropertySet )
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_CONSTRAINTALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_INDEXALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_INDEXALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_SESSIONALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_SESSIONALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_TABLEALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_TABLEALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_TRUSTEEALL == rgPropIDSets[ulIndex].guidPropertySet)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_TRUSTEEALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
else
|
||
|
if(DBPROPSET_VIEWALL == rgPropIDSets[ulIndex].guidPropertySet && fDSOInitialized == TRUE)
|
||
|
{
|
||
|
pPropInfoSet[ulPropSetIndex].guidPropertySet = DBPROPSET_VIEWALL;
|
||
|
pPropInfoSet[ulPropSetIndex++].cPropertyInfos = 0;
|
||
|
cProperties += 0;
|
||
|
|
||
|
}
|
||
|
*/ }
|
||
|
|
||
|
}
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Gets the number of propertysets to be returned for a particular type of property object
|
||
|
// if 0 is passed for the number of property set to be retrieved
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
ULONG CUtilProp::GetNumberOfPropertySets(BOOL fDSOInitialized,DWORD dwBitMask)
|
||
|
{
|
||
|
ULONG cPropSets = 0;
|
||
|
|
||
|
switch(m_propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
if(fDSOInitialized == TRUE)
|
||
|
cPropSets = 3; // DBINIT & WMIOLEDB_DBINIT && DATASOURCEINFO
|
||
|
else
|
||
|
cPropSets = 2; // DBINIT & WMIOLEDB_DBINIT
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
cPropSets = 0; // number of sesssion propertysets
|
||
|
break;
|
||
|
|
||
|
case COMMANDPROP :
|
||
|
cPropSets = 3; // WMIOLEDB_COMMAND & ROWSET & WMIOLEDB_ROWSET
|
||
|
break;
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
cPropSets = 2; // ROWSET & WMIOLEDB_ROWSET
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP:
|
||
|
switch(dwBitMask)
|
||
|
{
|
||
|
case PROPSET_INIT:
|
||
|
cPropSets = 2;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_DSO:
|
||
|
case PROPSET_DSOINIT:
|
||
|
if(fDSOInitialized == TRUE)
|
||
|
cPropSets = 3;
|
||
|
else
|
||
|
cPropSets = 2;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case PROPSET_SESSION:
|
||
|
cPropSets = 0;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_COMMAND:
|
||
|
cPropSets = 3;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_ROWSET:
|
||
|
cPropSets = 2;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_COLUMN:
|
||
|
cPropSets = 2;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
cPropSets = NUMBER_OF_SUPPORTED_PROPERTY_SETS; // all propertysets supported
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case COLUMNPROP:
|
||
|
cPropSets = 2; // COLUMNS & WMIOLEDB_COLUMN
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
return cPropSets;
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Reset all the properties to default properties
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::ResetProperties()
|
||
|
{
|
||
|
ULONG nPropStartIndex = 0;
|
||
|
|
||
|
switch(m_propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
nPropStartIndex = 0;
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
nPropStartIndex = START_OF_SUPPORTED_SESSION_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
case COMMANDPROP :
|
||
|
nPropStartIndex = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
nPropStartIndex = START_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP:
|
||
|
nPropStartIndex = 0;
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
if(m_cProperties > 0)
|
||
|
{
|
||
|
memcpy(m_prgproperties, &s_rgprop[nPropStartIndex], sizeof(PROPSTRUCT) * m_cProperties );
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Fills the different PropertIDsets when the number of propertysets
|
||
|
// requested for GetProperties is 0
|
||
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::FillPropStruct(BOOL fDSOInitialized,DWORD dwBitMask,DBPROPSET* pPropSet)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
ULONG lIndex = 0;
|
||
|
|
||
|
if(pPropSet == NULL)
|
||
|
{
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
else
|
||
|
switch(m_propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
|
||
|
if(fDSOInitialized == TRUE)
|
||
|
{
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
break;
|
||
|
|
||
|
case COMMANDPROP :
|
||
|
/* pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COMMAND;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
*/
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP:
|
||
|
|
||
|
switch(dwBitMask)
|
||
|
{
|
||
|
case PROPSET_INIT:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropSet[lIndex].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_DSO:
|
||
|
case PROPSET_DSOINIT:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
|
||
|
if(fDSOInitialized == TRUE)
|
||
|
{
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
|
||
|
break;
|
||
|
|
||
|
case PROPSET_SESSION:
|
||
|
break;
|
||
|
|
||
|
case PROPSET_COMMAND:
|
||
|
/* pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COMMAND;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
*/
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
|
||
|
break;
|
||
|
|
||
|
case PROPSET_ROWSET:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
case PROPSET_COLUMN:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_DBINIT;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_DATASOURCEINFO;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
|
||
|
/* pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COMMAND;
|
||
|
pPropSet[lIndex++].cProperties = START_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
*/
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_ROWSET;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
};
|
||
|
|
||
|
|
||
|
break;
|
||
|
|
||
|
case COLUMNPROP:
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
|
||
|
pPropSet[lIndex].guidPropertySet = DBPROPSET_WMIOLEDB_COLUMN;
|
||
|
pPropSet[lIndex++].cProperties = START_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
};
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Checks if the PropertysetIDs are proper
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CUtilProp::IsValidPropertySet(BOOL fDSOInitialized,const GUID guidPropset)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
/*
|
||
|
if(guidPropset == DBPROPSET_PROPERTIESINERROR &&
|
||
|
(m_propType == DATASOURCEPROP || m_propType == COMMANDPROP))
|
||
|
return hr;
|
||
|
else
|
||
|
return DB_S_ERRORSOCCURRED;
|
||
|
*/
|
||
|
switch(m_propType)
|
||
|
{
|
||
|
case DATASOURCEPROP :
|
||
|
|
||
|
if(!( guidPropset == DBPROPSET_DBINIT ||
|
||
|
(guidPropset == DBPROPSET_DATASOURCEINFO && fDSOInitialized == TRUE) ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_DBINIT ||
|
||
|
guidPropset == DBPROPSET_PROPERTIESINERROR))
|
||
|
{
|
||
|
hr = DB_S_ERRORSOCCURRED;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case SESSIONPROP :
|
||
|
if(!( guidPropset == DBPROPSET_SESSION))
|
||
|
{
|
||
|
hr = DB_S_ERRORSOCCURRED;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case COMMANDPROP :
|
||
|
if(!( guidPropset == DBPROPSET_ROWSET ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_ROWSET ||
|
||
|
// guidPropset == DBPROPSET_WMIOLEDB_COMMAND ||
|
||
|
guidPropset == DBPROPSET_PROPERTIESINERROR))
|
||
|
{
|
||
|
hr = DB_S_ERRORSOCCURRED;
|
||
|
}
|
||
|
|
||
|
case ROWSETPROP :
|
||
|
if(!( guidPropset == DBPROPSET_ROWSET ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_ROWSET))
|
||
|
{
|
||
|
hr = DB_S_ERRORSOCCURRED;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case BINDERPROP :
|
||
|
hr = S_OK;
|
||
|
break;
|
||
|
|
||
|
case COLUMNPROP :
|
||
|
if(!( guidPropset == DBPROPSET_COLUMN ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_COLUMN))
|
||
|
{
|
||
|
hr = DB_S_ERRORSOCCURRED;
|
||
|
}
|
||
|
break;
|
||
|
};
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
BOOL CUtilProp::IsPropertySetSupported(const GUID guidPropset)
|
||
|
{
|
||
|
BOOL bRet = FALSE;
|
||
|
|
||
|
|
||
|
if(guidPropset == DBPROPSET_PROPERTIESINERROR ||
|
||
|
guidPropset == DBPROPSET_DBINIT ||
|
||
|
guidPropset == DBPROPSET_DATASOURCEINFO ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_DBINIT ||
|
||
|
guidPropset == DBPROPSET_SESSION ||
|
||
|
guidPropset == DBPROPSET_ROWSET ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_ROWSET ||
|
||
|
guidPropset == DBPROPSET_COLUMN ||
|
||
|
guidPropset == DBPROPSET_WMIOLEDB_COLUMN )
|
||
|
// || guidPropset == DBPROPSET_WMIOLEDB_COMMAND )
|
||
|
{
|
||
|
bRet = TRUE;
|
||
|
};
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
|
||
|
ULONG CUtilProp::GetNumberofPropInfoToBeReturned(BOOL bDSOInitialized,
|
||
|
ULONG cPropertyIDSets,
|
||
|
const DBPROPIDSET rgPropertyIDSets[])
|
||
|
{
|
||
|
int nProps = 0;
|
||
|
if(cPropertyIDSets == 0)
|
||
|
{
|
||
|
nProps = NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES;
|
||
|
|
||
|
if(bDSOInitialized)
|
||
|
{
|
||
|
nProps = nProps + NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES +
|
||
|
NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
|
||
|
}
|
||
|
|
||
|
}
|
||
|
else
|
||
|
for( ULONG ulPropSets = 0; ulPropSets < cPropertyIDSets;ulPropSets++)
|
||
|
{
|
||
|
|
||
|
if (rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_DBINIT)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_DBINIT_PROPERTIES ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if (rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_WMIOLEDB_DBINIT)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_WMIOLEDB_DBINIT_PROPERTIES ;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if( bDSOInitialized )
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_DATASOURCEINFO)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_DATASOURCEINFO_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_WMIOLEDB_COMMAND)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_WMIOLEDB_COMMAND_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_ROWSET)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_WMIOLEDB_ROWSET)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_WMIOLEDB_ROWSET_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_COLUMN)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
if(rgPropertyIDSets[ulPropSets].guidPropertySet == DBPROPSET_WMIOLEDB_COLUMN)
|
||
|
{
|
||
|
if(rgPropertyIDSets[ulPropSets].cPropertyIDs == 0 )
|
||
|
{
|
||
|
nProps += NUMBER_OF_SUPPORTED_WMIOLEDB_COLUMN_PROPERTIES;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
nProps += rgPropertyIDSets[ulPropSets].cPropertyIDs;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nProps;
|
||
|
}
|
||
|
|
||
|
HRESULT CUtilProp::GetConnectionInitProperties(DBPROPSET** pprgPropertySets)
|
||
|
{
|
||
|
DBPROPIDSET rgPropertyIDSets[1];
|
||
|
ULONG cPropertySets;
|
||
|
DBPROPID rgPropId[NUMBER_OF_CONNECTIONINIT_PROP];
|
||
|
|
||
|
rgPropId[0] = DBPROP_INIT_DATASOURCE;
|
||
|
rgPropId[1] = DBPROP_INIT_PROTECTION_LEVEL;
|
||
|
rgPropId[2] = DBPROP_INIT_IMPERSONATION_LEVEL;
|
||
|
rgPropId[3] = DBPROP_AUTH_USERID;
|
||
|
rgPropId[4] = DBPROP_AUTH_PASSWORD;
|
||
|
rgPropId[5] = DBPROP_INIT_LCID;
|
||
|
rgPropId[6] = DBPROP_WMIOLEDB_AUTHORITY;
|
||
|
|
||
|
rgPropertyIDSets[0].guidPropertySet = DBPROPSET_DBINIT;
|
||
|
rgPropertyIDSets[0].rgPropertyIDs = rgPropId;
|
||
|
rgPropertyIDSets[0].cPropertyIDs = 7;
|
||
|
|
||
|
return GetProperties( PROPSET_DSO,1, rgPropertyIDSets,&cPropertySets,pprgPropertySets );
|
||
|
|
||
|
|
||
|
}
|
||
|
HRESULT CUtilProp::SetDefaultValueForStringProperties(PROPSTRUCT * prgPropeties,ULONG cProperties)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
for(ULONG lProperties = 0; lProperties < cProperties ; lProperties++)
|
||
|
{
|
||
|
switch(prgPropeties[lProperties].dwPropertyID)
|
||
|
{
|
||
|
case DBPROP_INIT_DATASOURCE:
|
||
|
case DBPROP_AUTH_USERID:
|
||
|
case DBPROP_AUTH_PASSWORD:
|
||
|
case DBPROP_WMIOLEDB_DS_FILTER:
|
||
|
case DBPROP_WMIOLEDB_DS_ATTRIBUTES:
|
||
|
case DBPROP_WMIOLEDB_AUTHORITY:
|
||
|
prgPropeties[lProperties].pwstrVal = NULL;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_QUERYLANGUAGE:
|
||
|
prgPropeties[lProperties].pwstrVal = new WCHAR[wcslen(DEFAULTQUERYLANG) + 1];
|
||
|
if(prgPropeties[lProperties].pwstrVal)
|
||
|
{
|
||
|
wcscpy(prgPropeties[lProperties].pwstrVal,DEFAULTQUERYLANG);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
//
|
||
|
// This class manages the memory allocations of all the property structs
|
||
|
//
|
||
|
//
|
||
|
//
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CPropertyMemoryMgr::AllocDBPROPINFOSET(DBPROPINFOSET *& pPropInfoSet, const ULONG cProps)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
pPropInfoSet = (DBPROPINFOSET*) g_pIMalloc->Alloc(cProps * sizeof( DBPROPINFOSET ));
|
||
|
|
||
|
if ( !pPropInfoSet ){
|
||
|
hr = E_OUTOFMEMORY ;
|
||
|
}
|
||
|
else{
|
||
|
memset( pPropInfoSet, 0, (cProps * sizeof( DBPROPINFOSET )));
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CPropertyMemoryMgr::AllocDESCRIPTBuffer(WCHAR *& pDescBuffer, WCHAR** ppDescBuffer, ULONG cProperties)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
if ( ppDescBuffer ){
|
||
|
pDescBuffer = (WCHAR*)g_pIMalloc->Alloc(cProperties * CCH_GETPROPERTYINFO_DESCRIP_BUFFER_SIZE * sizeof(WCHAR) );
|
||
|
|
||
|
if( pDescBuffer ){
|
||
|
memset(pDescBuffer, 0, (cProperties * CCH_GETPROPERTYINFO_DESCRIP_BUFFER_SIZE * sizeof(WCHAR)));
|
||
|
*ppDescBuffer = pDescBuffer;
|
||
|
}
|
||
|
else{
|
||
|
hr = E_OUTOFMEMORY ;
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
//=====================================================================================================
|
||
|
HRESULT CPropertyMemoryMgr::AllocDBPROPINFO(DBPROPINFO *& pPropInfo, DBPROPINFOSET * pPropInfoSet, ULONG ulPropSets)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
pPropInfo = (DBPROPINFO*) g_pIMalloc->Alloc(sizeof( DBPROPINFO ) * pPropInfoSet[ulPropSets].cPropertyInfos);
|
||
|
if( pPropInfo ){
|
||
|
|
||
|
}
|
||
|
else{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
//=====================================================================================================
|
||
|
HRESULT CPropertyMemoryMgr::AllocateDBPROP(DBPROP*& ppProp, const ULONG cProperties)
|
||
|
{
|
||
|
HRESULT hr = E_INVALIDARG;
|
||
|
|
||
|
if ( NULL != ppProp && NULL == ppProp && cProperties > 0 ) {
|
||
|
|
||
|
ppProp = (DBPROP*)g_pIMalloc->Alloc(cProperties * sizeof DBPROP);
|
||
|
// *ppProp = new DBPROP[cProperties];
|
||
|
if ( NULL == ppProp ){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
else {
|
||
|
memset(ppProp, 0, sizeof DBPROP);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CPropertyMemoryMgr::AllocDBPROPSET(DBPROPSET*& ppPropSet, const ULONG cPropSets)
|
||
|
{
|
||
|
HRESULT hr = E_INVALIDARG;
|
||
|
|
||
|
if ( NULL != ppPropSet && NULL == ppPropSet && cPropSets > 0 ) {
|
||
|
|
||
|
ppPropSet = (DBPROPSET*)g_pIMalloc->Alloc(cPropSets * sizeof DBPROPSET);
|
||
|
if ( NULL == ppPropSet ){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
else {
|
||
|
memset(ppPropSet, 0, cPropSets * sizeof DBPROPSET);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CPropertyMemoryMgr::AllocDBCOLUMNDESC(DBCOLUMNDESC*& ppCOLUMNDESC, const ULONG cColumnDescs)
|
||
|
{
|
||
|
HRESULT hr = E_INVALIDARG;
|
||
|
|
||
|
if ( NULL != ppCOLUMNDESC && NULL == ppCOLUMNDESC && cColumnDescs > 0 ) {
|
||
|
|
||
|
ppCOLUMNDESC = (DBCOLUMNDESC*)g_pIMalloc->Alloc(cColumnDescs * sizeof DBCOLUMNDESC);
|
||
|
if ( NULL == ppCOLUMNDESC ){
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
else {
|
||
|
memset(ppCOLUMNDESC, 0, cColumnDescs * sizeof DBCOLUMNDESC);
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPropertyMemoryMgr::FreeDBPROPINFOSET(DBPROPINFOSET *& pPropInfoSet, const ULONG cProps)
|
||
|
{
|
||
|
if (pPropInfoSet){
|
||
|
for(ULONG i = 0 ; i < cProps ; i++)
|
||
|
{
|
||
|
if(pPropInfoSet[i].rgPropertyInfos)
|
||
|
{
|
||
|
FreeDBPROPINFO(pPropInfoSet[i].rgPropertyInfos , pPropInfoSet[i].cPropertyInfos);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
g_pIMalloc->Free(pPropInfoSet);
|
||
|
pPropInfoSet = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPropertyMemoryMgr::FreeDBPROPINFO(DBPROPINFO *& pPropInfo, const ULONG cProps)
|
||
|
{
|
||
|
if(pPropInfo)
|
||
|
{
|
||
|
for(ULONG i = 0 ; i < cProps; i++)
|
||
|
{
|
||
|
VariantClear(&pPropInfo[i].vValues);
|
||
|
}
|
||
|
g_pIMalloc->Free(pPropInfo);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPropertyMemoryMgr::FreeDESCRIPTBuffer(WCHAR *& pDescBuffer, WCHAR** ppDescBuffer)
|
||
|
{
|
||
|
if ( ppDescBuffer ) {
|
||
|
*ppDescBuffer = NULL;
|
||
|
}
|
||
|
if( pDescBuffer ){
|
||
|
g_pIMalloc->Free(pDescBuffer);
|
||
|
pDescBuffer = NULL;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPropertyMemoryMgr::FreeDBCOLUMNDESC(DBCOLUMNDESC rgColumnDescs[], LONG cColumns)
|
||
|
{
|
||
|
if ( rgColumnDescs ){
|
||
|
for ( LONG i = 0; i < cColumns; i++ ) {
|
||
|
//free pointers
|
||
|
SysFreeString((BSTR)(rgColumnDescs[i].pwszTypeName));
|
||
|
if ( rgColumnDescs[i].pTypeInfo ) {
|
||
|
rgColumnDescs[i].pTypeInfo->Release();
|
||
|
rgColumnDescs[i].pTypeInfo = NULL;
|
||
|
}
|
||
|
//free sub structs
|
||
|
FreeDBPROPSET(rgColumnDescs[i].cPropertySets,rgColumnDescs[i].rgPropertySets);
|
||
|
rgColumnDescs[i].rgPropertySets = NULL;
|
||
|
}
|
||
|
g_pIMalloc->Free(rgColumnDescs);
|
||
|
}
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
HRESULT CPropertyMemoryMgr::CopyDBPROPSET(DBPROPSET*& pDestination, DBPROPSET*& pSource)
|
||
|
{
|
||
|
if ( NULL == pSource ||
|
||
|
NULL == pDestination ||
|
||
|
NULL != pDestination->rgProperties )
|
||
|
return E_INVALIDARG;
|
||
|
|
||
|
memcpy(pDestination, pSource, sizeof DBPROPSET);
|
||
|
memset(pSource->rgProperties, 0, sizeof DBPROPSET);
|
||
|
return S_OK;
|
||
|
}
|
||
|
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
HRESULT CPropertyMemoryMgr::CopyDBCOLUMNDESC(DBCOLUMNDESC*& pDestination, DBCOLUMNDESC*& pSource)
|
||
|
{
|
||
|
if ( NULL == pSource ||
|
||
|
NULL == pDestination ||
|
||
|
NULL != pDestination->rgPropertySets ) //must not contain data
|
||
|
return E_INVALIDARG;
|
||
|
memcpy(pDestination, pSource, sizeof DBCOLUMNDESC);
|
||
|
memset(pSource->rgPropertySets, 0, sizeof DBCOLUMNDESC);
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// CPriveligeToken class implementation
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Constructor
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CPreviligeToken::CPreviligeToken()
|
||
|
{
|
||
|
m_nMemAllocated = 0;
|
||
|
m_pPrevTokenPrev = NULL;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Destructor
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
CPreviligeToken::~CPreviligeToken()
|
||
|
{
|
||
|
SAFE_DELETE_ARRAY(m_pPrevTokenPrev);
|
||
|
}
|
||
|
|
||
|
|
||
|
// NTRaid: 136443
|
||
|
// 07/05/00
|
||
|
HRESULT CPreviligeToken::FInit()
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
m_nMemAllocated = sizeof(TOKEN_PRIVILEGES) + NUMBEROF_PRIVELAGES * sizeof(LUID_AND_ATTRIBUTES);
|
||
|
m_pPrevTokenPrev = (TOKEN_PRIVILEGES *)new BYTE [m_nMemAllocated];
|
||
|
if(m_pPrevTokenPrev)
|
||
|
{
|
||
|
memset(m_pPrevTokenPrev,0,m_nMemAllocated);
|
||
|
GetCurrentPrivelegeToken();
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
hr = E_OUTOFMEMORY;
|
||
|
}
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to adjust the privileges
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CPreviligeToken::AdjustTokenPrivileges(ULONG cProps , DBPROP rgProp[])
|
||
|
{
|
||
|
BOOL bRet = FALSE;
|
||
|
HANDLE hToken = NULL;
|
||
|
/* DWORD dwError;
|
||
|
|
||
|
ConvertDBPropToPriveleges(cProps,rgProp);
|
||
|
|
||
|
dwError = GetLastError();
|
||
|
// if(bRet = OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE,&hToken))
|
||
|
if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hToken))
|
||
|
*/
|
||
|
OpenToken(hToken);
|
||
|
if(hToken != NULL)
|
||
|
{
|
||
|
bRet = ::AdjustTokenPrivileges(hToken,
|
||
|
FALSE,
|
||
|
m_pPrevTokenPrev,
|
||
|
0,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
CloseHandle(hToken);
|
||
|
}
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to Set the DBPROP structure accoriding to the current privileges
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPreviligeToken::SetDBPROPForPrivileges(ULONG cProps , DBPROP * rgProp)
|
||
|
{
|
||
|
ULONG_PTR lPropValTemp = 1;
|
||
|
ULONG lSize = PRIVILEGE_NAMESIZE;
|
||
|
LONG lIndex = -1;
|
||
|
|
||
|
TCHAR strName[PRIVILEGE_NAMESIZE];
|
||
|
memset(strName,0,PRIVILEGE_NAMESIZE * sizeof(TCHAR));
|
||
|
|
||
|
for(ULONG_PTR i = 0 ; i < m_pPrevTokenPrev->PrivilegeCount ; i++)
|
||
|
{
|
||
|
lIndex = -1;
|
||
|
LookupPrivilegeName(NULL,&((m_pPrevTokenPrev->Privileges[i]).Luid) ,&strName[0],&lSize);
|
||
|
|
||
|
if(!_tcscmp(strName,SE_CREATE_TOKEN_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_CREATE_TOKEN,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_ASSIGNPRIMARYTOKEN_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_ASSIGNPRIMARYTOKEN,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_LOCK_MEMORY_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_LOCK_MEMORY,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_INCREASE_QUOTA_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_INCREASE_QUOTA,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_MACHINE_ACCOUNT_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_MACHINE_ACCOUNT,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_TCB_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_TCB,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SECURITY_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SECURITY,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_TAKE_OWNERSHIP_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_TAKE_OWNERSHIP,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_LOAD_DRIVER_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_LOAD_DRIVER,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEM_PROFILE_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SYSTEM_PROFILE,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEMTIME_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SYSTEMTIME,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_PROF_SINGLE_PROCESS_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_PROF_SINGLE_PROCESS,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_INC_BASE_PRIORITY_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_INC_BASE_PRIORITY,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CREATE_PAGEFILE_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_CREATE_PAGEFILE,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CREATE_PERMANENT_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_CREATE_PERMANENT,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_BACKUP_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_BACKUP,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_RESTORE_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_RESTORE,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SHUTDOWN_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SHUTDOWN,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_DEBUG_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_DEBUG,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_AUDIT_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_AUDIT,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEM_ENVIRONMENT_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SYSTEM_ENVIRONMENT,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CHANGE_NOTIFY_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_CHANGE_NOTIFY,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_REMOTE_SHUTDOWN_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_REMOTE_SHUTDOWN,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_UNDOCK_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_UNDOCK,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYNC_AGENT_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_SYNC_AGENT,&lIndex);
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_ENABLE_DELEGATION_NAME))
|
||
|
{
|
||
|
GetPropIndex(cProps,rgProp,DBPROP_WMIOLEDB_PREV_ENABLE_DELEGATION,&lIndex);
|
||
|
}
|
||
|
|
||
|
if(lIndex >= 0)
|
||
|
{
|
||
|
if(m_pPrevTokenPrev->Privileges[i].Attributes == SE_PRIVILEGE_ENABLED)
|
||
|
{
|
||
|
rgProp[lIndex].vValue.boolVal = VARIANT_TRUE;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
rgProp[lIndex].vValue.boolVal = VARIANT_FALSE;
|
||
|
}
|
||
|
}
|
||
|
memset(strName,0,PRIVILEGE_NAMESIZE * sizeof(TCHAR));
|
||
|
} // for loop
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to get priveleges from the DBPROP structure
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPreviligeToken::ConvertDBPropToPriveleges(ULONG cProps , DBPROP rgProp[])
|
||
|
{
|
||
|
LUID luid;
|
||
|
ULONG_PTR lPropValTemp = 1;
|
||
|
TCHAR * pName = NULL;
|
||
|
BOOL bPrivelege = TRUE;
|
||
|
|
||
|
m_pPrevTokenPrev->PrivilegeCount = 0;
|
||
|
|
||
|
for(ULONG i = 0 ; i < cProps && lPropValTemp != 0 ; i++)
|
||
|
{
|
||
|
bPrivelege = TRUE;
|
||
|
switch(rgProp[i].dwPropertyID)
|
||
|
{
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_TOKEN :
|
||
|
pName = SE_CREATE_TOKEN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_ASSIGNPRIMARYTOKEN:
|
||
|
pName = SE_ASSIGNPRIMARYTOKEN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_LOCK_MEMORY :
|
||
|
pName = SE_LOCK_MEMORY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_INCREASE_QUOTA:
|
||
|
pName = SE_INCREASE_QUOTA_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_MACHINE_ACCOUNT :
|
||
|
pName = SE_MACHINE_ACCOUNT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_TCB :
|
||
|
pName = SE_TCB_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SECURITY :
|
||
|
pName = SE_SECURITY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_TAKE_OWNERSHIP:
|
||
|
pName = SE_TAKE_OWNERSHIP_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_LOAD_DRIVER:
|
||
|
pName = SE_LOAD_DRIVER_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEM_PROFILE :
|
||
|
pName = SE_SYSTEM_PROFILE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEMTIME:
|
||
|
pName = SE_SYSTEMTIME_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_PROF_SINGLE_PROCESS:
|
||
|
pName = SE_PROF_SINGLE_PROCESS_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_INC_BASE_PRIORITY:
|
||
|
pName = SE_INC_BASE_PRIORITY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_PAGEFILE :
|
||
|
pName = SE_CREATE_PAGEFILE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_CREATE_PERMANENT:
|
||
|
pName = SE_CREATE_PERMANENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_BACKUP:
|
||
|
pName = SE_BACKUP_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_RESTORE:
|
||
|
pName = SE_RESTORE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SHUTDOWN:
|
||
|
pName = SE_SHUTDOWN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_DEBUG:
|
||
|
pName = SE_DEBUG_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_AUDIT:
|
||
|
pName = SE_AUDIT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SYSTEM_ENVIRONMENT:
|
||
|
pName = SE_SYSTEM_ENVIRONMENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_CHANGE_NOTIFY :
|
||
|
pName = SE_CHANGE_NOTIFY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_REMOTE_SHUTDOWN :
|
||
|
pName = SE_REMOTE_SHUTDOWN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_UNDOCK:
|
||
|
pName = SE_UNDOCK_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_SYNC_AGENT:
|
||
|
pName = SE_SYNC_AGENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROP_WMIOLEDB_PREV_ENABLE_DELEGATION:
|
||
|
pName = SE_ENABLE_DELEGATION_NAME;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
bPrivelege = FALSE;
|
||
|
|
||
|
|
||
|
}
|
||
|
|
||
|
if(bPrivelege)
|
||
|
{
|
||
|
LookupPrivilegeValue(NULL,pName,&luid);
|
||
|
m_pPrevTokenPrev->Privileges[m_pPrevTokenPrev->PrivilegeCount].Luid = luid;
|
||
|
//=============================================================================================
|
||
|
// Any setting other than SE_PRIVILEGE_ENABLED is interpreted by AdjustTokenPrivileges
|
||
|
// as a DISABLE request for the privelege
|
||
|
//=============================================================================================
|
||
|
m_pPrevTokenPrev->Privileges[m_pPrevTokenPrev->PrivilegeCount].Attributes = (rgProp[i].vValue.boolVal == VARIANT_TRUE)
|
||
|
? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_ENABLED_BY_DEFAULT;
|
||
|
m_pPrevTokenPrev->PrivilegeCount++;
|
||
|
pName = NULL;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Funciton to get the current privelege token
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPreviligeToken::GetCurrentPrivelegeToken()
|
||
|
{
|
||
|
HANDLE hToken = NULL;
|
||
|
HANDLE hThread = NULL;
|
||
|
BOOL bRet = FALSE;
|
||
|
/*
|
||
|
hThread = GetCurrentProcess();
|
||
|
dwError = GetLastError();
|
||
|
hThread = GetCurrentThread();
|
||
|
|
||
|
if(OpenThreadToken(hThread,TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,TRUE,&hToken))
|
||
|
// if(OpenProcessToken(hThread,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken))
|
||
|
*/
|
||
|
OpenToken(hToken);
|
||
|
if(hToken != NULL)
|
||
|
{
|
||
|
DWORD dwLen = m_nMemAllocated;
|
||
|
bRet = GetTokenInformation(hToken,
|
||
|
TokenPrivileges,
|
||
|
m_pPrevTokenPrev,
|
||
|
dwLen,
|
||
|
&dwLen);
|
||
|
|
||
|
CloseHandle(hToken);
|
||
|
}
|
||
|
// CloseHandle(hThread);
|
||
|
// dwError = GetLastError();
|
||
|
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to adjust the privileges
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CPreviligeToken::AdjustTokenPrivileges(ULONG ulProperty)
|
||
|
{
|
||
|
BOOL bRet = FALSE;
|
||
|
HANDLE hToken = NULL;
|
||
|
DWORD dwError = 0;
|
||
|
|
||
|
ConvertDBPropToPriveleges(ulProperty);
|
||
|
/*
|
||
|
dwError = GetLastError();
|
||
|
// if(bRet = OpenThreadToken(GetCurrentThread(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,FALSE,&hToken))
|
||
|
if(OpenProcessToken(GetCurrentProcess(),TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,&hToken))
|
||
|
*/
|
||
|
OpenToken(hToken);
|
||
|
if(hToken != NULL)
|
||
|
{
|
||
|
bRet = ::AdjustTokenPrivileges(hToken,
|
||
|
FALSE,
|
||
|
m_pPrevTokenPrev,
|
||
|
0,
|
||
|
NULL,
|
||
|
NULL);
|
||
|
CloseHandle(hToken);
|
||
|
}
|
||
|
dwError = GetLastError();
|
||
|
|
||
|
return bRet;
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to Set the DBPROP structure accoriding to the current privileges
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPreviligeToken::SetDBPROPForPrivileges(ULONG &ulProperty)
|
||
|
{
|
||
|
ULONG_PTR lPropValTemp = 1;
|
||
|
ULONG lSize = PRIVILEGE_NAMESIZE;
|
||
|
LONG lIndex = -1;
|
||
|
ULONG ulCurPrivilege = 0;
|
||
|
|
||
|
TCHAR strName[PRIVILEGE_NAMESIZE];
|
||
|
memset(strName,0,PRIVILEGE_NAMESIZE * sizeof(TCHAR));
|
||
|
|
||
|
ulProperty = 0;
|
||
|
|
||
|
for(ULONG_PTR i = 0 ; i < NUMBER_OF_PREVILAGE_PROPERTIES ; i++)
|
||
|
{
|
||
|
ulCurPrivilege = 0;
|
||
|
LookupPrivilegeName(NULL,&((m_pPrevTokenPrev->Privileges[i]).Luid) ,&strName[0],&lSize);
|
||
|
|
||
|
if(!_tcscmp(strName,SE_CREATE_TOKEN_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_CREATE_TOKEN;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_ASSIGNPRIMARYTOKEN_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_ASSIGNPRIMARYTOKEN;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_LOCK_MEMORY_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_LOCK_MEMORY;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_INCREASE_QUOTA_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_INCREASE_QUOTA;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_MACHINE_ACCOUNT_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_MACHINE_ACCOUNT;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_TCB_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_TCB;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SECURITY_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SECURITY;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_TAKE_OWNERSHIP_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_TAKE_OWNERSHIP;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_LOAD_DRIVER_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_LOAD_DRIVER;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEM_PROFILE_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SYSTEM_PROFILE;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEMTIME_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SYSTEMTIME;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_PROF_SINGLE_PROCESS_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_PROF_SINGLE_PROCESS;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_INC_BASE_PRIORITY_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_INC_BASE_PRIORITY;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CREATE_PAGEFILE_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_CREATE_PAGEFILE;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CREATE_PERMANENT_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_CREATE_PERMANENT;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_BACKUP_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_BACKUP;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_RESTORE_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_RESTORE;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SHUTDOWN_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SHUTDOWN;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_DEBUG_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_DEBUG;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_AUDIT_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_AUDIT;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYSTEM_ENVIRONMENT_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SYSTEM_ENVIRONMENT;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_CHANGE_NOTIFY_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_CHANGE_NOTIFY;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_REMOTE_SHUTDOWN_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_REMOTE_SHUTDOWN;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_UNDOCK_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_UNDOCK;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_SYNC_AGENT_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_SYNC_AGENT;
|
||
|
}
|
||
|
else if(!_tcscmp(strName,SE_ENABLE_DELEGATION_NAME))
|
||
|
{
|
||
|
ulCurPrivilege = DBPROPVAL_ENABLE_DELEGATION;
|
||
|
}
|
||
|
|
||
|
if(ulCurPrivilege != 0)
|
||
|
{
|
||
|
if(m_pPrevTokenPrev->Privileges[i].Attributes == SE_PRIVILEGE_ENABLED)
|
||
|
{
|
||
|
ulProperty = ulProperty | ulCurPrivilege;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
ulProperty = ulProperty | !(ulCurPrivilege);
|
||
|
}
|
||
|
}
|
||
|
memset(strName,0,PRIVILEGE_NAMESIZE * sizeof(TCHAR));
|
||
|
} // for loop
|
||
|
}
|
||
|
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to get priveleges from the DBPROP structure
|
||
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
void CPreviligeToken::ConvertDBPropToPriveleges(ULONG ulProperty)
|
||
|
{
|
||
|
LUID luid;
|
||
|
ULONG lPropValTemp = 1;
|
||
|
ULONG lProp = 0;
|
||
|
TCHAR * pName = NULL;
|
||
|
BOOL bPrivelege = TRUE;
|
||
|
|
||
|
m_pPrevTokenPrev->PrivilegeCount = 0;
|
||
|
|
||
|
for(ULONG i = 0 ; i < NUMBER_OF_PREVILAGE_PROPERTIES ; i++)
|
||
|
{
|
||
|
|
||
|
bPrivelege = TRUE;
|
||
|
|
||
|
switch(lPropValTemp)
|
||
|
{
|
||
|
case DBPROPVAL_CREATE_TOKEN :
|
||
|
pName = SE_CREATE_TOKEN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_ASSIGNPRIMARYTOKEN:
|
||
|
pName = SE_ASSIGNPRIMARYTOKEN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_LOCK_MEMORY :
|
||
|
pName = SE_LOCK_MEMORY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_INCREASE_QUOTA:
|
||
|
pName = SE_INCREASE_QUOTA_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_MACHINE_ACCOUNT :
|
||
|
pName = SE_MACHINE_ACCOUNT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_TCB :
|
||
|
pName = SE_TCB_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SECURITY :
|
||
|
pName = SE_SECURITY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_TAKE_OWNERSHIP:
|
||
|
pName = SE_TAKE_OWNERSHIP_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_LOAD_DRIVER:
|
||
|
pName = SE_LOAD_DRIVER_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SYSTEM_PROFILE :
|
||
|
pName = SE_SYSTEM_PROFILE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SYSTEMTIME:
|
||
|
pName = SE_SYSTEMTIME_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_PROF_SINGLE_PROCESS:
|
||
|
pName = SE_PROF_SINGLE_PROCESS_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_INC_BASE_PRIORITY:
|
||
|
pName = SE_INC_BASE_PRIORITY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_CREATE_PAGEFILE :
|
||
|
pName = SE_CREATE_PAGEFILE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_CREATE_PERMANENT:
|
||
|
pName = SE_CREATE_PERMANENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_BACKUP:
|
||
|
pName = SE_BACKUP_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_RESTORE:
|
||
|
pName = SE_RESTORE_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SHUTDOWN:
|
||
|
pName = SE_SHUTDOWN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_DEBUG:
|
||
|
pName = SE_DEBUG_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_AUDIT:
|
||
|
pName = SE_AUDIT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SYSTEM_ENVIRONMENT:
|
||
|
pName = SE_SYSTEM_ENVIRONMENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_CHANGE_NOTIFY :
|
||
|
pName = SE_CHANGE_NOTIFY_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_REMOTE_SHUTDOWN :
|
||
|
pName = SE_REMOTE_SHUTDOWN_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_UNDOCK:
|
||
|
pName = SE_UNDOCK_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_SYNC_AGENT:
|
||
|
pName = SE_SYNC_AGENT_NAME;
|
||
|
break;
|
||
|
|
||
|
case DBPROPVAL_ENABLE_DELEGATION:
|
||
|
pName = SE_ENABLE_DELEGATION_NAME;
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
bPrivelege = FALSE;
|
||
|
|
||
|
}
|
||
|
|
||
|
if(bPrivelege)
|
||
|
{
|
||
|
LookupPrivilegeValue(NULL,pName,&luid);
|
||
|
m_pPrevTokenPrev->Privileges[m_pPrevTokenPrev->PrivilegeCount].Luid = luid;
|
||
|
//=============================================================================================
|
||
|
// Any setting other than SE_PRIVILEGE_ENABLED is interpreted by AdjustTokenPrivileges
|
||
|
// as a DISABLE request for the privelege
|
||
|
//=============================================================================================
|
||
|
m_pPrevTokenPrev->Privileges[m_pPrevTokenPrev->PrivilegeCount].Attributes = (ulProperty & lPropValTemp)
|
||
|
? SE_PRIVILEGE_ENABLED : SE_PRIVILEGE_ENABLED_BY_DEFAULT;
|
||
|
m_pPrevTokenPrev->PrivilegeCount++;
|
||
|
pName = NULL;
|
||
|
lPropValTemp <<= 1;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
// Function to get the index of a particular property in the array of properties
|
||
|
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
BOOL CPreviligeToken::GetPropIndex (ULONG cProps ,
|
||
|
DBPROP rgProp[],
|
||
|
DBPROPID dwPropertyID,
|
||
|
LONG* pulIndex)
|
||
|
{
|
||
|
ULONG cNumberOfProperties;
|
||
|
BOOL fRc = FALSE;
|
||
|
assert( pulIndex );
|
||
|
*pulIndex = -1;
|
||
|
|
||
|
for ( cNumberOfProperties = 0; cNumberOfProperties < cProps; cNumberOfProperties++) {
|
||
|
if (dwPropertyID == rgProp[cNumberOfProperties].dwPropertyID ) {
|
||
|
|
||
|
//==============================================================
|
||
|
// found a match
|
||
|
//==============================================================
|
||
|
*pulIndex = cNumberOfProperties;
|
||
|
fRc = TRUE;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return fRc;
|
||
|
}
|
||
|
|
||
|
void CPreviligeToken::OpenToken(HANDLE &hToken)
|
||
|
{
|
||
|
HANDLE hObject = NULL;
|
||
|
DWORD dwError = 0;
|
||
|
BOOL bRet = FALSE;
|
||
|
|
||
|
hObject = GetCurrentThread();
|
||
|
if(!OpenThreadToken(hObject,TOKEN_QUERY|TOKEN_ADJUST_PRIVILEGES,TRUE,&hToken))
|
||
|
{
|
||
|
dwError = GetLastError();
|
||
|
}
|
||
|
|
||
|
if(dwError == ERROR_NO_TOKEN)
|
||
|
{
|
||
|
dwError = 0;
|
||
|
CloseHandle(hObject);
|
||
|
hObject = GetCurrentProcess();
|
||
|
if(!OpenProcessToken(hObject,TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,&hToken))
|
||
|
{
|
||
|
dwError = GetLastError();
|
||
|
}
|
||
|
}
|
||
|
|
||
|
CloseHandle(hObject);
|
||
|
|
||
|
if(!dwError)
|
||
|
{
|
||
|
DWORD dwLen = m_nMemAllocated;
|
||
|
bRet = GetTokenInformation(hToken,
|
||
|
TokenPrivileges,
|
||
|
m_pPrevTokenPrev,
|
||
|
dwLen,
|
||
|
&dwLen);
|
||
|
|
||
|
dwError = GetLastError();
|
||
|
}
|
||
|
|
||
|
}
|