NtAlpcImpersonateClientContainerOfPort
NTSTATUS __fastcall NtAlpcImpersonateClientContainerOfPort(VOID *PortHandle, _PORT_MESSAGE *PortMessage, UINT64 Flags){
_ETHREAD *CurrentThread;
int v5;
char PreviousMode;
_KALPC_MESSAGE **v7;
_ETHREAD *WaitingThread;
_ETHREAD *WorkOnBehalfThread;
_ETHREAD *v10;
_ETHREAD *v11;
void *Teb;
_ALPC_WORK_ON_BEHALF_TICKET *v13;
UINT64 DerefThread;
_KALPC_MESSAGE *Message;
PVOID Object;
_ALPC_WORK_ON_BEHALF_TICKET Ticket;
PADAPTER_OBJECT DmaAdapter;
UINT64 CallbackId;
UINT64 MessageId;
LODWORD(CallbackId) = 0;
LODWORD(DerefThread) = 0;
Message = 0i64;
LODWORD(MessageId) = 0;
Ticket = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
DmaAdapter = 0i64;
if( (_DWORD)Flags )
{
v5 = -1073741811;
}
else
{
AlpcpCaptureIdMessage((PORT_MESSAGE *)&PortMessage->u1.DataLength, &MessageId, &CallbackId);
PreviousMode = KeGetCurrentThread()->PreviousMode;
Object = 0i64;
v5 = ObReferenceObjectByHandle(PortHandle, 0x20000ui64, AlpcPortObjectType, PreviousMode, &Object, 0i64);
DmaAdapter = (PADAPTER_OBJECT)Object;
if( v5 >= 0 )
{
if( (*((_BYTE *)Object + 416) & 6) == 6
&& KeGetCurrentThread()->ApcState.Process == (_EPROCESS *)*((_QWORD *)Object + 3) )
{
v5 = AlpcpLookupMessage((_ALPC_PORT *)Object, (unsigned int)MessageId, (unsigned int)CallbackId, v7);
HIDWORD(DerefThread) = v5;
if( v5 >= 0 )
{
if( (Message->u1.State & 0x80u) == 0 )
{
WaitingThread = Message->WaitingThread;
if( WaitingThread )
{
WorkOnBehalfThread = PsGetWorkOnBehalfThread((VOID **)Message->WaitingThread, &DerefThread);
v10 = WorkOnBehalfThread;
if( WorkOnBehalfThread )
{
PsImpersonateContainerOfThread(WorkOnBehalfThread);
if( (_DWORD)DerefThread )
ObDereferenceObjectDeferDelete((UINT64)v10);
}
else if( IoThreadToProcess(WaitingThread)->DiskIoAttribution || PoEnergyEstimationEnabled() )
{
v10 = WaitingThread;
PsImpersonateContainerOfThread(WaitingThread);
}
else
{
v10 = 0i64;
}
if( v10 )
{
v11 = (_ETHREAD *)KeGetCurrentThread();
if( (v11->Tcb._bf_0 & 0x400) != 0 || v11->Tcb.ApcStateIndex == 1 )
Teb = 0i64;
else
Teb = v11->Tcb.Teb;
if( Teb )
{
PsEncodeThreadWorkOnBehalfTicket(v10, &Ticket);
v13[87] = Ticket;
}
}
}
AlpcpUnlockMessage(Message);
}
else
{
AlpcpUnlockMessage(Message);
v5 = -1073740029;
}
}
}
else
{
v5 = -1073741790;
}
}
}
if( DmaAdapter )
HalPutDmaAdapter(DmaAdapter);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v5;
}Referenced by:
No references.