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.
 
 
 
 
 
 

391 lines
9.3 KiB

//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1995.
//
// File: dbgtool.c
//
// Contents:
//
// Classes:
//
// Functions:
//
// History: 4-03-95 RichardW Created
//
//----------------------------------------------------------------------------
#include "dbgtool.h"
HANDLE hMapping;
PDebugHeader pHeader;
ULONG_PTR Xlate ;
#define TranslatePointer( x ) (PVOID) ( (x) ? ((PUCHAR) x + Xlate) : NULL )
PVOID
MapDebugMemory(DWORD pid)
{
WCHAR szMapping[32];
PDebugHeader pHeader = NULL;
PVOID pvMap;
DWORD CommitSize;
SYSTEM_INFO SysInfo;
SECURITY_DESCRIPTOR min ;
GetSystemInfo(&SysInfo);
swprintf(szMapping, TEXT("Debug.Memory.%x"), pid);
hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS,
FALSE,
szMapping);
if ( !hMapping && GetLastError() == ERROR_ACCESS_DENIED )
{
hMapping = OpenFileMapping( WRITE_DAC | READ_CONTROL,
FALSE,
szMapping );
if ( hMapping )
{
InitializeSecurityDescriptor(&min, 1);
SetSecurityDescriptorDacl(&min,FALSE,NULL,FALSE);
SetKernelObjectSecurity(hMapping, DACL_SECURITY_INFORMATION, &min );
CloseHandle( hMapping );
hMapping = OpenFileMapping( FILE_MAP_ALL_ACCESS,
FALSE,
szMapping);
}
}
if (hMapping)
{
pHeader = MapViewOfFileEx( hMapping,
FILE_MAP_ALL_ACCESS,
0,
0,
0,
NULL);
if (pHeader && (pHeader != pHeader->pvSection))
{
//
// Rats. Remap at preferred address:
//
pvMap = pHeader->pvSection;
UnmapViewOfFile(pHeader);
pHeader = MapViewOfFileEx( hMapping,
FILE_MAP_READ | FILE_MAP_WRITE,
0,
0,
0,
pvMap);
if (pHeader)
{
CommitSize = pHeader->CommitRange;
}
else
{
//
// Can't map at same address, unfortunately. Set up the translation:
//
pHeader = MapViewOfFileEx( hMapping,
FILE_MAP_READ | FILE_MAP_WRITE,
0,
0,
0,
NULL );
if ( pHeader )
{
Xlate = (ULONG_PTR) ((PUCHAR) pHeader - (PUCHAR) pHeader->pvSection );
}
}
}
else
{
}
}
return(pHeader);
}
//+---------------------------------------------------------------------------
//
// Function: DbgpFindModule
//
// Synopsis: Locates a module based on a name
//
// Arguments: [pHeader] -- Header to search
// [pszName] -- module to find
//
// History: 3-22-95 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
PDebugModule
DbgFindModule(
PDebugHeader pHeader,
CHAR * pszName)
{
PDebugModule pSearch;
pSearch = TranslatePointer( pHeader->pModules);
while ( pSearch )
{
if (_strcmpi( TranslatePointer( pSearch->pModuleName ), pszName) == 0)
{
return(pSearch);
}
pSearch = TranslatePointer( pSearch->pNext );
}
return(NULL);
}
RenameKeys(
HWND hDlg,
PDebugModule pModule)
{
int i;
DWORD f;
for (i = 0, f = 1; i < 32 ; i++, f <<= 1 )
{
if (pModule->TagLevels[i])
{
SetDlgItemTextA(hDlg, i + IDD_CHECK_0, TranslatePointer( pModule->TagLevels[i] ) );
}
else
{
SetDlgItemTextA(hDlg, i + IDD_CHECK_0, "");
}
CheckDlgButton(hDlg, i + IDD_CHECK_0, (pModule->InfoLevel & f) ? 1 : 0);
}
return(0);
}
InitDialog(
HWND hDlg)
{
PDebugModule pSearch;
LRESULT index;
HWND hLB;
CHAR szText[MAX_PATH];
//
// Load Listbox:
//
hLB = GetDlgItem(hDlg, IDD_DEBUG_LB);
pSearch = TranslatePointer( pHeader->pModules );
while (pSearch)
{
index = SendMessageA(
hLB,
LB_ADDSTRING,
0,
(LPARAM) TranslatePointer( pSearch->pModuleName ) );
SendMessage(
hLB,
LB_SETITEMDATA,
index,
(LPARAM) pSearch );
pSearch = TranslatePointer( pSearch->pNext );
}
SetFocus(hLB);
SendMessage(hLB, LB_SETSEL, 1, 0);
ShowWindow(GetDlgItem(hDlg, IDD_MODULE_TEXT), SW_HIDE);
ShowWindow(GetDlgItem(hDlg, IDD_MODULE_OUTPUT), SW_HIDE);
if (pHeader->pszExeName)
{
GetWindowTextA(hDlg, szText, MAX_PATH);
strcat(szText, " : ");
strcat(szText, TranslatePointer( pHeader->pszExeName ) );
SetWindowTextA(hDlg, szText);
}
return(TRUE);
}
int
ListBoxNotify(
HWND hDlg,
WPARAM wParam,
LPARAM lParam)
{
LRESULT i;
PDebugModule pModule;
char Total[16];
if (HIWORD(wParam) == LBN_SELCHANGE)
{
if (!GetWindowLongPtr(hDlg, GWLP_USERDATA))
{
ShowWindow(GetDlgItem(hDlg, IDD_MODULE_TEXT), SW_NORMAL);
ShowWindow(GetDlgItem(hDlg, IDD_MODULE_OUTPUT), SW_NORMAL);
}
i = SendMessage(GetDlgItem(hDlg, IDD_DEBUG_LB), LB_GETCURSEL, 0, 0);
pModule = (PDebugModule) SendMessage(GetDlgItem(hDlg, IDD_DEBUG_LB),
LB_GETITEMDATA, (WPARAM) i, 0);
RenameKeys(hDlg, pModule);
sprintf(Total, "%d bytes", pModule->TotalOutput);
SetDlgItemTextA(hDlg, IDD_MODULE_OUTPUT, Total);
SetWindowLongPtr(hDlg, GWLP_USERDATA, (LPARAM) pModule);
}
return(TRUE);
}
HandleCheck(
HWND hDlg,
WPARAM wParam,
LPARAM lParam)
{
int bit;
PDebugModule pModule;
pModule = (PDebugModule) GetWindowLongPtr(hDlg, GWLP_USERDATA);
bit = 1 << (LOWORD(wParam) - IDD_CHECK_0);
if (IsDlgButtonChecked(hDlg, LOWORD(wParam)))
{
pModule->InfoLevel |= bit;
}
else
{
pModule->InfoLevel&= ~(bit);
}
pModule->fModule |= DEBUGMOD_CHANGE_INFOLEVEL;
return(0);
}
LRESULT
CALLBACK
DialogProc(
HWND hDlg,
UINT Message,
WPARAM wParam,
LPARAM lParam)
{
char Total[16];
switch (Message)
{
case WM_INITDIALOG:
return(InitDialog(hDlg));
case WM_COMMAND:
sprintf(Total, "%d bytes", pHeader->TotalWritten);
SetDlgItemTextA(hDlg, IDD_TOTAL_OUTPUT, Total);
switch (LOWORD(wParam))
{
case IDOK:
EndDialog(hDlg, IDOK);
return(TRUE);
case IDCANCEL:
EndDialog(hDlg, IDCANCEL);
return(TRUE);
case IDD_DEBUG_LB:
return(ListBoxNotify(hDlg, wParam, lParam));
}
if ((LOWORD(wParam) >= IDD_CHECK_0) &&
(LOWORD(wParam) <= IDD_CHECK_31))
{
HandleCheck(hDlg, wParam, lParam);
}
return(TRUE);
}
return(FALSE);
}
int
ErrorMessage(
HWND hWnd,
PWSTR pszTitleBar,
DWORD Buttons)
{
WCHAR szMessage[256];
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,
NULL, // ignored
(GetLastError()), // message id
MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US), // message language
szMessage, // address of buffer pointer
199, // minimum buffer size
NULL ); // no other arguments
return(MessageBox(hWnd, szMessage, pszTitleBar, Buttons));
}
int WINAPI WinMain(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpszCmdParam,
int nCmdShow)
{
int pid;
PCHAR pszPid = lpszCmdParam;
LRESULT Status ;
sscanf(pszPid,"%d",&pid);
pHeader = MapDebugMemory(pid);
if (!pHeader)
{
ErrorMessage(NULL, TEXT("Map Debug Memory"), MB_OK | MB_ICONSTOP);
return(0);
}
Status = DialogBox( hInstance,
MAKEINTRESOURCE(IDD_DEBUG_TOOL),
GetDesktopWindow(),
DialogProc);
if ( Status < 0 )
{
ErrorMessage(NULL, TEXT("DialogBox"), MB_OK | MB_ICONSTOP);
}
return(0);
}