CmSetCallbackObjectContext
NTSTATUS __stdcall CmSetCallbackObjectContext(PVOID Object, LARGE_INTEGER *Cookie, PVOID NewContext, PVOID *OldContext){
char v4;
NTSTATUS v9;
_ETHREAD *CurrentThread;
_ETHREAD *v11;
_QWORD *v12;
_QWORD *v13;
LARGE_INTEGER v14;
_ETHREAD *v15;
LARGE_INTEGER *PoolWithTag;
LONGLONG *v17;
LONGLONG v18;
LARGE_INTEGER *v19;
LARGE_INTEGER **v20;
LONGLONG v21;
LONGLONG v22;
LONGLONG QuadPart;
void *v25;
v4 = 0;
v9 = -1073741275;
if( !Object || *(_DWORD *)Object != 1803104306 )
return -1073741585;
if( OldContext )
*OldContext = 0i64;
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 251, 0i64);
v11 = (_ETHREAD *)KeGetCurrentThread();
--v11->Tcb.KernelApcDisable;
ExAcquirePushLockSharedEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
v12 = (char *)Object + 72;
while( 1 )
{
v13 = (_QWORD *)*v12;
if( (_QWORD *)*v12 != v12 )
{
QuadPart = Cookie->QuadPart;
while( v13[4] != QuadPart )
{
if( v13[4] >= QuadPart )
{
v13 = (_QWORD *)*v13;
if( v13 != v12 )
continue;
}
goto LABEL_7;
}
v25 = (void *)_InterlockedExchange64(v13 + 7, (__int64)NewContext);
if( OldContext )
*OldContext = v25;
v9 = 0;
}
LABEL_7:
if( v9 >= 0 )
break;
if( v4 )
{
v14 = (LARGE_INTEGER)*(&CmpDummyThreadEvent + 252);
if( (_UNKNOWN *)*(&CmpDummyThreadEvent + 252) == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2016) )
{
LABEL_28:
v14.QuadPart = 0i64;
}
else
{
while( Cookie->QuadPart != *(_QWORD *)(v14.QuadPart + 24) )
{
v14 = *(LARGE_INTEGER *)v14.QuadPart;
if( (_UNKNOWN *)v14.QuadPart == (_UNKNOWN *)((char *)&CmpDummyThreadEvent + 2016) )
goto LABEL_28;
}
}
if( v14.QuadPart )
{
v9 = 0;
PoolWithTag = (LARGE_INTEGER *)ExAllocatePoolWithTag(1ui64, 0x40ui64, 1667452227i64);
v17 = (LONGLONG *)PoolWithTag;
if( PoolWithTag )
{
PoolWithTag[5] = v14;
v18 = v14.QuadPart + 64;
PoolWithTag[4] = *Cookie;
v19 = PoolWithTag + 2;
v17[7] = (LONGLONG)NewContext;
v17[6] = (LONGLONG)Object;
v20 = *(LARGE_INTEGER ***)(v18 + 8);
if( *v20 != (LARGE_INTEGER *)v18
|| (v19->QuadPart = v18,
v17[3] = (LONGLONG)v20,
*v20 = v19,
*(_QWORD *)(v18 + 8) = v19,
v21 = v13[1],
v22 = *(_QWORD *)v21,
*(_QWORD *)(*(_QWORD *)v21 + 8i64) != v21) )
{
__fastfail(3u);
}
*v17 = v22;
v17[1] = v21;
*(_QWORD *)(v22 + 8) = v17;
*(_QWORD *)v21 = v17;
}
else
{
v9 = -1073741670;
}
}
else
{
v9 = -1073741584;
}
break;
}
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
v15 = (_ETHREAD *)KeGetCurrentThread();
v4 = 1;
--v15->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx((_EX_PUSH_LOCK *)&CmpDummyThreadEvent + 254, 0i64);
}
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2032, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
ExReleasePushLockEx((ULONG_PTR)&CmpDummyThreadEvent + 2008, 0);
KeLeaveCriticalRegionThread(KeGetCurrentThread());
return v9;
}Referenced by:
VrpHandleIoctlInitializeJobForVreg
VrpPostOpenOrCreate
VrpPreLoadKey