|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: schemap.h
//
//--------------------------------------------------------------------------
#ifndef _SCHEMAP_H_
#define _SCHEMAP_H_
//
//Purpose contains all the attributes of an objecttype
//
typedef struct _OBJECT_TYPE_CACHE { GUID guidObject; DWORD flags; HDPA hListProperty; //List of Property of the objecttype
HDPA hListExtRights; //List of Extended Rights of the objecttype
HDPA hListPropertySet; //List of PropertySet of the objecttype
HDPA hListChildObject; //List of Child Classes of the objecttype
}OBJECT_TYPE_CACHE,*POBJECT_TYPE_CACHE;
#define OTC_PROP 0x00000001 //hListProperty is present.
#define OTC_EXTR 0x00000002 //hListExtRights,hListPropertySet is present
#define OTC_COBJ 0x00000004 //hListChildObject is present
typedef struct _ER_ENTRY { GUID guid; DWORD mask; DWORD dwFlags; WCHAR szName[ANYSIZE_ARRAY]; } ER_ENTRY, *PER_ENTRY;
typedef struct _PROP_ENTRY { GUID *pguid; GUID *pasguid; DWORD dwFlags; WCHAR szName[ANYSIZE_ARRAY]; }PROP_ENTRY,*PPROP_ENTRY;
//
// Structures used by the cache
//
typedef struct _IdCacheEntry { GUID guid; GUID asGuid; //attributeSecurityGuid, Present only for properties.
BOOL bAuxClass; WCHAR szLdapName[ANYSIZE_ARRAY]; } ID_CACHE_ENTRY, *PID_CACHE_ENTRY;
typedef struct _InheritTypeArray { GUID guidObjectType; DWORD dwFlags; ULONG cInheritTypes; SI_INHERIT_TYPE aInheritType[ANYSIZE_ARRAY]; } INHERIT_TYPE_ARRAY, *PINHERIT_TYPE_ARRAY;
typedef struct _AccessArray { GUID guidObjectType; DWORD dwFlags; ULONG cAccesses; ULONG iDefaultAccess; SI_ACCESS aAccess[ANYSIZE_ARRAY]; } ACCESS_ARRAY, *PACCESS_ARRAY;
//
// CSchemaCache object definition
//
class CSchemaCache { protected: BSTR m_strSchemaSearchPath; BSTR m_strERSearchPath; BSTR m_strFilterFile; //
//Cache of all classes in schema
//
HDPA m_hClassCache; //
//Cache of all attributes in schema
//
HDPA m_hPropertyCache; HANDLE m_hClassThread; HANDLE m_hPropertyThread; HRESULT m_hrClassResult; HRESULT m_hrPropertyResult; PINHERIT_TYPE_ARRAY m_pInheritTypeArray; //
//Cache for each objecttype. Contains lists of
//childclasses, propsets, extRigts, & properties
//
//
HDPA m_hObjectTypeCache; //
//Cache of ACCESS_RIGHT for each object type
//
HDPA m_hAccessInfoCache; //
//This ACCESS_RIGHT is used if SCHEMA_COMMON_PERM flag is present
//
ACCESS_INFO m_AICommon;
CRITICAL_SECTION m_ObjectTypeCacheCritSec; int m_nDsListObjectEnforced; HANDLE m_hLoadLibPropWaitEvent; HANDLE m_hLoadLibClassWaitEvent; AUTHZ_RESOURCE_MANAGER_HANDLE m_ResourceManager; //Used for access check
public: CSchemaCache(LPCWSTR pszServer); ~CSchemaCache();
LPCWSTR GetClassName(LPCGUID pguidObjectType); HRESULT GetInheritTypes(LPCGUID pguidObjectType, DWORD dwFlags, PSI_INHERIT_TYPE *ppInheritTypes, ULONG *pcInheritTypes); HRESULT GetAccessRights(LPCGUID pguidObjectType, LPCWSTR pszClassName, HDPA pAuxList, LPCWSTR pszSchemaPath, DWORD dwFlags, PACCESS_INFO* ppAccesInfo); HRESULT GetDefaultSD( GUID *pSchemaIDGuid, PSID pDomainSid, PSID pRootDomainSid, PSECURITY_DESCRIPTOR * ppSD = NULL );
HRESULT GetObjectTypeList(GUID *pSchamaGuid, HDPA hAuxList, LPCWSTR pszSchemaPath, DWORD dwFlags, POBJECT_TYPE_LIST *ppObjectTypeList , DWORD * pObjectTypeListCount ); AUTHZ_RESOURCE_MANAGER_HANDLE GetAuthzRM(){ return m_ResourceManager; }
HRESULT LookupClassID(LPCWSTR pszClass, LPGUID pGuid); protected: HRESULT WaitOnClassThread() { WaitOnThread(&m_hClassThread); return m_hrClassResult; } HRESULT WaitOnPropertyThread() { WaitOnThread(&m_hPropertyThread); return m_hrPropertyResult; }
private: PID_CACHE_ENTRY LookupID(HDPA hCache, LPCWSTR pszLdapName); PID_CACHE_ENTRY LookupClass(LPCGUID pguidObjectType); LPCGUID LookupPropertyID(LPCWSTR pszProperty); BOOL IsAuxClass(LPCGUID pguidObjectType);
int GetListObjectEnforced(void); BOOL HideListObjectAccess(void);
HRESULT BuildAccessArray(LPCGUID pguidObjectType, LPCWSTR pszClassName, LPCWSTR pszSchemaPath, HDPA hAuxList, DWORD dwFlags, PSI_ACCESS *ppAccesses, ULONG *pcAccesses, ULONG *piDefaultAccess); HRESULT EnumVariantList(LPVARIANT pvarList, HDPA hTempList, DWORD dwFlags, IDsDisplaySpecifier *pDisplaySpec, LPCWSTR pszPropertyClass, BOOL bObjectTypeList); UINT AddTempListToAccessList(HDPA hTempList, PSI_ACCESS *ppAccess, LPWSTR *ppszData, DWORD dwAccessFlags, DWORD dwFlags, BOOL bPropSet);
static DWORD WINAPI SchemaClassThread(LPVOID pvThreadData); static DWORD WINAPI SchemaPropertyThread(LPVOID pvThreadData);
HRESULT BuildInheritTypeArray(DWORD dwFlags);
HRESULT GetExtendedRightsForNClasses(IN LPWSTR pszSchemaSearchPath, IN LPCGUID pguidClass, IN HDPA hAuxList, OUT HDPA *phERList, OUT HDPA *phPropSetList);
HRESULT GetChildClassesForNClasses(IN LPCGUID pguidObjectType, IN LPCWSTR pszClassName, IN HDPA hAuxList, IN LPCWSTR pszSchemaPath, OUT HDPA *phChildList);
HRESULT GetPropertiesForNClasses(IN LPCGUID pguidObjectType, IN LPCWSTR pszClassName, IN HDPA hAuxList, IN LPCWSTR pszSchemaPath, OUT HDPA *phPropertyList);
HRESULT GetExtendedRightsForOneClass(IN LPWSTR pszSchemaSearchPath, IN LPCGUID pguidClass, OUT HDPA *phERList, OUT HDPA *phPropSetList);
HRESULT GetChildClassesForOneClass(IN LPCGUID pguidObjectType, IN LPCWSTR pszClassName, IN LPCWSTR pszSchemaPath, OUT HDPA *phChildList);
HRESULT GetPropertiesForOneClass(IN LPCGUID pguidObjectType, IN LPCWSTR pszClassName, IN LPCWSTR pszSchemaPath, OUT HDPA *phPropertyList);
}; typedef CSchemaCache *PSCHEMACACHE;
extern PSCHEMACACHE g_pSchemaCache;
#endif // _SCHEMAP_H_
|