SdbpGetNextIndexedRecord

__int64 __fastcall SdbpGetNextIndexedRecord(__int64 a1, UINT64 a2, _DWORD *a3){
  unsigned int v4; 
  INT64 MappedTagData; 
  unsigned int TagDataSize; 
  __int64 v8; 
  __int64 v9; 
  __int64 v10; 
  unsigned int NextTagId; 
  unsigned int v13; 
  __int16 TagFromTagID; 
  __int16 v15; 
  const CHAR *v16; 
  UINT64 v17; 
  v4 = a2;
  if( (unsigned __int16)SdbGetTagFromTagID(a1, a2) != 0x9801 )
  {
    v16 = "The tag 0x%lx is not an index tag";
    v17 = 499i64;
LABEL_18:
    AslLogCallPrintf(1ui64, "SdbpGetNextIndexedRecord", v17, v16, v4);
    return 0i64;
  }
  MappedTagData = SdbpGetMappedTagData(a1, v4);
  if( !MappedTagData )
  {
    v16 = "Failed to get pointer to the index data tagid x%lx";
    v17 = 506i64;
    goto LABEL_18;
  }
  if( (a3[5] & 1) != 0 )
  {
    v13 = a3[1];
    if( !v13 )
      v13 = *(_DWORD *)(MappedTagData + 12i64 * (unsigned int)a3[4] + 8);
    NextTagId = SdbpGetNextTagId(a1, v13);
    TagFromTagID = SdbGetTagFromTagID(a1, v13);
    v15 = SdbGetTagFromTagID(a1, NextTagId);
    if( v15 && (v15 & 0xF000) == 28672 && v15 == TagFromTagID && NextTagId != a3[2] )
    {
      a3[1] = NextTagId;
      return NextTagId;
    }
  }
  else
  {
    TagDataSize = SdbGetTagDataSize(a1, v4);
    v8 = (unsigned int)a3[4];
    if( (_DWORD)v8 != TagDataSize / 0xC - 1 )
    {
      v9 = 3 * v8;
      v10 = (unsigned int)(v8 + 1);
      if( *(_QWORD *)(MappedTagData + 4 * v9) == *(_QWORD *)(MappedTagData + 12 * v10) )
      {
        a3[4] = v10;
        return *(unsigned int *)(MappedTagData + 12 * v10 + 8);
      }
    }
  }
  return 0i64;
}

Referenced by:

SdbFindNextStringIndexedTag
SdbpFindMatchingName