📄 hwlocal.c
字号:
info->valid_sel = TRUE;
} else {
info->valid_sel = FALSE;
}
if( top >= LocalHeapCount ) top = 0;
info->top = *LocalHeapList[top];
return( TRUE );
}
/*
* ReDisplayLocalHeapList - dump heap list into list box
*/
static void ReDisplayLocalHeapList( HWND boxhwnd, LocalStateStruct *info ) {
unsigned i;
WORD addr;
if( info == NULL ) {
SendMessage( boxhwnd, LB_SETTOPINDEX, 0, 0 );
SendMessage( boxhwnd, LB_SETCURSEL, -1, 0 );
}
SetBoxCnt( boxhwnd, LocalHeapCount );
if( info != NULL ) {
addr = info->top.wAddress;
for( i=0; i < LocalHeapCount; i++ ) {
if( LocalHeapList[i]->wAddress == addr ) {
SendMessage( boxhwnd, LB_SETTOPINDEX, i, 0 );
}
}
}
}
/*
* InitLocalHeapList - create a local heap list
*/
static BOOL InitLocalHeapList( HWND hwnd, HWND listhdl, BOOL keeppos )
{
LOCALINFO info;
LOCALENTRY item;
LocalStateStruct state;
unsigned size;
unsigned lim;
BOOL ret;
/* get number of elements */
info.dwSize = sizeof( LOCALINFO );
info.wcItems = 0;
if( keeppos ) {
SaveLocalListState( listhdl, &state );
}
FreeLocalList();
for( ;; ) {
if( LocalInfo( &info, LocalHeapHandle ) == 0 ) break;
lim = info.wcItems;
size = lim * sizeof( LOCALENTRY * );
LocalHeapList = MemAlloc( size );
if( LocalHeapList == NULL ) break;
memset( &item, 0, sizeof( LOCALENTRY ) );
item.dwSize = sizeof( LOCALENTRY );
LocalHeapCount = 0;
if( LocalFirst( &item, LocalHeapHandle ) == 0 ) break;
for( ;; ) {
ret = AddToLocalHeapList( &item, LocalHeapCount );
if( ret == FALSE ) break;
LocalHeapCount ++;
if( LocalHeapCount == lim ) break;
if( LocalNext( &item ) == 0 ) break;
}
if( ret == FALSE ) break;
SortLocalHeapList( hwnd, LSortType );
ReDisplayLocalHeapList( listhdl, keeppos ? &state:NULL );
return( TRUE );
}
ErrorBox( NULL, STR_UNABLE_DISP_LCL_HEAP, MB_OK | MB_ICONINFORMATION );
return( FALSE );
} /* InitLocalHeapList */
/*
* CreateLocalPushWin - create the push windows for the local heap window
*/
static HWND *CreateLocalPushWin( HWND hwnd ) {
HWND *ret;
ret = MakePushWin( hwnd, HeapLocalTitles, 6,
HEAPMENU_SORT_ADDR, HEAPMENU_SORT_HANDLE,
HEAPMENU_SORT_SIZE, 0, 0, HEAPMENU_SORT_TYPE );
return( ret );
}
/*
* LocalHeapProc - process messages from the local heap window
*/
BOOL __export FAR PASCAL LocalHeapProc( HWND hwnd, WORD msg, WORD wparam,
DWORD lparam ) {
LclWndInfo *info;
LocalStateStruct state;
info = (LclWndInfo *)GetWindowLong( hwnd, 0 );
switch( msg ) {
case WM_CREATE:
info = MemAlloc( sizeof( LclWndInfo ) );
if( info == NULL ) {
ErrorBox( NULL, STR_LCL_HEAP_NO_MEM, MB_OK | MB_ICONINFORMATION );
}
memset( info, 0, sizeof( LclWndInfo ) );
SetWindowLong( hwnd, 0, (DWORD)info );
EnableLocalMenu( FALSE );
info->list.title = CreateLocalPushWin( hwnd );
CreateListBox( hwnd, &(info->list), LOCAL_LB );
// SetTitle( HeapLocalTitles, info->list.title );
if( !InitLocalHeapList( hwnd, info->list.box, FALSE ) ) {
DestroyWindow( hwnd );
}
break;
case WM_ACTIVATEAPP:
if( wparam ) {
if( !InitLocalHeapList( hwnd, info->list.box, TRUE ) ) {
DestroyWindow( hwnd );
} else {
SaveLocalListState( info->list.box, &state );
ReDisplayLocalHeapList( info->list.box, &state );
}
}
break;
case WM_SHOWWINDOW:
if( IsWindow( info->dialog ) ) {
if( !wparam && LOWORD( lparam ) == SW_PARENTCLOSING ) {
ShowWindow( info->dialog, SW_HIDE );
} else if( wparam && LOWORD( lparam ) == SW_PARENTOPENING ) {
ShowWindow( info->dialog, SW_SHOWNOACTIVATE );
}
}
return( DefWindowProc( hwnd, msg, wparam, lparam ) );
case WM_SIZE:
ResizeListBox( LOWORD( lparam ), HIWORD( lparam ), &( info->list ) );
return( DefWindowProc( hwnd, msg, wparam, lparam ) );
break;
case WM_COMMAND:
switch( wparam ) {
case HEAPMENU_GLOBAL_REFRESH:
if( !InitLocalHeapList( hwnd, info->list.box, TRUE ) ) {
DestroyWindow( hwnd );
} else {
SaveLocalListState( info->list.box, &state );
ReDisplayLocalHeapList( info->list.box, &state );
}
break;
case HEAPMENU_SORT_ADDR:
case HEAPMENU_SORT_SIZE:
case HEAPMENU_SORT_TYPE:
case HEAPMENU_SORT_HANDLE:
SortLocalHeapList( hwnd, wparam );
ReDisplayLocalHeapList( info->list.box, NULL );
break;
case HEAPMENU_FILE_SAVE:
SaveListBox( SLB_SAVE_TMP, PutOutLocalHeader, Config.lfname,
HeapWalkName, hwnd, info->list.box );
break;
case HEAPMENU_FILE_SAVE_TO:
SaveListBox( SLB_SAVE_AS, PutOutLocalHeader, Config.lfname,
HeapWalkName, hwnd, info->list.box );
break;
case HEAPMENU_GLOBAL_MEMORYINFO:
info->dialog = DisplayLocalHeapInfo( hwnd );
break;
case HEAPMENU_EXIT:
DestroyWindow( hwnd );
break;
}
break;
case WM_DESTROY:
KillPushWin( info->list.title );
EnableLocalMenu( TRUE );
MemFree( info );
FreeLocalList();
break;
case WM_NCDESTROY:
SendMessage( HeapWalkMainWindow, WM_USER, 0, 0 );
LocalHeapHwnd = NULL;
return( DefWindowProc( hwnd, msg, wparam, lparam ) );
break;
default:
return( DefWindowProc( hwnd, msg, wparam, lparam ) );
}
return( TRUE );
}
void ResetLocalFont() {
LclWndInfo *info;
if( LocalHeapHwnd != NULL ) {
info = (LclWndInfo *)GetWindowLong( LocalHeapHwnd, 0 );
KillPushWin( info->list.title );
info->list.title = CreateLocalPushWin( LocalHeapHwnd );
PositionListBox( &info->list, LocalHeapHwnd );
SetBoxFont( info->list.box, GetMonoFont() );
}
}
/*
* LocalWalk - begin a walk of the local heap
*/
void LocalWalk( heap_list *item ) {
char title[30];
int width;
int hight;
LocalHeapHandle = item->info.ge.hBlock;
width = GetSystemMetrics( SM_CXSCREEN );
hight = GetSystemMetrics( SM_CYSCREEN );
strcpy( Owner, item->szModule );
RCsprintf( title, STR_LCL_WIN_TITLE, Owner );
LocalHeapHwnd = CreateWindow(
LOCAL_DISPLAY_CLASS, /* Window class name */
title, /* Window caption */
WS_OVERLAPPED|WS_CAPTION
|WS_SYSMENU|WS_THICKFRAME
|WS_MAXIMIZEBOX, /* Window style */
width/8, /* Initial X position */
hight/3, /* Initial Y position */
3*width/4, /* Initial X size */
hight/3, /* Initial Y size */
HeapWalkMainWindow, /* Parent window handle */
NULL, /* Window menu handle */
Instance, /* Program instance handle */
NULL); /* Create parameters */
if( LocalHeapHwnd == NULL ) {
RCMessageBox( NULL, STR_CANT_OPEN_LCL_WIN, HeapWalkName,
MB_OK | MB_TASKMODAL | MB_ICONINFORMATION );
}
ShowWindow( LocalHeapHwnd, SW_SHOWNORMAL );
UpdateWindow( LocalHeapHwnd );
} /* LocalWalk */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -