You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
213 lines
3.8 KiB
213 lines
3.8 KiB
/*++
|
|
|
|
Copyright (c) 1998-1999 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
drdbg
|
|
|
|
Abstract:
|
|
|
|
Contains Debug Routines for Remote Desktopping
|
|
|
|
Author:
|
|
|
|
Tad Brockway 02/00
|
|
|
|
Revision History:
|
|
|
|
--*/
|
|
|
|
#ifdef TRC_FILE
|
|
#undef TRC_FILE
|
|
#endif
|
|
|
|
#define TRC_FILE "_slmdbg"
|
|
|
|
#include <RemoteDesktop.h>
|
|
#include <RemoteDesktopDBG.h>
|
|
|
|
#if DBG
|
|
|
|
typedef struct tagREMOTEDESKTOP_MEMHDR
|
|
{
|
|
DWORD magicNo;
|
|
DWORD tag;
|
|
DWORD size;
|
|
DWORD pad;
|
|
} REMOTEDESKTOP_MEMHDR, *PREMOTEDESKTOP_MEMHDR;
|
|
|
|
void *
|
|
RemoteDesktopAllocateMem(
|
|
IN size_t size,
|
|
IN DWORD tag
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Allocate memory. Similiar to malloc.
|
|
|
|
Arguments:
|
|
|
|
size - Number of bytes to allocate.
|
|
tag - Tag identifying the allocated block for tracking
|
|
memory allocations.
|
|
|
|
Return Value:
|
|
|
|
Pointer to allocated memory on success. Otherwise, NULL is returned.
|
|
|
|
--*/
|
|
{
|
|
PREMOTEDESKTOP_MEMHDR hdr;
|
|
PBYTE p;
|
|
|
|
DC_BEGIN_FN("RemoteDesktopAllocateMem");
|
|
|
|
hdr = (PREMOTEDESKTOP_MEMHDR)malloc(size + sizeof(REMOTEDESKTOP_MEMHDR));
|
|
if (hdr != NULL) {
|
|
hdr->magicNo = GOODMEMMAGICNUMBER;
|
|
hdr->tag = tag;
|
|
hdr->size = size;
|
|
|
|
p = (PBYTE)(hdr + 1);
|
|
memset(p, UNITIALIZEDMEM, size);
|
|
DC_END_FN();
|
|
return (void *)p;
|
|
}
|
|
else {
|
|
TRC_ERR((TB, TEXT("Can't allocate %ld bytes."), size));
|
|
DC_END_FN();
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void
|
|
RemoteDesktopFreeMem(
|
|
IN void *ptr
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Release memory allocated by a call to RemoteDesktopAllocateMem.
|
|
|
|
Arguments:
|
|
|
|
ptr - Block of memory allocated by a call to RemoteDesktopAllocateMem.
|
|
|
|
Return Value:
|
|
|
|
NA
|
|
|
|
--*/
|
|
{
|
|
PREMOTEDESKTOP_MEMHDR hdr;
|
|
|
|
DC_BEGIN_FN("RemoteDesktopFreeMem");
|
|
|
|
//
|
|
// NULL is okay with 'free' so it has to be okay with us.
|
|
// (STL passes NULL to 'delete')
|
|
//
|
|
if (ptr == NULL) {
|
|
DC_END_FN();
|
|
return;
|
|
}
|
|
|
|
//
|
|
// Get a pointer to the header to the memory block.
|
|
//
|
|
hdr = (PREMOTEDESKTOP_MEMHDR)ptr;
|
|
hdr--;
|
|
|
|
//
|
|
// Make sure the block is valid.
|
|
//
|
|
ASSERT(hdr->magicNo == GOODMEMMAGICNUMBER);
|
|
|
|
//
|
|
// Mark it as freed.
|
|
//
|
|
hdr->magicNo = FREEDMEMMAGICNUMBER;
|
|
|
|
//
|
|
// Scramble and free the memory.
|
|
//
|
|
memset(ptr, REMOTEDESKTOPBADMEM, (size_t)hdr->size);
|
|
|
|
free(hdr);
|
|
|
|
DC_END_FN();
|
|
}
|
|
|
|
void *
|
|
RemoteDesktopReallocMem(
|
|
IN void *ptr,
|
|
IN size_t size
|
|
)
|
|
/*++
|
|
|
|
Routine Description:
|
|
|
|
Realloc a block.
|
|
|
|
Arguments:
|
|
|
|
ptr - Block of memory allocated by a call to RemoteDesktopAllocateMem.
|
|
sz - Size of new block.
|
|
|
|
Return Value:
|
|
|
|
NA
|
|
|
|
--*/
|
|
{
|
|
PREMOTEDESKTOP_MEMHDR hdr, hdr_tmp;
|
|
|
|
DC_BEGIN_FN("RemoteDesktopReallocMem");
|
|
|
|
ASSERT(ptr != NULL);
|
|
|
|
//
|
|
// Get a pointer to the header to the memory block.
|
|
//
|
|
hdr = (PREMOTEDESKTOP_MEMHDR)ptr;
|
|
hdr--;
|
|
|
|
//
|
|
// Make sure the block is valid.
|
|
//
|
|
ASSERT(hdr->magicNo == GOODMEMMAGICNUMBER);
|
|
|
|
//
|
|
// Whack the old block magic number in case we move.
|
|
//
|
|
hdr->magicNo = FREEDMEMMAGICNUMBER;
|
|
|
|
//
|
|
// Resize.
|
|
//
|
|
hdr_tmp = (PREMOTEDESKTOP_MEMHDR)realloc(hdr, size + sizeof(REMOTEDESKTOP_MEMHDR));
|
|
|
|
//
|
|
// Update the size and update the magic number.
|
|
//
|
|
if (hdr_tmp != NULL) {
|
|
// prefast - leaking memory if realloc fails
|
|
hdr = hdr_tmp;
|
|
hdr->magicNo = GOODMEMMAGICNUMBER;
|
|
hdr->size = size;
|
|
ptr = (PBYTE)(hdr + 1);
|
|
}
|
|
else {
|
|
TRC_ERR((TB, TEXT("Can't allocate %ld bytes."), size));
|
|
ptr = NULL;
|
|
}
|
|
|
|
DC_END_FN();
|
|
return (void *)ptr;
|
|
}
|
|
|
|
#endif
|