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