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 = CurrentThread->Tcb.CombinedApcDisable;
  LOBYTE(CurrentThread) = KeGetCurrentIrql();
  v2->Irql = (unsigned __int8)CurrentThread;
  if( (unsigned __int8)CurrentThread > 1u || (unsigned int)RtlEnoughStackSpaceForStackCapture() )
  {
    ViPoolLogStackCallout(v2);
  }
  else if( KeExpandKernelStackAndCallout((PEXPAND_STACK_CALLOUT)ViPoolLogStackCallout, v2, 3632) < 0 )
  {
    v2->StackTrace[0] = 0i64;
  }
  return v2;
}

Referenced by:

IoReuseIrp
IovAllocateIrp
IovCancelIrp
IovCompleteRequest