//
// Copyright (c) Microsoft. All rights reserved.
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
//
//*****************************************************************************
// File: IPCManagerInterface.h
//
// Interface for InterProcess Communication with a COM+ process.
//
//*****************************************************************************
#ifndef _IPCMANAGERINTERFACE_H_
#define _IPCMANAGERINTERFACE_H_
#include "../ipcman/ipcheader.h"
struct PerfCounterIPCControlBlock;
struct AppDomainEnumerationIPCBlock;
#include "../ipcman/ipcmanagerimpl.h"
// These are the right that we will give to the global section and global events used
// in communicating between debugger and debugee
//
// SECTION_ALL_ACCESS is needed for the IPC block. Unfortunately, we DACL our events and
// IPC block identically. Or this particular right does not need to bleed into here.
//
#define CLR_IPC_GENERIC_RIGHT (GENERIC_READ | GENERIC_WRITE | GENERIC_EXECUTE | STANDARD_RIGHTS_ALL | SECTION_ALL_ACCESS)
//-----------------------------------------------------------------------------
// Writer - create a COM+ IPC Block with security attributes.
//-----------------------------------------------------------------------------
class IPCWriterInterface : public IPCWriterImpl
{
public:
BOOL TryAllocBlock(DWORD numRetries);
BOOL TryFreeBlock();
//.............................................................................
// Creation / Destruction only on implementation
//.............................................................................
HRESULT Init();
void Terminate();
//.............................................................................
// Marks the data in the IPC block as initialized
//.............................................................................
void Publish();
//.............................................................................
// Accessor for the Perf block
//.............................................................................
PerfCounterIPCControlBlock * GetPerfBlock();
void DestroySecurityAttributes(SECURITY_ATTRIBUTES *pSA);
#ifndef DACCESS_COMPILE
//.............................................................................
// Create the SxS Public IPC block.
//.............................................................................
HRESULT CreateSxSPublicBlockOnPid(DWORD PID);
//.............................................................................
// Open the SxS Public IPC block that has alread been created.
//.............................................................................
HRESULT OpenSxSPublicBlockOnPid(DWORD PID);
HRESULT GetSxSPublicSecurityAttributes(DWORD pid, SECURITY_ATTRIBUTES **ppSA);
#endif
DWORD GetBlockTableSize();
PTR_VOID GetBlockTableStart();
/*********************************** LEGACY FUNCTIONS ***********************************
*
* Though newer versions of the runtime do not open the LegacyPrivate block or the LegacyPublic
* block, we need functionality in the reader to inspect the LegacyPrivate block and LegacyPublic
* block so reading data from older runtimes.
*
****************************************************************************************/
//.............................................................................
// The AppDomain block resides within the LegacyPrivate IPC block.
//.............................................................................
AppDomainEnumerationIPCBlock * GetAppDomainBlock();
//.............................................................................
// Create the LegacyPrivate IPC block. If this fails because the IPC block has already been
// created by another module then the phInstIPCBlockOwner argument will be set to the
// HINSTANCE of the module that created the IPC block.
// Set inService to TRUE if creating from within a service on behalf of a process.
//.............................................................................
HRESULT CreateLegacyPrivateBlockTempV4OnPid(DWORD PID, BOOL inService, HINSTANCE *phInstIPCBlockOwner);
//.............................................................................
// Open the LegacyPrivate IPC block that has alread been created.
//.............................................................................
HRESULT OpenLegacyPrivateBlockOnPid(DWORD PID);
//.............................................................................
// ReDacl our LegacyPrivate block after it has been created.
//.............................................................................
HRESULT ReDaclLegacyPrivateBlock(PSECURITY_DESCRIPTOR pSecurityDescriptor);
//.............................................................................
// Accessors - return info from header -
// These functions work on LegacyPrivate Block
//.............................................................................
DWORD GetBlockSize();
PTR_VOID GetBlockStart();
PCWSTR GetInstancePath();
};
//-----------------------------------------------------------------------------
// IPCReader class connects to a COM+ IPC block and reads from it
// @FUTURE - make global & private readers
//-----------------------------------------------------------------------------
class IPCReaderInterface : public IPCReaderImpl
{
public:
void MakeInstanceName(const WCHAR * szProcessName, DWORD pid, DWORD runtimeId, SString & sName);
void MakeInstanceNameWhidbey(const WCHAR * szProcessName, DWORD pid, SString & sName);
BOOL TryOpenBlock(IPCHeaderReadHelper & readHelper, DWORD blockIndex);
//.............................................................................
// Create & Destroy
//.............................................................................
~IPCReaderInterface();
HRESULT OpenLegacyPrivateBlockTempV4OnPid(DWORD pid);
HRESULT OpenLegacyPrivateBlockTempV4OnPid(DWORD pid, DWORD dwDesiredAccess);
HRESULT OpenLegacyPrivateBlockOnPid(DWORD pid);
HRESULT OpenLegacyPrivateBlockOnPid(DWORD pid, DWORD dwDesiredAccess);
HRESULT OpenLegacyPrivateBlockOnPidReadWrite(DWORD pid);
HRESULT OpenLegacyPrivateBlockOnPidReadOnly(DWORD pid);
void CloseLegacyPrivateBlock();
#ifndef DACCESS_COMPILE
HRESULT OpenLegacyPublicBlockOnPid(DWORD pid);
HRESULT OpenLegacyPublicBlockOnPid(DWORD pid, DWORD dwDesiredAccess);
HRESULT OpenLegacyPublicBlockOnPidReadOnly(DWORD pid);
void CloseLegacyPublicBlock();
HRESULT OpenBlockTableOnPid(DWORD pid);
HRESULT OpenBlockTableOnPid(DWORD pid, DWORD dwDesiredAccess);
HRESULT OpenBlockTableOnPidReadOnly(DWORD pid);
void CloseBlockTable();
#endif
//.............................................................................
// Accessors - return info from header
// @FUTURE - factor this into IPCWriterInterface as well.
//.............................................................................
USHORT GetBlockVersion();
USHORT GetLegacyPublicBlockVersion();
HINSTANCE GetInstance();
USHORT GetBuildYear();
USHORT GetBuildNumber();
PVOID GetBlockStart();
PCWSTR GetInstancePath();
//........................................
// Check the block to see if its valid
//........................................
BOOL IsValidLegacy(BOOL fIsLegacyPublicBlock);
#ifndef DACCESS_COMPILE
//BOOL IsValidForSxSPublic(IPCControlBlock * pBlock);
#endif
//.............................................................................
// Get different sections of the IPC
//.............................................................................
void * GetLegacyPrivateBlock(ELegacyPrivateIPCClient eClient);
void * GetLegacyPublicBlock(ELegacyPublicIPCClient eClient);
#ifndef DACCESS_COMPILE
//void * GetSxSPublicBlock(DWORD chunkIndex, EIPCClient eClient);
#endif
void * GetPerfBlockLegacyPrivate();
void * GetPerfBlockLegacyPublic();
#ifndef DACCESS_COMPILE
//PerfCounterIPCControlBlock * GetPerfBlockSxSPublic(DWORD chunkIndex);
#endif
AppDomainEnumerationIPCBlock * GetAppDomainBlock();
//.............................................................................
// Return true if we're connected to a memory-mapped file, else false.
//.............................................................................
bool IsLegacyPrivateBlockOpen() const;
bool IsLegacyPublicBlockOpen() const;
bool IsBlockTableOpen() const;
HRESULT IsCompatablePlatformForDebuggerAndDebuggee(DWORD pid, BOOL * pfCompatible);
};
#endif