SepRmCallLsa
VOID __stdcall SepRmCallLsa(INT64 **a1){
INT64 v1;
char v2;
int v4;
INT64 *v5;
_ETHREAD *CurrentThread;
INT64 *v7;
INT64 *v8;
signed __int32 v9;
VOID *v10;
_ETHREAD *v11;
_EJOB *v12;
_LIST_ENTRY *Silo;
NTSTATUS v14;
NTSTATUS v15;
_KEVENT *v16;
INT64 **v17;
INT64 *v18;
_KEVENT *v19;
INT64 *v20;
char pbPreventCoaf[8];
VOID *Handle;
_KLOCK_QUEUE_HANDLE LockHandle;
_KAPC_STATE ApcState;
Handle = 0i64;
v2 = SepRmAuditingEnabled;
memset(&ApcState, 0, sizeof(ApcState));
v4 = 1;
memset(&LockHandle, 0, sizeof(LockHandle));
if( AdtpRegisteredWithEtw
|| SepAdtOpenEtwReadyEvent(&Handle) >= 0
&& (v15 = NtWaitForSingleObject((UINT64)Handle, 1, 0i64), NtClose((UINT64)Handle), v15 >= 0) )
{
if( v2 )
KiStackAttachProcess(SepRmLsaCallProcess, 0i64, &ApcState);
do
{
v5 = 0i64;
if( ((_BYTE)a1[28] & 1) == 0 )
goto LABEL_45;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquireResourceExclusiveLite((UINT64)(a1 + 4), 1, v1);
v7 = *a1;
if( *a1 == (INT64 *)a1 )
{
v16 = (_KEVENT *)a1[24];
if( v16 )
KeSetEvent(v16, 0, 0);
}
else if( *((_DWORD *)v7 + 13) == *((_DWORD *)a1 + 46) + 1 )
{
v5 = *a1;
v8 = (INT64 *)*v7;
if( (INT64 **)v7[1] != a1 || (INT64 *)v8[1] != v7 )
LABEL_42:
__fastfail(3u);
*a1 = v8;
v8[1] = (INT64)a1;
}
ExReleaseResourceLite((PERESOURCE)(a1 + 4));
KeLeaveCriticalRegionThread(KeGetCurrentThread());
if( !v5 )
{
LABEL_45:
if( ((_BYTE)a1[28] & 2) == 0 )
continue;
KeAcquireInStackQueuedSpinLock((PKSPIN_LOCK)a1 + 17, &LockHandle);
v17 = a1 + 2;
v18 = a1[2];
if( v18 == (INT64 *)(a1 + 2) )
{
v19 = (_KEVENT *)a1[25];
if( v19 )
KeSetEvent(v19, 0, 0);
}
else if( *((_DWORD *)v18 + 13) == *((_DWORD *)a1 + 46) + 1 )
{
v5 = a1[2];
v20 = (INT64 *)*v18;
if( (INT64 **)v18[1] != v17 || (INT64 *)v20[1] != v18 )
goto LABEL_42;
*v17 = v20;
v20[1] = (INT64)v17;
}
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
if( !v5 )
continue;
}
if( *((_DWORD *)v5 + 8) != 1 || (*(_DWORD *)(v5[3] + 20) & 2) != 0 )
{
if( v2 )
SepRmDispatchDataToLsa((_SEP_LSA_WORK_ITEM *)v5);
}
else
{
v11 = (_ETHREAD *)KeGetCurrentThread();
v12 = (_EJOB *)v5[7];
pbPreventCoaf[0] = 0;
Silo = (_LIST_ENTRY *)v11->Silo;
v11->Silo = v12;
v14 = AdtpWriteToEtw((_SE_ADT_PARAMETER_ARRAY *)v5[3], (UINT8 *)pbPreventCoaf);
KeGetCurrentThread()[1].WaitBlock[3].WaitListEntry.Blink = Silo;
if( v14 < 0 )
{
LODWORD(SepAdtLastAuditFailStatus) = v14;
_InterlockedIncrement((_DWORD *)&stru_140CF2E80 + 1957);
if( !pbPreventCoaf[0] )
SepAuditFailed((unsigned int)v14);
}
if( (unsigned int)(*((_DWORD *)v5 + 4) - 4) <= 1 )
ExFreePoolWithTag((PVOID)v5[3], 0);
}
_InterlockedIncrement((volatile signed __int32 *)a1 + 46);
v9 = _InterlockedExchangeAdd((volatile signed __int32 *)a1 + 44, 0xFFFFFFFF);
v10 = (VOID *)v5[7];
v4 = v9 - 1;
if( v10 )
{
ObfDereferenceObjectWithTag(v10, 0x69416553ui64);
v5[7] = 0i64;
}
((void(__fastcall *)(INT64 *))a1[27])(v5);
}
while( v4 );
if( v2 )
KiUnstackDetachProcess(&ApcState, 0i64);
}
}Referenced by:
No references.