IovpAdvanceStackDownwards
UINT64 __stdcall IovpAdvanceStackDownwards(
_IOV_STACK_LOCATION *StackDataArray,
INT8 CurrentLocation,
_IO_STACK_LOCATION *IrpSp,
_IO_STACK_LOCATION *IrpLastSp,
INT64 LocationsAdvanced,
UINT64 IsNewRequest,
UINT64 MarkAsTaken,
_IOV_STACK_LOCATION **StackLocationInfo){
_IOV_STACK_LOCATION *v10;
int v11;
__int64 v12;
__int64 v13;
_IOV_STACK_LOCATION *v14;
_IOV_STACK_LOCATION *v15;
_QWORD *v16;
_IO_STACK_LOCATION *v17;
UINT64 result;
__int64 v19;
_IOV_STACK_LOCATION *v21;
v10 = &StackDataArray[30 * CurrentLocation - 30];
v21 = v10;
if( !*(_BYTE *)v10 && (_DWORD)MarkAsTaken )
{
memset(v10, 0i64, 0x78u);
*((_QWORD *)v10 + 4) = IrpSp;
*((_QWORD *)v10 + 3) = v10 + 4;
*((_QWORD *)v10 + 2) = v10 + 4;
}
v11 = 0;
if( IrpLastSp )
{
if( (int)LocationsAdvanced <= 0 )
{
v13 = *((_QWORD *)v10 + 1);
v12 = 0i64;
v15 = 0i64;
v14 = 0i64;
}
else
{
v13 = *(_QWORD *)&v10[30 * (int)LocationsAdvanced + 2];
v12 = *(_QWORD *)&v10[30 * (int)LocationsAdvanced + 10];
*((_QWORD *)v10 + 1) = v13;
v15 = &v10[30 * (int)LocationsAdvanced + 12];
v14 = &v10[30 * (int)LocationsAdvanced + 14];
v11 = v10[30 * (int)LocationsAdvanced + 1] & 0x10000000;
v10[1] |= v11;
}
}
else
{
v12 = 0i64;
v13 = 0i64;
v14 = 0i64;
v15 = 0i64;
}
if( (int)LocationsAdvanced > 1 )
{
v16 = v10 + 4;
v19 = (unsigned int)(LocationsAdvanced - 1);
v17 = IrpSp;
do
{
v16 += 15;
++v17;
memset(v16 - 2, 0i64, 0x78u);
v16[1] = v16;
*v16 = v16;
*((_BYTE *)v16 - 16) = 1;
v16[2] = v17;
*(v16 - 1) = v13;
v16[4] = *(_QWORD *)v15;
v16[5] = *(_QWORD *)v14;
v16[3] = v12;
*((_DWORD *)v16 - 3) |= v11 | 0x800000;
--v19;
}
while( v19 );
v10 = v21;
}
*StackLocationInfo = v10;
if( !(_DWORD)MarkAsTaken )
return *(unsigned __int8 *)v10;
if( (_DWORD)IsNewRequest )
*((_QWORD *)v10 + 1) = v10;
result = *(unsigned __int8 *)v10;
*(_BYTE *)v10 = 1;
return result;
}Referenced by:
IovpCallDriver1
IovpCompleteRequest1