vmmap.dpr
来自「一本已经绝版的好书」· DPR 代码 · 共 261 行
DPR
261 行
// Module name: VMMap.C ->> VMMap.dpr
// Notices: Copyright (c) 1995-1997 Jeffrey Richter
// Translator: 刘麻子, Liu_mazi@126.com
program VMMap;
{$R 'VMMap.res' 'VMMap.rc'}
uses
Windows, Messages, VMQuery in 'VMQuery.pas',
Other in '..\Other.pas', CmnHdr in '..\CmnHdr.pas', WindowsX in '..\WindowsX.pas';
const
g_szModName = 'VMMap';
IDD_VMMAP = 1;
IDC_LISTBOX = 100;
IDI_VMMAP = 101;
{$Define CopyToClipBoard}
{$IfDef CopyToClipBoard}
// ListBox -> 剪贴板
procedure CopyControlToClipboard(hWnd: HWND);
var
nCount, nNum: Integer;
szClipData: array[0..20000] of Char;
szLine: array[0..1000] of Char;
hClipData: HGLOBAL;
lpClipData: LPTSTR;
fOk: BOOL;
begin
szClipData[0] := #0;
nCount := ListBox_GetCount(hWnd);
for nNum := 0 to nCount - 1 do
begin
ListBox_GetText(hWnd, nNum, szLine);
lstrcat(szClipData, szLine);
lstrcat(szClipData, #13#10);
end;
hClipData := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SizeOf(Char) * (lstrlen(szClipData) + 1));
lpClipData := GlobalLock(hClipData);
lstrcpy(lpClipData, szClipData);
OpenClipboard(0);
EmptyClipboard();
{$IfDef UniCode}
fOk := SetClipboardData(CF_UNICODETEXT, hClipData) = hClipData;
{$Else}
fOk := SetClipboardData(CF_TEXT, hClipData) = hClipData;
{$EndIf}
CloseClipboard();
if (fOk = FALSE) then
begin
GlobalFree(hClipData);
chMB('Error putting text on the clipboard', g_szModName, MB_OK or MB_ICONINFORMATION);
end;
end;
{$EndIf}
// 页面状态属性
function GetMemStorageText(dwStorage: DWORD): LPCTSTR;
begin
case (dwStorage) of
MEM_FREE:
Result := 'Free ';
MEM_RESERVE:
Result := 'Reserve';
MEM_IMAGE:
Result := 'Image ';
MEM_MAPPED:
Result := 'Mapped ';
MEM_PRIVATE:
Result := 'Private';
else
Result := 'Unknown';
end;
end;
// 页面保护属性
function GetProtectText(dwProtect: DWORD; const szBuf: LPTSTR; fShowFlags: BOOL): LPTSTR;
begin
case ( dwProtect and (not(PAGE_GUARD or PAGE_NOCACHE)) ) of
PAGE_READONLY:
Result := '-R--';
PAGE_READWRITE:
Result := '-RW-';
PAGE_WRITECOPY:
Result := '-RWC';
PAGE_EXECUTE:
Result := 'E---';
PAGE_EXECUTE_READ:
Result := 'ER--';
PAGE_EXECUTE_READWRITE:
Result := 'ERW-';
PAGE_EXECUTE_WRITECOPY:
Result := 'ERWC';
PAGE_NOACCESS:
Result := '----';
else
Result := 'Unknown';
end;
lstrcpy(szBuf, Result);
if (fShowFlags) then
begin
lstrcat(szBuf, ' ');
lstrcat(szBuf, IfThen(dwProtect and PAGE_GUARD <> 0, 'G', '-'));
lstrcat(szBuf, IfThen(dwProtect and PAGE_NOCACHE <> 0, 'N', '-'));
end;
Result := szBuf;
end;
// 区域信息 ->> szLine
procedure ConstructRgnInfoLine(var pVMQ: TVMQuery; const szLine: LPTSTR; nMaxLen: Integer);
var
nLen: Integer;
begin
_wvsprintf(szLine, '%08X %s %10u ',
[ DWORD(pVMQ.pvRgnBaseAddress), DWORD(GetMemStorageText(pVMQ.dwRgnStorage)), pVMQ.dwRgnSize ] );
if (pVMQ.dwRgnStorage <> MEM_FREE) then
begin
_wvsprintf(StrChr(szLine, #0), '%5u ', [ pVMQ.dwRgnBlocks ]);
GetProtectText(pVMQ.dwRgnProtection, StrChr(szLine, #0), FALSE);
end;
lstrcat(szLine, ' ');
nLen := lstrlen(szLine);
if (pVMQ.pvRgnBaseAddress <> nil) then GetModuleFileName(DWORD(pVMQ.pvRgnBaseAddress), szLine + nLen, nMaxLen - nLen);
if (DWORD(pVMQ.pvRgnBaseAddress) = GetProcessHeap()) then lstrcat(szLine, 'Default Process Heap');
if (pVMQ.fRgnIsAStack) then lstrcat(szLine, 'Thread Stack');
end;
// 块信息 ->> szLine
procedure ConstructBlkInfoLine(var pVMQ: TVMQuery; const szLine: LPTSTR; nMaxLen: Integer);
begin
_wvsprintf(szLine, ' %08X %s %10u ',
[ DWORD(pVMQ.pvBlkBaseAddress), DWORD(GetMemStorageText(pVMQ.dwBlkStorage)), pVMQ.dwBlkSize ]);
if (pVMQ.dwBlkStorage <> MEM_FREE) then GetProtectText(pVMQ.dwBlkProtection, StrChr(szLine, #0), TRUE);
end;
// WM_SIZE
procedure Dlg_OnSize(hWnd: HWND; state: UINT; cx, cy: Integer);
begin
SetWindowPos(GetDlgItem(hWnd, IDC_LISTBOX), 0, 0, 0, cx, cy, SWP_NOZORDER);
end;
// WM_INITDIALOG
function Dlg_OnInitDialog(hWnd, hWndFocus: HWND; lParam: LPARAM): BOOL;
var
hWndLB: DWORD; // HWND
pvAddress: Pointer;
szLine: array[0..200] of Char;
rc: TRect;
dwBlock: DWORD;
VMQ: TVMQuery;
begin
chSETDLGICONS(hWnd, IDI_VMMAP, IDI_VMMAP);
hWndLB := GetDlgItem(hWnd, IDC_LISTBOX);
ListBox_SetHorizontalExtent(hWndLB, 150 * LOWORD(GetDialogBaseUnits()));
GetClientRect(hWnd, rc);
SetWindowPos(hWndLB, 0, 0, 0, rc.Right, rc.Bottom, SWP_NOZORDER);
pvAddress := nil;
Result := TRUE;
while (Result) do
begin
Result := VM_Query(pvAddress, VMQ);
if (Result) then
begin
ConstructRgnInfoLine(VMQ, szLine, SizeOf(szLine));
ListBox_AddString(hWndLB, szLine);
{$IfNDef NoExpandRegions}
dwBlock := 0;
while (Result) and (dwBlock < VMQ.dwRgnBlocks) do
begin
ConstructBlkInfoLine(VMQ, szLine, SizeOf(szLine));
ListBox_AddString(hWndLB, szLine);
Inc(dwBlock);
if (dwBlock < VMQ.dwRgnBlocks) then
begin
Inc(PByte(pvAddress), VMQ.dwBlkSize);
Result := VM_Query(pvAddress, VMQ);
end;
end;
{$EndIf}
pvAddress := Pointer(DWORD(VMQ.pvRgnBaseAddress) + VMQ.dwRgnSize);
end;
end;
{$IfDef CopyToClipBoard}
CopyControlToClipboard(hWndLB);
{$EndIf}
Result := TRUE;
end;
// WM_COMMAND
procedure Dlg_OnCommand(hWnd: HWND; id: Integer; hWndCtl: HWND; codeNotify: UINT);
begin
if (id = IDCANCEL) then EndDialog(hWnd, id);
end;
// 对话框回调
function Dlg_Proc(hWnd: HWND; uMsg: UINT; wParam: WPARAM; lParam: LPARAM): BOOL; stdcall;
begin
case (uMsg) of
WM_INITDIALOG:
begin
Result := SetDlgMsgResult(hWnd, LRESULT(Dlg_OnInitDialog(hWnd, wParam, lParam)));
end;
WM_COMMAND:
begin
Dlg_OnCommand(hWnd, LOWORD(wParam), lParam, HIWORD(wParam));
Result := TRUE;
end;
WM_SIZE:
begin
Dlg_OnSize(hWnd, wParam, LOWORD(lParam), HIWORD(lParam));
Result := TRUE;
end;
else
Result := FALSE;
end;
end;
// 程序入口
begin
chWARNIFUNICODEUNDERWIN95();
DialogBox(HInstance, MakeIntResource(IDD_VMMAP), 0, @Dlg_Proc);
end.
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?