msvcrt: Don't use default process heap.
This commit is contained in:
parent
43cd9e6d96
commit
d48314c8a5
|
@ -38,6 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(msvcrt);
|
|||
((((DWORD_PTR)((char *)ptr + alignment + sizeof(void *) + offset)) & \
|
||||
~(alignment - 1)) - offset))
|
||||
|
||||
static HANDLE heap;
|
||||
|
||||
typedef int (CDECL *MSVCRT_new_handler_func)(MSVCRT_size_t size);
|
||||
|
||||
|
@ -59,7 +60,7 @@ void* CDECL MSVCRT_operator_new(MSVCRT_size_t size)
|
|||
|
||||
do
|
||||
{
|
||||
retval = HeapAlloc(GetProcessHeap(), 0, size);
|
||||
retval = HeapAlloc(heap, 0, size);
|
||||
if(retval)
|
||||
{
|
||||
TRACE("(%ld) returning %p\n", size, retval);
|
||||
|
@ -94,7 +95,7 @@ void* CDECL MSVCRT_operator_new_dbg(MSVCRT_size_t size, int type, const char *fi
|
|||
void CDECL MSVCRT_operator_delete(void *mem)
|
||||
{
|
||||
TRACE("(%p)\n", mem);
|
||||
HeapFree(GetProcessHeap(), 0, mem);
|
||||
HeapFree(heap, 0, mem);
|
||||
}
|
||||
|
||||
|
||||
|
@ -166,7 +167,7 @@ int CDECL _callnewh(MSVCRT_size_t size)
|
|||
*/
|
||||
void* CDECL _expand(void* mem, MSVCRT_size_t size)
|
||||
{
|
||||
return HeapReAlloc(GetProcessHeap(), HEAP_REALLOC_IN_PLACE_ONLY, mem, size);
|
||||
return HeapReAlloc(heap, HEAP_REALLOC_IN_PLACE_ONLY, mem, size);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -174,7 +175,7 @@ void* CDECL _expand(void* mem, MSVCRT_size_t size)
|
|||
*/
|
||||
int CDECL _heapchk(void)
|
||||
{
|
||||
if (!HeapValidate( GetProcessHeap(), 0, NULL))
|
||||
if (!HeapValidate( heap, 0, NULL))
|
||||
{
|
||||
msvcrt_set_errno(GetLastError());
|
||||
return MSVCRT__HEAPBADNODE;
|
||||
|
@ -187,7 +188,7 @@ int CDECL _heapchk(void)
|
|||
*/
|
||||
int CDECL _heapmin(void)
|
||||
{
|
||||
if (!HeapCompact( GetProcessHeap(), 0 ))
|
||||
if (!HeapCompact( heap, 0 ))
|
||||
{
|
||||
if (GetLastError() != ERROR_CALL_NOT_IMPLEMENTED)
|
||||
msvcrt_set_errno(GetLastError());
|
||||
|
@ -209,7 +210,7 @@ int CDECL _heapwalk(struct MSVCRT__heapinfo* next)
|
|||
phe.wFlags = next->_useflag == MSVCRT__USEDENTRY ? PROCESS_HEAP_ENTRY_BUSY : 0;
|
||||
|
||||
if (phe.lpData && phe.wFlags & PROCESS_HEAP_ENTRY_BUSY &&
|
||||
!HeapValidate( GetProcessHeap(), 0, phe.lpData ))
|
||||
!HeapValidate( heap, 0, phe.lpData ))
|
||||
{
|
||||
UNLOCK_HEAP;
|
||||
msvcrt_set_errno(GetLastError());
|
||||
|
@ -218,7 +219,7 @@ int CDECL _heapwalk(struct MSVCRT__heapinfo* next)
|
|||
|
||||
do
|
||||
{
|
||||
if (!HeapWalk( GetProcessHeap(), &phe ))
|
||||
if (!HeapWalk( heap, &phe ))
|
||||
{
|
||||
UNLOCK_HEAP;
|
||||
if (GetLastError() == ERROR_NO_MORE_ITEMS)
|
||||
|
@ -267,11 +268,11 @@ int CDECL _heapadd(void* mem, MSVCRT_size_t size)
|
|||
}
|
||||
|
||||
/*********************************************************************
|
||||
* _heapadd (MSVCRT.@)
|
||||
* _get_heap_handle (MSVCRT.@)
|
||||
*/
|
||||
MSVCRT_intptr_t CDECL _get_heap_handle(void)
|
||||
{
|
||||
return (MSVCRT_intptr_t)GetProcessHeap();
|
||||
return (MSVCRT_intptr_t)heap;
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -279,7 +280,7 @@ MSVCRT_intptr_t CDECL _get_heap_handle(void)
|
|||
*/
|
||||
MSVCRT_size_t CDECL _msize(void* mem)
|
||||
{
|
||||
MSVCRT_size_t size = HeapSize(GetProcessHeap(),0,mem);
|
||||
MSVCRT_size_t size = HeapSize(heap,0,mem);
|
||||
if (size == ~(MSVCRT_size_t)0)
|
||||
{
|
||||
WARN(":Probably called with non wine-allocated memory, ret = -1\n");
|
||||
|
@ -309,7 +310,7 @@ size_t CDECL _aligned_msize(void *p, MSVCRT_size_t alignment, MSVCRT_size_t offs
|
|||
*/
|
||||
void* CDECL MSVCRT_calloc(MSVCRT_size_t size, MSVCRT_size_t count)
|
||||
{
|
||||
return HeapAlloc( GetProcessHeap(), HEAP_ZERO_MEMORY, size * count );
|
||||
return HeapAlloc( heap, HEAP_ZERO_MEMORY, size * count );
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -317,7 +318,7 @@ void* CDECL MSVCRT_calloc(MSVCRT_size_t size, MSVCRT_size_t count)
|
|||
*/
|
||||
void CDECL MSVCRT_free(void* ptr)
|
||||
{
|
||||
HeapFree(GetProcessHeap(),0,ptr);
|
||||
HeapFree(heap,0,ptr);
|
||||
}
|
||||
|
||||
/*********************************************************************
|
||||
|
@ -325,7 +326,7 @@ void CDECL MSVCRT_free(void* ptr)
|
|||
*/
|
||||
void* CDECL MSVCRT_malloc(MSVCRT_size_t size)
|
||||
{
|
||||
void *ret = HeapAlloc(GetProcessHeap(),0,size);
|
||||
void *ret = HeapAlloc(heap,0,size);
|
||||
if (!ret)
|
||||
*MSVCRT__errno() = MSVCRT_ENOMEM;
|
||||
return ret;
|
||||
|
@ -337,7 +338,7 @@ void* CDECL MSVCRT_malloc(MSVCRT_size_t size)
|
|||
void* CDECL MSVCRT_realloc(void* ptr, MSVCRT_size_t size)
|
||||
{
|
||||
if (!ptr) return MSVCRT_malloc(size);
|
||||
if (size) return HeapReAlloc(GetProcessHeap(), 0, ptr, size);
|
||||
if (size) return HeapReAlloc(heap, 0, ptr, size);
|
||||
MSVCRT_free(ptr);
|
||||
return NULL;
|
||||
}
|
||||
|
@ -715,3 +716,14 @@ int CDECL MSVCRT_strncpy_s(char *dest, MSVCRT_size_t numberOfElements,
|
|||
dest[0] = '\0';
|
||||
return MSVCRT_EINVAL;
|
||||
}
|
||||
|
||||
BOOL msvcrt_init_heap(void)
|
||||
{
|
||||
heap = HeapCreate(0, 0, 0);
|
||||
return heap != NULL;
|
||||
}
|
||||
|
||||
void msvcrt_destroy_heap(void)
|
||||
{
|
||||
HeapDestroy(heap);
|
||||
}
|
||||
|
|
|
@ -98,12 +98,17 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
|||
{
|
||||
case DLL_PROCESS_ATTACH:
|
||||
msvcrt_init_exception(hinstDLL);
|
||||
if (!msvcrt_init_tls())
|
||||
if(!msvcrt_init_heap())
|
||||
return FALSE;
|
||||
if(!msvcrt_init_tls()) {
|
||||
msvcrt_destroy_heap();
|
||||
return FALSE;
|
||||
}
|
||||
msvcrt_init_mt_locks();
|
||||
if(!msvcrt_init_locale()) {
|
||||
msvcrt_free_mt_locks();
|
||||
msvcrt_free_tls_mem();
|
||||
msvcrt_destroy_heap();
|
||||
return FALSE;
|
||||
}
|
||||
msvcrt_init_math();
|
||||
|
@ -133,6 +138,7 @@ BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
|
|||
if (!msvcrt_free_tls())
|
||||
return FALSE;
|
||||
MSVCRT__free_locale(MSVCRT_locale);
|
||||
msvcrt_destroy_heap();
|
||||
TRACE("finished process free\n");
|
||||
break;
|
||||
case DLL_THREAD_DETACH:
|
||||
|
|
|
@ -274,6 +274,8 @@ extern void msvcrt_free_args(void) DECLSPEC_HIDDEN;
|
|||
extern void msvcrt_init_signals(void) DECLSPEC_HIDDEN;
|
||||
extern void msvcrt_free_signals(void) DECLSPEC_HIDDEN;
|
||||
extern void msvcrt_free_popen_data(void) DECLSPEC_HIDDEN;
|
||||
extern BOOL msvcrt_init_heap(void) DECLSPEC_HIDDEN;
|
||||
extern void msvcrt_destroy_heap(void) DECLSPEC_HIDDEN;
|
||||
|
||||
extern unsigned msvcrt_create_io_inherit_block(WORD*, BYTE**) DECLSPEC_HIDDEN;
|
||||
|
||||
|
|
Loading…
Reference in New Issue