ntdll: add partial support for HEAP_FREE_CHECKING_ENABLED heap overrun detection (take 2)

Alexandre Julliard julliard at winehq.org
Thu Dec 3 04:38:17 CST 2009


Dan Kegel <dank at kegel.com> writes:

> @@ -467,6 +475,156 @@ static void test_HeapQueryInformation(void)
>      ok(info == 0 || info == 1 || info == 2, "expected 0, 1 or 2, got %u\n", info);
>  }
>  
> +static LPVOID   (WINAPI * pRtlAllocateHeap)(HANDLE,ULONG,ULONG);
> +static HANDLE   (WINAPI * pRtlCreateHeap)(ULONG,PVOID,SIZE_T,SIZE_T,PVOID,PRTL_HEAP_DEFINITION);
> +static HANDLE   (WINAPI * pRtlDestroyHeap)(HANDLE);
> +static NTSTATUS (WINAPI * pRtlFreeHeap)(HANDLE, ULONG, PVOID);
> +static ULONG    (WINAPI * pRtlGetNtGlobalFlags)(void);
> +static LPVOID   (WINAPI * pRtlReAllocateHeap)(HANDLE, ULONG, PVOID, ULONG);
> +static SIZE_T   (WINAPI * pRtlSizeHeap)( HANDLE, ULONG, LPCVOID);
> +static BOOLEAN  (WINAPI * pRtlValidateHeap)(HANDLE, ULONG, LPCVOID);
> +
> +static HMODULE hntdll;

Now that it's in kernel32 you should of course use the kernel32 heap
functions instead.

> @@ -348,7 +349,10 @@ HANDLE thread_init(void)
>      peb->NtGlobalFlag = get_global_flag();
>  
>      /* create the process heap */
> -    if (!(peb->ProcessHeap = RtlCreateHeap( HEAP_GROWABLE, NULL, 0, 0, NULL, NULL )))
> +    heapflags = HEAP_GROWABLE;
> +    if (peb->NtGlobalFlag & FLG_HEAP_ENABLE_FREE_CHECK)
> +        heapflags |= HEAP_FREE_CHECKING_ENABLED;
> +    if (!(peb->ProcessHeap = RtlCreateHeap( heapflags, NULL, 0, 0, NULL, NULL )))

Is there any reason for not doing this for all created heaps, instead of
just the main one?

-- 
Alexandre Julliard
julliard at winehq.org



More information about the wine-devel mailing list