PsConvertToGuiThread
INT64 __fastcall PsConvertToGuiThread(){
_ETHREAD *CurrentThread;
__int64 v1;
int v2;
int v3;
__int64 v4;
__int64 v5;
char v6;
INT64 result;
int v8;
INT64 v9;
INT64 v10;
int v11;
__int64 v12;
int v13;
int v14;
_ETHREAD *v15;
int v16;
int v17;
UINT8 SignatureLevel;
v14 = 0;
v17 = 0;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
SignatureLevel = 0;
if( !*((_BYTE *)CurrentThread + 562) )
return 3221225485i64;
if( (*((_DWORD *)CurrentThread + 30) & 0x80u) != 0 )
return 1073741851i64;
v1 = *((_QWORD *)CurrentThread + 23);
v2 = *(_DWORD *)(v1 + 2512);
if( (v2 & 0x1000) != 0 || (*(_DWORD *)(v1 + 2512) & 0x2000) != 0 )
{
EtwTimLogProhibitWin32kSystemCalls((unsigned int)((v2 & 0x1000) != 0) + 1, *((_QWORD *)CurrentThread + 23));
if( (v2 & 0x1000) != 0 )
return 3221225506i64;
}
v3 = 1;
v12 = v1;
v13 = 1;
if( (int)PsQuerySectionSignatureInformation((_EPROCESS *)v1, &SignatureLevel) >= 0 )
{
v6 = (char)qword_140C1D900;
if( qword_140C1D900 )
{
LOBYTE(v5) = SignatureLevel;
LOBYTE(v4) = 12;
v6 = qword_140C1D900(v5, v4);
v3 = v13;
}
v13 = ((unsigned __int8)v3 ^ (unsigned __int8)(2 * v6)) & 2 ^ v3;
}
result = PsInvokeWin32Callout(0i64, &v12, 0i64, 0i64);
if( (int)result >= 0 )
{
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 7u);
v8 = v2 & 0xC000;
if( v8 )
_interlockedbittestandset((volatile signed __int32 *)CurrentThread + 30, 0x15u);
v16 = 0;
v15 = CurrentThread;
v11 = PsInvokeWin32Callout(1i64, &v15, 0i64, 0i64);
if( v11 < 0 )
{
_interlockedbittestandreset((volatile signed __int32 *)CurrentThread + 30, 7u);
if( v8 )
_interlockedbittestandreset((volatile signed __int32 *)CurrentThread + 30, 0x15u);
}
SeCaptureAtomTableCallout(v10, v9);
return(unsigned int)v11;
}
return result;
}Referenced by:
KiConvertToGuiThread