IopAllocateFileObjectExtension

NTSTATUS __stdcall IopAllocateFileObjectExtension(_FILE_OBJECT *FileObject, PVOID *FoExt){
  void *FileObjectExtension; 
  void *v3; 
  unsigned __int8 CurrentIrql; 
  void *v7; 
  INT64 v8; 
  CHAR *Pool_0; 
  FileObjectExtension = FileObject->FileObjectExtension;
  v3 = 0i64;
  if( FileObjectExtension )
  {
    if( FileObjectExtension != (void *)IopRevocationExtension )
    {
      if( FoExt )
        *FoExt = FileObjectExtension;
      return 0;
    }
  }
  else
  {
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    KxAcquireSpinLock(&FileObject->IrpListLock);
    v7 = FileObject->FileObjectExtension;
    if( v7 )
    {
LABEL_6:
      if( FoExt )
        *FoExt = v7;
      KxReleaseSpinLock(&FileObject->IrpListLock);
      __writecr8(CurrentIrql);
      if( v3 )
        ExFreePoolWithTag(v3, 0);
      return 0;
    }
    KxReleaseSpinLock(&FileObject->IrpListLock);
    __writecr8(CurrentIrql);
    Pool_0 = IopVerifierExAllocatePool_0(v8, 0x58ui64);
    v7 = Pool_0;
    if( Pool_0 )
    {
      memset((INT64)Pool_0, 0i64);
      CurrentIrql = KeGetCurrentIrql();
      __writecr8(2ui64);
      KxAcquireSpinLock(&FileObject->IrpListLock);
      if( FileObject->FileObjectExtension )
      {
        v3 = v7;
        v7 = FileObject->FileObjectExtension;
      }
      else
      {
        _InterlockedExchange64((volatile __int64 *)&FileObject->FileObjectExtension, (__int64)v7);
      }
      goto LABEL_6;
    }
  }
  return -1073741670;
}

Referenced by:

IoGetFileObjectFilterContext
IoSetIoPriorityHintIntoFileObject
IoSetOplockKeyContext
IoSetOplockPrivateFoExt
IopGetSetSpecificExtension
IopSetFileMemoryPartitionInformation
IopSetFileObjectExtensionFlag
IopSetFileObjectIosbRange
IopSymlinkSetFoExtension
NtSetInformationFile