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.