SMKM_STORE::SmStCompareRegionDataCallback

__int64 __fastcall SMKM_STORE::SmStCompareRegionDataCallback(
        __int64 a1,
        unsigned __int16 *a2,
        unsigned int *a3,
        VOID *a4){
  unsigned int v5; 
  char *v6; 
  __int64 v7; 
  unsigned int v8; 
  volatile signed __int32 *v10; 
  __int64 v11; 
  char *v12; 
  unsigned __int16 *v13; 
  unsigned __int16 *v14; 
  unsigned __int64 v15; 
  __int64 v16; 
  unsigned __int64 v17; 
  __int64 v18; 
  VOID *v19; 
  unsigned __int64 v20; 
  int v21; 
  char *buf2; 
  char *buf1; 
  unsigned __int64 v24; 
  unsigned __int16 *i; 
  unsigned int *v26; 

  v5 = 0;
  v6 = 0i64;
  v7 = a1 - 6232;
  v8 = 0;
  if( (_DWORD)a3 )
  {
    ExFreePoolWithTag(a2, 0);
    return 0i64;
  }
  v10 = (volatile signed __int32 *)(v7 + 6596);
  _InterlockedIncrement((volatile signed __int32 *)(v7 + 6596));
  v11 = *(unsigned int *)a2;
  if( (*(_BYTE *)(v7 + 6021) & 4) == 0 )
  {
    v12 = *(char **)((*(_QWORD *)(*(_QWORD *)(v7 + 6216) + 8 * v11) & 0xFFFFFFFFFFFFFFF8ui64) + 24);
    goto LABEL_7;
  }
  v12 = SMKM_STORE::SmStMapRegion(v7, v11, 0, (__int64)a4, 0x40u);
  if( (unsigned __int64)v12 > 3 )
  {
LABEL_7:
    v13 = a2 + 4;
    v14 = (unsigned __int16 *)((char *)a2 + a2[3]);
    for( i = v14; ; v14 = i )
    {
      if( v13 >= v14 )
      {
LABEL_23:
        v10 = (volatile signed __int32 *)(v7 + 6596);
        goto LABEL_24;
      }
      buf1 = &v12[*(unsigned int *)v13];
      *((_BYTE *)v13 + 7) = 16;
      v15 = (unsigned __int64)&v13[4 * *((unsigned __int8 *)v13 + 6) + 4];
      v24 = v15;
      a3 = (unsigned int *)(v13 + 4);
      while( 1 )
      {
        v26 = a3;
        if( (unsigned __int64)a3 >= v15 )
          break;
        if( v6 )
        {
          if( v8 == *a3 )
            goto LABEL_32;
          if( v6 != v12 )
          {
            if( (*(_BYTE *)(v7 + 6021) & 4) != 0 )
            {
              SMKM_STORE::SmStUnmapVirtualRegion(v7, v8, (__int64)a3, (__int64)a4, v21, 8u);
            }
            else
            {
              v16 = *(_QWORD *)(v7 + 6216);
              a4 = (VOID *)(*(_QWORD *)(v16 + 8i64 * v8) & 0xFFFFFFFFFFFFFFF8ui64);
              v17 = *(_QWORD *)(v16 + 8i64 * v8) & 0xFFFFFFFFFFFFFFFEui64;
              *(_QWORD *)(v16 + 8i64 * v8) = v17;
              if( (v17 & 3) != 0 )
                goto LABEL_19;
              SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(v7 + 6608), SmFpResourceMapping, KeGetCurrentThread(), a4);
            }
            a3 = v26;
          }
        }
LABEL_19:
        v8 = *a3;
        if( *a3 == *(_DWORD *)a2 )
        {
          v6 = v12;
        }
        else
        {
          v6 = SMKM_STORE::SmStMapRegion(v7, v8, 0, (__int64)a4, 0x40u);
          if( (unsigned __int64)v6 <= 3 )
          {
            v5 = -1073741670;
            goto LABEL_23;
          }
          a3 = v26;
        }
LABEL_32:
        buf2 = &v6[a3[1]];
        if( (unsigned int)SMKM_STORE::SmStCheckResident((__int64)buf2, v13[2]) == 1 )
        {
          if( !memcmp(buf1, buf2, v13[2]) )
            *((_BYTE *)v13 + 7) = ((char *)v26 - (char *)(v13 + 4)) >> 3;
          if( *((_BYTE *)v13 + 7) != 16 )
            break;
        }
        a3 = v26 + 2;
        v15 = v24;
      }
      v13 += 4 * *((unsigned __int8 *)v13 + 6) + 4;
    }
  }
  v5 = -1073741670;
LABEL_24:
  if( (*(_BYTE *)(v7 + 6021) & 4) != 0 && (unsigned __int64)v12 > 3 )
    SMKM_STORE::SmStUnmapVirtualRegion(v7, *(_DWORD *)a2, (__int64)a3, (__int64)a4, v21, 8u);
  if( (unsigned __int64)v6 > 3 && v6 != v12 )
  {
    if( (*(_BYTE *)(v7 + 6021) & 4) != 0 )
    {
      SMKM_STORE::SmStUnmapVirtualRegion(v7, v8, (__int64)a3, (__int64)a4, v21, 8u);
    }
    else
    {
      v18 = *(_QWORD *)(v7 + 6216);
      v19 = (VOID *)(*(_QWORD *)(v18 + 8i64 * v8) & 0xFFFFFFFFFFFFFFF8ui64);
      v20 = *(_QWORD *)(v18 + 8i64 * v8) & 0xFFFFFFFFFFFFFFFEui64;
      *(_QWORD *)(v18 + 8i64 * v8) = v20;
      if( (v20 & 3) == 0 )
        SmFpFree((_SM_FORWARD_PROGRESS_CTX *)(v7 + 6608), SmFpResourceMapping, KeGetCurrentThread(), v19);
    }
  }
  _InterlockedDecrement(v10);
  return v5;
}

Referenced by:

No references.