ExpPrepareToWakeResourceShared

NTSTATUS __stdcall ExpPrepareToWakeResourceShared(INT64 a1, INT64 *a2, INT64 *a3, INT64 *a4){
  INT64 v4; 
  INT64 v5; 
  int v8; 
  NTSTATUS result; 
  bool v10; 
  INT64 v11; 

  v4 = a1;
  v5 = 0i64;
  v11 = 0i64;
  v8 = 1;
  if( *(_DWORD *)(v4 + 64) > 1u )
    goto LABEL_4;
  if( *(_DWORD *)(v4 + 76) )
  {
    KeCaptureWaitChainHeadEx((_QWORD **)(v4 + 40), a2, &v11);
    --*(_DWORD *)(v4 + 76);
    *(_WORD *)(v4 + 26) |= 0x80u;
    v5 = v11;
  }
  else
  {
    if( !*(_DWORD *)(v4 + 72) )
    {
LABEL_4:
      v8 = 0;
      *a2 = 0i64;
      goto LABEL_5;
    }
    *a2 = *(_QWORD *)(v4 + 32);
    v8 = *(_DWORD *)(v4 + 72);
    *(_DWORD *)(v4 + 72) = 0;
    *(_QWORD *)(v4 + 32) = 0i64;
  }
LABEL_5:
  result = v8 - 1;
  v10 = v8 - 1 + *(_DWORD *)(v4 + 64) == 0;
  *(_DWORD *)(v4 + 64) += v8 - 1;
  if( v10 )
    *(_WORD *)(v4 + 24) = 0;
  *(_DWORD *)a4 = v8;
  *a3 = v5;
  return result;
}

Referenced by:

ExpReleaseDisownedFastResourceShared
ExpReleaseFastResourceShared