ExAcquireFastResourceShared
NTSTATUS __stdcall ExAcquireFastResourceShared(PVOID BugCheckParameter2, PVOID a2){
char v2;
char v3;
_BYTE *v6;
unsigned __int8 v7;
_ETHREAD *CurrentThread;
unsigned __int8 CurrentIrql;
_ETHREAD *v10;
ULONG_PTR v11;
ULONG_PTR v12;
unsigned __int8 v13;
INT64 *FastOwnerEntryForThread;
_BYTE *v15;
WORK_QUEUE_TYPE v16;
void *v17;
CHAR v18;
PVOID *v19;
_QWORD *v20;
PVOID *v21;
__int64 v22;
NTSTATUS result;
PVOID *v24;
_QWORD *v25;
INT64 v26;
PVOID *v27;
INT64 *v28;
struct _IO_WORKITEM LockHandle;
INT64 v30;
v3 = v2;
v6 = 0i64;
v7 = 2 - (v2 != 0);
memset(&LockHandle, 0, 72);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v30 = (INT64)CurrentThread;
if( (*((_BYTE *)BugCheckParameter2 + 26) & 1) == 0 )
KeBugCheckEx(0x1C6u, 3ui64, (ULONG_PTR)BugCheckParameter2, 0i64, 0i64);
CurrentIrql = KeGetCurrentIrql();
v10 = (_ETHREAD *)KeGetCurrentThread();
if( CurrentIrql > v7 )
KeBugCheckEx(0x1C6u, 0i64, CurrentIrql, v7, 0i64);
if( CurrentIrql >= 2u && (*((_DWORD *)KeGetPcr() + 3243) & 0x10001) != 0 )
KeBugCheckEx(0x1C6u, 5ui64, 0i64, 0i64, 0i64);
if( (*((_BYTE *)v10 + 192) & 2) != 0 )
KeBugCheckEx(0x1C6u, 6ui64, 0i64, 0i64, 0i64);
if( !CurrentIrql && (*((_DWORD *)v10 + 29) & 0x400) == 0 && !*((_DWORD *)v10 + 121) )
KeBugCheckEx(0x1C6u, 7ui64, 0i64, 0i64, 0i64);
v11 = *((_QWORD *)a2 + 4);
if( (_ETHREAD *)v11 != v10 )
KeBugCheckEx(0x1C6u, 9ui64, (ULONG_PTR)a2, v11, 0i64);
v12 = *((_QWORD *)a2 + 3);
if( v12 )
KeBugCheckEx(0x1C6u, 2ui64, (ULONG_PTR)a2, v12, 0i64);
*((_BYTE *)a2 + 17) &= ~4u;
*((_QWORD *)a2 + 3) = BugCheckParameter2;
v13 = KeGetCurrentIrql();
__writecr8(2ui64);
if( *((_DWORD *)BugCheckParameter2 + 16) )
{
FastOwnerEntryForThread = ExpFindFastOwnerEntryForThread((INT64)CurrentThread, (INT64)BugCheckParameter2, 0, 0);
if( FastOwnerEntryForThread )
{
v27 = (PVOID *)FastOwnerEntryForThread[6];
v28 = FastOwnerEntryForThread + 5;
if( *v27 == v28 )
{
*(_QWORD *)a2 = v28;
v18 = 1;
*((_QWORD *)a2 + 1) = v27;
*v27 = a2;
v28[1] = (INT64)a2;
goto LABEL_18;
}
goto LABEL_42;
}
}
LODWORD(v15) = KeAbPreAcquire(BugCheckParameter2, 0i64, v3 == 0);
v6 = v15;
if( v15 )
*((_BYTE *)a2 + 16) = (2 * ((__int64)&v15[-*(_QWORD *)&v15[-16 * (unsigned __int8)v15[24] + 800]] / 96)) | 1;
LockHandle.WorkItem.List.Flink = 0i64;
LockHandle.WorkItem.List.Blink = (_LIST_ENTRY *)((char *)BugCheckParameter2 + 96);
KxAcquireQueuedSpinLock(&LockHandle, (PIO_WORKITEM_ROUTINE)((char *)BugCheckParameter2 + 96), v16, v17);
v18 = ExpTryAcquireResourceShared((INT64)BugCheckParameter2);
if( v18 )
{
v19 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
v20 = (char *)a2 + 56;
if( *v19 == (char *)BugCheckParameter2 + 48 )
{
*v20 = (char *)BugCheckParameter2 + 48;
*((_QWORD *)a2 + 8) = v19;
*v19 = v20;
*((_QWORD *)BugCheckParameter2 + 7) = v20;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
*((_BYTE *)a2 + 18) = 1;
*((_QWORD *)a2 + 6) = (char *)a2 + 40;
*((_QWORD *)a2 + 5) = (char *)a2 + 40;
v21 = (PVOID *)(v30 + 1576);
v22 = *(_QWORD *)(v30 + 1576);
if( *(_QWORD *)(v22 + 8) == v30 + 1576 )
{
*(_QWORD *)a2 = v22;
*((_QWORD *)a2 + 1) = v21;
*(_QWORD *)(v22 + 8) = a2;
*v21 = a2;
LABEL_18:
result = v13;
__writecr8(v13);
goto LABEL_19;
}
}
goto LABEL_42;
}
if( !v3 )
{
*((_BYTE *)a2 + 17) &= 0xFAu;
*((_QWORD *)a2 + 3) = 0i64;
*((_BYTE *)a2 + 16) = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
goto LABEL_18;
}
if( v6 )
KeAbPreWait(v6);
v24 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
v25 = (char *)a2 + 56;
if( *v24 != (char *)BugCheckParameter2 + 48 )
LABEL_42:
__fastfail(3u);
*((_QWORD *)a2 + 8) = v24;
*v25 = (char *)BugCheckParameter2 + 48;
*v24 = v25;
*((_QWORD *)BugCheckParameter2 + 7) = v25;
ExpPrepareToWaitForResourceShared((INT64)BugCheckParameter2, v30, (INT64)&LockHandle.WorkItem.Parameter);
*((_BYTE *)a2 + 19) = 1;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
ExpAddFastOwnerEntryToThreadList(v30, v26, 0, (INT64)a2);
__writecr8(v13);
ExpWaitForResource((ERESOURCE *)BugCheckParameter2, &LockHandle.WorkItem.Parameter);
*((_BYTE *)a2 + 19) = 0;
if( v6 )
result = KeAbPreAcquire(BugCheckParameter2, v6, 0i64);
v18 = 1;
LABEL_19:
if( v6 )
{
if( v18 )
v6[26] |= 1u;
else
KeAbPostReleaseEx(BugCheckParameter2, v6);
}
LOBYTE(result) = v18;
return result;
}Referenced by:
ExAcquireResourceSharedLite
ExEnterCriticalRegionAndAcquireResourceShared
ExEnterPriorityRegionAndAcquireResourceShared
SeSecurityAttributePresent
SepMandatoryIntegrityCheck