IopReplaceCompletionPort

NTSTATUS __stdcall IopReplaceCompletionPort(_FILE_OBJECT *FileObject, VOID *NewPort, VOID *Key){
  unsigned __int64 *p_IrpListLock; 
  NTSTATUS v7; 
  unsigned __int8 v8; 
  _IO_COMPLETION_CONTEXT *CompletionContext; 
  unsigned __int64 v10; 

  p_IrpListLock = &FileObject->IrpListLock;
  v7 = -1073741823;
  v8 = KeAcquireSpinLockRaiseToDpc(&FileObject->IrpListLock);
  CompletionContext = FileObject->CompletionContext;
  v10 = v8;
  if( CompletionContext && FileObject->IrpList.Flink == &FileObject->IrpList && !CompletionContext->UsageCount )
  {
    ObfDereferenceObjectWithTag(CompletionContext->Port, 0x746C6644ui64);
    FileObject->Flags &= 0xF1FFFFFF;
    if( NewPort )
    {
      ObfReferenceObjectWithTag(NewPort, 0x746C6644ui64);
      FileObject->CompletionContext->Port = NewPort;
      FileObject->CompletionContext->Key = Key;
    }
    else
    {
      ExFreePoolWithTag(FileObject->CompletionContext, 0);
      FileObject->CompletionContext = 0i64;
      FileObject->Flags |= 0x400u;
    }
    v7 = 0;
  }
  KxReleaseSpinLock(p_IrpListLock);
  __writecr8(v10);
  return v7;
}

Referenced by:

NtSetInformationFile