139 lines
3.2 KiB
C
139 lines
3.2 KiB
C
/**************************************************************************
|
|
* LOCAL.C
|
|
*
|
|
* Routines used to walk local heaps
|
|
*
|
|
**************************************************************************/
|
|
|
|
#include "toolpriv.h"
|
|
|
|
/* ----- Function prototypes ----- */
|
|
|
|
NOEXPORT void NEAR PASCAL ComputeType(
|
|
LOCALENTRY FAR *lpLocal);
|
|
|
|
/* LocalInfo
|
|
* Reports information about the state of the indicated heap
|
|
*/
|
|
|
|
BOOL TOOLHELPAPI LocalInfo(
|
|
LOCALINFO FAR *lpLocalInfo,
|
|
HANDLE hHeap)
|
|
{
|
|
/* Check the version number and verify proper installation */
|
|
if (!wLibInstalled || !lpLocalInfo ||
|
|
lpLocalInfo->dwSize != sizeof (LOCALINFO))
|
|
return FALSE;
|
|
|
|
/* Get the item counts */
|
|
if (wTHFlags & TH_KERNEL_386)
|
|
lpLocalInfo->wcItems = WalkLoc386Count(hHeap);
|
|
else
|
|
lpLocalInfo->wcItems = WalkLoc286Count(hHeap);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/* LocalFirst
|
|
* Finds the first block on a local heap.
|
|
*/
|
|
|
|
BOOL TOOLHELPAPI LocalFirst(
|
|
LOCALENTRY FAR *lpLocal,
|
|
HANDLE hHeap)
|
|
{
|
|
WORD wFirst;
|
|
|
|
/* Check the version number and verify proper installation */
|
|
if (!wLibInstalled || !lpLocal || lpLocal->dwSize != sizeof (LOCALENTRY))
|
|
return FALSE;
|
|
|
|
/* Convert the heap variable to a selector */
|
|
hHeap = HelperHandleToSel(hHeap);
|
|
|
|
/* Get the first item from the heap */
|
|
if (wTHFlags & TH_KERNEL_386)
|
|
{
|
|
if (!(wFirst = WalkLoc386First(hHeap)))
|
|
return FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (!(wFirst = WalkLoc286First(hHeap)))
|
|
return FALSE;
|
|
}
|
|
|
|
|
|
/* Fill in other miscellaneous stuff */
|
|
lpLocal->hHeap = hHeap;
|
|
|
|
/* Get information about this item */
|
|
if (wTHFlags & TH_KERNEL_386)
|
|
WalkLoc386(wFirst, lpLocal, hHeap);
|
|
else
|
|
WalkLoc286(wFirst, lpLocal, hHeap);
|
|
|
|
/* Guess at the type of the object */
|
|
ComputeType(lpLocal);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* LocalNext
|
|
* Continues a local heap walk by getting information about the
|
|
* next item.
|
|
*/
|
|
|
|
BOOL TOOLHELPAPI LocalNext(
|
|
LOCALENTRY FAR *lpLocal)
|
|
{
|
|
/* Check the version number and verify proper installation */
|
|
if (!wLibInstalled || !lpLocal || lpLocal->dwSize != sizeof (LOCALENTRY))
|
|
return FALSE;
|
|
|
|
if (wTHFlags & TH_KERNEL_386)
|
|
WalkLoc386(lpLocal->wNext, lpLocal, lpLocal->hHeap);
|
|
else
|
|
WalkLoc286(lpLocal->wNext, lpLocal, lpLocal->hHeap);
|
|
|
|
/* See if this item is the last one. If so, return done because this
|
|
* last item is NOT useful.
|
|
*/
|
|
if (!lpLocal->wNext)
|
|
return FALSE;
|
|
|
|
/* Guess at the type of the object */
|
|
ComputeType(lpLocal);
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
|
|
/* ComputeType
|
|
* Computes the object type of an object
|
|
*/
|
|
|
|
NOEXPORT void NEAR PASCAL ComputeType(
|
|
LOCALENTRY FAR *lpLocal)
|
|
{
|
|
/* Decode the free/fixed/moveable bits */
|
|
if (lpLocal->wFlags & 2)
|
|
lpLocal->wFlags = LF_MOVEABLE;
|
|
else if (lpLocal->wFlags & 1)
|
|
lpLocal->wFlags = LF_FIXED;
|
|
else
|
|
{
|
|
/* Free blocks never have a unique type so return */
|
|
lpLocal->wFlags = LF_FREE;
|
|
lpLocal->wType = LT_FREE;
|
|
lpLocal->hHandle = NULL;
|
|
return;
|
|
}
|
|
|
|
/* Decode the heap type if possible */
|
|
UserGdiType(lpLocal);
|
|
}
|
|
|
|
|