RtlFindHotPatchInformation
INT64 __stdcall RtlFindHotPatchInformation(PVOID Base){
IMAGE_NT_HEADERS *v2;
char *v3;
char *v4;
__int64 v5;
unsigned int SizeOfImage;
char *v7;
unsigned int v8;
unsigned int v9;
unsigned int v10;
unsigned int v11;
INT64 v12;
UINT64 Size;
LODWORD(Size) = 0;
v2 = RtlImageNtHeader(Base);
LODWORD(v3) = RtlImageDirectoryEntryToData(Base, 1u, 0xAu, &Size);
if( !v3 )
return 0i64;
if( (unsigned int)Size <= 4 )
return 0i64;
if( (_DWORD)Size != *(_DWORD *)v3 )
return 0i64;
if( (unsigned int)Size < 0xF4 )
return 0i64;
if( &v3[(unsigned int)Size] < v3 )
return 0i64;
v4 = (char *)Base + v2->OptionalHeader.SizeOfImage;
if( v3 >= v4 )
return 0i64;
if( &v3[(unsigned int)Size] > v4 )
return 0i64;
_mm_lfence();
v5 = *((unsigned int *)v3 + 60);
if( (unsigned int)v5 >= 0xFFFFFFF8 || (_DWORD)v5 == 0 )
return 0i64;
SizeOfImage = v2->OptionalHeader.SizeOfImage;
if( (int)v5 + 8 > SizeOfImage )
return 0i64;
v7 = (char *)Base + v5;
switch( *(_DWORD *)((char *)Base + v5) )
{
case 1:
v8 = 20;
break;
case 2:
v8 = 24;
break;
case 3:
v8 = 28;
break;
default:
return 0i64;
}
v9 = *((_DWORD *)v7 + 1);
if( v9 >= v8 )
{
if( *((_DWORD *)v7 + 2) )
{
if( v9 + (unsigned int)v5 > v9 && v9 + (unsigned int)v5 <= SizeOfImage )
{
v10 = *((_DWORD *)v7 + 4);
if( v10 <= 0x3FFFFFF9 )
{
v11 = 4 * v10 + *((_DWORD *)v7 + 3);
if( v11 > 4 * v10 && v11 <= v9 && v10 == 1 && RtlFindHotPatchBase((UINT64 *)v7) )
return v12;
}
}
}
}
return 0i64;
}Referenced by:
MiApplyDriverHotPatch
MiOpenHotPatchFile
MiPerformImageHotPatch