IovpLogStackTrace

_IOV_IRP_TRACE *__stdcall IovpLogStackTrace(_IRP *Irp){
  _IOV_IRP_TRACE *v2; 
  _ETHREAD *CurrentThread; 
  if( !IovIrpTraces )
    return 0i64;
  v2 = (_IOV_IRP_TRACE *)(IovIrpTraces
                        + ((unsigned __int64)(_InterlockedIncrement(&IovIrpTracesIndex) & (unsigned int)(IovIrpTracesLength - 1)) << 7));
  v2->Irp = Irp;
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2->Thread = CurrentThread;
  v2->CombinedApcDisable = *((_DWORD *)CurrentThread + 121);
  LOBYTE(CurrentThread) = KeGetCurrentIrql();
  v2->Irql = (unsigned __int8)CurrentThread;
  if( (unsigned __int8)CurrentThread > 1u || RtlEnoughStackSpaceForStackCapture() )
  {
    ViPoolLogStackCallout(v2);
  }
  else if( KeExpandKernelStackAndCallout(ViPoolLogStackCallout, v2, 0xE30ui64) < 0 )
  {
    v2->StackTrace[0] = 0i64;
  }
  return v2;
}

Referenced by:

IoReuseIrp
IovAllocateIrp
IovCancelIrp
IovCompleteRequest