36 #define HandleToScm(Handle) (PSIDCACHEMGR)(Handle) 37 #define ScmToHandle(Scm) (HANDLE)(Scm) 84 if (QueueEntry->ListEntry.Flink !=
NULL)
91 QueueEntry->Callbacks);
181 if (SystemName !=
NULL && SystemName[0] !=
L'\0')
183 NameLength =
wcslen(SystemName);
189 LsaSystemName.
Buffer = SystemName;
192 psn = &LsaSystemName;
200 &LsaObjectAttributes,
225 DWORD AccountNameSize, DomainNameSize = 0;
236 SidNameUse =
Names->Use;
238 if (ReferencedDomain !=
NULL &&
239 Names->DomainIndex >= 0)
241 Domain = &ReferencedDomain->
Domains[
Names->DomainIndex];
242 DomainName = &Domain->
Name;
259 (
PVOID*)&PolicyAccountDomainInfo);
262 DomainName = &PolicyAccountDomainInfo->DomainName;
278 AccountNameSize =
Names->Name.Length;
279 if (DomainName !=
NULL)
281 DomainNameSize = DomainName->
Length;
287 (((AccountNameSize + DomainNameSize) + 2) *
sizeof(
WCHAR)));
298 if (DomainName !=
NULL)
311 if (PolicyAccountDomainInfo !=
NULL)
347 for (CurrentEntry = scm->CacheListHead.
Flink;
348 CurrentEntry != &scm->CacheListHead;
349 CurrentEntry = CurrentEntry->
Flink)
356 (
PSID)(CacheEntry + 1)))
359 ULONG AccountNameLen, DomainNameLen;
367 (((AccountNameLen + 1) +
368 (DomainNameLen + 1)) *
sizeof(
WCHAR));
382 Buffer += AccountNameLen + 1;
407 SIZE_T AccountNameLen = 0;
414 CacheEntrySize += SidLen;
416 AccountNameLen =
wcslen(ReqResult->AccountName);
417 CacheEntrySize += (AccountNameLen + 1) *
sizeof(
WCHAR);
419 DomainNameLen =
wcslen(ReqResult->DomainName);
420 CacheEntrySize += (
wcslen(ReqResult->DomainName) + 1) *
sizeof(
WCHAR);
425 if (CacheEntry !=
NULL)
429 CacheEntry->
SidNameUse = ReqResult->SidNameUse;
433 (
PSID)(CacheEntry + 1),
439 ReqResult->AccountName);
440 lpBuf += AccountNameLen + 1;
444 ReqResult->DomainName);
445 lpBuf += DomainNameLen + 1;
498 if (QueueEntry !=
NULL)
518 if (ReqResult !=
NULL)
528 if (ReqResult !=
NULL)
536 ReqResult = FoundReqResult;
545 i < QueueEntry->CallbackCount)
601 if (SystemName ==
NULL)
607 SystemName[
wcslen(SystemName) + 1]));
700 if (scm->QueueLookingUp !=
NULL &&
702 (
PSID)(scm->QueueLookingUp + 1)))
704 FoundEntry = scm->QueueLookingUp;
708 for (CurrentEntry = scm->QueueListHead.
Flink;
709 CurrentEntry != &scm->QueueListHead;
710 CurrentEntry = CurrentEntry->
Flink)
717 (
PSID)(QueueEntry + 1)))
719 FoundEntry = QueueEntry;
725 if (FoundEntry ==
NULL)
732 if (FoundEntry !=
NULL)
735 (
PSID)(FoundEntry + 1),
815 CurrentEntry = CurrentEntry->
Flink)
822 (
PSID)(QueueEntry + 1)))
924 if (ReqResult !=
NULL)
934 if (ReqResult !=
NULL)
942 ReqResult = FoundReqResult;
954 CompletionProc(SidCacheMgr,
959 if (ReqResult !=
NULL)
static VOID DereferenceSidCacheMgr(IN PSIDCACHEMGR scm)
struct _SIDCACHECALLBACKINFO * PSIDCACHECALLBACKINFO
_Must_inspect_result_ _In_ WDFDEVICE _In_ ULONG _In_ ACCESS_MASK DesiredAccess
VOID(* PSIDREQCOMPLETIONPROC)(IN HANDLE SidCacheMgr, IN PSID Sid, IN PSIDREQRESULT SidRequestResult, IN PVOID Context)
enum _SID_NAME_USE SID_NAME_USE
NTSTATUS WINAPI LsaQueryInformationPolicy(IN LSA_HANDLE PolicyHandle, IN POLICY_INFORMATION_CLASS InformationClass, OUT PVOID *Buffer)
PLSA_TRUST_INFORMATION Domains
IN BOOLEAN OUT PSTR Buffer
static VOID CacheLookupResults(IN PSIDCACHEMGR scm, IN PSID pSid, IN PSIDREQRESULT ReqResult)
#define POLICY_VIEW_LOCAL_INFORMATION
BOOL WINAPI EqualSid(PSID pSid1, PSID pSid2)
static DWORD WINAPI LookupThreadProc(IN LPVOID lpParameter)
struct _SIDCACHEENTRY SIDCACHEENTRY
HANDLE CreateSidCacheMgr(IN HANDLE Heap, IN LPCWSTR SystemName)
NTSTATUS WINAPI LsaClose(IN LSA_HANDLE ObjectHandle)
VOID DestroySidCacheMgr(IN HANDLE SidCacheMgr)
#define ERROR_NOT_ENOUGH_MEMORY
static BOOL OpenLSAPolicyHandle(IN LPWSTR SystemName, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define InsertTailList(ListHead, Entry)
NTSTATUS WINAPI LsaLookupSids(IN LSA_HANDLE PolicyHandle, IN ULONG Count, IN PSID *Sids, OUT PLSA_REFERENCED_DOMAIN_LIST *ReferencedDomains, OUT PLSA_TRANSLATED_NAME *Names)
_Must_inspect_result_ FORCEINLINE BOOLEAN IsListEmpty(_In_ const LIST_ENTRY *ListHead)
BOOL LookupSidCache(IN HANDLE SidCacheMgr, IN PSID pSid, IN PSIDREQCOMPLETIONPROC CompletionProc, IN PVOID Context)
#define STATUS_NONE_MAPPED
static VOID CleanupSidCacheMgr(IN PSIDCACHEMGR scm)
FORCEINLINE BOOLEAN RemoveEntryList(_In_ PLIST_ENTRY Entry)
VOID WINAPI FreeLibraryAndExitThread(HMODULE hLibModule, DWORD dwExitCode)
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
NTSTATUS WINAPI LsaOpenPolicy(IN PLSA_UNICODE_STRING SystemName OPTIONAL, IN PLSA_OBJECT_ATTRIBUTES ObjectAttributes, IN ACCESS_MASK DesiredAccess, OUT PLSA_HANDLE PolicyHandle)
VOID DereferenceSidReqResult(IN HANDLE SidCacheMgr, IN PSIDREQRESULT ReqResult)
static BOOL QueueSidLookup(IN PSIDCACHEMGR scm, IN PSID pSid, IN PSIDREQCOMPLETIONPROC CompletionProc, IN PVOID Context)
struct _SIDREQRESULT SIDREQRESULT
struct _SIDCACHEENTRY * PSIDCACHEENTRY
struct _SIDQUEUEENTRY * PSIDQUEUEENTRY
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
static VOID FreeQueueEntry(IN PSIDCACHEMGR scm, IN PSIDQUEUEENTRY QueueEntry)
struct _SIDQUEUEENTRY * QueueLookingUp
NTSTATUS WINAPI LsaFreeMemory(IN PVOID Buffer)
PFLT_MESSAGE_WAITER_QUEUE CONTAINING_RECORD(Csq, DEVICE_EXTENSION, IrpQueue)) -> WaiterQ.mLock) _IRQL_raises_(DISPATCH_LEVEL) VOID NTAPI FltpAcquireMessageWaiterLock(_In_ PIO_CSQ Csq, _Out_ PKIRQL Irql)
static HINSTANCE hDllInstance
#define POLICY_LOOKUP_NAMES
static BOOL LookupSidInformation(IN PSIDCACHEMGR scm, IN PSID pSid, OUT PSIDREQRESULT *ReqResult)
struct _LIST_ENTRY * Flink
#define UNICODE_STRING_MAX_CHARS
PVOID WINAPI HeapAlloc(HANDLE, DWORD, SIZE_T)
ULONG WINAPI LsaNtStatusToWinError(IN NTSTATUS Status)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
#define NT_SUCCESS(StatCode)
DWORD WINAPI GetLengthSid(PSID pSid)
static VOID FreeCacheEntry(IN PSIDCACHEMGR scm, IN PSIDCACHEENTRY CacheEntry)
struct _SIDCACHEMGR SIDCACHEMGR
static PSIDCACHEMGR ReferenceSidCacheMgr(IN HANDLE SidCacheMgr)
_CRTIMP wchar_t *__cdecl wcscpy(_Out_writes_z_(_String_length_(_Source)+1) wchar_t *_Dest, _In_z_ const wchar_t *_Source)
#define InterlockedDecrement
struct _SIDQUEUEENTRY SIDQUEUEENTRY
static const WCHAR Cleanup[]
struct _SIDCACHEMGR * PSIDCACHEMGR
BOOL WINAPI GetModuleHandleExW(IN DWORD dwFlags, IN LPCWSTR lpwModuleName OPTIONAL, OUT HMODULE *phModule)
#define InterlockedIncrement
VOID DequeueSidLookup(IN HANDLE SidCacheMgr, IN PSID pSid)
PSIDCACHECALLBACKINFO Callbacks
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
#define InitializeListHead(ListHead)
PSIDREQCOMPLETIONPROC CompletionProc
#define FIELD_OFFSET(t, f)
VOID ReferenceSidReqResult(IN HANDLE SidCacheMgr, IN PSIDREQRESULT ReqResult)
_CRTIMP size_t __cdecl wcslen(_In_z_ const wchar_t *_Str)
struct tagContext Context
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
BOOL WINAPI CopySid(DWORD nDestinationSidLength, PSID pDestinationSid, PSID pSourceSid)
struct _SIDCACHECALLBACKINFO SIDCACHECALLBACKINFO
static BOOL FindSidInCache(IN PSIDCACHEMGR scm, IN PSID pSid, OUT PSIDREQRESULT *ReqResult)
#define HeapFree(x, y, z)
#define HandleToScm(Handle)