RtlCountRequiredHotPatchAddressTableEntries
__int64 __fastcall RtlCountRequiredHotPatchAddressTableEntries(
__int64 a1,
unsigned int a2,
unsigned int a3,
_DWORD *a4,
int *a5,
char a6,
int a7,
int a8,
_DWORD *a9){
unsigned __int64 v10;
int v12;
unsigned int HotPatchSize;
int *v14;
__int64 v15;
int v16;
bool v17;
int *v18;
bool v19;
__int64 v20;
_BYTE *v21;
_BYTE *v22;
unsigned __int64 v23;
__int64 v24;
unsigned __int64 v25;
int v26;
v10 = a3;
v12 = 0;
HotPatchSize = RtlGetHotPatchSize(a4);
v14 = a5;
v15 = HotPatchSize;
v16 = *a5;
if( !*a5 )
{
LABEL_23:
*a9 = v12;
return 0i64;
}
while( 1 )
{
v17 = 0;
v18 = v14;
if( a6 )
{
if( v16 < 0 )
v17 = 1;
}
else
{
v17 = v16 >= 0;
}
v19 = 0;
++v14;
if( (v16 & 0xFC000) == 114688 )
v19 = v17;
if( v19 )
break;
v14 = &v18[(v16 & 0xFFF) * (unsigned int)v15 + 1];
LABEL_22:
v16 = *v14;
if( !*v14 )
goto LABEL_23;
}
if( (v16 & 0xFFF) == 0 )
goto LABEL_22;
while( 1 )
{
v20 = (unsigned int)*v14;
if( (unsigned int)v20 < 0x10 || (int)v20 + 2 > a2 )
return 3221225595i64;
v21 = 0i64;
v22 = (_BYTE *)(a1 + v20);
if( (_DWORD)v15 != 2 )
v21 = v14 + 2;
LODWORD(v23) = RtlpCheckFunctionPatchAppliedInOriginalImage(v22, v21);
if( v23 == -1i64 )
return 3221225595i64;
if( v23 )
{
if( v23 < v25 || v23 - v25 >= v10 )
return 3221225507i64;
}
else
{
++v12;
}
v14 = (int *)(v24 + 4 * v15);
if( v26 == 1 )
goto LABEL_22;
}
}Referenced by:
MiPrepareToHotPatchImage