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