ExEnterCriticalRegionAndAcquireResourceExclusive

VOID *__stdcall ExEnterCriticalRegionAndAcquireResourceExclusive(_ERESOURCE *Resource){
  _ETHREAD *CurrentThread; 
  __int16 v2; 
  unsigned __int8 CurrentIrql; 
  _ETHREAD *v5; 

  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  --CurrentThread->Tcb.KernelApcDisable;
  if( (Resource->Flag & 0x41) == 1 )
    KeBugCheckEx(0x1C6u, (PVOID)0xF, Resource, 0i64, 0i64);
  v2 = Resource->Flag & 1;
  if( v2 )
  {
    CurrentIrql = KeGetCurrentIrql();
    v5 = (_ETHREAD *)KeGetCurrentThread();
    if( CurrentIrql > 1u )
      KeBugCheckEx(0x1C6u, 0i64, (PVOID)CurrentIrql, (PVOID)1, 0i64);
    if( (v5->Tcb.ApcState.InProgressFlags & 2) != 0 )
      KeBugCheckEx(0x1C6u, (PVOID)6, 0i64, 0i64, 0i64);
    if( !CurrentIrql && (v5->Tcb._bf_0 & 0x400) == 0 && !v5->Tcb.WaitBlock[3].SpareLong )
      KeBugCheckEx(0x1C6u, (PVOID)7, 0i64, 0i64, 0i64);
  }
  if( v2 )
    ExpFastResourceLegacyAcquireExclusive(Resource);
  else
    ExpAcquireResourceExclusiveLite(Resource, 1);
  return KeGetCurrentThread()->WaitBlock[2].SparePtr;
}

Referenced by:

No references.