Windows NT 4.0 source code leak
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.
 
 
 
 
 
 

305 lines
8.8 KiB

/////////////////////////////////////////////////////////////////////////////
// DBWIN.CPP
#include "common.h"
#ifdef DBWIN
#define cLineDbWinMax 500 // 'Maximum' number of lines allowed on the editor
#define cLineDbWinFlush 100 // Number of lines to flush when exceeding cLineDbWinMax
#define mskLineDbWinCache 63 // SPEED: Mask to avoid sending a EM_GETLINECOUNT too often
const TCHAR szCaptionDbWin[] = _W"DbWin - Debug Messages for "szAPPNAME;
const TCHAR szClassDbWin[] = _W"_DbWin";
// To be saved into the registry
// const TCHAR szDbgDbWinInfo[] = "DbgDbWinInfo";
DBWINREGINFO dbwinreginfo;
HWND hwndDbWin;
HWND hwndDbWinEdit;
HFONT hfontDbWinEdit;
BOOL fSendSzToDbWinEdit = TRUE; // Send the debug string to hwndDbWinEdit
BOOL fSendSzToDebugger = TRUE;
/////////////////////////////////////////////////////////////////////////////
void OutputDbWinString(const TCHAR * szOutputString)
{
static int cLineCache = 0; // To avoid sending a EM_GETLINECOUNT
TCHAR szT[256];
TCHAR *pchDest = szT;
if (hwndDbWinEdit == NULL)
{
OutputDebugString(_W"\nDbWin does not exists. (hwndDbWinEdit == NULL)");
return;
}
Report(IsWindow(hwndDbWinEdit));
Assert(szOutputString);
while (*szOutputString && (pchDest - szT) < LENGTH(szT)-4)
{
if (*szOutputString == _W'\n')
*pchDest++ = _W'\r';
*pchDest++ = *szOutputString++;
}
*pchDest = 0; // Append a null-terminator
if ((++cLineCache & mskLineDbWinCache) == 0)
{
int cLineEdit; // Number of lines in the Edit control
cLineCache = 0;
cLineEdit = LSendMessage(hwndDbWinEdit, EM_GETLINECOUNT, 0, 0);
if ((cLineEdit > cLineDbWinMax) ||
(20000 < LSendMessage(hwndDbWinEdit, WM_GETTEXTLENGTH, 0, 0)))
{
// Select the number of lines to delete
LSendMessage(hwndDbWinEdit, EM_SETSEL, 0,
LSendMessage(hwndDbWinEdit, EM_LINEINDEX, cLineDbWinFlush, 0));
// Delete the selection
LSendMessage(hwndDbWinEdit, EM_REPLACESEL, 0, (LPARAM)_W"[DbWin: Flushing...] ");
}
} // if
LSendMessage(hwndDbWinEdit, EM_SETSEL, (WPARAM)2000000, (LPARAM)2000000); // Move the cursor to the end
LSendMessage(hwndDbWinEdit, EM_REPLACESEL, 0, (LPARAM)szT);
LSendMessage(hwndDbWinEdit, EM_SCROLLCARET, 0, 0);
UpdateWindow(hwndDbWinEdit);
} // OutputDbWinString
/////////////////////////////////////////////////////////////////////////////
BOOL FDbWinCreate()
{
WNDCLASS wndclass;
LOGFONT lf;
wndclass.lpszClassName = szClassDbWin;
wndclass.style = CS_BYTEALIGNCLIENT;
wndclass.lpfnWndProc = WndProcDbWin;
wndclass.hInstance = hInstanceSave;
wndclass.hCursor = LoadCursor(NULL, IDC_ARROW);
wndclass.hIcon = HLoadIcon(ID_ICON_DBWIN);
wndclass.lpszMenuName = MAKEINTRESOURCE(ID_MENU_DBWIN);
wndclass.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndclass.cbWndExtra = 0;
wndclass.cbClsExtra = 0;
if (!RegisterClass(&wndclass))
{
ReportSz("Unable to register DbWin");
return FALSE;
}
hwndDbWin = CreateWindow(
szClassDbWin, // Class name
szCaptionDbWin, // Caption
WS_OVERLAPPEDWINDOW, // Style bits
10, 10, 450, 150, // Window position
(HWND)NULL, // Parent window (no parent)
(HMENU)NULL, // Menu
hInstanceSave,
NULL); // No params
Report(IsWindow(hwndDbWin));
if (!hwndDbWin)
return FALSE;
hwndDbWinEdit = CreateWindow(
szClassEdit,
NULL, // Caption
WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL |
ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE,
0, 0, 0, 0,
hwndDbWin,
NULL,
hInstanceSave,
NULL);
Report(IsWindow(hwndDbWinEdit));
if (!hwndDbWinEdit)
return FALSE;
// Get the font that is used for icon titles.
SideReport(SystemParametersInfo(
SPI_GETICONTITLELOGFONT, sizeof(lf), &lf, FALSE));
hfontDbWinEdit = CreateFontIndirect(&lf);
Report(hfontDbWinEdit);
if (hfontDbWinEdit)
LSendMessage(hwndDbWinEdit, WM_SETFONT, (WPARAM)hfontDbWinEdit, 0);
return TRUE;
} // FDbWinCreate
/////////////////////////////////////////////////////////////////////////////
BOOL FSaveBuffer(HWND hwnd)
{
OPENFILENAME ofn = { 0 };
TCHAR szFileName[256];
ofn.lStructSize = sizeof(OPENFILENAME);
ofn.hwndOwner = hwnd;
ofn.hInstance = hInstanceSave;
ofn.lpstrFilter = _W"Text Files (*.txt)\0*.txt\0All Files (*.*)\0*.*\0";
ofn.nFilterIndex = 1;
ofn.lpstrFile = szFileName;
ofn.nMaxFile = LENGTH(szFileName);
ofn.Flags = OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_PATHMUSTEXIST;
ofn.lpstrDefExt = _W"txt";
szFileName[0] = 0;
if (GetSaveFileName(&ofn))
{
HANDLE hfile;
DWORD dwNumberOfBytesWritten;
hfile = CreateFile(
szFileName,
GENERIC_WRITE,
0, // No Sharing
NULL, // Security attributes
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
NULL);
Report(hfile);
Report(hwndDbWinEdit);
if (!hfile)
return FALSE;
int cLine = LSendMessage(hwndDbWinEdit, EM_GETLINECOUNT, 0, 0);
UINT cchBuffer;
TCHAR szBuffer[256];
for (int i = 0; i < cLine; i++)
{
*(WORD *)szBuffer = LENGTH(szBuffer) - 2;
cchBuffer = LSendMessage(hwndDbWinEdit, EM_GETLINE, i, (LPARAM)szBuffer);
szBuffer[cchBuffer++] = _W'\n';
SideReport(WriteFile(hfile, szBuffer, cchBuffer, &dwNumberOfBytesWritten, NULL));
Report(dwNumberOfBytesWritten == cchBuffer);
}
CloseHandle(hfile);
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////
LRESULT CALLBACK WndProcDbWin(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
Assert(hwndDbWin == hwnd || hwndDbWin == NULL);
switch (uMsg)
{
case WM_SYSCOMMAND:
if (wParam == SC_CLOSE)
{
ShowWindow(hwnd, SW_HIDE);
return 0;
}
break;
case WM_COMMAND:
Assert(hwnd == hwndDbWin);
switch (LOWORD(wParam))
{
case IDM_DBWIN_FILE_SAVEBUFFERAS:
FSaveBuffer(hwnd);
break;
case IDM_DBWIN_FILE_EXIT:
case IDM_DBWIN_OPTIONS_HIDEWINDOW:
ShowWindow(hwndDbWin, SW_HIDE);
break;
case IDM_DBWIN_EDIT_COPY:
PostMessage(hwndDbWinEdit, WM_COPY, 0, 0);
break;
case IDM_DBWIN_EDIT_CLEARBUFFER:
LSendMessage(hwndDbWinEdit, EM_SETSEL, 0, -1); // Select all the text
LSendMessage(hwndDbWinEdit, EM_REPLACESEL, 0, (LPARAM)szNull); // Replace it by an empty string
break;
case IDM_DBWIN_EDIT_SELECTALL:
LSendMessage(hwndDbWinEdit, EM_SETSEL, 0, -1); // Select all the text
break;
case IDM_DBWIN_OPTIONS_SETTRACEFLAGS:
PostMessage(hwndMain, WM_COMMAND, IDM_DEBUG_SETTRACEFLAGS, 0);
break;
case IDM_DBWIN_OPTIONS_SAVEDEBUGSETTINGS:
PostMessage(hwndMain, WM_COMMAND, IDM_DEBUG_SAVEDEBUGSETTINGS, 0);
break;
case IDM_DBWIN_OPTIONS_NOMESSAGES:
fSendSzToDbWinEdit = !fSendSzToDbWinEdit;
break;
case IDM_DBWIN_OPTIONS_SENDMESSAGETODEBUGGER:
fSendSzToDebugger = !fSendSzToDebugger;
break;
case IDM_DBWIN_OPTIONS_SAVETOCLIPBOARDONEXIT:
dbwinreginfo.fSaveToClipboard = !dbwinreginfo.fSaveToClipboard;
break;
case IDM_DBWIN_OPTIOINS_ALWAYSONTOP:
dbwinreginfo.fTopMost = !dbwinreginfo.fTopMost;
SetWindowPos(hwnd, (dbwinreginfo.fTopMost ? HWND_TOPMOST : HWND_NOTOPMOST),
0, 0, 0, 0, SWP_NOACTIVATE | SWP_NOSIZE | SWP_NOMOVE);
break;
} // swtich
return 0; // WM_COMMAND
case WM_INITMENU:
Assert((HMENU)wParam == GetMenu(hwnd));
CheckMenuItem((HMENU)wParam, IDM_DBWIN_OPTIOINS_ALWAYSONTOP,
(dbwinreginfo.fTopMost ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem((HMENU)wParam, IDM_DBWIN_OPTIONS_SAVETOCLIPBOARDONEXIT,
(dbwinreginfo.fSaveToClipboard ? MF_CHECKED : MF_UNCHECKED));
CheckMenuItem((HMENU)wParam, IDM_DBWIN_OPTIONS_NOMESSAGES,
(fSendSzToDbWinEdit ? MF_UNCHECKED : MF_CHECKED));
CheckMenuItem((HMENU)wParam, IDM_DBWIN_OPTIONS_SENDMESSAGETODEBUGGER,
(fSendSzToDebugger ? MF_CHECKED : MF_UNCHECKED));
return 0;
case WM_MENUSELECT:
if (((HMENU)lParam == NULL) && (HIWORD(wParam) == 0xFFFF))
StatusBar.SetText(IDS_READY);
else if (LOWORD(wParam) >= 100 && LOWORD(wParam) <= 1000)
StatusBar.SetText(LOWORD(wParam));
else
StatusBar.SetText(szNull);
return 0;
case WM_SIZE:
Report(IsWindow(hwndDbWinEdit));
if (hwndDbWinEdit)
{
RECT rc;
GetClientRect(hwnd, &rc);
MoveWindow(hwndDbWinEdit, rc.top, rc.left, rc.right - rc.left, rc.bottom - rc.top, TRUE);
}
break;
case WM_ACTIVATE:
if (LOWORD(wParam))
SetFocus(hwndDbWinEdit);
return 0;
case WM_DESTROY:
Assert(IsWindow(hwndDbWin));
if (dbwinreginfo.fSaveToClipboard)
{
LSendMessage(hwndDbWinEdit, EM_SETSEL, 0, -1); // Select all the text
LSendMessage(hwndDbWinEdit, WM_COPY, 0, 0); // Copy it onto the clipboard
}
if (hfontDbWinEdit)
SideAssert(DeleteObject(hfontDbWinEdit));
hfontDbWinEdit = NULL;
Assert(hwnd == hwndDbWin);
hwndDbWin = NULL;
return 0;
default:
break;
} // switch
return DefWindowProc(hwnd, uMsg, wParam, lParam);
} // WndProcDbWin
#endif // DBWIN