KseDriverUnloadImage
NTSTATUS __stdcall KseDriverUnloadImage(_KLDR_DATA_TABLE_ENTRY *DataTableEntry){
void *DllBase;
_ETHREAD *CurrentThread;
_KSE_SHIMMED_MODULE *v5;
__int64 v6;
_KSE_SHIMMED_MODULE *v7;
_KSE_SHIMMED_MODULE v8;
__int64 v9;
void(__fastcall *v10)(void *);
__int64 v11;
__int64 *v12;
__int64 v13;
int v14;
int v15;
__int64 *v16;
__int64 **v17;
__int64 v18;
_KSE_SHIMMED_MODULE **v19;
UINT64 v20;
__int64 v21;
_KSE_SHIMMED_MODULE *v22;
__int64 v23;
_ADAPTER_OBJECT *v24;
__int64 v25;
_KSE_SHIMMED_MODULE *v26;
__int64 v27;
_KSE_SHIMMED_MODULE *ModuleInfo;
ModuleInfo = 0i64;
if( !DataTableEntry )
return -1073741811;
if( dword_140C50324 != 2 )
return -1073741637;
if( (Engine & 1) != 0 )
return -1073741637;
DllBase = DataTableEntry->DllBase;
if( MmIsSessionAddress(DllBase) == 1 )
return -1073741637;
if( KsepIsModuleShimmed(&Engine, DllBase, &ModuleInfo) && ModuleInfo )
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
--CurrentThread->Tcb.KernelApcDisable;
ExAcquirePushLockExclusiveEx(&stru_140C50350, 0i64);
v5 = ModuleInfo;
v6 = 0i64;
v7 = ModuleInfo + 6;
v8 = ModuleInfo[6];
if( v8 )
{
do
{
v9 = *(_QWORD *)(*((_QWORD *)v5 + 4) + 80 * v6 + 72);
if( (*(_DWORD *)(v9 + 28) & 4) == 0 )
{
v10 = *(void(__fastcall **)(void *))(*(_QWORD *)(v9 + 16) + 32i64);
if( v10 )
v10(DataTableEntry->DllBase);
}
v8 = *v7;
v6 = (unsigned int)(v6 + 1);
}
while( (unsigned int)v6 < *v7 );
}
v11 = 0i64;
if( v8 )
{
do
{
v12 = *(__int64 **)(*((_QWORD *)v5 + 4) + 80 * v11 + 72);
if( !*((_DWORD *)v12 + 6) )
{
v13 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryErrorsIndex, 1u) + 1) & 0x3F;
dword_140C2A864[2 * v13] = -1073740768;
KsepHistoryErrors[2 * v13] = 460173;
if( (KsepDebugFlag & 4) != 0 )
RtlAssert("RegisteredShim->RefCount > 0", "minkernel\\ntos\\kshim\\kseloader.c", 1421i64, 0i64);
}
v14 = *((_DWORD *)v12 + 7);
v15 = *((_DWORD *)v12 + 6) - 1;
*((_DWORD *)v12 + 6) = v15;
if( (v14 & 4) != 0 && !v15 )
{
v16 = (__int64 *)*v12;
if( *(__int64 **)(*v12 + 8) != v12 )
goto LABEL_43;
v17 = (__int64 **)v12[1];
if( *v17 != v12 )
goto LABEL_43;
*v17 = v16;
v16[1] = (__int64)v17;
}
v11 = (unsigned int)(v11 + 1);
}
while( (unsigned int)v11 < *v7 );
v5 = ModuleInfo;
}
v18 = *(_QWORD *)v5;
if( *(_KSE_SHIMMED_MODULE **)(*(_QWORD *)v5 + 8i64) != v5
|| (v19 = (_KSE_SHIMMED_MODULE **)*((_QWORD *)v5 + 1), *v19 != v5) )
{
LABEL_43:
__fastfail(3u);
}
*v19 = (_KSE_SHIMMED_MODULE *)v18;
*(_QWORD *)(v18 + 8) = v19;
if( (_InterlockedExchangeAdd64(&stru_140C50350._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(&stru_140C50350);
KeAbPostRelease(&stru_140C50350);
KeLeaveCriticalRegion();
v20 = (unsigned int)*v7;
v21 = 0i64;
if( (_DWORD)v20 )
{
v22 = ModuleInfo;
do
{
v23 = *(_QWORD *)(*((_QWORD *)v22 + 4) + 80 * v21 + 72);
v24 = *(_ADAPTER_OBJECT **)(v23 + 32);
if( v24 )
HalPutDmaAdapter(v24);
if( (*(_DWORD *)(v23 + 28) & 4) != 0 && !*(_DWORD *)(v23 + 24) )
{
KsepPoolFreePaged((VOID *)v23);
v25 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
HIDWORD(KsepHistoryMessages[v25]) = 0;
LODWORD(KsepHistoryMessages[v25]) = 460230;
if( (KsepDebugFlag & 1) != 0 )
KsepDebugPrint(
5i64,
"KSE: Cleaned up dangling shim object [0x%08X] (unregistered while refcount >0)\n",
v23);
KsepLogInfo(5, "KSE: Cleaned up dangling shim object [0x%08X] (unregistered while refcount >0)\n", v23);
}
v20 = (unsigned int)*v7;
v21 = (unsigned int)(v21 + 1);
}
while( (unsigned int)v21 < (unsigned int)v20 );
}
v26 = ModuleInfo;
KsepDbFreeDriverShims(*((_KSE_SHIM_INFO **)ModuleInfo + 4), v20);
KsepPoolFreePaged(v26);
v27 = ((unsigned __int8)_InterlockedExchangeAdd(&KsepHistoryMessagesIndex, 1u) + 1) & 0x3F;
HIDWORD(KsepHistoryMessages[v27]) = 0;
LODWORD(KsepHistoryMessages[v27]) = 460238;
if( (KsepDebugFlag & 1) != 0 )
KsepDebugPrint(5i64, "KSE: Shimmed driver unload notification processed\n");
KsepLogInfo(5, "KSE: Shimmed driver unload notification processed\n");
}
return 0;
}Referenced by:
No references.