-////////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Visual Leak Detector - CRT and MFC IAT Patch Functions Header\r
-// Copyright (c) 2009 Dan Moulding\r
-//\r
-// This library is free software; you can redistribute it and/or\r
-// modify it under the terms of the GNU Lesser General Public\r
-// License as published by the Free Software Foundation; either\r
-// version 2.1 of the License, or (at your option) any later version.\r
-//\r
-// This library is distributed in the hope that it will be useful,\r
-// but WITHOUT ANY WARRANTY; without even the implied warranty of\r
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\r
-// Lesser General Public License for more details.\r
-//\r
-// You should have received a copy of the GNU Lesser General Public\r
-// License along with this library; if not, write to the Free Software\r
-// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA\r
-//\r
-// See COPYING.txt for the full terms of the GNU Lesser General Public License.\r
-//\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-#pragma once\r
-\r
-#ifndef VLDBUILD\r
-#error \\r
-"This header should only be included by Visual Leak Detector when building it from source. \\r
-Applications should never include this header."\r
-#endif\r
-\r
-#include "vldint.h"\r
-extern __declspec(dllexport) VisualLeakDetector vld;\r
-\r
-#define TEMPLATE_HEADER \\r
-template<wchar_t const *crtddll, wchar_t const *mfcddll, wchar_t const *mfcuddll,\\r
- char const *crtd_vector_new_name, char const *crtd_vector_new_dbg_name,\\r
- char const *crtd_scalar_new_name, char const *crtd_scalar_new_dbg_name,\\r
- int mfcd_vector_new_ordinal, int mfcd_vector_new_dbg_4p_ordinal, int mfcd_vector_new_dbg_3p_ordinal,\\r
- int mfcd_scalar_new_ordinal, int mfcd_scalar_new_dbg_4p_ordinal, int mfcd_scalar_new_dbg_3p_ordinal,\\r
- int mfcud_vector_new_ordinal, int mfcud_vector_new_dbg_4p_ordinal, int mfcud_vector_new_dbg_3p_ordinal,\\r
- int mfcud_scalar_new_ordinal, int mfcud_scalar_new_dbg_4p_ordinal, int mfcud_scalar_new_dbg_3p_ordinal>\r
-\r
-#define TEMPLATE_ARGS \\r
- crtddll, mfcddll, mfcuddll,\\r
- crtd_vector_new_name, crtd_vector_new_dbg_name,\\r
- crtd_scalar_new_name, crtd_scalar_new_dbg_name,\\r
- mfcd_vector_new_ordinal, mfcd_vector_new_dbg_4p_ordinal, mfcd_vector_new_dbg_3p_ordinal,\\r
- mfcd_scalar_new_ordinal, mfcd_scalar_new_dbg_4p_ordinal, mfcd_scalar_new_dbg_3p_ordinal,\\r
- mfcud_vector_new_ordinal, mfcud_vector_new_dbg_4p_ordinal, mfcud_vector_new_dbg_3p_ordinal,\\r
- mfcud_scalar_new_ordinal, mfcud_scalar_new_dbg_4p_ordinal, mfcud_scalar_new_dbg_3p_ordinal\r
-\r
-TEMPLATE_HEADER\r
-class CrtMfcPatch\r
-{\r
-public:\r
- static void* __cdecl crtd__calloc_dbg (size_t num, size_t size, int type, char const *file, int line);\r
- static void* __cdecl crtd__malloc_dbg (size_t size, int type, const char *file, int line);\r
- static void* __cdecl crtd__realloc_dbg (void *mem, size_t size, int type, char const *file, int line);\r
- static void* __cdecl crtd__scalar_new_dbg (size_t size, int type, char const *file, int line);\r
- static void* __cdecl crtd__vector_new_dbg (size_t size, int type, char const *file, int line);\r
- static void* __cdecl crtd_calloc (size_t num, size_t size);\r
- static void* __cdecl crtd_malloc (size_t size);\r
- static void* __cdecl crtd_realloc (void *mem, size_t size);\r
- static void* __cdecl crtd_scalar_new (size_t size);\r
- static void* __cdecl crtd_vector_new (size_t size);\r
-\r
- template<char const *procname>\r
- static void* __cdecl crtd_new_dbg (SIZE_T fp, size_t size, int type, char const *file, int line);\r
- template<char const *procname>\r
- static void* __cdecl crtd_new (SIZE_T fp, size_t size);\r
-\r
- static void* __cdecl mfcd_vector_new (size_t size);\r
- static void* __cdecl mfcd__vector_new_dbg_4p (size_t size, int type, char const *file, int line);\r
- static void* __cdecl mfcd__vector_new_dbg_3p (size_t size, char const *file, int line);\r
- static void* __cdecl mfcd_scalar_new (size_t size);\r
- static void* __cdecl mfcd__scalar_new_dbg_4p (size_t size, int type, char const *file, int line);\r
- static void* __cdecl mfcd__scalar_new_dbg_3p (size_t size, char const *file, int line);\r
- static void* __cdecl mfcud_vector_new (size_t size);\r
- static void* __cdecl mfcud__vector_new_dbg_4p (size_t size, int type, char const *file, int line);\r
- static void* __cdecl mfcud__vector_new_dbg_3p (size_t size, char const *file, int line);\r
- static void* __cdecl mfcud_scalar_new (size_t size);\r
- static void* __cdecl mfcud__scalar_new_dbg_4p (size_t size, int type, char const *file, int line);\r
- static void* __cdecl mfcud__scalar_new_dbg_3p (size_t size, char const *file, int line);\r
-\r
- template<wchar_t const *mfcdll, int ordinal>\r
- static void* __cdecl mfcd_new_dbg (SIZE_T fp, size_t size, int type, char const *file, int line);\r
- template<wchar_t const *mfcdll, int ordinal>\r
- static void* __cdecl mfcd_new_dbg (SIZE_T fp, size_t size, char const *file, int line);\r
- template<wchar_t const *mfcdll, int ordinal>\r
- static void* __cdecl mfcd_new (SIZE_T fp, size_t size);\r
-};\r
-\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-//\r
-// Visual Studio DLLs\r
-//\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-// crtd__calloc_dbg - Calls to _calloc_dbg from msvcrXXd.dll are patched\r
-// through to this function.\r
-//\r
-// - mem (IN): Pointer to the memory block to be reallocated.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by _calloc_dbg.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__calloc_dbg (size_t num,\r
- size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- static _calloc_dbg_t pcrtxxd__calloc_dbg = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd__calloc_dbg == NULL) {\r
- // This is the first call to this function. Link to the real\r
- // _calloc_dbg.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd__calloc_dbg = (_calloc_dbg_t)GetProcAddress(msvcrxxd, "_calloc_dbg");\r
- }\r
-\r
- return vld.__calloc_dbg(pcrtxxd__calloc_dbg, fp, num, size, type, file, line);\r
-}\r
-\r
-// crtd__malloc_dbg - Calls to _malloc_dbg from msvcrXXd.dll are patched\r
-// through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by _malloc_dbg.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__malloc_dbg (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- static _malloc_dbg_t pcrtxxd__malloc_dbg = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd__malloc_dbg == NULL) {\r
- // This is the first call to this function. Link to the real\r
- // _malloc_dbg.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd__malloc_dbg = (_malloc_dbg_t)GetProcAddress(msvcrxxd, "_malloc_dbg");\r
- }\r
-\r
- return vld.__malloc_dbg(pcrtxxd__malloc_dbg, fp, size, type, file, line);\r
-}\r
-\r
-// crtd__realloc_dbg - Calls to _realloc_dbg from msvcrXXd.dll are patched\r
-// through to this function.\r
-//\r
-// - mem (IN): Pointer to the memory block to be reallocated.\r
-//\r
-// - size (IN): The size of the memory block to reallocate.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be reallocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by _realloc_dbg.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__realloc_dbg (void *mem,\r
- size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- static _realloc_dbg_t pcrtxxd__realloc_dbg = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd__realloc_dbg == NULL) {\r
- // This is the first call to this function. Link to the real\r
- // _realloc_dbg.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd__realloc_dbg = (_realloc_dbg_t)GetProcAddress(msvcrxxd, "_realloc_dbg");\r
- }\r
-\r
- return vld.__realloc_dbg(pcrtxxd__realloc_dbg, fp, mem, size, type, file, line);\r
-}\r
-\r
-// crtd__scalar_new_dbg - Calls to the CRT's debug scalar new operator from\r
-// msvcrXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT debug scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__scalar_new_dbg (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return crtd_new_dbg<crtd_scalar_new_dbg_name>(fp, size, type, file, line);\r
-}\r
-\r
-// crtd__vector_new_dbg - Calls to the CRT's debug vector new operator from\r
-// msvcrXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT debug vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__vector_new_dbg (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return crtd_new_dbg<crtd_vector_new_dbg_name>(fp, size, type, file, line);\r
-}\r
-\r
-// crtd_calloc - Calls to calloc from msvcrXXd.dll are patched through to\r
-// this function.\r
-//\r
-// - dll (IN): The name of the dll\r
-//\r
-// - num (IN): The number of blocks, of size 'size', to be allocated.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the valued returned from calloc.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_calloc (size_t num, size_t size)\r
-{\r
- static calloc_t pcrtxxd_calloc = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd_calloc == NULL) {\r
- // This is the first call to this function. Link to the real malloc.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd_calloc = (calloc_t)GetProcAddress(msvcrxxd, "calloc");\r
- }\r
-\r
- return vld._calloc(pcrtxxd_calloc, fp, num, size);\r
-}\r
-\r
-// crtd_malloc - Calls to malloc from msvcrXXd.dll are patched through to\r
-// this function.\r
-//\r
-// - dll (IN): The name of the dll\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the valued returned from malloc.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_malloc (size_t size)\r
-{\r
- static malloc_t pcrtxxd_malloc = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd_malloc == NULL) {\r
- // This is the first call to this function. Link to the real malloc.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd_malloc = (malloc_t)GetProcAddress(msvcrxxd, "malloc");\r
- }\r
-\r
- return vld._malloc(pcrtxxd_malloc, fp, size);\r
-}\r
-\r
-// crtd_realloc - Calls to realloc from msvcrXXd.dll are patched through to\r
-// this function.\r
-//\r
-// - dll (IN): The name of the dll\r
-//\r
-// - mem (IN): Pointer to the memory block to reallocate.\r
-//\r
-// - size (IN): Size of the memory block to reallocate.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned from realloc.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_realloc (void *mem, size_t size)\r
-{\r
- static realloc_t pcrtxxd_realloc = NULL;\r
-\r
- SIZE_T fp;\r
- HMODULE msvcrxxd;\r
-\r
- FRAMEPOINTER(fp);\r
-\r
- if (pcrtxxd_realloc == NULL) {\r
- // This is the first call to this function. Link to the real realloc.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd_realloc = (realloc_t)GetProcAddress(msvcrxxd, "realloc");\r
- }\r
-\r
- return vld._realloc(pcrtxxd_realloc, fp, mem, size);\r
-}\r
-\r
-// crtd_scalar_new - Calls to the CRT's scalar new operator from msvcrXXd.dll\r
-// are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_scalar_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return crtd_new<crtd_scalar_new_name>(fp, size);\r
-}\r
-\r
-// crtd_vector_new - Calls to the CRT's vector new operator from msvcrXXd.dll\r
-// are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_vector_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return crtd_new<crtd_vector_new_name>(fp, size);\r
-}\r
-\r
-// crtd_new_dbg - A template function for implementation of patch functions to\r
-// the CRT's debug new operator from msvcrXXd.dll\r
-//\r
-// - procname (IN): The debug new operator's name\r
-//\r
-// - fp (IN): Frame pointer from the call that initiated this allocation.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The CRT "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT debug new operator.\r
-//\r
-TEMPLATE_HEADER\r
-template<char const *procname>\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_new_dbg (SIZE_T fp,\r
- size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- static new_dbg_crt_t pcrtxxd_new_dbg = NULL;\r
-\r
- HMODULE msvcrxxd;\r
-\r
- if (pcrtxxd_new_dbg == NULL) {\r
- // This is the first call to this function. Link to the real CRT debug\r
- // new operator.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd_new_dbg = (new_dbg_crt_t)GetProcAddress(msvcrxxd, procname);\r
- }\r
-\r
- return vld.new_dbg_crt(pcrtxxd_new_dbg, fp, size, type, file, line);\r
-}\r
-\r
-// crt_new - A template function for implementing patch functions to the\r
-// CRT's new operator from msvcrXXd.dll\r
-//\r
-// - dll (IN): The name of the dll\r
-//\r
-// - procname (IN): The debug new operator's name\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the CRT new operator.\r
-//\r
-TEMPLATE_HEADER\r
-template<char const *procname>\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_new (SIZE_T fp, size_t size)\r
-{\r
- static new_t pcrtxxd_scalar_new = NULL;\r
-\r
- HMODULE msvcrxxd;\r
-\r
- if (pcrtxxd_scalar_new == NULL) {\r
- // This is the first call to this function. Link to the real CRT new\r
- // operator.\r
- msvcrxxd = GetModuleHandle(crtddll);\r
- pcrtxxd_scalar_new = (new_t)GetProcAddress(msvcrxxd, procname);\r
- }\r
-\r
- return vld._new(pcrtxxd_scalar_new, fp, size);\r
-}\r
-\r
-////////////////////////////////////////////////////////////////////////////////\r
-//\r
-// MFC DLLs\r
-//\r
-////////////////////////////////////////////////////////////////////////////////\r
-\r
-// mfcd__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from\r
-// mfcXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__scalar_new_dbg_4p (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcddll, mfcd_scalar_new_dbg_4p_ordinal>\r
- (fp, size, type, file, line);\r
-}\r
-\r
-// mfcd__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from\r
-// mfcXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__scalar_new_dbg_3p (size_t size,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcddll, mfcd_scalar_new_dbg_3p_ordinal>\r
- (fp, size, file, line);\r
-}\r
-\r
-// mfcd__vector_new_dbg_4p - Calls to the MFC debug vector new operator from\r
-// mfcXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__vector_new_dbg_4p (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcddll, mfcd_vector_new_dbg_4p_ordinal>\r
- (fp, size, type, file, line);\r
-}\r
-\r
-// mfcd__vector_new_dbg_3p - Calls to the MFC debug vector new operator from\r
-// mfcXXd.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__vector_new_dbg_3p (size_t size,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcddll, mfcd_vector_new_dbg_3p_ordinal>\r
- (fp, size, file, line);\r
-}\r
-\r
-// mfcd_scalar_new - Calls to the MFC scalar new operator from mfcXXd.dll are\r
-// patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_scalar_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new<mfcddll, mfcd_scalar_new_ordinal>(fp, size);\r
-}\r
-\r
-// mfcd_vector_new - Calls to the MFC vector new operator from mfcXXd.dll are\r
-// patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_vector_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new<mfcddll, mfcd_vector_new_ordinal>(fp, size);\r
-}\r
-\r
-// mfcud__scalar_new_dbg_4p - Calls to the MFC debug scalar new operator from\r
-// mfcXXud.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__scalar_new_dbg_4p (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcuddll, mfcud_scalar_new_dbg_4p_ordinal>\r
- (fp, size, type, file, line);\r
-}\r
-\r
-// mfcud__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from\r
-// mfcXXud.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__scalar_new_dbg_3p (size_t size,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcuddll, mfcud_scalar_new_dbg_3p_ordinal>\r
- (fp, size, file, line);\r
-}\r
-\r
-// mfcud__vector_new_dbg_4p - Calls to the MFC debug vector new operator from\r
-// mfcXXud.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - type (IN): The "use type" of the block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__vector_new_dbg_4p (size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcuddll, mfcud_vector_new_dbg_4p_ordinal>\r
- (fp, size, type, file, line);\r
-}\r
-\r
-// mfcud__vector_new_dbg_3p - Calls to the MFC debug vector new operator from\r
-// mfcXXud.dll are patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__vector_new_dbg_3p (size_t size,\r
- char const *file,\r
- int line)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new_dbg<mfcuddll, mfcud_vector_new_dbg_3p_ordinal>\r
- (fp, size, file, line);\r
-}\r
-\r
-// mfcud_scalar_new - Calls to the MFC scalar new operator from mfcXXud.dll are\r
-// patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC scalar new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud_scalar_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new<mfcuddll, mfcud_scalar_new_ordinal>(fp, size);\r
-}\r
-\r
-// mfcud_vector_new - Calls to the MFC vector new operator from mfcXXud.dll are\r
-// patched through to this function.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC vector new operator.\r
-//\r
-TEMPLATE_HEADER\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud_vector_new (size_t size)\r
-{\r
- SIZE_T fp;\r
- FRAMEPOINTER(fp);\r
-\r
- return mfcd_new<mfcuddll, mfcud_vector_new_ordinal>(fp, size);\r
-}\r
-\r
-// mfcd_new_dbg - A generic function for implementing patch functions to the MFC\r
-// debug new operators:\r
-// void* __cdecl operator new[](size_t size, int type, char const *file, int line)\r
-// void* __cdecl operator new(size_t size, int type, char const *file, int line)\r
-//\r
-// - mfcdll (IN): The name of the MFC DLL\r
-//\r
-// - ordinal (IN): The debug new operator's ordinal value\r
-//\r
-// - type (IN): The "use type" of the block to be allocated.\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug new operator.\r
-//\r
-TEMPLATE_HEADER\r
-template<wchar_t const *mfcdll, int ordinal>\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new_dbg (SIZE_T fp,\r
- size_t size,\r
- int type,\r
- char const *file,\r
- int line)\r
-{\r
- static new_dbg_crt_t pmfcxxd__new_dbg = NULL;\r
-\r
- HMODULE mfcxxd;\r
-\r
- if (pmfcxxd__new_dbg == NULL) {\r
- // This is the first call to this function. Link to the real MFC debug\r
- // new operator.\r
- mfcxxd = GetModuleHandle(mfcdll);\r
- pmfcxxd__new_dbg = (new_dbg_crt_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);\r
- }\r
-\r
- return vld.new_dbg_mfc(pmfcxxd__new_dbg, fp, size, type, file, line);\r
-}\r
-\r
-// mfcd_new_dbg - A generic function for implementing patch functions to the MFC\r
-// debug new operators:\r
-// void* __cdecl operator new[](size_t size, char const *file, int line)\r
-// void* __cdecl operator new(size_t size, char const *file, int line)\r
-//\r
-// - mfcdll (IN): The name of the MFC DLL\r
-//\r
-// - ordinal (IN): The debug new operator's ordinal value\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// - file (IN): The name of the file from which this function is being called.\r
-//\r
-// - line (IN): The line number, in the above file, at which this function is\r
-// being called.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC debug new operator.\r
-//\r
-TEMPLATE_HEADER\r
-template<wchar_t const *mfcdll, int ordinal>\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new_dbg (SIZE_T fp,\r
- size_t size,\r
- char const *file,\r
- int line)\r
-{\r
- static new_dbg_mfc_t pmfcxxd__new_dbg = NULL;\r
-\r
- HMODULE mfcxxd;\r
-\r
- if (pmfcxxd__new_dbg == NULL) {\r
- // This is the first call to this function. Link to the real MFC debug\r
- // new operator.\r
- mfcxxd = GetModuleHandle(mfcdll);\r
- pmfcxxd__new_dbg = (new_dbg_mfc_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);\r
- }\r
-\r
- return vld.new_dbg_mfc(pmfcxxd__new_dbg, fp, size, file, line);\r
-}\r
-\r
-// mfcd_new - A generic function for implementing patch functions to the MFC new\r
-// operators.\r
-//\r
-// - mfcdll (IN): The name of the MFC DLL\r
-//\r
-// - ordinal (IN): The new operator's ordinal value\r
-//\r
-// - size (IN): The size, in bytes, of the memory block to be allocated.\r
-//\r
-// Return Value:\r
-//\r
-// Returns the value returned by the MFC new operator.\r
-//\r
-TEMPLATE_HEADER\r
-template<wchar_t const *mfcdll, int ordinal>\r
-void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new (SIZE_T fp, size_t size)\r
-{\r
- static new_t pmfcxxd_new = NULL;\r
-\r
- HMODULE mfcxxd;\r
-\r
- if (pmfcxxd_new == NULL) {\r
- // This is the first call to this function. Link to the real CRT new\r
- // operator.\r
- mfcxxd = GetModuleHandle(mfcdll);\r
- pmfcxxd_new = (new_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);\r
- }\r
-\r
- return vld._new(pmfcxxd_new, fp, size);\r
-}\r
-\r
-#undef TEMPLATE_HEADER\r
-#undef TEMPLATE_ARGS\r
-\r
-const extern char scalar_new_dbg_name[] = "??2@YAPAXIHPBDH@Z";\r
-const extern char vector_new_dbg_name[] = "??_U@YAPAXIHPBDH@Z";\r
-const extern char scalar_new_name[] = "??2@YAPAXI@Z";\r
-const extern char vector_new_name[] = "??_U@YAPAXI@Z";\r
-const extern wchar_t msvcrtd_dll[] = L"msvcrtd.dll";\r
-const extern wchar_t mfc42d_dll[] = L"mfc42d.dll";\r
-const extern wchar_t mfc42ud_dll[] = L"mfc42ud.dll";\r
-const extern wchar_t msvcr70d_dll[] = L"msvcr70d.dll";\r
-const extern wchar_t mfc70d_dll[] = L"mfc70d.dll";\r
-const extern wchar_t mfc70ud_dll[] = L"mfc70ud.dll";\r
-const extern wchar_t msvcr71d_dll[] = L"msvcr71d.dll";\r
-const extern wchar_t mfc71d_dll[] = L"mfc71d.dll";\r
-const extern wchar_t mfc71ud_dll[] = L"mfc71ud.dll";\r
-const extern wchar_t msvcr80d_dll[] = L"msvcr80d.dll";\r
-const extern wchar_t mfc80d_dll[] = L"mfc80d.dll";\r
-const extern wchar_t mfc80ud_dll[] = L"mfc80ud.dll";\r
-const extern wchar_t msvcr90d_dll[] = L"msvcr90d.dll";\r
-const extern wchar_t mfc90d_dll[] = L"mfc90d.dll";\r
-const extern wchar_t mfc90ud_dll[] = L"mfc90ud.dll";\r
-const extern wchar_t msvcr100d_dll[] = L"msvcr100d.dll";\r
-const extern wchar_t mfc100d_dll[] = L"mfc100d.dll";\r
-const extern wchar_t mfc100ud_dll[] = L"mfc100ud.dll";\r
-\r
-// Visual Studio 6.0\r
-typedef CrtMfcPatch<msvcrtd_dll, mfc42d_dll, mfc42ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 0, 0, 0, 711, 712, 714,\r
- 0, 0, 0, 711, 712, 714>\r
- VS60;\r
-// Visual Studio .NET 2002\r
-typedef CrtMfcPatch<msvcr70d_dll, mfc70d_dll, mfc70ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 257, 258, 259, 832, 833, 834,\r
- 258, 259, 260, 833, 834, 835>\r
- VS70;\r
-// Visual Studio .NET 2003\r
-typedef CrtMfcPatch<msvcr71d_dll, mfc71d_dll, mfc71ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 267, 268, 269, 893, 894, 895,\r
- 267, 268, 269, 893, 894, 895>\r
- VS71;\r
-// Visual Studio 2005\r
-typedef CrtMfcPatch<msvcr80d_dll, mfc80d_dll, mfc80ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 267, 268, 269, 893, 894, 895,\r
- 267, 268, 269, 893, 894, 895>\r
- VS80;\r
-// Visual Studio 2008\r
-typedef CrtMfcPatch<msvcr90d_dll, mfc90d_dll, mfc90ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 267, 268, 269, 931, 932, 933,\r
- 267, 268, 269, 935, 936, 937>\r
- VS90;\r
-\r
-// Visual Studio 2010\r
-typedef CrtMfcPatch<msvcr100d_dll, mfc100d_dll, mfc100ud_dll,\r
- vector_new_name, vector_new_dbg_name,\r
- scalar_new_name, scalar_new_dbg_name,\r
- 267, 268, 269, 1405, 1406, 1407,\r
- 267, 268, 269, 1412, 1413, 1414>\r
- VS100;
\ No newline at end of file
+////////////////////////////////////////////////////////////////////////////////
+//
+// Visual Leak Detector - CRT and MFC IAT Patch Functions Header
+// Copyright (c) 2009 Dan Moulding
+//
+// This library is free software; you can redistribute it and/or
+// modify it under the terms of the GNU Lesser General Public
+// License as published by the Free Software Foundation; either
+// version 2.1 of the License, or (at your option) any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+//
+// See COPYING.txt for the full terms of the GNU Lesser General Public License.
+//
+////////////////////////////////////////////////////////////////////////////////
+
+#pragma once
+
+#ifndef VLDBUILD
+#error \
+"This header should only be included by Visual Leak Detector when building it from source. \
+Applications should never include this header."
+#endif
+
+#include "vldint.h"
+extern __declspec(dllexport) VisualLeakDetector vld;
+
+#define TEMPLATE_HEADER \
+template<wchar_t const *crtddll, wchar_t const *mfcddll, wchar_t const *mfcuddll,\
+ char const *crtd_vector_new_name, char const *crtd_vector_new_dbg_name,\
+ char const *crtd_scalar_new_name, char const *crtd_scalar_new_dbg_name,\
+ int mfcd_vector_new_ordinal, int mfcd_vector_new_dbg_4p_ordinal, int mfcd_vector_new_dbg_3p_ordinal,\
+ int mfcd_scalar_new_ordinal, int mfcd_scalar_new_dbg_4p_ordinal, int mfcd_scalar_new_dbg_3p_ordinal,\
+ int mfcud_vector_new_ordinal, int mfcud_vector_new_dbg_4p_ordinal, int mfcud_vector_new_dbg_3p_ordinal,\
+ int mfcud_scalar_new_ordinal, int mfcud_scalar_new_dbg_4p_ordinal, int mfcud_scalar_new_dbg_3p_ordinal>
+
+#define TEMPLATE_ARGS \
+ crtddll, mfcddll, mfcuddll,\
+ crtd_vector_new_name, crtd_vector_new_dbg_name,\
+ crtd_scalar_new_name, crtd_scalar_new_dbg_name,\
+ mfcd_vector_new_ordinal, mfcd_vector_new_dbg_4p_ordinal, mfcd_vector_new_dbg_3p_ordinal,\
+ mfcd_scalar_new_ordinal, mfcd_scalar_new_dbg_4p_ordinal, mfcd_scalar_new_dbg_3p_ordinal,\
+ mfcud_vector_new_ordinal, mfcud_vector_new_dbg_4p_ordinal, mfcud_vector_new_dbg_3p_ordinal,\
+ mfcud_scalar_new_ordinal, mfcud_scalar_new_dbg_4p_ordinal, mfcud_scalar_new_dbg_3p_ordinal
+
+TEMPLATE_HEADER
+class CrtMfcPatch
+{
+public:
+ static void* __cdecl crtd__calloc_dbg (size_t num, size_t size, int type, char const *file, int line);
+ static void* __cdecl crtd__malloc_dbg (size_t size, int type, const char *file, int line);
+ static void* __cdecl crtd__realloc_dbg (void *mem, size_t size, int type, char const *file, int line);
+ static void* __cdecl crtd__scalar_new_dbg (size_t size, int type, char const *file, int line);
+ static void* __cdecl crtd__vector_new_dbg (size_t size, int type, char const *file, int line);
+ static void* __cdecl crtd_calloc (size_t num, size_t size);
+ static void* __cdecl crtd_malloc (size_t size);
+ static void* __cdecl crtd_realloc (void *mem, size_t size);
+ static void* __cdecl crtd_scalar_new (size_t size);
+ static void* __cdecl crtd_vector_new (size_t size);
+
+ template<char const *procname>
+ static void* __cdecl crtd_new_dbg (SIZE_T fp, size_t size, int type, char const *file, int line);
+ template<char const *procname>
+ static void* __cdecl crtd_new (SIZE_T fp, size_t size);
+
+ static void* __cdecl mfcd_vector_new (size_t size);
+ static void* __cdecl mfcd__vector_new_dbg_4p (size_t size, int type, char const *file, int line);
+ static void* __cdecl mfcd__vector_new_dbg_3p (size_t size, char const *file, int line);
+ static void* __cdecl mfcd_scalar_new (size_t size);
+ static void* __cdecl mfcd__scalar_new_dbg_4p (size_t size, int type, char const *file, int line);
+ static void* __cdecl mfcd__scalar_new_dbg_3p (size_t size, char const *file, int line);
+ static void* __cdecl mfcud_vector_new (size_t size);
+ static void* __cdecl mfcud__vector_new_dbg_4p (size_t size, int type, char const *file, int line);
+ static void* __cdecl mfcud__vector_new_dbg_3p (size_t size, char const *file, int line);
+ static void* __cdecl mfcud_scalar_new (size_t size);
+ static void* __cdecl mfcud__scalar_new_dbg_4p (size_t size, int type, char const *file, int line);
+ static void* __cdecl mfcud__scalar_new_dbg_3p (size_t size, char const *file, int line);
+
+ template<wchar_t const *mfcdll, int ordinal>
+ static void* __cdecl mfcd_new_dbg (SIZE_T fp, size_t size, int type, char const *file, int line);
+ template<wchar_t const *mfcdll, int ordinal>
+ static void* __cdecl mfcd_new_dbg (SIZE_T fp, size_t size, char const *file, int line);
+ template<wchar_t const *mfcdll, int ordinal>
+ static void* __cdecl mfcd_new (SIZE_T fp, size_t size);
+};
+
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// Visual Studio DLLs
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// crtd__calloc_dbg - Calls to _calloc_dbg from msvcrXXd.dll are patched
+// through to this function.
+//
+// - mem (IN): Pointer to the memory block to be reallocated.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The CRT "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by _calloc_dbg.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__calloc_dbg (size_t num,
+ size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ static _calloc_dbg_t pcrtxxd__calloc_dbg = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd__calloc_dbg == NULL) {
+ // This is the first call to this function. Link to the real
+ // _calloc_dbg.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd__calloc_dbg = (_calloc_dbg_t)GetProcAddress(msvcrxxd, "_calloc_dbg");
+ }
+
+ return vld.__calloc_dbg(pcrtxxd__calloc_dbg, fp, num, size, type, file, line);
+}
+
+// crtd__malloc_dbg - Calls to _malloc_dbg from msvcrXXd.dll are patched
+// through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The CRT "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by _malloc_dbg.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__malloc_dbg (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ static _malloc_dbg_t pcrtxxd__malloc_dbg = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd__malloc_dbg == NULL) {
+ // This is the first call to this function. Link to the real
+ // _malloc_dbg.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd__malloc_dbg = (_malloc_dbg_t)GetProcAddress(msvcrxxd, "_malloc_dbg");
+ }
+
+ return vld.__malloc_dbg(pcrtxxd__malloc_dbg, fp, size, type, file, line);
+}
+
+// crtd__realloc_dbg - Calls to _realloc_dbg from msvcrXXd.dll are patched
+// through to this function.
+//
+// - mem (IN): Pointer to the memory block to be reallocated.
+//
+// - size (IN): The size of the memory block to reallocate.
+//
+// - type (IN): The CRT "use type" of the block to be reallocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by _realloc_dbg.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__realloc_dbg (void *mem,
+ size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ static _realloc_dbg_t pcrtxxd__realloc_dbg = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd__realloc_dbg == NULL) {
+ // This is the first call to this function. Link to the real
+ // _realloc_dbg.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd__realloc_dbg = (_realloc_dbg_t)GetProcAddress(msvcrxxd, "_realloc_dbg");
+ }
+
+ return vld.__realloc_dbg(pcrtxxd__realloc_dbg, fp, mem, size, type, file, line);
+}
+
+// crtd__scalar_new_dbg - Calls to the CRT's debug scalar new operator from
+// msvcrXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The CRT "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT debug scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__scalar_new_dbg (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return crtd_new_dbg<crtd_scalar_new_dbg_name>(fp, size, type, file, line);
+}
+
+// crtd__vector_new_dbg - Calls to the CRT's debug vector new operator from
+// msvcrXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The CRT "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT debug vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd__vector_new_dbg (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return crtd_new_dbg<crtd_vector_new_dbg_name>(fp, size, type, file, line);
+}
+
+// crtd_calloc - Calls to calloc from msvcrXXd.dll are patched through to
+// this function.
+//
+// - dll (IN): The name of the dll
+//
+// - num (IN): The number of blocks, of size 'size', to be allocated.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the valued returned from calloc.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_calloc (size_t num, size_t size)
+{
+ static calloc_t pcrtxxd_calloc = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd_calloc == NULL) {
+ // This is the first call to this function. Link to the real malloc.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd_calloc = (calloc_t)GetProcAddress(msvcrxxd, "calloc");
+ }
+
+ return vld._calloc(pcrtxxd_calloc, fp, num, size);
+}
+
+// crtd_malloc - Calls to malloc from msvcrXXd.dll are patched through to
+// this function.
+//
+// - dll (IN): The name of the dll
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the valued returned from malloc.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_malloc (size_t size)
+{
+ static malloc_t pcrtxxd_malloc = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd_malloc == NULL) {
+ // This is the first call to this function. Link to the real malloc.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd_malloc = (malloc_t)GetProcAddress(msvcrxxd, "malloc");
+ }
+
+ return vld._malloc(pcrtxxd_malloc, fp, size);
+}
+
+// crtd_realloc - Calls to realloc from msvcrXXd.dll are patched through to
+// this function.
+//
+// - dll (IN): The name of the dll
+//
+// - mem (IN): Pointer to the memory block to reallocate.
+//
+// - size (IN): Size of the memory block to reallocate.
+//
+// Return Value:
+//
+// Returns the value returned from realloc.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_realloc (void *mem, size_t size)
+{
+ static realloc_t pcrtxxd_realloc = NULL;
+
+ SIZE_T fp;
+ HMODULE msvcrxxd;
+
+ FRAMEPOINTER(fp);
+
+ if (pcrtxxd_realloc == NULL) {
+ // This is the first call to this function. Link to the real realloc.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd_realloc = (realloc_t)GetProcAddress(msvcrxxd, "realloc");
+ }
+
+ return vld._realloc(pcrtxxd_realloc, fp, mem, size);
+}
+
+// crtd_scalar_new - Calls to the CRT's scalar new operator from msvcrXXd.dll
+// are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_scalar_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return crtd_new<crtd_scalar_new_name>(fp, size);
+}
+
+// crtd_vector_new - Calls to the CRT's vector new operator from msvcrXXd.dll
+// are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_vector_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return crtd_new<crtd_vector_new_name>(fp, size);
+}
+
+// crtd_new_dbg - A template function for implementation of patch functions to
+// the CRT's debug new operator from msvcrXXd.dll
+//
+// - procname (IN): The debug new operator's name
+//
+// - fp (IN): Frame pointer from the call that initiated this allocation.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The CRT "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT debug new operator.
+//
+TEMPLATE_HEADER
+template<char const *procname>
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_new_dbg (SIZE_T fp,
+ size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ static new_dbg_crt_t pcrtxxd_new_dbg = NULL;
+
+ HMODULE msvcrxxd;
+
+ if (pcrtxxd_new_dbg == NULL) {
+ // This is the first call to this function. Link to the real CRT debug
+ // new operator.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd_new_dbg = (new_dbg_crt_t)GetProcAddress(msvcrxxd, procname);
+ }
+
+ return vld.new_dbg_crt(pcrtxxd_new_dbg, fp, size, type, file, line);
+}
+
+// crt_new - A template function for implementing patch functions to the
+// CRT's new operator from msvcrXXd.dll
+//
+// - dll (IN): The name of the dll
+//
+// - procname (IN): The debug new operator's name
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the CRT new operator.
+//
+TEMPLATE_HEADER
+template<char const *procname>
+void* CrtMfcPatch<TEMPLATE_ARGS>::crtd_new (SIZE_T fp, size_t size)
+{
+ static new_t pcrtxxd_scalar_new = NULL;
+
+ HMODULE msvcrxxd;
+
+ if (pcrtxxd_scalar_new == NULL) {
+ // This is the first call to this function. Link to the real CRT new
+ // operator.
+ msvcrxxd = GetModuleHandle(crtddll);
+ pcrtxxd_scalar_new = (new_t)GetProcAddress(msvcrxxd, procname);
+ }
+
+ return vld._new(pcrtxxd_scalar_new, fp, size);
+}
+
+////////////////////////////////////////////////////////////////////////////////
+//
+// MFC DLLs
+//
+////////////////////////////////////////////////////////////////////////////////
+
+// mfcd__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from
+// mfcXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__scalar_new_dbg_4p (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcddll, mfcd_scalar_new_dbg_4p_ordinal>
+ (fp, size, type, file, line);
+}
+
+// mfcd__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from
+// mfcXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__scalar_new_dbg_3p (size_t size,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcddll, mfcd_scalar_new_dbg_3p_ordinal>
+ (fp, size, file, line);
+}
+
+// mfcd__vector_new_dbg_4p - Calls to the MFC debug vector new operator from
+// mfcXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__vector_new_dbg_4p (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcddll, mfcd_vector_new_dbg_4p_ordinal>
+ (fp, size, type, file, line);
+}
+
+// mfcd__vector_new_dbg_3p - Calls to the MFC debug vector new operator from
+// mfcXXd.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd__vector_new_dbg_3p (size_t size,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcddll, mfcd_vector_new_dbg_3p_ordinal>
+ (fp, size, file, line);
+}
+
+// mfcd_scalar_new - Calls to the MFC scalar new operator from mfcXXd.dll are
+// patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_scalar_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new<mfcddll, mfcd_scalar_new_ordinal>(fp, size);
+}
+
+// mfcd_vector_new - Calls to the MFC vector new operator from mfcXXd.dll are
+// patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_vector_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new<mfcddll, mfcd_vector_new_ordinal>(fp, size);
+}
+
+// mfcud__scalar_new_dbg_4p - Calls to the MFC debug scalar new operator from
+// mfcXXud.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__scalar_new_dbg_4p (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcuddll, mfcud_scalar_new_dbg_4p_ordinal>
+ (fp, size, type, file, line);
+}
+
+// mfcud__scalar_new_dbg_3p - Calls to the MFC debug scalar new operator from
+// mfcXXud.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__scalar_new_dbg_3p (size_t size,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcuddll, mfcud_scalar_new_dbg_3p_ordinal>
+ (fp, size, file, line);
+}
+
+// mfcud__vector_new_dbg_4p - Calls to the MFC debug vector new operator from
+// mfcXXud.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - type (IN): The "use type" of the block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__vector_new_dbg_4p (size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcuddll, mfcud_vector_new_dbg_4p_ordinal>
+ (fp, size, type, file, line);
+}
+
+// mfcud__vector_new_dbg_3p - Calls to the MFC debug vector new operator from
+// mfcXXud.dll are patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud__vector_new_dbg_3p (size_t size,
+ char const *file,
+ int line)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new_dbg<mfcuddll, mfcud_vector_new_dbg_3p_ordinal>
+ (fp, size, file, line);
+}
+
+// mfcud_scalar_new - Calls to the MFC scalar new operator from mfcXXud.dll are
+// patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC scalar new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud_scalar_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new<mfcuddll, mfcud_scalar_new_ordinal>(fp, size);
+}
+
+// mfcud_vector_new - Calls to the MFC vector new operator from mfcXXud.dll are
+// patched through to this function.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC vector new operator.
+//
+TEMPLATE_HEADER
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcud_vector_new (size_t size)
+{
+ SIZE_T fp;
+ FRAMEPOINTER(fp);
+
+ return mfcd_new<mfcuddll, mfcud_vector_new_ordinal>(fp, size);
+}
+
+// mfcd_new_dbg - A generic function for implementing patch functions to the MFC
+// debug new operators:
+// void* __cdecl operator new[](size_t size, int type, char const *file, int line)
+// void* __cdecl operator new(size_t size, int type, char const *file, int line)
+//
+// - mfcdll (IN): The name of the MFC DLL
+//
+// - ordinal (IN): The debug new operator's ordinal value
+//
+// - type (IN): The "use type" of the block to be allocated.
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug new operator.
+//
+TEMPLATE_HEADER
+template<wchar_t const *mfcdll, int ordinal>
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new_dbg (SIZE_T fp,
+ size_t size,
+ int type,
+ char const *file,
+ int line)
+{
+ static new_dbg_crt_t pmfcxxd__new_dbg = NULL;
+
+ HMODULE mfcxxd;
+
+ if (pmfcxxd__new_dbg == NULL) {
+ // This is the first call to this function. Link to the real MFC debug
+ // new operator.
+ mfcxxd = GetModuleHandle(mfcdll);
+ pmfcxxd__new_dbg = (new_dbg_crt_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);
+ }
+
+ return vld.new_dbg_mfc(pmfcxxd__new_dbg, fp, size, type, file, line);
+}
+
+// mfcd_new_dbg - A generic function for implementing patch functions to the MFC
+// debug new operators:
+// void* __cdecl operator new[](size_t size, char const *file, int line)
+// void* __cdecl operator new(size_t size, char const *file, int line)
+//
+// - mfcdll (IN): The name of the MFC DLL
+//
+// - ordinal (IN): The debug new operator's ordinal value
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// - file (IN): The name of the file from which this function is being called.
+//
+// - line (IN): The line number, in the above file, at which this function is
+// being called.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC debug new operator.
+//
+TEMPLATE_HEADER
+template<wchar_t const *mfcdll, int ordinal>
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new_dbg (SIZE_T fp,
+ size_t size,
+ char const *file,
+ int line)
+{
+ static new_dbg_mfc_t pmfcxxd__new_dbg = NULL;
+
+ HMODULE mfcxxd;
+
+ if (pmfcxxd__new_dbg == NULL) {
+ // This is the first call to this function. Link to the real MFC debug
+ // new operator.
+ mfcxxd = GetModuleHandle(mfcdll);
+ pmfcxxd__new_dbg = (new_dbg_mfc_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);
+ }
+
+ return vld.new_dbg_mfc(pmfcxxd__new_dbg, fp, size, file, line);
+}
+
+// mfcd_new - A generic function for implementing patch functions to the MFC new
+// operators.
+//
+// - mfcdll (IN): The name of the MFC DLL
+//
+// - ordinal (IN): The new operator's ordinal value
+//
+// - size (IN): The size, in bytes, of the memory block to be allocated.
+//
+// Return Value:
+//
+// Returns the value returned by the MFC new operator.
+//
+TEMPLATE_HEADER
+template<wchar_t const *mfcdll, int ordinal>
+void* CrtMfcPatch<TEMPLATE_ARGS>::mfcd_new (SIZE_T fp, size_t size)
+{
+ static new_t pmfcxxd_new = NULL;
+
+ HMODULE mfcxxd;
+
+ if (pmfcxxd_new == NULL) {
+ // This is the first call to this function. Link to the real CRT new
+ // operator.
+ mfcxxd = GetModuleHandle(mfcdll);
+ pmfcxxd_new = (new_t)GetProcAddress(mfcxxd, (LPCSTR)ordinal);
+ }
+
+ return vld._new(pmfcxxd_new, fp, size);
+}
+
+#undef TEMPLATE_HEADER
+#undef TEMPLATE_ARGS
+
+const extern char scalar_new_dbg_name[] = "??2@YAPAXIHPBDH@Z";
+const extern char vector_new_dbg_name[] = "??_U@YAPAXIHPBDH@Z";
+const extern char scalar_new_name[] = "??2@YAPAXI@Z";
+const extern char vector_new_name[] = "??_U@YAPAXI@Z";
+const extern wchar_t msvcrtd_dll[] = L"msvcrtd.dll";
+const extern wchar_t mfc42d_dll[] = L"mfc42d.dll";
+const extern wchar_t mfc42ud_dll[] = L"mfc42ud.dll";
+const extern wchar_t msvcr70d_dll[] = L"msvcr70d.dll";
+const extern wchar_t mfc70d_dll[] = L"mfc70d.dll";
+const extern wchar_t mfc70ud_dll[] = L"mfc70ud.dll";
+const extern wchar_t msvcr71d_dll[] = L"msvcr71d.dll";
+const extern wchar_t mfc71d_dll[] = L"mfc71d.dll";
+const extern wchar_t mfc71ud_dll[] = L"mfc71ud.dll";
+const extern wchar_t msvcr80d_dll[] = L"msvcr80d.dll";
+const extern wchar_t mfc80d_dll[] = L"mfc80d.dll";
+const extern wchar_t mfc80ud_dll[] = L"mfc80ud.dll";
+const extern wchar_t msvcr90d_dll[] = L"msvcr90d.dll";
+const extern wchar_t mfc90d_dll[] = L"mfc90d.dll";
+const extern wchar_t mfc90ud_dll[] = L"mfc90ud.dll";
+const extern wchar_t msvcr100d_dll[] = L"msvcr100d.dll";
+const extern wchar_t mfc100d_dll[] = L"mfc100d.dll";
+const extern wchar_t mfc100ud_dll[] = L"mfc100ud.dll";
+
+// Visual Studio 6.0
+typedef CrtMfcPatch<msvcrtd_dll, mfc42d_dll, mfc42ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 0, 0, 0, 711, 712, 714,
+ 0, 0, 0, 711, 712, 714>
+ VS60;
+// Visual Studio .NET 2002
+typedef CrtMfcPatch<msvcr70d_dll, mfc70d_dll, mfc70ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 257, 258, 259, 832, 833, 834,
+ 258, 259, 260, 833, 834, 835>
+ VS70;
+// Visual Studio .NET 2003
+typedef CrtMfcPatch<msvcr71d_dll, mfc71d_dll, mfc71ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 267, 268, 269, 893, 894, 895,
+ 267, 268, 269, 893, 894, 895>
+ VS71;
+// Visual Studio 2005
+typedef CrtMfcPatch<msvcr80d_dll, mfc80d_dll, mfc80ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 267, 268, 269, 893, 894, 895,
+ 267, 268, 269, 893, 894, 895>
+ VS80;
+// Visual Studio 2008
+typedef CrtMfcPatch<msvcr90d_dll, mfc90d_dll, mfc90ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 267, 268, 269, 931, 932, 933,
+ 267, 268, 269, 935, 936, 937>
+ VS90;
+
+// Visual Studio 2010
+typedef CrtMfcPatch<msvcr100d_dll, mfc100d_dll, mfc100ud_dll,
+ vector_new_name, vector_new_dbg_name,
+ scalar_new_name, scalar_new_dbg_name,
+ 267, 268, 269, 1405, 1406, 1407,
+ 267, 268, 269, 1412, 1413, 1414>
+ VS100;