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.