Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

248 lines
7.5 KiB

#include "precomp.h"
#pragma hdrstop
#include "wiadebug.h"
CSystemGlobalData *CGlobalDebugState::Lock(void)
{
CSystemGlobalData *pSystemGlobalData = NULL;
if (IsValid())
{
DWORD dwWait = WaitForSingleObject(m_hSystemDataMutex,10000);
if (WAIT_OBJECT_0 == dwWait)
{
pSystemGlobalData = m_pSystemGlobalData;
}
}
return pSystemGlobalData;
}
void CGlobalDebugState::Release(void)
{
ReleaseMutex(m_hSystemDataMutex);
}
CGlobalDebugState::CGlobalDebugState(void)
: m_hSystemDataMutex(NULL),
m_hMemoryMappedFile(NULL),
m_pSystemGlobalData(NULL)
{
//
// Create the mutex that protects the system global data
//
m_hSystemDataMutex = CreateMutex( NULL, FALSE, WIADEBUG_MEMORYMAPPED_MUTEXNAME );
if (m_hSystemDataMutex)
{
//
// Grab the mutex that protects the system global data
//
DWORD dwWait = WaitForSingleObject( m_hSystemDataMutex, 10000 );
if (WAIT_OBJECT_0 == dwWait)
{
//
// First try to open the memory mapped file.
//
m_hMemoryMappedFile = OpenFileMapping( FILE_MAP_WRITE, FALSE, WIADEBUG_MEMORYMAPPED_FILENAME );
if (m_hMemoryMappedFile)
{
m_pSystemGlobalData = reinterpret_cast<CSystemGlobalData*>(MapViewOfFile( m_hMemoryMappedFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 ));
}
else
{
//
// We need to create this file mapping with access to everyone.
// Since it is debug-only code, this doesn't represent a security risk.
//
SECURITY_INFORMATION SecurityInformation = DACL_SECURITY_INFORMATION;
SECURITY_DESCRIPTOR SecurityDescriptor = {0};
SECURITY_ATTRIBUTES SecurityAttributes = {0};
SecurityAttributes.nLength = sizeof(SecurityAttributes);
SecurityAttributes.lpSecurityDescriptor = &SecurityDescriptor;
SecurityAttributes.bInheritHandle = FALSE;
//
// Give access to everybody
//
InitializeSecurityDescriptor(&SecurityDescriptor, SECURITY_DESCRIPTOR_REVISION);
SetSecurityDescriptorDacl(&SecurityDescriptor, TRUE, (PACL)NULL, FALSE);
//
// Create the memory mapped file
//
m_hMemoryMappedFile = CreateFileMapping( INVALID_HANDLE_VALUE, &SecurityAttributes, PAGE_READWRITE, 0, sizeof(CSystemGlobalData), WIADEBUG_MEMORYMAPPED_FILENAME );
if (m_hMemoryMappedFile)
{
m_pSystemGlobalData = reinterpret_cast<CSystemGlobalData*>(MapViewOfFile( m_hMemoryMappedFile, FILE_MAP_ALL_ACCESS, 0, 0, 0 ));
if (m_pSystemGlobalData)
{
//
// Start off with everything zeroed out.
//
ZeroMemory( m_pSystemGlobalData, sizeof( CSystemGlobalData ) );
//
// Get the initial global debug settings from the registry
//
m_pSystemGlobalData->nAllowDebugMessages = CSimpleReg( HKEY_CLASSES_ROOT, DEBUG_REGISTRY_PATH, false, KEY_READ ).Query( DEBUG_REGISTRY_ENABLE_DBG, 0 );
//
// No window is registered initially
//
m_pSystemGlobalData->hwndDebug = NULL;
//
// Initialize color table data
//
static const COLORREF crColors[NUMBER_OF_DEBUG_COLORS] =
{
RGB(0x00,0x00,0x00),
RGB(0x00,0x00,0x7F),
RGB(0x00,0x7F,0x00),
RGB(0x00,0x7F,0x7F),
RGB(0x7F,0x00,0x00),
RGB(0x7F,0x00,0x7F),
RGB(0x7F,0x00,0x7F),
RGB(0x7F,0x7F,0x7F)
};
for (int i=0;i<NUMBER_OF_DEBUG_COLORS;i++)
{
m_pSystemGlobalData->crDebugColors[i] = crColors[i];
}
m_pSystemGlobalData->nCurrentColor = 0;
}
}
}
ReleaseMutex(m_hSystemDataMutex);
}
}
//
// If everything didn't work out, destroy the object completely
//
if (!IsValid())
{
Destroy();
}
}
void CGlobalDebugState::Destroy(void)
{
if (m_pSystemGlobalData)
{
UnmapViewOfFile(m_pSystemGlobalData);
m_pSystemGlobalData = NULL;
}
if (m_hMemoryMappedFile)
{
CloseHandle(m_hMemoryMappedFile);
m_hMemoryMappedFile = NULL;
}
if (m_hSystemDataMutex)
{
CloseHandle(m_hSystemDataMutex);
m_hSystemDataMutex = NULL;
}
}
CGlobalDebugState::~CGlobalDebugState(void)
{
Destroy();
}
bool CGlobalDebugState::IsValid(void) const
{
return (m_hSystemDataMutex && m_hMemoryMappedFile && m_pSystemGlobalData);
}
DWORD CGlobalDebugState::AllowDebugMessages(void)
{
DWORD nResult = 0;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
nResult = m_pSystemGlobalData->nAllowDebugMessages;
Release();
}
return nResult;
}
DWORD CGlobalDebugState::AllowDebugMessages( DWORD nAllowDebugMessages )
{
DWORD nResult = 0;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
nResult = m_pSystemGlobalData->nAllowDebugMessages;
m_pSystemGlobalData->nAllowDebugMessages = nAllowDebugMessages;
Release();
}
return nResult;
}
DWORD CGlobalDebugState::AllocateNextColorIndex(void)
{
DWORD nResult = 0;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
nResult = m_pSystemGlobalData->nCurrentColor++;
Release();
}
return nResult;
}
COLORREF CGlobalDebugState::GetColorFromIndex( DWORD nIndex )
{
COLORREF crResult = RGB(0,0,0);
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
crResult = m_pSystemGlobalData->crDebugColors[nIndex % NUMBER_OF_DEBUG_COLORS];
Release();
}
return crResult;
}
bool CGlobalDebugState::DebugWindow( HWND hWnd )
{
bool bResult = false;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
m_pSystemGlobalData->hwndDebug = static_cast<DWORD>(reinterpret_cast<UINT_PTR>(hWnd));
bResult = true;
Release();
}
return bResult;
}
HWND CGlobalDebugState::DebugWindow(void)
{
HWND hWndResult = NULL;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
hWndResult = reinterpret_cast<HWND>(static_cast<UINT_PTR>(m_pSystemGlobalData->hwndDebug));
Release();
}
return hWndResult;
}
bool CGlobalDebugState::SendDebugWindowMessage( UINT nMsg, WPARAM wParam, LPARAM lParam )
{
bool bResult = false;
CSystemGlobalData *pSystemGlobalData = Lock();
if (pSystemGlobalData)
{
HWND hWndDebug = reinterpret_cast<HWND>(static_cast<UINT_PTR>(m_pSystemGlobalData->hwndDebug));
if (IsWindow(hWndDebug))
{
SendMessage( hWndDebug, nMsg, wParam, lParam );
bResult = true;
}
Release();
}
return bResult;
}