IoAdjustStackSizeForRedirection

NTSTATUS __stdcall IoAdjustStackSizeForRedirection(
        _DEVICE_OBJECT *SourceDevice,
        _DEVICE_OBJECT *TargetDevice,
        CHAR *ExtraStackLocations){
  NTSTATUS v4; 
  UINT8 v7; 
  char StackSize; 
  UINT8 v9; 
  char v10; 
  CHAR v11; 
  _DEVICE_OBJECT *v12; 
  _DEVICE_OBJECT *AttachedTo; 

  v4 = 0;
  v7 = KeAcquireQueuedSpinLock(10i64, (INT64)TargetDevice, (INT64)ExtraStackLocations);
  StackSize = SourceDevice->StackSize;
  v9 = v7;
  v10 = TargetDevice->StackSize;
  if( StackSize < v10 )
  {
    v11 = v10 - StackSize;
    LODWORD(v12) = IoGetAttachedDevice((INT64)SourceDevice);
    AttachedTo = v12;
    if( (unsigned __int16)v11 + (unsigned int)(unsigned __int16)v12->StackSize < 0x7D )
    {
      if( v12 != SourceDevice )
      {
        do
        {
          AttachedTo->StackSize += v11;
          AttachedTo = AttachedTo->DeviceObjectExtension->AttachedTo;
        }
        while( AttachedTo != SourceDevice );
        StackSize = SourceDevice->StackSize;
      }
      SourceDevice->StackSize = v11 + StackSize;
    }
    else
    {
      v4 = -1073741811;
    }
  }
  else
  {
    v11 = 0;
  }
  KeReleaseQueuedSpinLock(LockQueueIoDatabaseLock, v9);
  if( v4 >= 0 && ExtraStackLocations )
    *ExtraStackLocations = v11;
  return v4;
}

Referenced by:

No references.