PsInvokeWin32Callout
NTSTATUS __stdcall PsInvokeWin32Callout(
_WIN32_CALLOUTS_OPERATION Operation,
VOID *Parameters,
PS_WIN32_SESSION_ATTACH_MODE AttachMode,
UINT64 *SessionId){
UINT64 *v4;
VOID *v5;
_RTL_RUN_ONCE *Win32Callouts;
_EX_RUNDOWN_REF *v8;
_EX_RUNDOWN_REF *v9;
int v10;
__int32 v12;
_EPROCESS *Process;
NTSTATUS v14;
_DWORD *v15;
_RTL_RUN_ONCE *v16;
UINT64 *v17;
INT64 CallBackStatus;
LODWORD(CallBackStatus) = 0;
v4 = SessionId;
v5 = (VOID *)(int)Operation;
if( AttachMode == PsWin32SessionAttachNone )
{
Win32Callouts = MmSessionGetWin32Callouts();
v8 = ExReferenceCallBackBlock((INT64 *)Win32Callouts);
v9 = v8;
if( v8 )
{
v10 = ((__int64(__fastcall *)(unsigned __int64, VOID *, VOID *))v8[1].Count)(v8[2].Count, v5, Parameters);
ExDereferenceCallBackBlock((_EX_CALLBACK *)Win32Callouts, v9);
return v10;
}
return -1073741811;
}
v12 = AttachMode - 1;
if( v12 )
{
if( v12 != 1 )
return -1073741811;
v17 = 0i64;
}
else
{
Process = KeGetCurrentThread()->ApcState.Process;
if( (Process->Flags & 0x10000) != 0 )
{
v14 = MmGetSessionId(Process);
if( *v15 == v14 )
{
v16 = MmSessionGetWin32Callouts();
return ExCallCallBack((_EX_CALLBACK *)v16, v5, Parameters);
}
}
v17 = v4;
}
v10 = ExCallSessionCallBack(v17, v5, Parameters, &CallBackStatus);
if( v10 >= 0 )
return CallBackStatus;
return 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