ExCallSessionCallBack
NTSTATUS __stdcall ExCallSessionCallBack(UINT64 *SessionId, PVOID Argument1, PVOID Argument2, INT64 *CallBackStatus){
INT64 *v4;
int v7;
struct _DMA_ADAPTER *v8;
struct _DMA_ADAPTER *v9;
int v10;
union RTL_RUN_ONCE *Win32Callouts;
struct EX_RUNDOWN_REF *v12;
EX_RUNDOWN_REF *v13;
void *v15;
void *v16;
PVOID v17;
int v18;
NTSTATUS v19;
union RTL_RUN_ONCE *v20;
struct EX_RUNDOWN_REF *v21;
EX_RUNDOWN_REF *v22;
void *v23;
KAPC_STATE ApcState;
v4 = CallBackStatus;
v7 = -1073741811;
memset(&ApcState, 0, sizeof(ApcState));
if( SessionId )
{
LODWORD(v8) = MmGetSessionById(*(unsigned int *)SessionId);
v9 = v8;
if( !v8 )
return -1073741811;
v10 = MmAttachSession(v8, &ApcState);
if( v10 < 0 )
{
v10 = -1073741811;
}
else
{
Win32Callouts = MmSessionGetWin32Callouts();
v12 = ExReferenceCallBackBlock((INT64 *)Win32Callouts);
v13 = v12;
if( v12 )
{
v7 = ((__int64(__fastcall *)(unsigned __int64, PVOID, PVOID))v12[1].Count)(v12[2].Count, Argument1, Argument2);
ExDereferenceCallBackBlock((INT64 *)Win32Callouts, v13);
}
else
{
v10 = -1073741811;
}
MmDetachSession(v9, &ApcState);
}
HalPutDmaAdapter(v9);
}
else
{
LODWORD(v15) = MmGetNextSession(0i64);
v16 = v15;
if( v15 )
{
v17 = Argument2;
do
{
v18 = MmGetSessionId((__int64)v16);
v19 = MmAttachSession(v16, &ApcState);
if( v19 >= 0 )
{
v20 = MmSessionGetWin32Callouts();
v21 = ExReferenceCallBackBlock((INT64 *)v20);
v22 = v21;
if( v21 )
{
v19 = ((__int64(__fastcall *)(unsigned __int64, PVOID, PVOID))v21[1].Count)(v21[2].Count, Argument1, v17);
ExDereferenceCallBackBlock((INT64 *)v20, v22);
}
MmDetachSession(v16, &ApcState);
}
if( v18 )
v19 = v7;
v7 = v19;
LODWORD(v23) = MmGetNextSession(v16);
v16 = v23;
}
while( v23 );
v4 = CallBackStatus;
}
v10 = 0;
}
if( v10 >= 0 && v4 )
*(_DWORD *)v4 = v7;
return v10;
}Referenced by:
PsInvokeWin32Callout