2025-04-27 07:49:33 -04:00

176 lines
3.8 KiB
C++

/*++
Copyright (c) 1996 Microsoft Corporation
Module Name :
admacl.hxx
Abstract:
This header file declares Admin API Access Check API
Author:
Philippe Choquier 26-Nov-1996
--*/
#if !defined(_ADMACL_H)
#define _ADMACL_H
class CInitAdmacl {
public:
CInitAdmacl();
~CInitAdmacl();
};
extern CInitAdmacl g_cinitadmacl;
#define AAC_GETALL (DWORD)-1
#define AAC_ENUM_KEYS (DWORD)-2
#define AAC_COPYKEY (DWORD)-3
#define AAC_DELETEKEY (DWORD)-4
#define ISPATHDELIM(a) ((a)=='/' || (a)=='\\')
#define ISPATHDELIMW(a) ((a)==(WCHAR)'/' || (a)==(WCHAR)'\\')
#define ADMINACL_NONINIT_SIGN 0x4b6d2dc9
#define ADMINACL_INIT_SIGN 0x5a6d2dc9
#define ADMINACL_FREED_SIGN 0x676d2dc9
class CAdminAcl {
public:
CAdminAcl() { m_wchPath[0] = '\0';
m_dwAclRef = 0;
m_pAcl = NULL;
m_pMDCom = NULL;
m_dwSignature = ADMINACL_NONINIT_SIGN; }
~CAdminAcl() ;
LPWSTR GetPath() { return m_wchPath; }
BOOL Init( IMDCOM*,
LPVOID pvAdmin,
METADATA_HANDLE hAdminHandle,
LPCWSTR pszPath,
LPBYTE pAcl,
DWORD dwAclRef,
PBOOL pbIsPathCorrect );
LPBYTE GetAcl() { return m_pAcl; }
METADATA_HANDLE GetAdminHandle() { return m_hAdminHandle; }
LPVOID GetAdminContext() { return m_pvAdmin; }
public:
static LIST_ENTRY m_ListHead;
static CRITICAL_SECTION m_csList;
static LONG m_lInList;
DWORD m_dwSignature;
LIST_ENTRY m_ListEntry;
private:
WCHAR m_wchPath[MAX_PATH];
METADATA_HANDLE m_hAdminHandle;
LPBYTE m_pAcl;
DWORD m_dwAclRef;
LPVOID m_pvAdmin;
IMDCOM* m_pMDCom;
} ;
class COpenHandle {
public:
COpenHandle()
: m_pszPath( NULL )
{}
~COpenHandle()
{
if( m_pszPath )
{
LocalFree(m_pszPath);
}
}
LPWSTR GetPath() { return m_pszPath; }
HRESULT Init(METADATA_HANDLE hAdminHandle,
LPCWSTR pszPath,
LPCWSTR pszParentPath,
BOOL fIsNSE );
METADATA_HANDLE GetAdminHandle() { return m_hAdminHandle; }
BOOL GetAcl(
IMDCOM* pMDCom,
LPCWSTR pszPath,
LPBYTE* pAcl,
LPDWORD pdwRef );
BOOL CheckSubAcls(
IMDCOM *pMDCom,
LPCWSTR pszPath,
LPBOOL pfIsAnyAcl );
VOID AddRef() {InterlockedIncrement(&m_lRefCount);}
VOID Release(PVOID pvAdmin);
private:
LPWSTR m_pszPath;
METADATA_HANDLE m_hAdminHandle;
BOOL m_fIsNse;
long m_lRefCount;
} ;
BOOL
AdminAclNotifySetOrDeleteProp(
METADATA_HANDLE hMB,
DWORD dwId
);
BOOL
AdminAclAccessCheck(
IMDCOM* pMDCom,
LPVOID pvAdmin,
METADATA_HANDLE hMB,
LPCWSTR pszPath,
DWORD dwId, // check for MD_ADMIN_ACL, must have special right to write them
DWORD dwAccess, // METADATA_PERMISSION_*
COpenHandle* pohHandle,
LPBOOL pfEnableSecureAccess = NULL
);
BOOL
AdminAclNotifyOpen(
LPVOID pvAdmin,
METADATA_HANDLE hMB,
LPCWSTR pszPath,
BOOL fIsNse
);
BOOL
AdminAclNotifyClose(
LPVOID pvAdmin,
METADATA_HANDLE hMB
);
BOOL
AdminAclFlushCache(
);
void
AdminAclDisableAclCache();
void
AdminAclEnableAclCache();
#define IsAclCachingEnabled (g_lCacheAcls > 0)
#endif