NtManageHotPatch
__int64 __fastcall NtManageHotPatch(unsigned int a1, VOID *a2, unsigned int a3, unsigned __int64 a4){
INT64 v4;
__int64 v7;
char PreviousMode;
int active;
int v10;
INT64 v11;
unsigned __int64 v12;
const VOID *v13;
UINT8 *v14;
unsigned int v15;
unsigned __int64 v16;
unsigned int v17;
_DWORD *v18;
__int64 v19;
_KPROCESSOR_MODE AccessMode;
int v22;
size_t v24;
int v25;
size_t Size[2];
unsigned __int64 v27;
PVOID P;
PVOID v29;
_UNICODE_STRING DestinationString;
INT64 Src[14];
v4 = a3;
v27 = a4;
DestinationString = 0i64;
LODWORD(v7) = 104;
*(_QWORD *)Size = 104i64;
memset(Src, 0i64, 0x68u);
P = 0i64;
v29 = 0i64;
RtlInitUnicodeString(&DestinationString, 0i64);
v24 = 0;
PreviousMode = KeGetCurrentThread()->PreviousMode;
if( !dword_140C4C9F0 )
{
active = -1073741637;
LABEL_3:
v22 = active;
goto LABEL_78;
}
if( !SeSinglePrivilegeCheck(*(_QWORD *)&SeLoadDriverPrivilege, PreviousMode) )
{
active = -1073741727;
goto LABEL_3;
}
v10 = 0;
v25 = 0;
switch( a1 )
{
case 0u:
goto LABEL_16;
case 1u:
goto LABEL_20;
case 2u:
goto LABEL_19;
}
if( a1 != 3 )
{
if( a1 != 4 )
{
if( a1 != 5 )
{
if( a1 != 6 )
{
active = -1073741821;
goto LABEL_3;
}
v7 = 40i64;
goto LABEL_15;
}
LABEL_19:
v7 = 96i64;
LABEL_15:
*(_QWORD *)Size = v7;
goto LABEL_16;
}
LABEL_20:
LODWORD(v7) = 80;
*(_QWORD *)Size = 80i64;
v10 = 1;
v11 = 4i64;
v25 = 1;
goto LABEL_17;
}
LABEL_16:
v11 = 8i64;
LABEL_17:
if( (unsigned int)v4 < (unsigned int)v7 )
{
active = -1073741820;
goto LABEL_3;
}
if( PreviousMode )
{
v12 = a4;
if( a4 >= 0x7FFFFFFF0000i64 )
v12 = 0x7FFFFFFF0000i64;
*(_DWORD *)v12 = *(_DWORD *)v12;
if( v10 )
{
if( (_DWORD)v4 )
{
if( (((_DWORD)v11 - 1) & (unsigned int)a2) != 0 )
ExRaiseDatatypeMisalignment();
if( (unsigned __int64)a2 + v4 > 0x7FFFFFFF0000i64 || (char *)a2 + v4 < a2 )
MEMORY[0x7FFFFFFF0000] = 0;
}
}
else
{
ProbeForWrite((UINT64)a2, v4, v11);
}
memmove(Src, a2, Size[0]);
}
else
{
memmove(Src, a2, v7);
}
switch( a1 )
{
case 0u:
goto LABEL_61;
case 1u:
goto LABEL_54;
case 2u:
goto LABEL_45;
case 3u:
LABEL_61:
if( LODWORD(Src[0]) != 2 || !LOWORD(Src[1]) )
goto LABEL_46;
if( PreviousMode )
{
if( (Src[2] & 1) != 0 )
ExRaiseDatatypeMisalignment();
v16 = Src[2] + LOWORD(Src[1]);
if( v16 > 0x7FFFFFFF0000i64 || v16 < Src[2] )
MEMORY[0x7FFFFFFF0000] = 0;
}
active = RtlDuplicateUnicodeString(0i64, (_UNICODE_STRING *)&Src[1], &DestinationString);
v22 = active;
if( active < 0 )
goto LABEL_78;
if( a1 == 3 )
{
if( !RtlValidSid(&Src[3]) )
goto LABEL_49;
v17 = MiLoadHotPatchForUserSid(&DestinationString, &Src[3], (INT64 *)((char *)&Src[11] + 4));
}
else
{
v17 = MiLoadHotPatch(&DestinationString);
}
v22 = v17;
active = v17;
MiLogHotPatchManagement(a1, (INT64)Src, &DestinationString.Length, v17);
v13 = Src;
v24 = Size[0];
goto LABEL_74;
case 4u:
LABEL_54:
if( LODWORD(Src[0]) != 1 )
goto LABEL_46;
if( a1 == 4 )
{
if( !RtlValidSid((_BYTE *)&Src[1] + 4) )
goto LABEL_49;
v15 = MiUnloadHotPatchForUserSid((char *)&Src[1] + 4, (INT64 *)((char *)Src + 4));
}
else
{
v15 = MiUnloadHotPatch(HIDWORD(Src[0]), LODWORD(Src[1]));
}
v22 = v15;
active = v15;
MiLogHotPatchManagement(a1, (INT64)Src, 0i64, v15);
v13 = 0i64;
goto LABEL_74;
}
if( a1 != 5 )
{
LOBYTE(AccessMode) = PreviousMode;
active = MiQueryProcessActivePatches(Src[1], (INT64 *)&v29, &v24, (__int64)a2, v4, AccessMode);
v22 = active;
if( active < 0 )
goto LABEL_78;
if( v24 > (unsigned int)v4 )
goto LABEL_42;
v13 = v29;
goto LABEL_74;
}
LABEL_45:
if( LODWORD(Src[0]) != 2 )
{
LABEL_46:
active = -1073741811;
goto LABEL_43;
}
v14 = 0i64;
if( a1 == 5 )
{
if( !RtlValidSid((_BYTE *)Src + 4) )
{
LABEL_49:
active = -1073741704;
goto LABEL_43;
}
v14 = (UINT8 *)Src + 4;
}
active = MiQueryLoadedPatches(v14, &P, &v24, (__int64)a2, v4);
v22 = active;
if( active < 0 )
goto LABEL_78;
if( v24 > (unsigned int)v4 )
{
LABEL_42:
active = -1073741789;
LABEL_43:
v22 = active;
goto LABEL_78;
}
v13 = P;
LABEL_74:
if( !v25 )
{
if( PreviousMode )
{
memmove(a2, v13, v24);
v18 = (_DWORD *)a4;
goto LABEL_79;
}
memmove(a2, v13, v24);
}
LABEL_78:
v18 = (_DWORD *)a4;
LABEL_79:
if( PreviousMode )
{
v19 = (__int64)v18;
if( (unsigned __int64)v18 >= 0x7FFFFFFF0000i64 )
v19 = 0x7FFFFFFF0000i64;
*(_DWORD *)v19 = *(_DWORD *)v19;
*v18 = v24;
active = v22;
}
else
{
*v18 = v24;
}
RtlFreeAnsiString(&DestinationString);
if( P )
ExFreePoolWithTag(P, 0);
if( v29 )
ExFreePoolWithTag(v29, 0);
return(unsigned int)active;
}Referenced by:
No references.