ObpGetTraceIndex
UINT16 __stdcall ObpGetTraceIndex(_OBJECT_REF_TRACE *Trace){
unsigned int v1;
_OBJECT_REF_TRACE *v2;
__int64 v3;
int v4;
int v5;
_QWORD *v6;
unsigned __int16 v7;
unsigned int v8;
unsigned int v9;
unsigned __int16 *v10;
VOID **PoolWithTag;
unsigned __int64 v13;
__int64 v14;
v1 = 0;
v2 = Trace;
v3 = 32i64;
do
{
v4 = WORD1(Trace->StackTrace[0]);
v5 = LOWORD(Trace->StackTrace[0]);
Trace = (_OBJECT_REF_TRACE *)((char *)Trace + 4);
v1 += v5 ^ v4;
--v3;
}
while( v3 );
v6 = StackTable;
v7 = v1 % 0x3FFD;
LOWORD(v8) = v7;
LOWORD(v9) = *((_WORD *)StackTable + v7 + 68);
while( (_WORD)v9 != 0xFFFF )
{
if( RtlCompareMemory(
(const VOID *)(v6[((unsigned __int64)(unsigned __int16)v9 >> 10) + 1] + ((unsigned __int64)(v9 & 0x3FF) << 7)),
v2,
128) == (_SIZE_T *)128 )
return v9;
v8 = ((unsigned int)(unsigned __int16)v8 + 1) % 0x3FFD;
if( (_WORD)v8 == v7 )
return 16381;
LOWORD(v9) = *((_WORD *)StackTable + (unsigned __int16)v8 + 68);
}
v10 = (unsigned __int16 *)StackTable;
if( *(_WORD *)StackTable == *((_WORD *)StackTable + 1) )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x20000ui64, 1951556175i64);
if( !PoolWithTag )
return 16381;
v10 = (unsigned __int16 *)StackTable;
*((_QWORD *)StackTable + ((unsigned __int64)*((unsigned __int16 *)StackTable + 1) >> 10) + 1) = PoolWithTag;
v10[1] += 1024;
}
v9 = *v10;
v13 = (unsigned __int64)(*v10 & 0x3FF) << 7;
v10[(unsigned __int16)v8 + 68] = v9;
v14 = *(_QWORD *)&v10[4 * ((unsigned __int64)v9 >> 10) + 4];
*(_OWORD *)(v14 + v13) = *(_OWORD *)v2->StackTrace;
*(_OWORD *)(v14 + v13 + 16) = *(_OWORD *)&v2->StackTrace[2];
*(_OWORD *)(v14 + v13 + 32) = *(_OWORD *)&v2->StackTrace[4];
*(_OWORD *)(v14 + v13 + 48) = *(_OWORD *)&v2->StackTrace[6];
*(_OWORD *)(v14 + v13 + 64) = *(_OWORD *)&v2->StackTrace[8];
*(_OWORD *)(v14 + v13 + 80) = *(_OWORD *)&v2->StackTrace[10];
*(_OWORD *)(v14 + v13 + 96) = *(_OWORD *)&v2->StackTrace[12];
*(_OWORD *)(v14 + v13 + 112) = *(_OWORD *)&v2->StackTrace[14];
++*v10;
return v9;
}Referenced by:
ObpPushRefDerefInfo