ExAcquireFastResourceExclusive
NTSTATUS __stdcall ExAcquireFastResourceExclusive(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;
_BYTE *v14;
WORK_QUEUE_TYPE v15;
void *v16;
CHAR v17;
PVOID *v18;
_QWORD *v19;
INT64 v20;
NTSTATUS result;
PVOID *v22;
_QWORD *v23;
INT64 v24;
INT64 *FastOwnerEntryForThread;
PVOID *v26;
INT64 *v27;
struct _IO_WORKITEM LockHandle;
INT64 v29;
v3 = v2;
v6 = 0i64;
v7 = 2 - (v2 != 0);
memset(&LockHandle, 0, 72);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v29 = (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( *((char *)BugCheckParameter2 + 26) < 0 )
{
FastOwnerEntryForThread = ExpFindFastOwnerEntryForThread((INT64)CurrentThread, (INT64)BugCheckParameter2, 0, 0);
if( FastOwnerEntryForThread )
{
v26 = (PVOID *)FastOwnerEntryForThread[6];
v27 = FastOwnerEntryForThread + 5;
if( *v26 == v27 )
{
*(_QWORD *)a2 = v27;
v17 = 1;
*((_QWORD *)a2 + 1) = v26;
*v26 = a2;
v27[1] = (INT64)a2;
goto LABEL_16;
}
goto LABEL_41;
}
}
LODWORD(v14) = KeAbPreAcquire(BugCheckParameter2, 0i64, v3 == 0);
v6 = v14;
if( v14 )
*((_BYTE *)a2 + 16) = (2 * ((__int64)&v14[-*(_QWORD *)&v14[-16 * (unsigned __int8)v14[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), v15, v16);
v17 = ExpTryAcquireResourceExclusive((INT64)BugCheckParameter2);
if( v17 )
{
v18 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
v19 = (char *)a2 + 56;
if( *v18 == (char *)BugCheckParameter2 + 48 )
{
*v19 = (char *)BugCheckParameter2 + 48;
*((_QWORD *)a2 + 8) = v18;
*v18 = v19;
*((_QWORD *)BugCheckParameter2 + 7) = v19;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
ExpAddFastOwnerEntryToThreadList(v29, v20, 0, (INT64)a2);
LABEL_16:
result = v13;
__writecr8(v13);
goto LABEL_17;
}
LABEL_41:
__fastfail(3u);
}
if( !v3 )
{
*((_BYTE *)a2 + 17) &= 0xFAu;
*((_QWORD *)a2 + 3) = 0i64;
*((_BYTE *)a2 + 16) = 0;
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
goto LABEL_16;
}
if( v6 )
KeAbPreWait(v6);
v22 = (PVOID *)*((_QWORD *)BugCheckParameter2 + 7);
v23 = (char *)a2 + 56;
if( *v22 != (char *)BugCheckParameter2 + 48 )
goto LABEL_41;
*((_QWORD *)a2 + 8) = v22;
*v23 = (char *)BugCheckParameter2 + 48;
*v22 = v23;
*((_QWORD *)BugCheckParameter2 + 7) = v23;
*((_BYTE *)a2 + 19) = 1;
ExpPrepareToWaitForResourceExclusive((INT64)BugCheckParameter2, v29, (INT64)&LockHandle.WorkItem.Parameter);
KeReleaseInStackQueuedSpinLockFromDpcLevel((_KLOCK_QUEUE_HANDLE *)&LockHandle);
ExpAddFastOwnerEntryToThreadList(v29, v24, 0, (INT64)a2);
__writecr8(v13);
ExpWaitForResource((ERESOURCE *)BugCheckParameter2, &LockHandle.WorkItem.Parameter);
*((_BYTE *)a2 + 19) = 0;
if( v6 )
result = KeAbPreAcquire(BugCheckParameter2, v6, 0i64);
v17 = 1;
LABEL_17:
if( v6 )
{
if( v17 )
v6[26] |= 1u;
else
KeAbPostReleaseEx(BugCheckParameter2, v6);
}
LOBYTE(result) = v17;
return result;
}Referenced by:
ExpFastResourceLegacyAcquireExclusive