IopAllocateFileObjectExtension

VOID __fastcall IopAllocateFileObjectExtension(_FILE_OBJECT *FileObject, VOID **FoExt){
  void *FileObjectExtension; 
  void *v3; 
  unsigned __int8 CurrentIrql; 
  void *v7; 
  __int64 v8; 
  VOID **Pool_0; 

  FileObjectExtension = FileObject->FileObjectExtension;
  v3 = 0i64;
  if( FileObjectExtension )
  {
    if( FileObjectExtension != IopRevocationExtension && FoExt )
      *FoExt = FileObjectExtension;
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    KxAcquireSpinLock(&FileObject->IrpListLock);
    v7 = FileObject->FileObjectExtension;
    if( !v7 )
    {
      KxReleaseSpinLock(&FileObject->IrpListLock);
      __writecr8(CurrentIrql);
      Pool_0 = IopVerifierExAllocatePool_0(v8, 0x58ui64);
      v7 = Pool_0;
      if( !Pool_0 )
        return;
      memset(Pool_0, 0i64, 0x58u);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      KxAcquireSpinLock(&FileObject->IrpListLock);
      if( FileObject->FileObjectExtension )
      {
        v3 = v7;
        v7 = FileObject->FileObjectExtension;
      }
      else
      {
        _InterlockedExchange64((volatile __int64 *)&FileObject->FileObjectExtension, (__int64)v7);
      }
    }
    if( FoExt )
      *FoExt = v7;
    KxReleaseSpinLock(&FileObject->IrpListLock);
    __writecr8(CurrentIrql);
    if( v3 )
      ExFreePoolWithTag(v3, 0);
  }
}

Referenced by:

IoGetFileObjectFilterContext
IoSetIoPriorityHintIntoFileObject
IoSetOplockKeyContext
IoSetOplockPrivateFoExt
IopGetSetSpecificExtension
IopSetFileMemoryPartitionInformation
IopSetFileObjectExtensionFlag
IopSetFileObjectIosbRange
IopSymlinkSetFoExtension
NtSetInformationFile