ExpWnfDeleteProcessContext
VOID __fastcall ExpWnfDeleteProcessContext(_WNF_PROCESS_CONTEXT *ProcessContext, UINT64 FinalCleanup){
_WNF_LOCK *p_ProcessSubscriptionListLock;
int v3;
_BYTE *v5;
_BYTE *v6;
_LIST_ENTRY *p_ProcessSubscriptionListHead;
_LIST_ENTRY *Flink;
_LIST_ENTRY **p_Blink;
_BYTE *v10;
_BYTE *v11;
_WNF_LOCK *p_TemporaryNamesListLock;
_BYTE *v13;
_BYTE *v14;
_LIST_ENTRY *p_TemporaryNamesListHead;
_LIST_ENTRY *v16;
_BYTE *v17;
_BYTE *v18;
_LIST_ENTRY *v19;
_LIST_ENTRY *Blink;
_KEVENT *NotificationEvent;
_WNF_NAME_INSTANCE *v22;
_BYTE *v23;
_BYTE *v24;
p_ProcessSubscriptionListLock = &ProcessContext->ProcessSubscriptionListLock;
v3 = FinalCleanup;
LODWORD(v5) = KeAbPreAcquire(&ProcessContext->ProcessSubscriptionListLock, 0i64, 0i64);
v6 = v5;
if( _interlockedbittestandset64((volatile signed __int32 *)p_ProcessSubscriptionListLock, 0i64) )
ExfAcquirePushLockExclusiveEx((UINT64 *)p_ProcessSubscriptionListLock, v5, p_ProcessSubscriptionListLock);
if( v6 )
v6[26] |= 1u;
p_ProcessSubscriptionListHead = &ProcessContext->ProcessSubscriptionListHead;
while( 1 )
{
Flink = p_ProcessSubscriptionListHead->Flink;
if( p_ProcessSubscriptionListHead->Flink == p_ProcessSubscriptionListHead )
break;
p_Blink = &Flink[-2].Blink;
ExAcquireRundownProtection((PEX_RUNDOWN_REF)&Flink[-1]);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_ProcessSubscriptionListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)p_ProcessSubscriptionListLock);
KeAbPostRelease(p_ProcessSubscriptionListLock);
ExpWnfDeleteSubscription(p_Blink, ProcessContext->Process);
LODWORD(v10) = KeAbPreAcquire(p_ProcessSubscriptionListLock, 0i64, 0i64);
v11 = v10;
if( _interlockedbittestandset64((volatile signed __int32 *)p_ProcessSubscriptionListLock, 0i64) )
ExfAcquirePushLockExclusiveEx((UINT64 *)p_ProcessSubscriptionListLock, v10, p_ProcessSubscriptionListLock);
if( v11 )
v11[26] |= 1u;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_ProcessSubscriptionListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)p_ProcessSubscriptionListLock);
KeAbPostRelease(p_ProcessSubscriptionListLock);
p_TemporaryNamesListLock = &ProcessContext->TemporaryNamesListLock;
LODWORD(v13) = KeAbPreAcquire(&ProcessContext->TemporaryNamesListLock, 0i64, 0i64);
v14 = v13;
if( _interlockedbittestandset64((volatile signed __int32 *)&ProcessContext->TemporaryNamesListLock, 0i64) )
ExfAcquirePushLockExclusiveEx(
(UINT64 *)&ProcessContext->TemporaryNamesListLock,
v13,
&ProcessContext->TemporaryNamesListLock);
if( v14 )
v14[26] |= 1u;
p_TemporaryNamesListHead = &ProcessContext->TemporaryNamesListHead;
while( 1 )
{
v16 = p_TemporaryNamesListHead->Flink;
if( p_TemporaryNamesListHead->Flink == p_TemporaryNamesListHead )
break;
v22 = (_WNF_NAME_INSTANCE *)&v16[-9].Blink;
ExAcquireRundownProtection((PEX_RUNDOWN_REF)&v16[-8]);
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_TemporaryNamesListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&ProcessContext->TemporaryNamesListLock);
KeAbPostRelease(&ProcessContext->TemporaryNamesListLock);
ExpWnfNotifyNameSubscribers((INT64)v22, 0x10ui64, 0i64, 0i64);
ExpWnfDeleteNameInstance(v22->ScopeInstance, v22, 1u);
LODWORD(v23) = KeAbPreAcquire(&ProcessContext->TemporaryNamesListLock, 0i64, 0i64);
v24 = v23;
if( _interlockedbittestandset64((volatile signed __int32 *)p_TemporaryNamesListLock, 0i64) )
ExfAcquirePushLockExclusiveEx(
(UINT64 *)&ProcessContext->TemporaryNamesListLock,
v23,
&ProcessContext->TemporaryNamesListLock);
if( v24 )
v24[26] |= 1u;
}
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)p_TemporaryNamesListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&ProcessContext->TemporaryNamesListLock);
KeAbPostRelease(&ProcessContext->TemporaryNamesListLock);
if( v3 )
{
LODWORD(v17) = KeAbPreAcquire(&ExpWnfProcessesListLock, 0i64, 0i64);
v18 = v17;
if( _interlockedbittestandset64((volatile signed __int32 *)&ExpWnfProcessesListLock, 0i64) )
ExfAcquirePushLockExclusiveEx(&ExpWnfProcessesListLock, v17, &ExpWnfProcessesListLock);
if( v18 )
v18[26] |= 1u;
v19 = ProcessContext->WnfProcessesListEntry.Flink;
if( v19->Blink != &ProcessContext->WnfProcessesListEntry
|| (Blink = ProcessContext->WnfProcessesListEntry.Blink, Blink->Flink != &ProcessContext->WnfProcessesListEntry) )
{
__fastfail(3u);
}
Blink->Flink = v19;
v19->Blink = Blink;
if( (_InterlockedExchangeAdd64((volatile signed __int64 *)&ExpWnfProcessesListLock, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock((volatile INT64 *)&ExpWnfProcessesListLock);
KeAbPostRelease(&ExpWnfProcessesListLock);
NotificationEvent = ProcessContext->NotificationEvent;
if( NotificationEvent )
HalPutDmaAdapter((PADAPTER_OBJECT)NotificationEvent);
ExFreePoolWithTag(ProcessContext, 0x20666E57u);
}
}Referenced by:
ExWnfExitProcess
ExpWnfCreateProcessContext