VfThunkAddSpecialDriverThunks
NTSTATUS __stdcall VfThunkAddSpecialDriverThunks(
UINT64 EntryRoutine,
PVOID ThunkBuffer,
UINT64 ThunkBufferSize,
_KLDR_DATA_TABLE_ENTRY *DataTableEntry){
_DRIVER_SPECIFIED_VERIFIER_THUNKS *ThunkTable;
_DRIVER_SPECIFIED_SPECIAL_VERIFIER_THUNKS *NextSpecialTable;
VOID **PoolWithTag;
_QWORD *v10;
_QWORD *v11;
_DRIVER_SPECIFIED_VERIFIER_THUNKS **v12;
_DRIVER_SPECIFIED_SPECIAL_VERIFIER_THUNKS *v13;
int v14[10];
UINT64 ImportThunk;
ImportThunk = EntryRoutine;
ThunkTable = ViThunkCreateThunkTable(ThunkBuffer, (unsigned int)ThunkBufferSize, DataTableEntry);
if( !ThunkTable )
return -1073741670;
VfDriverLock();
if( (DataTableEntry->Flags & 0x2000000) != 0 )
ViThunkRecoverPristines(ThunkTable);
NextSpecialTable = ViThunkFindNextSpecialTable(&ImportThunk, 1ui64, 0i64);
if( !NextSpecialTable )
{
PoolWithTag = ExAllocatePoolWithTag(1ui64, 0x28ui64, 1951821133i64);
NextSpecialTable = (_DRIVER_SPECIFIED_SPECIAL_VERIFIER_THUNKS *)PoolWithTag;
if( !PoolWithTag )
{
ViDriversLoadLockOwner = 0i64;
KeReleaseMutex(&ViDriversLoadLock, 0);
return -1073741670;
}
PoolWithTag[2] = (VOID *)EntryRoutine;
v10 = PoolWithTag + 3;
v10[1] = v10;
*v10 = v10;
v11 = ViVerifierDriverAddedSpecialThunkListHead;
if( *((PVOID **)ViVerifierDriverAddedSpecialThunkListHead + 1) != &ViVerifierDriverAddedSpecialThunkListHead )
LABEL_11:
__fastfail(3u);
++ViVerifierSpecialThunkTables;
*(_QWORD *)NextSpecialTable = ViVerifierDriverAddedSpecialThunkListHead;
*((_QWORD *)NextSpecialTable + 1) = &ViVerifierDriverAddedSpecialThunkListHead;
v11[1] = NextSpecialTable;
ViVerifierDriverAddedSpecialThunkListHead = NextSpecialTable;
}
VfThunksExtended = 1;
_InterlockedOr(v14, 0);
v12 = (_DRIVER_SPECIFIED_VERIFIER_THUNKS **)*((_QWORD *)NextSpecialTable + 4);
v13 = NextSpecialTable + 6;
++ViActiveVerifierThunks;
if( *v12 != v13 )
goto LABEL_11;
*(_QWORD *)ThunkTable = v13;
*((_QWORD *)ThunkTable + 1) = v12;
*v12 = ThunkTable;
*((_QWORD *)v13 + 1) = ThunkTable;
ViDriversLoadLockOwner = 0i64;
KeReleaseMutex(&ViDriversLoadLock, 0);
return 0;
}Referenced by:
MmAddVerifierSpecialThunks