windows-nt/Source/XPSP1/NT/shell/osshell/security/aclui/sidcache.h

130 lines
4.2 KiB
C
Raw Normal View History

2020-09-26 03:20:57 -05:00
//+-------------------------------------------------------------------------
//
// Microsoft Windows
//
// Copyright (C) Microsoft Corporation, 1997 - 1999
//
// File: sidcache.h
//
// This file contains definitions and prototypes for SID/Name cache.
//
//--------------------------------------------------------------------------
#ifndef _SIDCACHE_H_
#define _SIDCACHE_H_
#include <comctrlp.h> // DPA
DWORD WaitOnThread(HANDLE *phThread);
#define BUCKET_COUNT 31
typedef struct _sid_cache_entry
{
DWORD dwLastAccessTime;
SID_NAME_USE SidType;
PSID pSid;
LPCTSTR pszName;
LPCTSTR pszLogonName;
} SID_CACHE_ENTRY, *PSID_CACHE_ENTRY;
class CSidCache
{
private:
HDPA m_dpaSidHashTable[BUCKET_COUNT];
CRITICAL_SECTION m_csHashTableLock;
CRITICAL_SECTION m_csDomainNameLock;
CRITICAL_SECTION m_csDcNameLock;
LPTSTR m_pszCachedServer;
LPTSTR m_pszCachedDomain;
HANDLE m_hInitThread;
LPTSTR m_pszLastDc;
LPTSTR m_pszLastDomain;
LONG m_cRef;
public:
CSidCache();
~CSidCache();
// used to control lifetime of the object
ULONG AddRef();
ULONG Release();
BOOL LookupSids(HDPA hSids, LPCTSTR pszServer, LPSECURITYINFO2 psi2, PUSER_LIST *ppUserList);
BOOL LookupSidsAsync(HDPA hSids, LPCTSTR pszServer, LPSECURITYINFO2 psi2, HWND hWndNotify, UINT uMsgNotify);
#if(_WIN32_WINNT >= 0x0500)
BOOL LookupNames(PDS_SELECTION_LIST pDsSelList, LPCTSTR pszServer, PUSER_LIST *ppUserList, BOOL bStandalone);
#endif
void GetDomainName(LPCTSTR pszServer, LPTSTR pszDomain, ULONG cchDomain);
void GetDcName(LPCTSTR pszDomain, LPTSTR pszDC, ULONG cchDC);
PSID_CACHE_ENTRY FindSid(PSID pSid);
PSID_CACHE_ENTRY MakeEntry(PSID pSid,
SID_NAME_USE SidType,
LPCTSTR pszName,
LPCTSTR pszLogonName = NULL);
BOOL AddEntry(PSID_CACHE_ENTRY pEntry);
BOOL BuildUserList(HDPA hEntryList,
LPCTSTR pszServer,
PUSER_LIST *ppUserList);
private:
int HashSid(PSID pSid);
static int CALLBACK CompareSid(LPVOID p1, LPVOID p2, LPARAM lParam);
void GetUserFriendlyName(LPCTSTR pszSamLogonName,
LPCTSTR pszSamAccountName,
LPCTSTR pszServer,
BOOL bUseSamCompatibleInfo,
BOOL bIsStandalone,
BSTR *pstrLogonName,
BSTR *pstrDisplayName);
BSTR GetNT4DisplayName(LPCTSTR pszAccount,
LPCTSTR pszName,
LPCTSTR pszServer,
BOOL bStandalone);
BOOL InternalLookupSids(HDPA hSids,
LPCTSTR pszServer,
LPSECURITYINFO2 psi2,
HDPA hEntryList,
HWND hWndNotify = NULL,
UINT uMsgNotify = 0);
BOOL LookupSidsHelper(HDPA hSids,
LPCTSTR pszServer,
HDPA hEntryList,
HWND hWndNotify = NULL,
UINT uMsgNotify = 0,
BOOL bSecondTry = FALSE);
HRESULT LookupSidsFromObject(HDPA hSids, LPSECURITYINFO2 psi2, HDPA hEntryList);
#if(_WIN32_WINNT >= 0x0500)
BOOL InternalLookupNames(PDS_SELECTION_LIST pDsSelList,
LPCTSTR pszServer,
HDPA hEntryList,
BOOL bStandalone);
#endif
static DWORD WINAPI InitThread(LPVOID pvThreadData);
void Lock() { EnterCriticalSection(&m_csHashTableLock); }
void Unlock() { LeaveCriticalSection(&m_csHashTableLock); }
void LockDomain() { EnterCriticalSection(&m_csDomainNameLock); }
void UnlockDomain() { LeaveCriticalSection(&m_csDomainNameLock); }
void LockDc() { EnterCriticalSection(&m_csDcNameLock); }
void UnlockDc() { LeaveCriticalSection(&m_csDcNameLock); }
};
typedef CSidCache *PSIDCACHE;
//
// Helper functions for creating/deleting the global SID Cache
//
PSIDCACHE GetSidCache();
void FreeSidCache();
#endif // _SIDCACHE_H_