PsInvokeWin32Callout
INT64 __fastcall PsInvokeWin32Callout(INT64 a1, VOID *a2, INT64 a3, UINT64 *a4){
UINT64 *v4;
__int64 v5;
union RTL_RUN_ONCE *Win32Callouts;
struct EX_RUNDOWN_REF *v8;
EX_RUNDOWN_REF *v9;
NTSTATUS v10;
int v12;
__int64 v13;
int SessionId;
_DWORD *v15;
union RTL_RUN_ONCE *v16;
UINT64 *v17;
INT64 CallBackStatus;
LODWORD(CallBackStatus) = 0;
v4 = a4;
v5 = (int)a1;
if( !(_DWORD)a3 )
{
Win32Callouts = MmSessionGetWin32Callouts();
v8 = ExReferenceCallBackBlock((INT64 *)Win32Callouts);
v9 = v8;
if( v8 )
{
v10 = ((__int64(__fastcall *)(unsigned __int64, __int64, VOID *))v8[1].Count)(v8[2].Count, v5, a2);
ExDereferenceCallBackBlock((INT64 *)Win32Callouts, v9);
return(unsigned int)v10;
}
return(unsigned int)-1073741811;
}
v12 = a3 - 1;
if( v12 )
{
if( v12 != 1 )
return(unsigned int)-1073741811;
v17 = 0i64;
}
else
{
v13 = *((_QWORD *)KeGetCurrentThread() + 23);
if( (*(_DWORD *)(v13 + 1124) & 0x10000) != 0 )
{
SessionId = MmGetSessionId(v13);
if( *v15 == SessionId )
{
v16 = MmSessionGetWin32Callouts();
return(unsigned int)ExCallCallBack((signed __int64 *)v16, v5, (__int64)a2);
}
}
v17 = v4;
}
v10 = ExCallSessionCallBack(v17, (PVOID)v5, a2, &CallBackStatus);
if( v10 >= 0 )
return(unsigned int)CallBackStatus;
return(unsigned int)v10;
}Referenced by:
ExpWin32CloseProcedure
ExpWin32DeleteProcedure
ExpWin32OkayToCloseProcedure
ExpWin32OpenProcedure
ExpWin32ParseProcedure
KeUserModeCallback
KiSystemCall64
NtAddAtomEx
NtDeleteAtom
NtQueryInformationAtom
NtSetInformationJobObject
NtSetSystemInformation
PfpQueryGpuUtilization
PopInvokeWin32Callout
PsConvertToGuiThread
PsFreezeProcess
PsThawProcess
PspAssignProcessToJob
PspExitThread
PspJobDelete
PspQueryProcessInterferenceCountCallback
PspSetProcessTimerDelayForWin32
PspShutdownCsrProcess
SeCaptureAtomTableCallout