146 lines
2.7 KiB
C
146 lines
2.7 KiB
C
/*++
|
|
|
|
Copyright (c) 1993 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
memory.c
|
|
|
|
Abstract:
|
|
|
|
Memory handling routines for Windows NT Setup API dll.
|
|
|
|
Author:
|
|
|
|
Ted Miller (tedm) 11-Jan-1995
|
|
|
|
Revision History:
|
|
|
|
Jamie Hunter (jamiehun) 13-Feb-1998
|
|
|
|
Improved this further for debugging
|
|
added linked list,
|
|
alloc tracing,
|
|
memory fills
|
|
and memory leak detection
|
|
|
|
jamiehun 30-April-1998
|
|
|
|
Added some more consistancy checks
|
|
Put try/except around access
|
|
|
|
jimschm 27-Oct-1998
|
|
|
|
Wrote fast allocation routines to speed up setupapi.dll on Win9x
|
|
|
|
--*/
|
|
|
|
|
|
#include "precomp.h"
|
|
#pragma hdrstop
|
|
|
|
//
|
|
// String to be used when displaying insufficient memory msg box.
|
|
// We load it at process attach time so we can be guaranteed of
|
|
// being able to display it.
|
|
//
|
|
PCTSTR OutOfMemoryString;
|
|
|
|
|
|
#if MEM_DBG
|
|
|
|
DWORD g_Track = 0;
|
|
PCSTR g_TrackFile = NULL;
|
|
UINT g_TrackLine = 0;
|
|
|
|
DWORD g_MemoryFlags = 0; // set this to 1 in the debugger to catch some extra dbg assertions.
|
|
|
|
DWORD g_DbgAllocNum = -1; // set g_MemoryFlags to 1 and this to the allocation number you want
|
|
// to catch if the same number allocation leaks every time.
|
|
|
|
VOID
|
|
SetTrackFileAndLine (
|
|
PCSTR File,
|
|
UINT Line
|
|
)
|
|
{
|
|
if (!g_Track) {
|
|
g_TrackFile = File;
|
|
g_TrackLine = Line;
|
|
}
|
|
|
|
g_Track++;
|
|
}
|
|
|
|
|
|
VOID
|
|
ClrTrackFileAndLine (
|
|
VOID
|
|
)
|
|
{
|
|
if (g_Track) {
|
|
g_Track--;
|
|
if (!g_Track) {
|
|
g_TrackFile = NULL;
|
|
g_TrackLine = 0;
|
|
}
|
|
}
|
|
}
|
|
|
|
PVOID MyDebugMalloc(
|
|
IN DWORD Size,
|
|
IN PCSTR Filename,
|
|
IN DWORD Line,
|
|
IN DWORD Tag
|
|
)
|
|
{
|
|
return pSetupDebugMallocWithTag(Size,
|
|
g_TrackFile ? g_TrackFile : Filename,
|
|
g_TrackLine ? g_TrackLine : Line,
|
|
Tag
|
|
);
|
|
}
|
|
|
|
#endif
|
|
|
|
BOOL
|
|
MemoryInitializeEx(
|
|
IN BOOL Attach
|
|
)
|
|
{
|
|
if (Attach) {
|
|
OutOfMemoryString = MyLoadString(IDS_OUTOFMEMORY);
|
|
return(OutOfMemoryString != NULL);
|
|
} else {
|
|
MyFree(OutOfMemoryString);
|
|
|
|
return(TRUE);
|
|
}
|
|
}
|
|
|
|
VOID
|
|
pSetupOutOfMemory(
|
|
IN HWND Owner OPTIONAL
|
|
)
|
|
{
|
|
//
|
|
// Don't popup a dialog if we're not running interactively...
|
|
//
|
|
if(!(GlobalSetupFlags & PSPGF_NONINTERACTIVE)) {
|
|
|
|
MYASSERT(OutOfMemoryString);
|
|
|
|
//
|
|
// Use special combination of flags that guarantee
|
|
// display of the message box regardless of available memory.
|
|
//
|
|
MessageBox(
|
|
Owner,
|
|
OutOfMemoryString,
|
|
NULL,
|
|
MB_ICONHAND | MB_SYSTEMMODAL | MB_OK | MB_SETFOREGROUND
|
|
);
|
|
}
|
|
}
|
|
|