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