AlpcViewDestroyProcedure
NTSTATUS __stdcall AlpcViewDestroyProcedure(PVOID Param){
void *v1;
__int64 v3;
_EPROCESS *v4;
int v5;
int v6;
_KPROCESS *v7;
void *v8;
volatile INT64 *v9;
_KAPC_STATE ApcState;
v1 = 0i64;
memset(&ApcState, 0, sizeof(ApcState));
v3 = *((_QWORD *)Param + 2);
v4 = (_EPROCESS *)*((_QWORD *)KeGetCurrentThread() + 23);
if( v3 )
{
AlpcpLockForCachedReferenceBlob(*((PVOID *)Param + 2));
**((_QWORD **)Param + 1) = *(_QWORD *)Param;
*(_QWORD *)(*(_QWORD *)Param + 8i64) = *((_QWORD *)Param + 1);
v5 = *(_DWORD *)(v3 + 52) - 1;
*(_DWORD *)(v3 + 52) = v5;
if( (*((_DWORD *)Param + 18) & 4) == 0 )
{
v6 = *(_DWORD *)(v3 + 48);
if( (v6 & 1) != 0 )
{
*(_QWORD *)(v3 + 80) = 0i64;
v1 = *(void **)(v3 + 72);
if( v1 )
{
AlpcpRestoreWriteAccess(*(_QWORD *)(v3 + 72));
}
else if( !v5 )
{
*(_DWORD *)(v3 + 48) = v6 & 0xFFFFFFFE;
}
}
}
AlpcpUnlockBlob((PVOID)v3);
AlpcpRemoveResourcePort(*((_QWORD *)Param + 3), (INT64)Param);
HalPutDmaAdapter(*((PADAPTER_OBJECT *)Param + 3));
if( (*((_DWORD *)Param + 18) & 8) != 0 )
{
MmUnmapViewInSystemSpace(*((PVOID *)Param + 5));
}
else
{
v7 = (_EPROCESS *)*((_QWORD *)Param + 4);
if( v4 != v7 )
KiStackAttachProcess((_KPROCESS *)v7, 0i64, &ApcState);
v8 = (void *)*((_QWORD *)Param + 7);
if( v8 )
MmUnsecureVirtualMemory(v8);
MiUnmapViewOfSection(*((_QWORD *)Param + 4), *((_QWORD *)Param + 5), 0, 0);
if( v4 != *((_EPROCESS **)Param + 4) )
KiUnstackDetachProcess(&ApcState, 0i64);
}
if( v1 )
AlpcpDereferenceBlobEx(v1, 1i64);
AlpcpDereferenceBlobEx(*((PVOID *)Param + 2), 1i64);
ExAcquirePushLockExclusiveEx(*((_QWORD *)Param + 4) + 2048i64, 0i64);
**((_QWORD **)Param + 11) = *((_QWORD *)Param + 10);
*(_QWORD *)(*((_QWORD *)Param + 10) + 8i64) = *((_QWORD *)Param + 11);
v9 = (volatile INT64 *)(*((_QWORD *)Param + 4) + 2048i64);
if( (_InterlockedExchangeAdd64(v9, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
ExfTryToWakePushLock(v9);
KeAbPostRelease((PVOID)v9);
ObfDereferenceObjectWithTag(*((PVOID *)Param + 4), 0x63706C41ui64);
}
return 0;
}Referenced by:
No references.