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