I spent most of the weekend trying to get Grand Prix Legends GPL to
work. I achieved my first goal of getting it to run in server mode.
One of the things I needed to get the game to do, was to recognise
that there where some interfaces it could talk TCP/IP out of. It took
me some time to realise that under windows it was doing this by
looking for the key
[System\\CurrentControlSet\\Services\\Class\\NetTrans]
and was then enumerating the keys under it to establish an IP address
ie the following
[System\\CurrentControlSet\\Services\\Class\\NetTrans\\0000]
"IPAddress"="10.0.10.100"
The thought occurred to me that maybe the tool the builds the registry
during wine install could actually create these keys - since it is
essentially a key part of the system (and other similar keys are also
built in the same way).
I don't think I have the skills to do it myself yet.
Alan
alan(a)chandlerfamily.org.uk
http://www.chandler.u-net.com
Howdy,
Here is a symptom that has crept into the recent version of wine. Since
I know how to make things work, this is just a post in case someone is
interested.
When I recently updated to the Feb 24 CVS version (from the Feb 4
version), I suddenly had the symptom that I could only run one program
at a time. In other words, I ran the program schedit (one I use
regularly), and it came up and worked fine. But when I then tried to
also run symed, it would not come up, but instead gave:
err:ntdll:RtlpWaitForCriticalSection Critical section 0x400f9ad0
wait timed out, retrying (60 sec) fs=022f
Where the address 0x400f9ad0 is in:
disas 0x400f9ad0
0x400f9ad0 (peb_lock [rtl.c]): addb %al,0x0(%eax)
0x400f9ad2 (peb_lock+0x2 [rtl.c]): addb %al,0x0(%eax)
0x400f9ad4 (peb_lock+0x4 [rtl.c]):
0x400f9ad6 (peb_lock+0x6 [rtl.c]):
0x400f9ad8 (peb_lock+0x8 [rtl.c]): addb %al,0x0(%eax)
0x400f9ada (peb_lock+0xa [rtl.c]): addb %al,0x0(%eax)
0x400f9adc (peb_lock+0xc [rtl.c]): addb %al,0x0(%eax)
0x400f9ade (peb_lock+0xe [rtl.c]): addb %al,0x0(%eax)
0x400f9ae0 (peb_lock+0x10 [rtl.c]): cmpb $0,%al
0x400f9ae2 (peb_lock+0x12 [rtl.c]): addb %al,0x0(%eax)
Wine-dbg>
Trying a couple other programs showed that this affected all of them. In
particular, one that is more readily available, Wordview97. For example,
I could run one instance of wordview, but not a second. This is running
wine along with a Win98 installation.
It turns out the for some obscure reason I had the DLLs exactly as in
the sample config file, except that I had:
"DefaultLoadOrder" = "builtin, native, so"
Putting it the (presumably) right way fixed things (except a wordview
font problem):
"DefaultLoadOrder" = "native, builtin, so"
Here is info on the the loading of DLLs. The only differences I see with
native first is with ole32 being native instead of builtin, and that
rpcrt4 gets loaded much later.
Here is with "DefaultLoadOrder" = "native, builtin, so"
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\kernel32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\advapi32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\gdi32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\user32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\ole32.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\mso97v.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module 'C:\Program
Files\WordView\wwint32v.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\shlwapi.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\comctl32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\shell32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\winspool.drv' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'krnl386.exe' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'system' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'wprocs' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'GDI.EXE' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\WINDOWS\SYSTEM\wineps.DLL' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'USER.EXE' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\WINDOWS\SYSTEM\x11drv.DLL' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'display' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\comdlg32.dll' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'commdlg.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\rpcrt4.dll' : native
And here is with "DefaultLoadOrder" = "builtin, native, so"
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\kernel32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\advapi32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\gdi32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\user32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\rpcrt4.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\ole32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\mso97v.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module 'C:\Program
Files\WordView\wwint32v.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\shlwapi.dll' : native
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\comctl32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\shell32.dll' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\winspool.drv' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'krnl386.exe' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'system' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'wprocs' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'GDI.EXE' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\WINDOWS\SYSTEM\wineps.DLL' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'USER.EXE' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\WINDOWS\SYSTEM\x11drv.DLL' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'display' : builtin
trace:loaddll:MODULE_LoadLibraryExA Loaded module
'C:\windows\system\comdlg32.dll' : builtin
trace:loaddll:MODULE_LoadModule16 Loaded module 'commdlg.dll' : builtin
And here is a short message from Gerard, regarding a trace I had sent
him. Both traces are from running Wordview, where the first one came up
ok and the second crashed (the behavior changed when run with these
debug messages enabled):
Here is what your app (actually, probably rpcrt4 for Win9x) is doing :
Call kernel32.193:
CreateFileMappingA(ffffffff,00000000,00000004,00000000,00000400,7fbd4a7c
"rpcrt4sharedmem") ret=7fb9177b fs=008f
Ret kernel32.193: CreateFileMappingA() retval=00000048 ret=7fb9177b
fs=008f
Call kernel32.419: GetLastError() ret=7fb9178e fs=008f
Ret kernel32.419: GetLastError() retval=00000000 ret=7fb9178e fs=008f
Call kernel32.632:
MapViewOfFile(00000048,00000002,00000000,00000000,00000000) ret=7fb917ac
fs=008f
Ret kernel32.632: MapViewOfFile() retval=40349000 ret=7fb917ac fs=008f
Call kernel32.553: HeapCreate(04000000,00001000,00000000) ret=7fb95c0f
fs=008f
Ret kernel32.553: HeapCreate() retval=65430000 ret=7fb95c0f fs=008f
Call kernel32.551: HeapAlloc(65430000,00000000,00000040) ret=7fb95bf9
fs=008f
Ret kernel32.551: HeapAlloc() retval=6543009c ret=7fb95bf9
fs=008f
So, we have created a shared memory area and allocated memory at
65430000
Now here is what the next process is doing :
Call kernel32.193:
CreateFileMappingA(ffffffff,00000000,00000004,00000000,00000400,7fbd4a7c
"rpcrt4sharedmem") ret=7fb9177b fs=008f
Ret kernel32.193: CreateFileMappingA() retval=00000048 ret=7fb9177b
fs=008f
Call kernel32.419: GetLastError() ret=7fb9178e fs=008f
Ret kernel32.419: GetLastError() retval=000000b7 ret=7fb9178e fs=008f
Call kernel32.632:
MapViewOfFile(00000048,00000002,00000000,00000000,00000000) ret=7fb917ac
fs=008f
Ret kernel32.632: MapViewOfFile() retval=40349000 ret=7fb917ac fs=008f
Call kernel32.380: GetCurrentProcessId() ret=7fb95d5b fs=008f
Ret kernel32.380: GetCurrentProcessId() retval=0808e1b8 ret=7fb95d5b
fs=008f
Call user32.422: MessageBoxA(00000000,40474ae0 "Unhandled page fault on
read access to 0x654300b0
We have opened the shared memory (this is working since GetLastError
returns
that the file already exists : 000000b7), and tried to access data at
0x654300b0. This is
failing it seems (you could try to run with -debugmsg +seh to confirm
that an
exception is occuring there)
Note that the second process has allocated *no memory* at this place;
from where
is coming this 654300b0 value ? I guess from the shared memory.
Duane
I've got a lot of the wine support kernel module written now. Its system call
latency seems to be down at near half that of Win2000 for mutexes, though
there's no guarantee that my benchmark programs produce meaningful numbers.
I've also got PE Image mapping done (with pages fixed up on demand and marked
as discardable). So if anything, Wine might want to steal that if the module
as a whole is not used. This bit requires virtually no changes to the kernel
itself, just half a dozen or so extra symbols to be exported.
The module image size stands currently at about 30K.
Status:
PART STATE
====================================== ==========================
General object infrastructure done
HANDLE infrastructure mostly done
Waiting calls partly done
Exception handling not done
Win32 error handling not done, uses UNIX errno
UNICODE handling ignored, all ASCII
Security handling ignored
Mutex objects done
Semaphore objects done
Event objects done
File objects (synchronous access) mostly done
File objects (asynchronous access) not done
Shared memory objects mostly done
Process objects slightly done
Thread objects slightly done
Registry objects not done
NT Port objects not done
NT Token objects not done
W2K Job objects not done
Net Communications not done
userspace access library up to date
strace mostly up to date
Cheers,
David
The attached patch removes the explicit load of the PostScript driver
from MAIN_GdiInit. Instead, when a function calls DRIVER_FindDriver to
get a drivers DC_FUNCTIONS, DRIVER_FindDriver will attempt to load a
named driver if it hasn't already registered itself.
This appears to work for printing from Lotus Notes. I'd appreciate some
feedback from people using other applications, however.
Also, any thoughts on the approach in general would be welcome. Thanks!
--
========================================================================
Ian Pilcher pilcher(a)concentric.net
========================================================================
--- ../wine-20010226cvs/graphics/driver.c Mon Nov 27 17:54:29 2000
+++ graphics/driver.c Tue Feb 27 18:34:08 2001
@@ -54,15 +54,25 @@
*/
const DC_FUNCTIONS *DRIVER_FindDriver( LPCSTR name )
{
- GRAPHICS_DRIVER *driver = firstDriver;
+ GRAPHICS_DRIVER *driver;
+ HINSTANCE hDriver;
TRACE(": %s\n", name);
- while (driver && name)
- {
+
+ if (!name) return genericDriver ? genericDriver->funcs : NULL;
+
+ for (driver = firstDriver; driver; driver = driver->next)
if (!strcasecmp( driver->name, name )) return driver->funcs;
- driver = driver->next;
- }
- return genericDriver ? genericDriver->funcs : NULL;
+
+ if (!(hDriver = LoadLibraryA (name))) return NULL;
+
+ for (driver = firstDriver; driver; driver = driver->next)
+ if (!strcasecmp( driver->name, name )) return driver->funcs;
+
+ if (!FreeLibrary (hDriver))
+ WARN ("FreeLibrary failed with code %li\n", GetLastError ());
+
+ return NULL;
}
--- ../wine-20010226cvs/dlls/gdi/gdi_main.c Fri Jan 26 14:43:43 2001
+++ dlls/gdi/gdi_main.c Tue Feb 27 18:19:44 2001
@@ -24,9 +24,6 @@
/* Create the Win16 printer driver */
if (!WIN16DRV_Init()) return FALSE;
- /* PSDRV initialization */
- if (!LoadLibraryA( "wineps" )) return FALSE;
-
return TRUE;
}
The saga continues!
I've gotten my modified version of the PostScript driver to load, but it
seems to causing/exposing another problem.
WINPROC_GetPtr is being called befor WINPROC_Init during Wine
initialization. The call to WINPROC_GetPtr results from a call to
LoadLibraryExA ("COMCTL32.DLL" ...); here is the stack:
#0 HEAP_GetPtr (heap=0) at heap.c:217
#1 0x40093514 in HeapValidate (heap=0, flags=0, block=0x408ffc67) at
heap.c:1508
#2 0x4081c93f in WINPROC_GetPtr () from /usr/lib/wine/libuser32.so
#3 0x4081cbaa in WINPROC_SetProc () from /usr/lib/wine/libuser32.so
#4 0x407e280d in RegisterClassA () from /usr/lib/wine/libuser32.so
#5 0x40900058 in ANIMATE_Register () from /usr/lib/wine/libcomctl32.so
#6 0x40906412 in COMCTL32_LibMain () from /usr/lib/wine/libcomctl32.so
#7 0x400814e8 in PE_InitDLL () from /usr/lib/wine/libntdll.so
#8 0x4007d0f9 in MODULE_InitDLL () from /usr/lib/wine/libntdll.so
#9 0x4007d216 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#10 0x4007f364 in LoadLibraryExA () from /usr/lib/wine/libntdll.so
#11 0x4007f916 in LoadLibraryA () from /usr/lib/wine/libntdll.so
#12 0x40975772 in WINSPOOL_EntryPoint () from
/usr/lib/wine/libwinspool.drv.so
#13 0x400814e8 in PE_InitDLL () from /usr/lib/wine/libntdll.so
#14 0x4007d0f9 in MODULE_InitDLL () from /usr/lib/wine/libntdll.so
#15 0x4007d216 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#16 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#17 0x4007f364 in LoadLibraryExA () from /usr/lib/wine/libntdll.so
#18 0x4007f916 in LoadLibraryA () from /usr/lib/wine/libntdll.so
#19 0x4087206b in MAIN_GdiInit () from /usr/lib/wine/libgdi32.so
#20 0x400814e8 in PE_InitDLL () from /usr/lib/wine/libntdll.so
#21 0x4007d0f9 in MODULE_InitDLL () from /usr/lib/wine/libntdll.so
#22 0x4007d216 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#23 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#24 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#25 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#26 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#27 0x4007d1f0 in MODULE_DllProcessAttach () from
/usr/lib/wine/libntdll.so
#28 0x400c758c in start_process () from /usr/lib/wine/libntdll.so
#29 0x400caeed in SYSDEPS_DoCallOnStack () from
/usr/lib/wine/libntdll.so
#30 0x400caf97 in SYSDEPS_CallOnStack () from /usr/lib/wine/libntdll.so
#31 0x400cb03a in SYSDEPS_SwitchToThreadStack () from
/usr/lib/wine/libntdll.so
#32 0x400c79d7 in PROCESS_InitWine () from /usr/lib/wine/libntdll.so
#33 0x804b213 in main ()
#34 0x4027ff55 in __libc_start_main (main=0x804b1f8 <main>, argc=1,
ubp_av=0xbffff9d4,
init=0x8048728 <_init>, fini=0x804b25c <_fini>, rtld_fini=0x4000e3e4
<_dl_fini>, stack_end=0xbffff9cc)
at ../sysdeps/generic/libc-start.c:129
This is way out of my depth!
--
========================================================================
Ian Pilcher pilcher(a)concentric.net
========================================================================
"Dimitrie O. Paun" <dimi(a)cs.toronto.edu> writes:
> Would it be useful to create such a list, and maybe list
> for each of the dlls in there, why there aren't separated yet?
Here's a list of the undefined symbols that prevent separation of the
remaining dlls (I didn't include user/gdi/kernel to avoid scaring
people too much ;-)
./libddraw.so: undefined reference to `DIB_CreateDIBSection'
./libddraw.so: undefined reference to `DIB_GetDIBWidthBytes'
./libddraw.so: undefined reference to `PROFILE_GetWineIniBool'
./libddraw.so: undefined reference to `WIN_FindWndPtr'
./libddraw.so: undefined reference to `WIN_ReleaseWndPtr'
./libddraw.so: undefined reference to `X11DRV_WND_GetXWindow'
./libddraw.so: undefined reference to `display'
./libddraw.so: undefined reference to `root_window'
./libddraw.so: undefined reference to `visual'
./libopengl32.so: undefined reference to `DC_GetDCPtr'
./libopengl32.so: undefined reference to `GDI_ReleaseObj'
./libopengl32.so: undefined reference to `XFONT_GetFontObject'
./libopengl32.so: undefined reference to `display'
./libopengl32.so: undefined reference to `root_window'
./libopengl32.so: undefined reference to `visual'
./libdinput.so: undefined reference to `MOUSE_Enable'
./libdinput.so: undefined reference to `USER_Driver'
./libwinedos.so: undefined reference to `DOSMEM_Available'
./libwinedos.so: undefined reference to `DOSMEM_FreeBlock'
./libwinedos.so: undefined reference to `DOSMEM_GetBlock'
./libwinedos.so: undefined reference to `DOSMEM_Init'
./libwinedos.so: undefined reference to `DOSMEM_MapRealToLinear'
./libwinedos.so: undefined reference to `DOSMEM_wrap_seg'
./libwinedos.so: undefined reference to `EXC_RtlRaiseException'
./libwinedos.so: undefined reference to `FILE_GetUnixHandle'
./libwinedos.so: undefined reference to `INSTR_EmulateInstruction'
./libwinedos.so: undefined reference to `INT_GetRMHandler'
./libwinedos.so: undefined reference to `INT_Int09SendScan'
./libwinedos.so: undefined reference to `INT_Int33Message'
./libwinedos.so: undefined reference to `INT_RealModeInterrupt'
./libwinedos.so: undefined reference to `INT_SetRMHandler'
./libwinedos.so: undefined reference to `VGA_Clean'
./libwinedos.so: undefined reference to `_LeaveWin16Lock'
./libwinedos.so: undefined reference to `full_argv0'
./libwineps.so: undefined reference to `CloseJob16'
./libwineps.so: undefined reference to `DC_GetDCPtr'
./libwineps.so: undefined reference to `DIB_GetBitmapInfo'
./libwineps.so: undefined reference to `DIB_GetDIBWidthBytes'
./libwineps.so: undefined reference to `DRIVER_RegisterDriver'
./libwineps.so: undefined reference to `DRIVER_UnregisterDriver'
./libwineps.so: undefined reference to `DrvGetPrinterData16'
./libwineps.so: undefined reference to `DrvSetPrinterData16'
./libwineps.so: undefined reference to `GDI_GetObjPtr'
./libwineps.so: undefined reference to `GDI_ReleaseObj'
./libwineps.so: undefined reference to `OpenJob16'
./libwineps.so: undefined reference to `PROFILE_EnumWineIniString'
./libwineps.so: undefined reference to `PROFILE_GetWineIniString'
./libwineps.so: undefined reference to `SelectClipRgn16'
./libwineps.so: undefined reference to `WriteSpool16'
./libmcicda.drv.so: undefined reference to `CDROM_Close'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_Stop'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_GetCDStatus'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_Play'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_GetTracksInfo'
./libmcicda.drv.so: undefined reference to `CDROM_CloseDev'
./libmcicda.drv.so: undefined reference to `CDROM_OpenDev'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_GetSerial'
./libmcicda.drv.so: undefined reference to `CDROM_Open'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_GetNumberOfTracks'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_Pause'
./libmcicda.drv.so: undefined reference to `CDROM_SetDoor'
./libmcicda.drv.so: undefined reference to `CDROM_Audio_Seek'
./libws2_32.so: undefined reference to `SERVICE_Delete'
./libws2_32.so: undefined reference to `SERVICE_AddObject'
./libws2_32.so: undefined reference to `FILE_GetUnixHandle'
./libx11drv.so: undefined reference to `BITMAP_Driver'
./libx11drv.so: undefined reference to `BITMAP_GetWidthBytes'
./libx11drv.so: undefined reference to `CLIPBOARD_DeleteRecord'
./libx11drv.so: undefined reference to `CLIPBOARD_EmptyCache'
./libx11drv.so: undefined reference to `CLIPBOARD_GetFormatName'
./libx11drv.so: undefined reference to `CLIPBOARD_IsPresent'
./libx11drv.so: undefined reference to `CLIPBOARD_LookupFormat'
./libx11drv.so: undefined reference to `CLIPBOARD_ReleaseOwner'
./libx11drv.so: undefined reference to `CLIPPING_IntersectVisRect'
./libx11drv.so: undefined reference to `COLOR_IsSolid'
./libx11drv.so: undefined reference to `COLOR_PaletteLookupExactIndex'
./libx11drv.so: undefined reference to `COLOR_PaletteLookupPixel'
./libx11drv.so: undefined reference to `COLOR_gapEnd'
./libx11drv.so: undefined reference to `COLOR_gapFilled'
./libx11drv.so: undefined reference to `COLOR_gapStart'
./libx11drv.so: undefined reference to `COLOR_max'
./libx11drv.so: undefined reference to `COLOR_sysPal'
./libx11drv.so: undefined reference to `COLOR_sysPalTemplate'
./libx11drv.so: undefined reference to `DCE_InvalidateDCE'
./libx11drv.so: undefined reference to `DC_GetDCPtr'
./libx11drv.so: undefined reference to `DC_InitDC'
./libx11drv.so: undefined reference to `DIB_BitmapInfoSize'
./libx11drv.so: undefined reference to `DIB_CreateDIBFromBitmap'
./libx11drv.so: undefined reference to `DIB_GetBitmapInfo'
./libx11drv.so: undefined reference to `DIB_GetDIBImageBytes'
./libx11drv.so: undefined reference to `DIB_GetDIBWidthBytes'
./libx11drv.so: undefined reference to `DRAG_QueryUpdate'
./libx11drv.so: undefined reference to `DRIVER_RegisterDriver'
./libx11drv.so: undefined reference to `DeleteObject16'
./libx11drv.so: undefined reference to `EVENT_Synchronize'
./libx11drv.so: undefined reference to `FILE_DupUnixHandle'
./libx11drv.so: undefined reference to `FONT_LogFontWTo16'
./libx11drv.so: undefined reference to `GDI_AllocObject'
./libx11drv.so: undefined reference to `GDI_GetObjPtr'
./libx11drv.so: undefined reference to `GDI_ReleaseObj'
./libx11drv.so: undefined reference to `GetClipboardData16'
./libx11drv.so: undefined reference to `InputKeyStateTable'
./libx11drv.so: undefined reference to `KEYBOARD_SendEvent'
./libx11drv.so: undefined reference to `NC_IconForWindow'
./libx11drv.so: undefined reference to `Options'
./libx11drv.so: undefined reference to `PALETTE_Driver'
./libx11drv.so: undefined reference to `PROFILE_GetStringItem'
./libx11drv.so: undefined reference to `PROFILE_GetWineIniBool'
./libx11drv.so: undefined reference to `PROFILE_GetWineIniInt'
./libx11drv.so: undefined reference to `PROFILE_GetWineIniString'
./libx11drv.so: undefined reference to `PostMessage16'
./libx11drv.so: undefined reference to `REGION_LPTODP'
./libx11drv.so: undefined reference to `RestoreVisRgn16'
./libx11drv.so: undefined reference to `SELECTOR_AllocBlock'
./libx11drv.so: undefined reference to `SELECTOR_FreeBlock'
./libx11drv.so: undefined reference to `SERVICE_AddObject'
./libx11drv.so: undefined reference to `SERVICE_AddTimer'
./libx11drv.so: undefined reference to `SaveVisRgn16'
./libx11drv.so: undefined reference to `SelectClipRgn16'
./libx11drv.so: undefined reference to `SelectVisRgn16'
./libx11drv.so: undefined reference to `TWEAK_WineLook'
./libx11drv.so: undefined reference to `VIRTUAL_SetFaultHandler'
./libx11drv.so: undefined reference to `WIN_FindWndPtr'
./libx11drv.so: undefined reference to `WIN_GetDesktop'
./libx11drv.so: undefined reference to `WIN_InternalShowOwnedPopups'
./libx11drv.so: undefined reference to `WIN_LinkWindow'
./libx11drv.so: undefined reference to `WIN_LockWndPtr'
./libx11drv.so: undefined reference to `WIN_ReleaseDesktop'
./libx11drv.so: undefined reference to `WIN_ReleaseWndPtr'
./libx11drv.so: undefined reference to `WIN_RestoreWndsLock'
./libx11drv.so: undefined reference to `WIN_SuspendWndsLock'
./libx11drv.so: undefined reference to `WIN_UnlinkWindow'
./libx11drv.so: undefined reference to `WIN_UpdateWndPtr'
./libx11drv.so: undefined reference to `WIN_WindowNeedsWMBorder'
./libx11drv.so: undefined reference to `WND_Driver'
./libx11drv.so: undefined reference to `argv0'
./libx11drv.so: undefined reference to `get_config_dir'
./libx11drv.so: undefined reference to `pKeyStateTable'
./libttydrv.so: undefined reference to `BITMAP_Driver'
./libttydrv.so: undefined reference to `COLOR_gapEnd'
./libttydrv.so: undefined reference to `COLOR_gapStart'
./libttydrv.so: undefined reference to `COLOR_sysPal'
./libttydrv.so: undefined reference to `COLOR_sysPalTemplate'
./libttydrv.so: undefined reference to `DC_GetDCPtr'
./libttydrv.so: undefined reference to `DRIVER_FindDriver'
./libttydrv.so: undefined reference to `DRIVER_RegisterDriver'
./libttydrv.so: undefined reference to `GDI_GetObjPtr'
./libttydrv.so: undefined reference to `GDI_ReleaseObj'
./libttydrv.so: undefined reference to `PALETTE_Driver'
./libttydrv.so: undefined reference to `WND_Driver'
--
Alexandre Julliard
julliard(a)winehq.com
"Robert O'Callahan" <roc+(a)cs.cmu.edu> writes:
> So your concern is simply that if it's too simple to lock the mutex, then
> you have an unacceptably high probability of a runaway process
> accidentally locking the mutex, whereas you regard the probability of the
> process accidentally calling AcquireMutex again (or executing the
> protected control transfer on its own) as acceptably low. That seems
> reasonable.
No, that's not my concern. The probability of error doesn't matter at
all, I don't mind if the process locks the mutex by accident. What
must not be able to happen is that the process somehow corrupts the
state as seen from the wineserver or other processes. That is, it
doesn't matter if the process thinks it got the mutex when it didn't;
but it must not be possible to make the wineserver see two processes
holding the mutex, or some other inconsistent state. Any inconsistency
must remain local to the process.
> Yeah, but that doesn't seem fundamental --- the wineserver can always take
> ownership of the mutex itself when it needs to do a complex atomic
> operation. I'll let Gavriel work out the details :-).
My point is that getting the details right is what is important; and
if you are not interested in doing this, then there is no point in
arguing any further.
--
Alexandre Julliard
julliard(a)winehq.com
I am trying to modify the Wine PostScript driver to use GetPrinterDataA
to read configuration information from the registry. I have added a
line that reads "import winspool.drv" to wineps.spec, and Wine builds
with no errors. When I try to run Wine, however, I get the following
error:
BUILTIN32_dlopen failed to load .so lib for builtin wineps.dll:
/usr/lib/wine/libwineps.so: undefined symbol: GetPrinterDataA
Ideas?
--
========================================================================
Ian Pilcher pilcher(a)concentric.net
========================================================================
"Robert O'Callahan" <roc+(a)cs.cmu.edu> writes:
> Of course it has to be 100% reliable, but since you're dealing with
> failing processes it's not 100% clear what 100% reliability is. Anyway, I
> think 100% reliability is possible for any plausible definition.
For a mutex the basic definition is obviously that you can never have
two threads holding the mutex at the same time, and that when it is
released some other thread has a chance at grabbing it. This has to be
true no matter what the process does, including corrupting memory or
crashing. You also need to make sure nothing a process does should be
able to crash/hang the wineserver or another process (except if they
fight over the same mutex of course), and then there is the small
matter of respecting the Win32 semantics...
Actually it is the last constraint that is the main problem. You can
certainly provide some kind of mutexes using shared memory; but we
don't need just 'some kind', we need Win32 mutexes. This means a mutex
is identified by a handle that can be manipulated by CloseHandle or
DuplicateHandle; it means you need to detect and handle abandoned
mutexes; it means you must support WaitForMultipleObjects, including
the 'all' case where you cannot grab the mutex unless all objects are
signaled; all things that I didn't see in your implementation ;-)
--
Alexandre Julliard
julliard(a)winehq.com