PspCallThreadNotifyRoutines
VOID __stdcall PspCallThreadNotifyRoutines(_ETHREAD *Thread, UINT8 Create, UINT8 ExNotify){
bool v5;
INT64 *v6;
__int64 v7;
_EX_RUNDOWN_REF *v8;
_EX_RUNDOWN_REF *v9;
int Count;
INT64 *v11;
__int64 v12;
_EX_RUNDOWN_REF *v13;
_EX_RUNDOWN_REF *v14;
INT64 *v15;
__int64 v16;
_EX_RUNDOWN_REF *v17;
_EX_RUNDOWN_REF *v18;
v5 = Thread->PicoContext != 0i64;
if( Create )
{
if( ExNotify )
{
if( (PspNotifyEnableMask & 0x10) != 0 )
{
v11 = (INT64 *)&stru_140CEBF20;
v12 = 64i64;
do
{
v13 = ExReferenceCallBackBlock(v11);
v14 = v13;
if( v13 )
{
if( (v13[2].Count & 1) != 0 )
((void(__fastcall *)(void *, void *, _QWORD))v13[1].Count)(
Thread->Tcb.Process->UniqueProcessId,
Thread->Cid.UniqueThread,
Create);
ExDereferenceCallBackBlock((_EX_CALLBACK *)v11, v14);
}
++v11;
--v12;
}
while( v12 );
}
}
else if( (PspNotifyEnableMask & 8) != 0 )
{
v6 = (INT64 *)&stru_140CEBF20;
v7 = 64i64;
do
{
v8 = ExReferenceCallBackBlock(v6);
v9 = v8;
if( v8 )
{
Count = v8[2].Count;
if( (Count & 1) == 0 && (!v5 || (Count & 2) != 0) )
((void(__fastcall *)(void *, void *, _QWORD))v9[1].Count)(
Thread->Tcb.Process->UniqueProcessId,
Thread->Cid.UniqueThread,
Create);
ExDereferenceCallBackBlock((_EX_CALLBACK *)v6, v9);
}
++v6;
--v7;
}
while( v7 );
}
}
else if( (PspNotifyEnableMask & 0x10) != 0 || (PspNotifyEnableMask & 8) != 0 )
{
v15 = (INT64 *)&stru_140CEBF20;
v16 = 64i64;
do
{
v17 = ExReferenceCallBackBlock(v15);
v18 = v17;
if( v17 )
{
if( !v5 || (v17[2].Count & 2) != 0 )
((void(__fastcall *)(void *, void *, _QWORD))v17[1].Count)(
Thread->Tcb.Process->UniqueProcessId,
Thread->Cid.UniqueThread,
0i64);
ExDereferenceCallBackBlock((_EX_CALLBACK *)v15, v18);
}
++v15;
--v16;
}
while( v16 );
}
}Referenced by:
PspExitThread
PspInitializeThunkContext
PspInsertThread