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