PspCallThreadNotifyRoutines
VOID __stdcall PspCallThreadNotifyRoutines(_ETHREAD *Thread, UINT8 Create, UINT8 ExNotify){
bool v5;
INT64 *v6;
__int64 v7;
struct EX_RUNDOWN_REF *v8;
struct EX_RUNDOWN_REF *v9;
int Count;
INT64 *v11;
__int64 v12;
struct EX_RUNDOWN_REF *v13;
EX_RUNDOWN_REF *v14;
INT64 *v15;
__int64 v16;
struct EX_RUNDOWN_REF *v17;
EX_RUNDOWN_REF *v18;
v5 = *((_QWORD *)Thread + 188) != 0i64;
if( Create )
{
if( ExNotify )
{
if( (PspNotifyEnableMask & 0x10) != 0 )
{
v11 = &PspCreateThreadNotifyRoutine;
v12 = 64i64;
do
{
v13 = ExReferenceCallBackBlock(v11);
v14 = v13;
if( v13 )
{
if( (v13[2].Count & 1) != 0 )
((void(__fastcall *)(_QWORD, _QWORD, _QWORD))v13[1].Count)(
*(_QWORD *)(*((_QWORD *)Thread + 68) + 1088i64),
*((_QWORD *)Thread + 144),
Create);
ExDereferenceCallBackBlock(v11, v14);
}
++v11;
--v12;
}
while( v12 );
}
}
else if( (PspNotifyEnableMask & 8) != 0 )
{
v6 = &PspCreateThreadNotifyRoutine;
v7 = 64i64;
do
{
v8 = ExReferenceCallBackBlock(v6);
v9 = v8;
if( v8 )
{
Count = v8[2].Count;
if( (Count & 1) == 0 && (!v5 || (Count & 2) != 0) )
((void(__fastcall *)(_QWORD, _QWORD, _QWORD))v9[1].Count)(
*(_QWORD *)(*((_QWORD *)Thread + 68) + 1088i64),
*((_QWORD *)Thread + 144),
Create);
ExDereferenceCallBackBlock(v6, v9);
}
++v6;
--v7;
}
while( v7 );
}
}
else if( (PspNotifyEnableMask & 0x10) != 0 || (PspNotifyEnableMask & 8) != 0 )
{
v15 = &PspCreateThreadNotifyRoutine;
v16 = 64i64;
do
{
v17 = ExReferenceCallBackBlock(v15);
v18 = v17;
if( v17 )
{
if( !v5 || (v17[2].Count & 2) != 0 )
((void(__fastcall *)(_QWORD, _QWORD, _QWORD))v17[1].Count)(
*(_QWORD *)(*((_QWORD *)Thread + 68) + 1088i64),
*((_QWORD *)Thread + 144),
0i64);
ExDereferenceCallBackBlock(v15, v18);
}
++v15;
--v16;
}
while( v16 );
}
}Referenced by:
PspExitThread
PspInitializeThunkContext
PspInsertThread