KeAttachProcess
VOID __stdcall KeAttachProcess(_EPROCESS *Process){
_ETHREAD *CurrentThread;
_EPROCESS *v3;
UINT8 CurrentIrql;
UINT64 SpinCount;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v3 = CurrentThread->Tcb.ApcState.Process;
if( v3 != Process )
{
if( CurrentThread->Tcb.ApcStateIndex
|| (KeGetPcr()->Prcb._bf_0 & 0x10001) != 0
|| (Process->Pcb._bf_0 & 0x400) != 0 )
{
KeBugCheckEx(5u, Process, v3, (PVOID)CurrentThread->Tcb.ApcStateIndex, (PVOID)(KeGetPcr()->Prcb._bf_0 & 0x10001));
}
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( CurrentThread->Tcb.ThreadLock );
}
KiAttachProcess(&CurrentThread->Tcb, &Process->Pcb, CurrentIrql, 0i64, &CurrentThread->Tcb.SavedApcState);
}
}Referenced by:
KiCompleteKernelInit
PopGracefulShutdown