windows-nt/Source/XPSP1/NT/base/mvdm/wow16/ddeml/heapwach.c
2020-09-26 16:20:57 +08:00

109 lines
2.2 KiB
C

#include "ddemlp.h"
#include "heapwach.h"
#ifdef WATCHHEAPS
extern char FAR SZHEAPWATCHCLASS[];
#define MAX_WINDOWS 20
typedef struct {
WORD sel;
HWND hwnd;
} SELWND;
char szT[30];
SELWND sw[MAX_WINDOWS];
int cHwnds = 0;
VOID LogAlloc(
DWORD lpstr,
WORD cb,
DWORD color,
HANDLE hInstance)
{
int i;
HWND hwnd;
WORD sel;
WORD off;
int mj, mn, cl;
HDC hdc;
RECT rc, rcClient;
HBRUSH hbr;
sel = HIWORD(lpstr);
hwnd = NULL;
for (i = 0; i < cHwnds; i++) {
if (sel == sw[i].sel) {
hwnd = sw[i].hwnd;
if (!IsWindow(hwnd)) {
// this must have been destroyed and we are now reusing the sel.
sw[i] = sw[--cHwnds];
hwnd = NULL;
}
break;
}
}
if (!hwnd && cHwnds < MAX_WINDOWS) {
itoa((int)sel, szT, 16);
sw[cHwnds].sel = sel;
sw[cHwnds].hwnd = hwnd = CreateWindow(SZHEAPWATCHCLASS, szT,
WS_POPUP | WS_CAPTION, CW_USEDEFAULT, CW_USEDEFAULT, 64, 64,
NULL, NULL, hInstance, NULL);
if (hwnd) {
cHwnds++;
GetWindowRect(hwnd, &rc);
GetClientRect(hwnd, &rcClient);
rc.bottom += 128 - (rcClient.bottom - rcClient.top);
rc.right += 128 - (rcClient.right - rcClient.left);
MoveWindow(hwnd, 0, 0, rc.right - rc.left, rc.bottom - rc.top, FALSE);
ShowWindow(hwnd, SW_SHOWNORMAL);
}
}
if (!hwnd) {
return;
}
off = LOWORD(lpstr) >> 2;
mj = off >> 7;
mn = off & 0x7f;
cl = cb >> 2;
hdc = GetDC(hwnd);
hbr = CreateSolidBrush(color);
rc.top = mj;
rc.bottom = rc.top + 1;
rc.left = (int)mn;
rc.right = min(127, mn + cl);
FillRect(hdc, &rc, hbr);
cl -= (int)(rc.right - rc.left);
if (cl > 127) {
rc.top++;
rc.bottom = rc.top + cl / 128;
rc.left = 0;
rc.right = 127;
FillRect(hdc, &rc, hbr);
cl -= 128 * (cl / 128);
}
if (cl > 0) {
rc.top = rc.bottom;
rc.bottom++;
rc.left = 0;
rc.right = cl;
FillRect(hdc, &rc, hbr);
}
DeleteObject(hbr);
ReleaseDC(hwnd, hdc);
}
VOID CloseHeapWatch()
{
int i;
for (i = 0; i < cHwnds; i++) {
DestroyWindow(sw[i].hwnd);
}
cHwnds = 0;
}
#endif