home *** CD-ROM | disk | FTP | other *** search
- PROGRAM DrWalker;
-
- {$R DrWalker}
- {$D Dr. Walker v0.45, (c)1993 by Reebear}
-
- {$IFNDEF VER70}
- USES WinTypes, WinProcs, WinDos, WObjects, ToolHelp, Strings;
- {$ELSE}
- USES WinTypes, WinProcs, WinDos, Objects, ODialogs, OWindows, ToolHelp, Strings;
- {$ENDIF}
-
- CONST
- Titel : pChar = 'Address Size Flags Type ';
- id_Box = 201;
- id_Static = 202;
- id_ScrollBar = 203;
- cm_ShowCount = 101;
- id_ShowList = 102;
- cm_About = 105;
- XSize = 320;
- YSize = 400;
-
- TYPE
- TBlockEntry = ARRAY [0..8] OF CHAR;
- TResEntry = ARRAY [0..15] OF CHAR;
- TMaxEntry = ARRAY [0..18] OF CHAR;
- TGlobalData = RECORD
- dwAddress: LONGINT;
- dwBlockSize: LONGINT;
- hBlock: tHandle;
- hOwner: tHandle;
- wType: WORD;
- wData: WORD;
- END;
- TLocalData = RECORD
- wAddress: WORD;
- wSize: WORD;
- lFlags: LONGINT;
- lType: LONGINT;
- END;
- TGDIObjCount = ARRAY [0..10] OF WORD;
-
- CONST
- MemObjFlags: ARRAY [1..4] OF TBlockEntry =
- ( 'Fixed', 'Free', 'Unknown', 'Moveable' );
-
- GDITypes: ARRAY [0..10] OF TMaxEntry =
- ( 'Normal', 'Pen', 'Brush', 'Font', 'Palette', 'Bitmap', 'Region', 'DC',
- 'Disabled DC', 'Meta DC', 'Metafile'
- );
-
- TYPE
- PGDICollection = ^TGDICollection;
- TGDICollection = OBJECT (TStrCollection)
- FUNCTION KeyOf (Item: POINTER): POINTER; VIRTUAL;
- PROCEDURE ChangeSelect (ChangeTo: WORD);
- END;
-
- TListXferRec = RECORD
- ListStrings: PGDICollection;
- ListSelect: INTEGER;
- END;
-
- TShowXferRec = RECORD
- List: PStrCollection;
- ListSelect: INTEGER;
- END;
-
- PGDIHeapWindow = ^TGDIHeapWindow;
- TGDIHeapWindow = OBJECT (tWindow)
- AListBox: pListBox;
- AStatic: pStatic;
- Xfer: TListXferRec;
- TheFont: hFont;
- PROCEDURE WalkOnTheWildSide;
- CONSTRUCTOR Init (aTitle: pChar);
- PROCEDURE SetupWindow; VIRTUAL;
- PROCEDURE GetWindowClass (VAR aWndClass: tWndClass); VIRTUAL;
- PROCEDURE WMGetMinMaxInfo (VAR Msg: tMessage); VIRTUAL wm_First +
- wm_GetMinMaxInfo;
- PROCEDURE WMCtlColor (VAR Msg: tMessage); VIRTUAL wm_First + wm_CtlColor;
- PROCEDURE WMSize (VAR Msg: tMessage); VIRTUAL wm_First + wm_Size;
- PROCEDURE ShowCount (VAR Msg: tMessage); VIRTUAL cm_First + cm_ShowCount;
- PROCEDURE CMAbout (VAR Msg: tMessage); VIRTUAL cm_First + cm_About;
- END;
-
- PShowCountDialog = ^TShowCountDialog;
- TShowCountDialog = OBJECT (tDialog)
- XferRec: TShowXferRec;
- ShowList: pListBox;
- CONSTRUCTOR Init (aParent: pWindowsObject; aTitle: pChar);
- PROCEDURE SetupWindow; VIRTUAL;
- END;
-
- tMyApplication = OBJECT (tApplication)
- PROCEDURE InitMainWindow; VIRTUAL;
- END;
-
- VAR
- BlockHandle: tHandle;
- OldGDIObjCount, GDIObjCount: TGDIObjCount;
-
- (* ====================================================== *)
-
- PROCEDURE GlobalHeapWalk (Print: BOOLEAN);
- VAR
- GlobalEntry: PGlobalEntry;
- ModuleEntry: PModuleEntry;
- TaskEntry: PTaskEntry;
- GlobalData: TGlobalData;
- Buffer: ARRAY [0..79] OF CHAR;
- Result: Bool;
- BEGIN
- New (GlobalEntry);
- GlobalEntry^.dwSize := SizeOf (TGlobalEntry);
- Result := GlobalFirst (GlobalEntry, global_All);
-
- WHILE Result DO
- BEGIN
- GlobalData.dwAddress := GlobalEntry^.dwAddress;
- GlobalData.dwBlockSize := GlobalEntry^.dwBlockSize;
- GlobalData.hBlock := GlobalEntry^.hBlock;
- GlobalData.hOwner := GlobalEntry^.hOwner;
- GlobalData.wType := GlobalEntry^.wType;
- GlobalData.wData := GlobalEntry^.wData;
-
- New(ModuleEntry);
- ModuleEntry^.dwSize := SizeOf(TModuleEntry);
-
- IF ModuleFindHandle(ModuleEntry, GlobalData.hOwner) = 0 THEN
- BEGIN
- IF (GlobalData.hOwner = 0) THEN StrCopy (ModuleEntry^.szModule, 'FREE');
- New (TaskEntry);
- TaskEntry^.dwSize := SizeOf (TTaskEntry);
- IF TaskFindHandle (TaskEntry, GlobalData.hOwner)
- THEN StrCopy(ModuleEntry^.szModule, TaskEntry^.szModule)
- ELSE StrPCopy (ModuleEntry^.szModule, 'Don''t know much...');
- Dispose (TaskEntry);
- END;
-
- GlobalData.wType := GlobalEntry^.wType;
-
- IF (GlobalEntry^.wHeapPresent AND (GlobalEntry^.wType = gt_DGroup) AND
- (StrIComp(ModuleEntry^.szModule, 'GDI') = 0))
- THEN BlockHandle := GlobalEntry^.hBlock;
-
- Dispose (ModuleEntry);
- Result := GlobalNext (GlobalEntry, global_All);
- END;
- Dispose (GlobalEntry);
- END;
-
- FUNCTION TGDICollection.KeyOf (Item: POINTER): POINTER;
- VAR
- P: pChar;
- BEGIN
- P := TStrCollection.KeyOf (Item);
- Inc(P, 28);
- KeyOf := P;
- END;
-
- PROCEDURE TGDICollection.ChangeSelect (ChangeTo: WORD);
- BEGIN
- END;
-
- CONSTRUCTOR TShowCountDialog.Init (aParent: pWindowsObject; aTitle: pChar);
- VAR
- i: WORD;
- BEGIN
- tDialog.Init (aParent, aTitle);
- ShowList := New(pListBox, InitResource(@Self, id_ShowList));
- XferRec.List := New (PStrCollection, Init(10,2));
- TransferBuffer := @XferRec;
- END;
-
- PROCEDURE TShowCountDialog.SetupWindow;
- VAR
- Buffer: ARRAY [0..29] OF CHAR;
- i: WORD;
- Internal: RECORD
- lType: LONGINT;
- wCount: WORD;
- wChange: INTEGER;
- END;
- BEGIN
- tDialog.SetupWindow;
- FOR i := 0 TO 10 DO
- BEGIN
- Internal.lType := LONGINT(@GDITypes[i]);
- Internal.wCount := GDIObjCount[i];
- Internal.wChange := GDIObjCount[i] - OldGDIObjCount[i];
- wvSprintF (Buffer, '%-12s %4i %4i', Internal);
- XferRec.List^.Insert (StrNew (Buffer));
- ShowList^.Transfer (@XferRec, tf_SetData);
- END;
- END;
-
- (* ====================================================== *)
-
- CONSTRUCTOR TGDIHeapWindow.Init (aTitle: pChar);
- VAR
- i: WORD;
- BEGIN
- tWindow.Init (NIL, aTitle);
- Attr.w := XSize;
- Attr.h := YSize;
- Attr.Menu := LoadMenu (hInstance, 'DrWalker');
-
- AListBox := New (pListBox, Init (@Self, id_Box, 0, 16, XSize, YSize));
- AListBox^.Attr.Style := ((AListBox^.Attr.Style AND NOT ws_Border)
- OR lbs_NoIntegralHeight) AND NOT lbs_Sort;
- AStatic := New (pStatic, Init (@Self, id_Static, Titel, 0, 0, XSize, 15,
- StrLen(Titel)));
- AStatic^.Attr.Style := AStatic^.Attr.Style OR ss_LeftNoWordWrap;
- Xfer.ListStrings := New (PGDICollection, Init (200,20));
- Xfer.ListStrings^.Duplicates := TRUE;
- TransferBuffer := @Xfer;
- EnableKBHandler;
-
- FOR i := 0 TO 10 DO
- BEGIN
- GDIObjCount[i] := 0;
- OldGDIObjCount[i] := 0;
- END;
-
- END;
-
- PROCEDURE TGDIHeapWindow.WalkOnTheWildSide;
- VAR
- i: WORD;
- LouReed: PLocalEntry;
- Result: Bool;
- LocalData: TLocalData;
- Buffer: ARRAY [0..79] OF CHAR;
- BEGIN
- (* Fill StringCollection *)
- GlobalHeapWalk (FALSE);
-
- FOR i := 0 TO 10 DO
- GDIObjCount[i] := 0;
-
- (* BlockHandle is the handle of local heap *)
- New (LouReed);
- LouReed^.dwSize := SizeOf (TLocalEntry);
- Result := LocalFirst (LouReed, BlockHandle);
- WHILE Result DO BEGIN
- LocalData.wAddress := LouReed^.wAddress;
- LocalData.wSize := LouReed^.wSize;
- LocalData.lFlags := LONGINT(@MemObjFlags[LouReed^.wFlags]);
- IF (LouReed^.wType < 11)
- THEN BEGIN
- LocalData.lType := LONGINT(@GDITypes[LouReed^.wType]);
- Inc(GDIObjCount[LouReed^.wType]);
- END
- ELSE LocalData.lType := LONGINT(pChar('Free'));
- wvSprintF (Buffer, '%05X %4i %-9s %-9s', LocalData);
- Xfer.ListStrings^.Insert (StrNew (Buffer));
- Result := LocalNext (LouReed);
- END;
-
- Dispose (LouReed);
- END;
-
- PROCEDURE TGDIHeapWindow.SetupWindow;
- BEGIN
- tWindow.SetupWindow;
-
- TheFont := CreateFont (8, 0, 0, 0, 400, 0, 0, 0, ANSI_CharSet,
- out_Default_Precis, clip_Default_Precis,
- Default_Quality, 0, 'COURIER');
-
- SendMessage (AStatic^.hWindow, wm_SetFont, TheFont, 0);
- SendMessage (AListBox^.hWindow, wm_SetFont, TheFont, 0);
-
- WalkOnTheWildSide;
- AListBox^.Transfer (@Xfer, tf_SetData);
- END;
-
- PROCEDURE TGDIHeapWindow.GetWindowClass (VAR aWndClass: tWndClass);
- BEGIN
- tWindow.GetWindowClass (aWndClass);
- aWndClass.hIcon := LoadIcon (hInstance, 'DrWalker');
- END;
-
- PROCEDURE TGDIHeapWindow.WMGetMinMaxInfo (VAR Msg: tMessage);
- TYPE
- PInfo= ^TInfo;
- TInfo= ARRAY [0..4] OF tPoint;
- BEGIN
- PInfo(Msg.lParam)^[4].x := XSize;
- END;
-
- PROCEDURE TGDIHeapWindow.WMCtlColor (VAR Msg: tMessage);
- BEGIN
- DefWndProc (Msg);
- IF (Msg.lParamHi = ctlcolor_Static)
- THEN BEGIN
- SetTextColor (Msg.wParam, RGB(255, 0, 0));
- SetBkColor (Msg.wParam, RGB(200, 200, 200));
- END;
- END;
-
- PROCEDURE TGDIHeapWindow.WMSize (VAR Msg: tMessage);
- BEGIN
- tWindow.WMSize (Msg);
- MoveWindow (AListBox^.hWindow, 0, 16, Msg.lParamLo, Msg.lParamHi-16, TRUE);
- END;
-
- PROCEDURE TGDIHeapWindow.ShowCount (VAR Msg: tMessage);
- VAR
- Dialog: PShowCountDialog;
- BEGIN
- WalkOnTheWildSide;
- Dialog := New (PShowCountDialog, Init(@Self, MakeIntResource ('ShowCount')));
- Application^.ExecDialog (Dialog);
- OldGDIObjCount := GDIObjCount;
- END;
-
- PROCEDURE TGDIHeapWindow.CMAbout (VAR Msg: tMessage);
- VAR
- Dialog: pDialog;
- BEGIN
- Dialog := New (pDialog, Init(@Self, MakeIntResource ('About')));
- Application^.ExecDialog (Dialog);
- END;
-
- PROCEDURE tMyApplication.InitMainWindow;
- BEGIN
- MainWindow := New (PGDIHeapWindow, Init ('Dr. Walker'));
- END;
-
- VAR
- ListApp: tMyApplication;
- BWCCHandle: tHandle;
-
- BEGIN
- BWCCHandle := LoadLibrary ('BWCC.DLL');
- ListApp.Init ('Dr. Walker');
- ListApp.Run;
- ListApp.Done;
- FreeLibrary (BWCCHandle);
- END.
-