PsCaptureExceptionPort
VOID *__stdcall PsCaptureExceptionPort(_EPROCESS *Process){
_ETHREAD *CurrentThread;
_EX_PUSH_LOCK *p_ProcessLock;
void *v4;
if( !Process->ExceptionPortValue )
return 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
p_ProcessLock = &Process->ProcessLock;
ExAcquirePushLockSharedEx(&Process->ProcessLock, 0i64);
v4 = (void *)(Process->ExceptionPortValue & 0xFFFFFFFFFFFFFFF8ui64);
ObfReferenceObject(v4);
if( _InterlockedCompareExchange64(&p_ProcessLock->_bf_0, 0i64, 17i64) != 17 )
ExfReleasePushLockShared(p_ProcessLock);
KeAbPostRelease(p_ProcessLock);
KeLeaveCriticalRegionThread(&CurrentThread->Tcb);
return v4;
}Referenced by:
DbgkForwardException
ExpRaiseHardError
PspExitThread
PspFreezeProcessWorker