Annotation of mstools/samples/ddeml/client/mem.c, revision 1.1

1.1     ! root        1: /***************************************************************************
        !             2:  *                                                                         *
        !             3:  *  MODULE      : mem.c                                                    *
        !             4:  *                                                                         *
        !             5:  *  PURPOSE     : Functions for debugging memory allocation bugs.          *
        !             6:  *                                                                         *
        !             7:  ***************************************************************************/
        !             8: #include <windows.h>
        !             9: #include <windowsx.h>
        !            10: 
        !            11: #define MAX_OBJECTS 200
        !            12: 
        !            13: PSTR aptrs[MAX_OBJECTS];
        !            14: DWORD cptrs = 0;
        !            15: 
        !            16: /****************************************************************************
        !            17:  *                                                                          *
        !            18:  *  FUNCTION   : DbgAlloc()                                                 *
        !            19:  *                                                                          *
        !            20:  *  PURPOSE    : Useful routine for catching memory allocation errors.      *
        !            21:  *               Enters allocated objects into an array to check when freed *
        !            22:  *                                                                          *
        !            23:  *  RETURNS    : pointer to object allocated.                               *
        !            24:  *                                                                          *
        !            25:  ****************************************************************************/
        !            26: PSTR DbgAlloc(
        !            27: register DWORD cb)
        !            28: {
        !            29:     register PSTR p;
        !            30: 
        !            31:     p = (PSTR)LocalAlloc(LPTR, cb);
        !            32:     aptrs[cptrs++] = p;
        !            33:     if (cptrs >= MAX_OBJECTS)
        !            34:         OutputDebugString("Too many objects to track");
        !            35:     return p;
        !            36: }
        !            37: 
        !            38: /****************************************************************************
        !            39:  *                                                                          *
        !            40:  *  FUNCTION   : DbgFree()                                                  *
        !            41:  *                                                                          *
        !            42:  *  PURPOSE    : To free an object allocated with DbgAlloc().  Checks the   *
        !            43:  *               object array to make sure an object isn't freed twice.     *
        !            44:  *                                                                          *
        !            45:  *  RETURNS    :                                                            *
        !            46:  *                                                                          *
        !            47:  ****************************************************************************/
        !            48: PSTR DbgFree(
        !            49: register PSTR p)
        !            50: {
        !            51:     register DWORD i;
        !            52: 
        !            53:     if (p == NULL)
        !            54:         return p;
        !            55: 
        !            56:     for (i = 0; i < cptrs; i++) {
        !            57:         if (aptrs[i] == p) {
        !            58:             aptrs[i] = aptrs[cptrs - 1];
        !            59:             break;
        !            60:         }
        !            61:     }
        !            62:     if (i == cptrs) {
        !            63:         OutputDebugString("Free on non-allocated object");
        !            64:         DebugBreak();
        !            65:     } else {
        !            66:         LocalUnlock((HANDLE)p);
        !            67:         p = (PSTR)LocalFree((HANDLE)p);
        !            68:     }
        !            69:     cptrs--;
        !            70:     return p;
        !            71: }
        !            72: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.