IovpExamineIrpStackForwarding
VOID __stdcall IovpExamineIrpStackForwarding(
_IOV_REQUEST_PACKET *IovPacket,
UINT64 IsNewSession,
_IRP *Irp,
VOID *CallerAddress,
_IO_STACK_LOCATION *IoCurrentStackLocation,
_IO_STACK_LOCATION **IoLastStackLocation,
INT64 *StackLocationsAdvanced,
INT64 a8){
unsigned __int16 *v9;
int v10;
__int64 v11;
int v12;
_BOOL4 v13;
_BOOL4 v14;
int v15;
int v16;
_IO_STACK_LOCATION *v17;
if( (_DWORD)IsNewSession )
{
v9 = 0i64;
v10 = 1;
goto LABEL_16;
}
v11 = *((_QWORD *)CallerAddress + 23);
v10 = *((unsigned __int8 *)IovPacket + 186) - *((char *)CallerAddress + 67);
v9 = (unsigned __int16 *)(v11 + 72 * (v10 - 1i64));
if( v10 )
{
v12 = *(unsigned __int16 *)IoLastStackLocation - *v9;
if( !v12 )
v12 = *((unsigned __int8 *)IoLastStackLocation + 2) - *((unsigned __int8 *)v9 + 2);
v13 = v12 == 0;
v14 = memcmp(IoLastStackLocation + 1, v9 + 4, 0x20ui64) == 0;
v15 = 0;
v16 = v13 && v14;
if( IoLastStackLocation[6] == *((_IO_STACK_LOCATION **)v9 + 6) )
v15 = v16;
if( v15 )
{
v17 = IoLastStackLocation[7];
if( *(_OWORD *)(IoLastStackLocation + 7) == *(_OWORD *)(v9 + 28)
&& *((_BYTE *)IoLastStackLocation + 3) == *((_BYTE *)v9 + 3) )
{
if( v17 )
{
if( !(unsigned int)IovUtilMultipleDevicesSameDriver(*((_DEVICE_OBJECT **)v9 + 5)) )
{
ViErrorReport1(519, IoCurrentStackLocation, CallerAddress);
IoLastStackLocation[7] = 0i64;
*((_BYTE *)IoLastStackLocation + 3) = 0;
}
goto LABEL_16;
}
}
else if( v17 )
{
goto LABEL_16;
}
*(_QWORD *)(v11 - 8) = v11;
*(_QWORD *)(v11 - 16) = IovpInternalCompletionTrap;
*(_BYTE *)(v11 - 69) = -32;
}
}
LABEL_16:
*StackLocationsAdvanced = (INT64)v9;
*(_DWORD *)a8 = v10;
}Referenced by:
IovpCallDriver1