IopAllocateFoExtensionsOnCreate

INT64 __fastcall IopAllocateFoExtensionsOnCreate(
        _FILE_OBJECT *FileObject,
        _DEVICE_OBJECT *DeviceObject,
        _OPEN_PACKET *Op,
        _OB_EXTENDED_PARSE_PARAMETERS *ExtendedParameters,
        UINT64 DesiredAccess){
  unsigned int v9; 
  INT64 result; 
  unsigned int InternalFlags; 
  _FILE_OBJECT *v12; 
  _EJOB *v13; 
  _FILE_OBJECT *RelatedFileObject; 
  _EJOB *Silo; 
  _FILE_OBJECT *v16; 
  char v17; 
  int v18; 
  _QWORD *v19; 
  _TXN_PARAMETER_BLOCK *TxnParameters; 
  struct _DMA_ADAPTER *TransactionObject; 
  int v22; 
  PVOID TypeExt; 
  v9 = -1073741811;
  if( (Op->InternalFlags & 2) != 0 )
  {
    LODWORD(result) = IopSetFileObjectExtensionFlag(FileObject, 1ui64, 1u);
    v9 = result;
    if( (int)result < 0 )
      return result;
  }
  InternalFlags = Op->InternalFlags;
  if( (InternalFlags & 1) != 0 )
  {
    TypeExt = 0i64;
    IopGetSetSpecificExtension(FileObject, FoExtTypeInternal, 0x20ui64, 1u, &TypeExt, 0i64);
    v9 = result;
    if( (int)result < 0 )
      return result;
    *(_QWORD *)TypeExt = Op->DriverCreateContext.DeviceObjectHint;
    InternalFlags = Op->InternalFlags;
  }
  if( (InternalFlags & 4) != 0 )
  {
    TypeExt = 0i64;
    if( !IopCheckStackForTransactionSupport(DeviceObject)
      && (Op->Disposition != 1 || (Op->ShareAccess & 6) != 0 || (DesiredAccess & 0xFEEDFF56) != 0)
      && !Op->QueryOnly )
    {
      return 3222863935i64;
    }
    TxnParameters = Op->DriverCreateContext.TxnParameters;
    if( !TxnParameters )
      return 3221225485i64;
    if( TxnParameters->Length != 16 )
      return 3221225485i64;
    TransactionObject = (struct _DMA_ADAPTER *)TxnParameters->TransactionObject;
    if( !TransactionObject )
      return 3221225485i64;
    LODWORD(result) = ObReferenceObjectByPointer(
                        TxnParameters->TransactionObject,
                        0x120037u,
                        (POBJECT_TYPE)TmTransactionObjectType,
                        0);
    if( (int)result < 0 )
      return result;
    IopGetSetSpecificExtension(FileObject, FoExtTypeTransactionParams, 0x10ui64, 1u, &TypeExt, 0i64);
    v9 = v22;
    if( v22 < 0 )
    {
      HalPutDmaAdapter(TransactionObject);
      return v9;
    }
    *(_TXN_PARAMETER_BLOCK *)TypeExt = *Op->DriverCreateContext.TxnParameters;
    InternalFlags = Op->InternalFlags;
  }
  if( (InternalFlags & 0x40) == 0 )
  {
    if( PsIsHostSilo(ExtendedParameters->Silo) )
    {
      RelatedFileObject = Op->RelatedFileObject;
      if( !RelatedFileObject )
        return v9;
      Silo = IoGetSilo(RelatedFileObject);
      if( PsIsHostSilo(Silo) )
        return v9;
    }
  }
  v12 = Op->RelatedFileObject;
  v9 = 0;
  v13 = ExtendedParameters->Silo;
  if( v12 )
  {
    PsIsServerSilo((INT64)ExtendedParameters->Silo, (volatile INT32 *)&v12->Type);
    if( v17 )
      v13 = IoGetSilo(v16);
  }
  if( PsIsHostSilo(v13) )
    return v9;
  TypeExt = 0i64;
  LODWORD(result) = PsAcquireSiloHardReference(v13);
  if( (int)result >= 0 )
  {
    IopGetSetSpecificExtension(FileObject, FoExtTypeSilo, 0x10ui64, 1u, &TypeExt, 0i64);
    v9 = v18;
    if( v18 < 0 )
    {
      PsReleaseSiloHardReference(v13);
    }
    else
    {
      v19 = TypeExt;
      *(_DWORD *)TypeExt = 16;
      v19[1] = v13;
      *((_DWORD *)v19 + 1) |= 1u;
      ObfReferenceObjectWithTag(v13, 0x70536F49u);
    }
    return v9;
  }
  return result;
}

Referenced by:

IopAllocRealFileObject