AlpcpFreeMessageFunction

VOID __stdcall AlpcpFreeMessageFunction(PVOID Buffer){
  unsigned int v2; 
  _ETHREAD *CurrentThread; 
  _HANDLE_TABLE *v4; 
  unsigned int v5; 
  _HANDLE_TABLE_ENTRY *v6; 
  v2 = *((_DWORD *)Buffer + 78) & 0x7FFFFFFF;
  if( v2 )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    if( (v2 & 0xFC000000) != 0 )
    {
      v4 = 0i64;
      if( AlpcpSecondaryMessageTables )
        v4 = *(_HANDLE_TABLE **)(AlpcpSecondaryMessageTables + 8 * ((unsigned __int64)v2 >> 26));
    }
    else
    {
      v4 = (_HANDLE_TABLE *)AlpcMessageTable;
    }
    v5 = v2 & 0x3FFFFFF;
    v6 = (_HANDLE_TABLE_ENTRY *)ExMapHandleToPointerEx(
                                  (ULONG_PTR)v4,
                                  v2 & 0x3FFFFFF,
                                  *((_BYTE *)KeGetCurrentThread() + 562));
    ExDestroyHandle(v4, (VOID *)v5, v6);
    KeLeaveCriticalRegionThread((__int64)CurrentThread);
  }
  ExFreePoolWithTag(Buffer, 0);
}

Referenced by:

No references.