home *** CD-ROM | disk | FTP | other *** search
- {$A-,B-,D+,F-,G-,I+,L+,N-,R-,S+,V+,W+,X+}
- {$M 8192,8192}
- PROGRAM Check;
-
- USES WinTypes, WinProcs, ToolHelp, WinCrt, Strings;
-
- 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;
- szFlags: TBlockEntry;
- szType: TMaxEntry;
- szHeapType: TBlockEntry;
- END;
-
- CONST
- BlockTypes : ARRAY [0..10] OF TBlockEntry =
- (
- 'Private', 'DGroup', 'Data', 'Code', 'Task', 'Resource',
- 'Module', 'Free', 'Internal', 'Sentinel', 'BMaster'
- );
-
- ResTypes: ARRAY [0..15] OF TResEntry =
- ( 'UserDefined', 'CursorComponent', 'Bitmap', 'IconComponent',
- 'Menu', 'Dialog', 'String', 'FontDir', 'Font', 'Accelerators',
- 'RCData', 'ErrTable', 'Cursor', 'Icon', 'NameTable', 'Max_Resource'
- );
-
- MemObjFlags: ARRAY [1..4] OF TBlockEntry =
- ( 'Fixed', 'Free', 'Unknown', 'Moveable' );
-
- HeapTypes: ARRAY [0..2] OF TBlockEntry =
- ( 'Normal', 'User', 'GDI' );
-
- LocalTypes: ARRAY [0..36] OF TMaxEntry =
- ( 'Free', 'Bitmap', 'Brush', 'DC', 'Disabled DC', 'Font', 'Max', 'MetaDC',
- 'Metafile', 'Palette', 'Pen', 'Region', 'Normal', 'Atoms', 'BWL',
- 'ComboBox', 'CheckPoint', 'Class', 'Clip', 'DCE', 'Edit', 'HandleTable',
- 'HookList', 'HotkeyList', 'ListBox', 'LockInputState', 'Menu', 'Misc',
- 'MWP', 'OwnerDraw', 'User_Palette', 'PopupMenu', 'Property', 'SPB',
- 'String', 'UserSeeUserDoAlloc', 'Window'
- );
-
- CONST
- cm_Test = 101;
- cm_Exit = 102;
-
- VAR
- Window: hWND;
- PrevWinProc: tFarProc;
- Menu: hMenu;
- BlockHandle: tHandle;
-
- FUNCTION NewWndProc (Window: hWND; Message, wParam: WORD;
- lParam: LONGINT): LONGINT; EXPORT;
- BEGIN
- IF (Message = wm_Command) THEN
- BEGIN
- CASE wParam OF
- cm_Test: BEGIN
- MessageBox(Window, 'Hallo', 'Hallo', mb_OK);
- NewWndProc := 0;
- END;
- cm_Exit: DoneWinCrt;
- ELSE NewWndProc := CallWindowProc (PrevWinProc, Window, Message, wParam, lParam);
- END;
- END ELSE NewWndProc := CallWindowProc (PrevWinProc, Window, Message, wParam, lParam);
- END;
-
- PROCEDURE GlobalHeapWalk (Print: BOOLEAN);
- VAR
- GlobalEntry: PGlobalEntry;
- ModuleEntry: PModuleEntry;
- TaskEntry: PTaskEntry;
- GlobalData: TGlobalData;
- Buffer: ARRAY [0..79] OF CHAR;
- Result: Bool;
- i: WORD;
- BEGIN
- New (GlobalEntry);
- GlobalEntry^.dwSize := SizeOf (TGlobalEntry);
- Result := GlobalFirst (GlobalEntry, global_All);
-
- i := 1;
- 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;
-
- wvSprintF (Buffer, 'Addr=%08lX Size=%08lX Hndl=%04X Ownr=%04X',GlobalData);
- IF Print THEN BEGIN
- Write (Buffer, ' Type=',BlockTypes[GlobalData.wType], ' ', ModuleEntry^.szModule);
- IF (GlobalData.wType = gt_Resource)
- THEN WriteLn (ResTypes[GlobalData.wData])
- ELSE WriteLn;
- IF (i MOD 20) = 0 THEN ReadLn;
- END;
- Dispose (ModuleEntry);
- Result := GlobalNext (GlobalEntry, global_All);
- Inc(i);
- END;
- Dispose (GlobalEntry);
- END;
-
- PROCEDURE TaskListWalk;
- TYPE
- TTaskData = RECORD
- wTask: WORD;
- wInst: WORD;
- wModule: WORD;
- lModule: LONGINT;
- END;
- VAR
- TaskEntry: PTaskEntry;
- TaskData: TTaskData;
- Result: Bool;
- Buffer: ARRAY [0..79] OF CHAR;
- i: WORD;
- BEGIN
- New (TaskEntry);
- TaskEntry^.dwSize := SizeOf (TTaskEntry);
- Result := TaskFirst (TaskEntry);
- i := 1;
- WHILE Result DO
- BEGIN
- TaskData.wTask := TaskEntry^.hTask;
- TaskData.wInst := TaskEntry^.hInst;
- TaskData.wModule := TaskEntry^.hModule;
- TaskData.lModule := LONGINT(@TaskEntry^.szModule);
- wvSprintF (Buffer, 'Task %04X Inst %04X Module %04X Module %-9s ', TaskData);
- WriteLn (Buffer);
- IF (i MOD 20 = 0) THEN ReadLn;
- Inc(i);
- Result := TaskNext (TaskEntry);
- END;
-
- Dispose (TaskEntry);
- END;
-
- PROCEDURE ModuleListWalk;
- VAR
- Buffer: ARRAY [0..79] OF CHAR;
- SModuleEntry: PModuleEntry;
- Result: Bool;
- i: WORD;
- DataRec: RECORD
- lModule: LONGINT;
- wUsage: WORD;
- wHandle: WORD;
- END;
- BEGIN
- New (SModuleEntry);
- SModuleEntry^.dwSize := SizeOf (TModuleEntry);
- Result := ModuleFirst (SModuleEntry);
- i := 1;
- WHILE Result DO
- BEGIN
- DataRec.lModule := LONGINT(@SModuleEntry^.szModule);
- DataRec.wUsage := SModuleEntry^.wUsageFlags;
- DataRec.wHandle := SModuleEntry^.hModule;
- wvSprintF (Buffer,'Module: %9s Usage count: %04i Handle: %04X', DataRec);
- WriteLn (Buffer);
- Result := ModuleNext (SModuleEntry);
- IF (i MOD 20) = 0 THEN ReadLn;
- Inc(i);
- END;
- Dispose (SModuleEntry);
- END;
-
- PROCEDURE GDIHeapWalk;
- VAR
- ALocal: PLocalEntry;
- Result: Bool;
- LocalData: TLocalData;
- Buffer: ARRAY [0..79] OF CHAR;
- i: WORD;
- BEGIN
- (* BlockHandle is the handle of local heap *)
- New (ALocal);
- ALocal^.dwSize := SizeOf (TLocalEntry);
- Result := LocalFirst (ALocal, BlockHandle);
- i := 1;
- WHILE Result DO BEGIN
- LocalData.wAddress := ALocal^.wAddress;
- LocalData.wSize := ALocal^.wSize;
- LocalData.szFlags := MemObjFlags[ALocal^.wFlags];
- LocalData.szType := LocalTypes[ALocal^.wType];
- LocalData.szHeapType := HeapTypes[ALocal^.wHeapType];
- wvSprintF (Buffer, 'A=%04X Size=%03i ', LocalData);
- WriteLn (Buffer,'Flags= ',ALocal^.wFlags:2,LocalData.szFlags:9, ' Content= ',LocalData.szType);
- Result := LocalNext (ALocal);
- IF (i MOD 20) = 0 THEN ReadLn;
- Inc(i);
- END;
- Dispose (ALocal);
- END;
-
- BEGIN
- InitWinCrt;
- Window := GetActiveWindow;
- Menu := LoadMenu (hInstance, 'Menu_1');
- SetMenu (Window, Menu);
- PrevWinProc := tFarProc(GetWindowLong(Window, gwl_WndProc));
- SetWindowLong (Window, gwl_WndProc, LONGINT(@NewWndProc));
-
- TaskListWalk;
- ReadLn;
-
- GlobalHeapWalk (TRUE);
- ReadLn;
- GDIHeapWalk;
- WriteLn ('Back from the walk');
- ReadLn;
- DoneWinCrt;
-
- GlobalHeapWalk (TRUE);
- ReadLn;
-
- ModuleListWalk;
-
- ReadLn;
- PostQuitMessage(0);
- END.
-