How to add winmm.dll driver from within msacm32.dll?

a_villacis at palosanto.com a_villacis at palosanto.com
Mon Jun 6 22:29:14 CDT 2005


I recently downloaded a Japanese RPG game
(http://download.sama.jp:8080/archives/shinkiro_pre.zip) and
tried to run
it under Wine. However, it crashed with the following fatal trace:

[alex at karlalex shinkiro_pre]$ pwd
/home/alex/.wine/drive_c/shinkiro_pre
[alex at karlalex shinkiro_pre]$ LANG=ja WINEDEBUG=msacm,winmm wine
game.exe
trace:winmm:DllMain 0x7f620000 0x1 0x1
trace:winmm:WINMM_CreateIData Initialized IData (0x7f67fba0)
trace:winmm:MMDRV_Init ()
trace:winmm:MMDRV_Install ('winealsa.drv', 'winealsa.drv',
mapper=N);
ALSA lib control.c:654:(snd_ctl_open_noupdate) Invalid CTL plug:hw:0
ALSA lib pcm_hw.c:1056:(snd_pcm_hw_open) open /dev/snd/pcmC1D0p
failed: Device or resource busy
ALSA lib pcm_hw.c:1056:(snd_pcm_hw_open) open /dev/snd/pcmC1D0c
failed: Device or resource busy
trace:winmm:MMDRV_Install Got 32 bit func 'midMessage'
trace:winmm:MMDRV_Install Got 32 bit func 'modMessage'
trace:winmm:MMDRV_Install Got 32 bit func 'widMessage'
trace:winmm:MMDRV_Install Got 32 bit func 'wodMessage'
trace:winmm:MMDRV_GetDescription32 (0x7fa9fc54, 0x7fa9f998, 128)
trace:winmm:MMDRV_GetDescription32 Can't find file winealsa.drv
trace:winmm:MMDRV_Install winealsa.drv => No description
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0000, 0003)
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0001, 0001)
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0002, 0035)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 1 dev for (winealsa.drv:MidiIn)
trace:winmm:MMDRV_InitPerType Setting min=0 max=1 (ttop=1) for
(winealsa.drv:MidiIn)
trace:winmm:MMDRV_InitPerType MidiIn:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0003, 0001)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 5 dev for (winealsa.drv:MidiOut)
trace:winmm:MMDRV_InitPerType Setting min=0 max=5 (ttop=5) for
(winealsa.drv:MidiOut)
trace:winmm:MMDRV_InitPerType MidiOut:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[1] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[2] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[3] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[4] -> winealsa.drv
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0004, 0032)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 1 dev for (winealsa.drv:WaveIn)
trace:winmm:MMDRV_InitPerType Setting min=0 max=1 (ttop=1) for
(winealsa.drv:WaveIn)
trace:winmm:MMDRV_InitPerType WaveIn:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_InitPerType (0x7f67f600, 0005, 0003)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 1 dev for (winealsa.drv:WaveOut)
trace:winmm:MMDRV_InitPerType Setting min=0 max=1 (ttop=1) for
(winealsa.drv:WaveOut)
trace:winmm:MMDRV_InitPerType WaveOut:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_Install ('wavemapper', 'msacm.drv', mapper=Y);
trace:msacm:DllMain 0x7f5f0000 0x1 (nil)
trace:msacm:MSACM_RegisterDriver (L"MSACM.imaadpcm",
L"imaadp32.acm", (nil))
trace:msacm:MSACM_RegisterDriver (L"MSACM.msadpcm",
L"msadp32.acm", (nil))
trace:msacm:MSACM_RegisterDriver (L"MSACM.msg711",
L"msg711.acm", (nil))
trace:msacm:MSACM_RegisterDriver (L"MSACM.winemp3",
L"winemp3.acm", (nil))
trace:msacm:MSACM_RegisterDriver (L"msacm32.dll",
L"msacm32.dll", (nil))
trace:winmm:MMDRV_Install Got 32 bit func 'widMessage'
trace:winmm:MMDRV_Install Got 32 bit func 'wodMessage'
trace:winmm:MMDRV_GetDescription32 (0x7fa9fb54, 0x7fa9f998, 128)
trace:winmm:MMDRV_GetDescription32 Can't find file msacm.drv
trace:winmm:MMDRV_Install msacm.drv => No description
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0000, 0003)
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0001, 0001)
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0002, 0035)
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0003, 0001)
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0004, 0032)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 1 dev for (wavemapper:WaveIn)
trace:winmm:MMDRV_InitPerType Setting min=0 max=0 (ttop=1) for
(wavemapper:WaveIn)
trace:winmm:MMDRV_InitPerType WaveIn:Trans[-1] -> wavemapper
trace:winmm:MMDRV_InitPerType WaveIn:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_InitPerType (0x7f67f654, 0005, 0003)
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:winmm:MMDRV_InitPerType Got 1 dev for (wavemapper:WaveOut)
trace:winmm:MMDRV_InitPerType Setting min=0 max=0 (ttop=1) for
(wavemapper:WaveOut)
trace:winmm:MMDRV_InitPerType WaveOut:Trans[-1] -> wavemapper
trace:winmm:MMDRV_InitPerType WaveOut:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_Install ('midimapper', 'midimap.drv', mapper=Y);
trace:winmm:MMDRV_GetNum (0003)
trace:winmm:midiOutGetDevCapsW (0, 0x7fa9f720, 84);
trace:winmm:MMDRV_Get ((nil), 0003, Y)
trace:winmm:MMDRV_GetByID (0000, 0003)
trace:winmm:MMDRV_Message (MidiOut 0 2 0x00000000 0x7fa9f720
0x00000054 Y)
trace:winmm:MMDRV_Message Calling message(dev=0 msg=2
usr=0x00000000 p1=0x7fa9f720 p2=0x00000054)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:midiOutGetDevCapsW (1, 0x7fa9f720, 84);
trace:winmm:MMDRV_Get (0x1, 0003, Y)
trace:winmm:MMDRV_GetByID (0001, 0003)
trace:winmm:MMDRV_Message (MidiOut 1 2 0x00000000 0x7fa9f720
0x00000054 Y)
trace:winmm:MMDRV_Message Calling message(dev=1 msg=2
usr=0x00000000 p1=0x7fa9f720 p2=0x00000054)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:midiOutGetDevCapsW (2, 0x7fa9f720, 84);
trace:winmm:MMDRV_Get (0x2, 0003, Y)
trace:winmm:MMDRV_GetByID (0002, 0003)
trace:winmm:MMDRV_Message (MidiOut 2 2 0x00000000 0x7fa9f720
0x00000054 Y)
trace:winmm:MMDRV_Message Calling message(dev=2 msg=2
usr=0x00000000 p1=0x7fa9f720 p2=0x00000054)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:midiOutGetDevCapsW (3, 0x7fa9f720, 84);
trace:winmm:MMDRV_Get (0x3, 0003, Y)
trace:winmm:MMDRV_GetByID (0003, 0003)
trace:winmm:MMDRV_Message (MidiOut 3 2 0x00000000 0x7fa9f720
0x00000054 Y)
trace:winmm:MMDRV_Message Calling message(dev=3 msg=2
usr=0x00000000 p1=0x7fa9f720 p2=0x00000054)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:midiOutGetDevCapsW (4, 0x7fa9f720, 84);
trace:winmm:MMDRV_Get (0x4, 0003, Y)
trace:winmm:MMDRV_GetByID (0004, 0003)
trace:winmm:MMDRV_Message (MidiOut 4 2 0x00000000 0x7fa9f720
0x00000054 Y)
trace:winmm:MMDRV_Message Calling message(dev=4 msg=2
usr=0x00000000 p1=0x7fa9f720 p2=0x00000054)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:MMDRV_Install Got 32 bit func 'modMessage'
trace:winmm:MMDRV_GetDescription32 (0x7fa9fa54, 0x7fa9f98c, 128)
trace:winmm:MMDRV_GetDescription32 Can't find file midimap.drv
trace:winmm:MMDRV_Install midimap.drv => No description
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0000, 0003)
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0001, 0001)
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0002, 0035)
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0003, 0001)
trace:msacm:MIDIMAP_modMessage (0, 0064, 00000000, 00000000,
00000000);
trace:winmm:MMDRV_InitPerType DRVM_INIT => MMSYSERR_NOERROR
trace:msacm:MIDIMAP_modMessage (0, 0001, 00000000, 00000000,
00000000);
trace:winmm:MMDRV_InitPerType Got 1 dev for (midimapper:MidiOut)
trace:winmm:MMDRV_InitPerType Setting min=0 max=0 (ttop=5) for
(midimapper:MidiOut)
trace:winmm:MMDRV_InitPerType MidiOut:Trans[-1] -> midimapper
trace:winmm:MMDRV_InitPerType MidiOut:Trans[0] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[1] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[2] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[3] -> winealsa.drv
trace:winmm:MMDRV_InitPerType MidiOut:Trans[4] -> winealsa.drv
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0004, 0032)
trace:winmm:MMDRV_InitPerType (0x7f67f6a8, 0005, 0003)
trace:winmm:joyGetPos (0, 0x7fa9f2b8);
trace:winmm:MMDRV_GetNum (0005)
trace:winmm:waveOutMessage ((nil), 2068, 2141844160, 0)
trace:winmm:MMDRV_Get ((nil), 0005, N)
trace:winmm:MMDRV_Get ((nil), 0005, Y)
trace:winmm:MMDRV_GetByID (0000, 0005)
trace:winmm:MMDRV_PhysicalFeatures (0x7fe01b8c, 0814, 7fa9f2c0,
00000000)
trace:winmm:MMDRV_Message (WaveOut 0 2068 0x00000000 0x7fa9f2c0
0x00000000 Y)
trace:winmm:MMDRV_Message Calling message(dev=0 msg=2068
usr=0x00000000 p1=0x7fa9f2c0 p2=0x00000000)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:WAVE_Open (0x7fe19304, 0, Out, 0x7fe163a0, 7D70B324,
7FE19068, 00030080, 32);
trace:winmm:WAVE_Open wFormatTag=1, nChannels=2,
nSamplesPerSec=22050, nAvgBytesPerSec=44100, nBlockAlign=2,
wBitsPerSample=8
trace:winmm:MMDRV_Alloc (28, 0005, 0x7fa9f298, 0x7fa9f2e8,
0x7fa9f2e0, 0x7fa9f2e4, Y)
trace:winmm:MMDRV_GetNum (0005)
trace:winmm:WAVE_Open cb=7d70b324
trace:winmm:MMDRV_Open (0x7fe18dd8, 0005, 0x7fa9f29c, 0x00030080)
trace:winmm:MMDRV_Open Setting mmdIndex to 0
trace:winmm:MMDRV_Message (WaveOut 0 5 0x7fa9f268 0x7fa9f29c
0x00030080 Y)
trace:winmm:MMDRV_Message Calling message(dev=0 msg=5
usr=0x7fa9f268 p1=0x7fa9f29c p2=0x00030080)
trace:winmm:MMDRV_Message => MMSYSERR_NOERROR
trace:winmm:WAVE_Open dwRet = MMSYSERR_NOERROR
trace:winmm:WAVE_Open => MMSYSERR_NOERROR hWave=0x8000
trace:msacm:acmDriverAddA (0x7fa9f3d4, 0x10000000, 10001040,
00000000, 00000003)
trace:msacm:MSACM_RegisterDriver ((null), (null), 0x10000000)
err:msacm:MSACM_GetRegistryKey No alias needed for registry entry
trace:msacm:acmDriverOpen (0x7fa9ebc0, 0x7d7d03f8, 00000000)
trace:msacm:acmDriverOpen '(null)' => 7d7d0430
wine: Unhandled exception (thread 0009), starting debugger...
WineDbg starting on pid 0x8
Unhandled exception: page fault on write access to 0x7b480000 in
32-bit code (0x47415b47).
In 32 bit mode.
Register dump:
 CS:0073 SS:007b DS:007b ES:007b FS:003b GS:0033
 EIP:47415b47 ESP:7fa9eb60 EBP:7fa9eb80 EFLAGS:00210246(   - 00
     -RIZP1)
 EAX:00000000 EBX:77ef5f14 ECX:3fffc006 EDX:00000000
 ESI:fffffff8 EDI:7b480000
Stack dump:
0x7fa9eb60:  7b470020 77eca05e 7b470020 00000000
0x7fa9eb70:  fffffff8 77ef5f14 7b470020 fffffff8
0x7fa9eb80:  7fa9eba8 77ec93b8 7b470020 fffffff8
0x7fa9eb90:  00000000 7d7d0000 7b470000 7f60798c
0x7fa9eba0:  7d7d03f8 7d7d03f8 7fa9f360 7f60069f
0x7fa9ebb0:  7d7d0000 0000000a fffffff8 77eea224
Backtrace:
=>1 0x47415b47 __GI_memset in libc.so.6 (0x7fa9eb80)
  2 0x77ec93b8 RtlAllocateHeap(heap=0x7d7d0000, flags=0xa,
size=0xfffffff8)
[/home/alex/install/wine/wine-20050524-patch/dlls/ntdll/heap.c:1179]
in ntdll (0x7fa9eba8)
  3 0x7f60069f MSACM_FillCache+0x197(padid=0x7d7d03f8)
[/home/alex/install/wine/wine-20050524-patch/dlls/msacm/internal.c:106]
in msacm32 (0x7fa9f360)
  4 0x7f600b1c MSACM_RegisterDriver(pszDriverAlias=0x0,
pszFileName=0x0, hinstModule=0x10000000)
[/home/alex/install/wine/wine-20050524-patch/dlls/msacm/internal.c:279]
in msacm32 (0x7fa9f37c)
  5 0x7f5fd580 acmDriverAddA+0x4c(phadid=0x7fa9f3d4,
hinstModule=0x10000000, lParam=0x10001040, dwPriority=0x0,
fdwAdd=0x3) [driver.c:79] in msacm32 (0x7fa9f39c)
  6 0x0045bb45 in game (+0x5bb45) (0x7fa9ff2c)
  7 0x7fd2105b start_process+0xc3(arg=0x0)
[/home/alex/install/wine/wine-20050524-patch/dlls/kernel/process.c:1044]
in kernel32 (0x7fa9fff4)
  8 0xb7f5b70d wine_switch_to_stack+0x11 in libwine.so.1
(0x00000000)
0x47415b47 __GI_memset+0x37 in libc.so.6: repe stosl    %es:(%edi)
Modules:
Module  Address                 Debug info      Name (81 modules)
ELF     0x001d5000-0027e000     Deferred        libasound.so.2
ELF     0x001d5000-0027e000     Deferred        libasound.so.2
ELF     0x002a1000-002b2000     Deferred        libz.so.1
ELF     0x002b4000-00319000     Deferred        libfreetype.so.6
ELF     0x0031b000-00342000     Deferred        libfontconfig.so.1
ELF     0x003b2000-0047a000     Deferred        libx11.so.6
PE      0x00400000-008d7000     Export          game
ELF     0x00cba000-00cc8000     Deferred        libxext.so.6
ELF     0x00cca000-00ce1000     Deferred        libice.so.6
ELF     0x00cdb000-00ce1000     Deferred        libxxf86dga.so.1
ELF     0x00ce3000-00ceb000     Deferred        libsm.so.6
ELF     0x00d01000-00d09000     Deferred        libxrender.so.1
ELF     0x00d0b000-00d0e000     Deferred        libxrandr.so.2
ELF     0x00d3b000-00d40000     Deferred        libxxf86vm.so.1
ELF     0x00dbf000-00dc8000     Deferred        libxcursor.so.1
PE      0x10000000-10138000     Deferred        vorbis.acm
ELF     0x47395000-473ac000     Deferred        ld-linux.so.2
ELF     0x473ae000-474ca000     Export          libc.so.6
ELF     0x474cc000-474ef000     Deferred        libm.so.6
ELF     0x474f1000-474f5000     Deferred        libdl.so.2
ELF     0x475e4000-475f6000     Deferred        libpthread.so.0
ELF     0x476ba000-476d9000     Deferred        libexpat.so.0
ELF     0x77e90000-77f00000     Stabs           ntdll<elf>
  \-PE  0x77eb0000-77f00000     \               ntdll
ELF     0x77f00000-77f03000     Deferred        <wine-loader>
ELF     0x7b8c0000-7b8d4000     Deferred        joystick.drv<elf>
  \-PE  0x7b8d0000-7b8d4000     \               joystick.drv
ELF     0x7d4b6000-7d4c0000     Deferred        xomgeneric.so.2
ELF     0x7d6dd000-7d722000     Deferred        dsound<elf>
  \-PE  0x7d6f0000-7d722000     \               dsound
ELF     0x7d722000-7d790000     Deferred        ddraw<elf>
  \-PE  0x7d740000-7d790000     \               ddraw
ELF     0x7d98c000-7d9b6000     Deferred        winealsa.drv<elf>
  \-PE  0x7d9a0000-7d9b6000     \               winealsa.drv
ELF     0x7f0ec000-7f109000     Deferred        ximcp.so.2
ELF     0x7f110000-7f128000     Deferred        msacm.drv<elf>
  \-PE  0x7f120000-7f128000     \               msacm.drv
ELF     0x7f29d000-7f311000     Deferred        winex11.drv<elf>
  \-PE  0x7f2b0000-7f311000     \               winex11.drv
ELF     0x7f3b2000-7f3c7000     Deferred        midimap.drv<elf>
  \-PE  0x7f3c0000-7f3c7000     \               midimap.drv
ELF     0x7f3c7000-7f3ca000     Deferred        xlcdef.so.2
ELF     0x7f3ca000-7f41d000     Deferred        shlwapi<elf>
  \-PE  0x7f3e0000-7f41d000     \               shlwapi
ELF     0x7f41d000-7f4d1000     Deferred        shell32<elf>
  \-PE  0x7f440000-7f4d1000     \               shell32
ELF     0x7f4d1000-7f56e000     Deferred        comctl32<elf>
  \-PE  0x7f4e0000-7f56e000     \               comctl32
ELF     0x7f56e000-7f591000     Deferred        msvfw32<elf>
  \-PE  0x7f580000-7f591000     \               msvfw32
ELF     0x7f591000-7f5cb000     Deferred        avifil32<elf>
  \-PE  0x7f5a0000-7f5cb000     \               avifil32
ELF     0x7f5cb000-7f5e8000     Deferred        imm32<elf>
  \-PE  0x7f5d0000-7f5e8000     \               imm32
ELF     0x7f5e8000-7f609000     Stabs           msacm32<elf>
  \-PE  0x7f5f0000-7f609000     \               msacm32
ELF     0x7f609000-7f680000     Deferred        winmm<elf>
  \-PE  0x7f620000-7f680000     \               winmm
ELF     0x7f680000-7f705000     Deferred        oleaut32<elf>
  \-PE  0x7f6a0000-7f705000     \               oleaut32
ELF     0x7f705000-7f723000     Deferred        iphlpapi<elf>
  \-PE  0x7f710000-7f723000     \               iphlpapi
ELF     0x7f723000-7f768000     Deferred        rpcrt4<elf>
  \-PE  0x7f740000-7f768000     \               rpcrt4
ELF     0x7f768000-7f7e2000     Deferred        ole32<elf>
  \-PE  0x7f780000-7f7e2000     \               ole32
ELF     0x7f7e2000-7f81b000     Deferred        advapi32<elf>
  \-PE  0x7f7f0000-7f81b000     \               advapi32
ELF     0x7f81b000-7f898000     Deferred        gdi32<elf>
  \-PE  0x7f830000-7f898000     \               gdi32
ELF     0x7f898000-7f9a0000     Deferred        user32<elf>
  \-PE  0x7f8c0000-7f9a0000     \               user32
ELF     0x7fcb3000-7fdb0000     Stabs           kernel32<elf>
  \-PE  0x7fce0000-7fdb0000     \               kernel32
ELF     0x7fec8000-7fed4000     Deferred        libnss_files.so.2
ELF     0x7feda000-7fef0000     Deferred        lz32<elf>
  \-PE  0x7fee0000-7fef0000     \               lz32
ELF     0x7fef0000-7ffe4000     Deferred        libwine_unicode.so.1
ELF     0x7ffe5000-7fffe000     Deferred        version<elf>
  \-PE  0x7fff0000-7fffe000     \               version
ELF     0xb7f57000-b7f6f000     DIA             libwine.so.1
Threads:
process  tid      prio (all id:s are in hex)
00000008 (D) C:\shinkiro_pre\game.exe
        0000000a   15
        00000009    0 <==
WineDbg terminated on pid 0x8
[alex at karlalex shinkiro_pre]$

I believe the following sequence of events is taking place:

- The function acmDriverAdd is called by the executable with
these parameters:
  trace:msacm:acmDriverAddA (0x7fa9f3d4, 0x10000000, 10001040,
00000000, 00000003)

  That is: hinstModule == 0x10000000, fdwAdd ==
ACM_DRIVERADDF_FUNCTION, lParam (acmDriverProc) == 0x10001040
- After verifying that the parameters are valid, the function calls:
  *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL, NULL,
hinstModule);

  Note that lParam is ignored (it even says so in a comment
within the same file)

- The MSACM_RegisterDriver() function, in turn, calls
MSACM_FillCache().
- MSACM_FillCache() calls MSACM_Message() in order to initialize a
  ACMDRIVERDETAILSW structure. However, this function eventually
requires that
  hinstModule be a valid LPWINE_DRIVER reference, which it is
not - it is not
  even a valid pointer (as reported by
HeapValidate(GetProcessHeap(), 0, ptr)).
  Presumably hinstModule is a reference to the executable
itself, and
  lParam(acmDriverProc) was expected to be enough to build a
complete driver
  reference. The net result is that the ACMDRIVERDETAILSW
structure remains
  uninitialized.
- A HeapAlloc() is attempted based on the fields of the
uninitialized structure.
- (Segmentation fault)

I tried the following change in acmDriverAddA() at
dlls/msacm/driver.c:

    if (!hinstModule) {
        return MMSYSERR_INVALHANDLE;
    } else {
#define WINE_DI_MAGIC   0x900F1B01
        unsigned int * d = (unsigned int *)hinstModule;
        if (HeapValidate(GetProcessHeap(), 0, d) && *d ==
WINE_DI_MAGIC) {
            *phadid = (HACMDRIVERID) MSACM_RegisterDriver(NULL,
NULL, hinstModule);
        } else {
            return MMSYSERR_INVALHANDLE;
        }
    }

This essentially checks for the preconditions required for the
remainder of the
code. However, I believe this to be incomplete. So, the obvious
solution should be
to build a LPWINE_DRIVER function and add its reference to the
chain maintained
by winmm.dll. However, I am not sure of how to proceed from
here. Since
dlls/msacm/driver.c and dlls/winmm/driver.c end up in different
DLLs, I don't
think writing a function to manipulate the chain at
dlls/winmm/driver.c could be
called from dlls/msacm/driver.c without exporting it in the spec
file. No
obvious documented function in the spec file of winmm suggests
itself as appropriate
for the task of building a driver reference from outside
winmm.dll, given only
the driverProc.

How is this solved in other cases (that is, in a way that does
not prevent the
resulting patch from being accepted)?


Alex Villacís Lasso

------------------------------------------------------------------------
Mail enviado desde PortalMail 1.4.2 Web based email system.
PaloSanto Solutions, Sunnyvale CA.
http://www.palosanto.com




More information about the wine-devel mailing list