"Eric" == Eric Pouech pouech-eric@wanadoo.fr writes:
>> Why should expecting a NULL return be wrong? It happens, as the the >> crashes show. Eric> no. the cases are different. The ones you refer to (mainly in Eric> driver.c) use a hDrvr passed by the called. So, we have to catch Eric> erroneous hDrvr values. The case in lolvldrv.c is different. The Eric> hDrvr used is the one returned by the call to OpenDriver in the Eric> same function. That's why it shouldn't fail (unless someone closes Eric> the driver between the call to OpenDriver and the one to Eric> DRIVER_FindFromHDrvr - and yes, winmm functions should be made Eric> reentrant, why they are not today) A+
Eric,
we discussed the problem some time ago, and came to no conclusion. You requested a debug log, but I didn't hit that error in the meantime. Now I hit it again.
I changed in winmm/driver.c LPWINE_DRIVER DRIVER_TryOpenDriver32(LPCSTR fn, LPARAM lParam2) { LPWINE_DRIVER lpDrv = NULL; HMODULE hModule = 0; LPSTR ptr; LPCSTR cause = 0;
TRACE("(%s, %08lX);\n", debugstr_a(fn), lParam2);
if ((ptr = strchr(fn, ' ')) != NULL) { *ptr++ = '\0'; while (*ptr == ' ') ptr++; if (*ptr == '\0') ptr = NULL; }
FIXME("BON: lpDrv before HeapAlloc is %p\n",lpDrv); lpDrv = HeapAlloc(GetProcessHeap(), 0, sizeof(WINE_DRIVER)); FIXME("BON: after HeapAlloc %p\n",lpDrv); if(!HeapValidate(GetProcessHeap(), 0, lpDrv)) { FIXME("BON:HeapValidate failed\n"); }
A +relay,+heap,+winmm,+driver log looks like:
trace:winmm:MMDRV_Install ('wineoss.drv', 'wineoss.drv', mapper=N); trace:driver:OpenDriverA ("wineoss.drv", (null), 0x00000000); 0009:Call kernel32.lstrcpynA(406ef9b8,406efb28 "wineoss.drv",00000080) ret=41285668 0009:Ret kernel32.lstrcpynA() retval=406ef9b8 ret=41285668 trace:driver:DRIVER_TryOpenDriver32 ("wineoss.drv", 00000000); fixme:driver:DRIVER_TryOpenDriver32 BON: HeapAlloc is (nil) 0009:Call kernel32.GetCurrentThreadId() ret=0a908a76 0009:Ret kernel32.GetCurrentThreadId() retval=00000009 ret=0a908a76 fixme:driver:DRIVER_TryOpenDriver32 BON: HeapAlloc got 0x41c401c0 0009:Call kernel32.HeapValidate(403a0000,00000000,41c401c0) ret=4128527e 0009:Call ntdll.RtlValidateHeap(403a0000,00000000,41c401c0) ret=4050a731 warn:heap:HEAP_IsRealArena Heap 0x403a0000: block 0x41c401c0 is not inside heap 0009:Ret ntdll.RtlValidateHeap() retval=00000000 ret=4050a731 0009:Ret kernel32.HeapValidate() retval=00000000 ret=4128527e fixme:driver:DRIVER_TryOpenDriver32 BON:HeapValidate failed
Strange: we don't see the RtlHeapAllocate function. But then I remember that the application (_impact.exe from the Xilinx ISE suite) uses the shsmp library for memory allocation (http://www.microquill.com/smartheap/sh_tspec.htm).
So our HeapAlloc get patched by the Microquill code, but probably HeapValidate dose not get patched and things diverge.
Eric, can we do the memory validation perhaps in some other way then by HeapValidate ?
Bye