|
|
//+-------------------------------------------------------------------------
//
// 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_
|