Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
February 2001
- 76 participants
- 331 messages
New execution behavior
by Duane Clark
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
Feb. 28, 2001
Re: Speeding up wineserver syncronization objects with shared memory
by David Howells
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
Feb. 28, 2001
PostScript driver demand loading
by Ian Pilcher
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;
}
Feb. 27, 2001
Re: winspool.drv initialization problem
by Huw D M Davies
On Mon, Feb 26, 2001 at 11:07:27PM +0600, Ian Pilcher wrote:
> Any idea when Windows loads printer drivers?
Usually on CreateDC/IC or OpenPrinter.
Huw.
--
Dr. Huw D M Davies | Clarendon Laboratory
h.davies1(a)physics.ox.ac.uk | Parks Road
Tel: +44 1865 272390 | Oxford OX1 3PU
Fax: +44 1865 272400 | UK
Feb. 27, 2001
Re: winspool.drv initialization problem
by Ian Pilcher
Huw D M Davies wrote:
>
> > Any idea when Windows loads printer drivers?
>
> Usually on CreateDC/IC or OpenPrinter.
>
Well, since I can't whip out 400-line patches the way Alexandre can,
I'll see if I can move the LoadLibrary call.
--
========================================================================
Ian Pilcher pilcher(a)concentric.net
========================================================================
Feb. 27, 2001
Re: winspool.drv initialization problem
by Alexandre Julliard
Ian Pilcher <pilcher(a)concentric.net> writes:
> 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:
Sounds like importing winspool.drv in wineps creates a circular load
dependency (user32->gdi32->wineps->winspool->comctl32->user32). We
could probably be a bit more clever about loading wineps only when
really necessary; OTOH there is no reason for winspool.drv to require
comctl32. Something like this should fix it (completely untested, so
it's probably broken):
Index: dlls/winspool/info.c
===================================================================
RCS file: /opt/cvs-commit/wine/dlls/winspool/info.c,v
retrieving revision 1.33
diff -u -r1.33 info.c
--- dlls/winspool/info.c 2001/02/21 04:00:40 1.33
+++ dlls/winspool/info.c 2001/02/26 23:01:57
@@ -20,23 +20,12 @@
#include "wine/unicode.h"
#include "debugtools.h"
#include "heap.h"
-#include "commctrl.h"
#include "winnls.h"
DEFAULT_DEBUG_CHANNEL(winspool);
-typedef struct _OPENEDPRINTER
-{
- LPWSTR lpsPrinterName;
- HANDLE hPrinter;
-} OPENEDPRINTER, *LPOPENEDPRINTER;
-
-/* The OpenedPrinter Table dynamic array */
-static HDPA pOpenedPrinterDPA = NULL;
-
-extern HDPA WINAPI (*WINSPOOL_DPA_CreateEx) (INT, HANDLE);
-extern LPVOID WINAPI (*WINSPOOL_DPA_GetPtr) (const HDPA, INT);
-extern INT WINAPI (*WINSPOOL_DPA_InsertPtr) (const HDPA, INT, LPVOID);
+static LPWSTR *printer_array;
+static int nb_printers;
static DWORD WINAPI (*GDI_CallDeviceCapabilities16)( LPCSTR lpszDevice, LPCSTR lpszPort,
WORD fwCapability, LPSTR lpszOutput,
@@ -84,73 +73,42 @@
* WINSPOOL_GetOpenedPrinterEntry
* Get the first place empty in the opened printer table
*/
-static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinterEntry()
+static HANDLE WINSPOOL_GetOpenedPrinterEntry( LPCWSTR name )
{
int i;
- LPOPENEDPRINTER pOpenedPrinter;
- /*
- * Create the opened printers' handle dynamic array.
- */
- if (!pOpenedPrinterDPA)
- {
- pOpenedPrinterDPA = WINSPOOL_DPA_CreateEx(10, GetProcessHeap());
- for (i = 0; i < 10; i++)
- {
- pOpenedPrinter = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- sizeof(OPENEDPRINTER));
- pOpenedPrinter->hPrinter = -1;
- WINSPOOL_DPA_InsertPtr(pOpenedPrinterDPA, i, pOpenedPrinter);
- }
- }
+ for (i = 0; i < nb_printers; i++) if (!printer_array[i]) break;
- /*
- * Search for a handle not yet allocated.
- */
- for (i = 0; i < pOpenedPrinterDPA->nItemCount; i++)
+ if (i >= nb_printers)
{
- pOpenedPrinter = WINSPOOL_DPA_GetPtr(pOpenedPrinterDPA, i);
-
- if (pOpenedPrinter->hPrinter == -1)
- {
- pOpenedPrinter->hPrinter = i + 1;
- return pOpenedPrinter;
- }
+ LPWSTR *new_array = HeapReAlloc( GetProcessHeap(), 0, printer_array,
+ (nb_printers + 16) * sizeof(*new_array) );
+ if (!new_array) return 0;
+ printer_array = new_array;
+ nb_printers += 16;
}
- /*
- * Didn't find one, insert new element in the array.
- */
- if (i == pOpenedPrinterDPA->nItemCount)
+ if ((printer_array[i] = HeapAlloc( GetProcessHeap(), 0, (strlenW(name)+1)*sizeof(WCHAR) )))
{
- pOpenedPrinter = HeapAlloc(GetProcessHeap(),
- HEAP_ZERO_MEMORY,
- sizeof(OPENEDPRINTER));
- pOpenedPrinter->hPrinter = i + 1;
- WINSPOOL_DPA_InsertPtr(pOpenedPrinterDPA, i, pOpenedPrinter);
- return pOpenedPrinter;
+ strcpyW( printer_array[i], name );
+ return (HANDLE)(i + 1);
}
-
- return NULL;
+ return 0;
}
/******************************************************************
* WINSPOOL_GetOpenedPrinter
* Get the pointer to the opened printer referred by the handle
*/
-static LPOPENEDPRINTER WINSPOOL_GetOpenedPrinter(int printerHandle)
+static LPCWSTR WINSPOOL_GetOpenedPrinter(HANDLE printerHandle)
{
- LPOPENEDPRINTER pOpenedPrinter;
-
- if(!pOpenedPrinterDPA) return NULL;
- if((printerHandle <=0) ||
- (printerHandle > (pOpenedPrinterDPA->nItemCount - 1)))
+ int idx = (int)printerHandle;
+ if ((idx <= 0) || (idx > nb_printers))
+ {
+ SetLastError(ERROR_INVALID_HANDLE);
return NULL;
-
- pOpenedPrinter = WINSPOOL_DPA_GetPtr(pOpenedPrinterDPA, printerHandle-1);
-
- return pOpenedPrinter;
+ }
+ return printer_array[idx - 1];
}
/******************************************************************
@@ -159,21 +117,20 @@
*/
static DWORD WINSPOOL_GetOpenedPrinterRegKey(HANDLE hPrinter, HKEY *phkey)
{
- LPOPENEDPRINTER lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
+ LPCWSTR name = WINSPOOL_GetOpenedPrinter(hPrinter);
DWORD ret;
HKEY hkeyPrinters;
- if(!lpOpenedPrinter)
- return ERROR_INVALID_HANDLE;
+ if(!name) return ERROR_INVALID_HANDLE;
if((ret = RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters)) !=
ERROR_SUCCESS)
return ret;
- if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, phkey)
- != ERROR_SUCCESS) {
+ if(RegOpenKeyW(hkeyPrinters, name, phkey) != ERROR_SUCCESS)
+ {
ERR("Can't find opened printer %s in registry\n",
- debugstr_w(lpOpenedPrinter->lpsPrinterName));
+ debugstr_w(name));
RegCloseKey(hkeyPrinters);
return ERROR_INVALID_PRINTER_NAME; /* ? */
}
@@ -408,7 +365,6 @@
LPSTR pDeviceName, LPDEVMODEA pDevModeOutput,
LPDEVMODEA pDevModeInput,DWORD fMode )
{
- LPOPENEDPRINTER lpOpenedPrinter;
LPSTR lpName = pDeviceName;
LONG ret;
@@ -417,13 +373,8 @@
);
if(!pDeviceName) {
- LPWSTR lpNameW;
- lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
- if(!lpOpenedPrinter) {
- SetLastError(ERROR_INVALID_HANDLE);
- return -1;
- }
- lpNameW = lpOpenedPrinter->lpsPrinterName;
+ LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter);
+ if(!lpNameW) return -1;
lpName = HEAP_strdupWtoA(GetProcessHeap(),0,lpNameW);
}
@@ -512,7 +463,6 @@
BOOL WINAPI OpenPrinterW(LPWSTR lpPrinterName,HANDLE *phPrinter,
LPPRINTER_DEFAULTSW pDefault)
{
- LPOPENEDPRINTER lpOpenedPrinter;
HKEY hkeyPrinters, hkeyPrinter;
if (!lpPrinterName) {
@@ -545,21 +495,8 @@
if(!phPrinter) /* This seems to be what win95 does anyway */
return TRUE;
- /* Get a place in the opened printer buffer*/
- lpOpenedPrinter = WINSPOOL_GetOpenedPrinterEntry();
- if(!lpOpenedPrinter) {
- ERR("Can't allocate printer slot\n");
- SetLastError(ERROR_OUTOFMEMORY);
- return FALSE;
- }
-
- /* Get the name of the printer */
- lpOpenedPrinter->lpsPrinterName = HeapAlloc( GetProcessHeap(), 0,
- (strlenW(lpPrinterName)+1)*sizeof(WCHAR) );
- strcpyW( lpOpenedPrinter->lpsPrinterName, lpPrinterName );
-
/* Get the unique handle of the printer*/
- *phPrinter = lpOpenedPrinter->hPrinter;
+ *phPrinter = WINSPOOL_GetOpenedPrinterEntry( lpPrinterName );
if (pDefault != NULL)
FIXME("Not handling pDefault\n");
@@ -915,23 +852,14 @@
*/
BOOL WINAPI ClosePrinter(HANDLE hPrinter)
{
- LPOPENEDPRINTER lpOpenedPrinter;
+ int i = (int)hPrinter;
TRACE("Handle %d\n", hPrinter);
-
- if (!pOpenedPrinterDPA)
- return FALSE;
- if ((hPrinter != -1) && (hPrinter < (pOpenedPrinterDPA->nItemCount - 1)))
- {
- lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
- HeapFree(GetProcessHeap(), 0, lpOpenedPrinter->lpsPrinterName);
- lpOpenedPrinter->lpsPrinterName = NULL;
- lpOpenedPrinter->hPrinter = -1;
-
- return TRUE;
- }
- return FALSE;
+ if ((i <= 0) || (i > nb_printers)) return FALSE;
+ HeapFree( GetProcessHeap(), 0, printer_array[i - 1] );
+ printer_array[i - 1] = NULL;
+ return TRUE;
}
/*****************************************************************************
@@ -957,15 +885,10 @@
*/
BOOL WINAPI DeletePrinter(HANDLE hPrinter)
{
- LPWSTR lpNameW;
+ LPCWSTR lpNameW = WINSPOOL_GetOpenedPrinter(hPrinter);
HKEY hkeyPrinters;
- LPOPENEDPRINTER lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
- if(!lpOpenedPrinter) {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
- lpNameW = lpOpenedPrinter->lpsPrinterName;
+ if(!lpNameW) return FALSE;
if(RegOpenKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters) !=
ERROR_SUCCESS) {
ERR("Can't open Printers key\n");
@@ -1410,7 +1333,7 @@
static BOOL WINSPOOL_GetPrinter(HANDLE hPrinter, DWORD Level, LPBYTE pPrinter,
DWORD cbBuf, LPDWORD pcbNeeded, BOOL unicode)
{
- OPENEDPRINTER *lpOpenedPrinter;
+ LPCWSTR name;
DWORD size, needed = 0;
LPBYTE ptr = NULL;
HKEY hkeyPrinter, hkeyPrinters;
@@ -1418,20 +1341,16 @@
TRACE("(%d,%ld,%p,%ld,%p)\n",hPrinter,Level,pPrinter,cbBuf, pcbNeeded);
- lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
- if(!lpOpenedPrinter) {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
+ if (!(name = WINSPOOL_GetOpenedPrinter(hPrinter))) return FALSE;
+
if(RegCreateKeyA(HKEY_LOCAL_MACHINE, Printers, &hkeyPrinters) !=
ERROR_SUCCESS) {
ERR("Can't create Printers key\n");
return FALSE;
}
- if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, &hkeyPrinter)
- != ERROR_SUCCESS) {
- ERR("Can't find opened printer %s in registry\n",
- debugstr_w(lpOpenedPrinter->lpsPrinterName));
+ if(RegOpenKeyW(hkeyPrinters, name, &hkeyPrinter) != ERROR_SUCCESS)
+ {
+ ERR("Can't find opened printer %s in registry\n", debugstr_w(name));
RegCloseKey(hkeyPrinters);
SetLastError(ERROR_INVALID_PRINTER_NAME); /* ? */
return FALSE;
@@ -1933,7 +1852,7 @@
DWORD cbBuf, LPDWORD pcbNeeded,
BOOL unicode)
{
- OPENEDPRINTER *lpOpenedPrinter;
+ LPCWSTR name;
WCHAR DriverName[100];
DWORD ret, type, size, needed = 0;
LPBYTE ptr = NULL;
@@ -1944,11 +1863,8 @@
ZeroMemory(pDriverInfo, cbBuf);
- lpOpenedPrinter = WINSPOOL_GetOpenedPrinter(hPrinter);
- if(!lpOpenedPrinter) {
- SetLastError(ERROR_INVALID_HANDLE);
- return FALSE;
- }
+ if (!(name = WINSPOOL_GetOpenedPrinter(hPrinter))) return FALSE;
+
if(Level < 1 || Level > 3) {
SetLastError(ERROR_INVALID_LEVEL);
return FALSE;
@@ -1958,10 +1874,9 @@
ERR("Can't create Printers key\n");
return FALSE;
}
- if(RegOpenKeyW(hkeyPrinters, lpOpenedPrinter->lpsPrinterName, &hkeyPrinter)
+ if(RegOpenKeyW(hkeyPrinters, name, &hkeyPrinter)
!= ERROR_SUCCESS) {
- ERR("Can't find opened printer %s in registry\n",
- debugstr_w(lpOpenedPrinter->lpsPrinterName));
+ ERR("Can't find opened printer %s in registry\n", debugstr_w(name));
RegCloseKey(hkeyPrinters);
SetLastError(ERROR_INVALID_PRINTER_NAME); /* ? */
return FALSE;
@@ -1972,8 +1887,7 @@
RegCloseKey(hkeyPrinter);
RegCloseKey(hkeyPrinters);
if(ret != ERROR_SUCCESS) {
- ERR("Can't get DriverName for printer %s\n",
- debugstr_w(lpOpenedPrinter->lpsPrinterName));
+ ERR("Can't get DriverName for printer %s\n", debugstr_w(name));
return FALSE;
}
Index: dlls/winspool/wspool.c
===================================================================
RCS file: /opt/cvs-commit/wine/dlls/winspool/wspool.c,v
retrieving revision 1.3
diff -u -r1.3 wspool.c
--- dlls/winspool/wspool.c 2001/02/12 03:51:05 1.3
+++ dlls/winspool/wspool.c 2001/02/26 23:01:57
@@ -5,15 +5,10 @@
* Copyright 1999 Thuy Nguyen
*/
-#include "commctrl.h"
#include "debugtools.h"
DEFAULT_DEBUG_CHANNEL(winspool);
-HINSTANCE hcomctl32 = 0;
-HDPA WINAPI (*WINSPOOL_DPA_CreateEx)(INT, HANDLE);
-LPVOID WINAPI (*WINSPOOL_DPA_GetPtr)(const HDPA, INT);
-INT WINAPI (*WINSPOOL_DPA_InsertPtr)(const HDPA, INT, LPVOID);
/******************************************************************************
* WINSPOOL_EntryPoint
@@ -28,16 +23,9 @@
switch (reason)
{
case DLL_PROCESS_ATTACH:
-
- hcomctl32 = LoadLibraryA("COMCTL32.DLL");
-
- WINSPOOL_DPA_CreateEx = (void*)GetProcAddress(hcomctl32, (LPCSTR)340L);
- WINSPOOL_DPA_GetPtr = (void*)GetProcAddress(hcomctl32, (LPCSTR)332L);
- WINSPOOL_DPA_InsertPtr = (void*)GetProcAddress(hcomctl32, (LPCSTR)334L);
break;
case DLL_PROCESS_DETACH:
- FreeLibrary(hcomctl32);
break;
}
--
Alexandre Julliard
julliard(a)winehq.com
Feb. 26, 2001
Re: winspool.drv initialization problem
by Eric Pouech
Ian Pilcher wrote:
>
> 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:
basically, before your patch you had:
winspool.drv and wineps didn't depend on each others
on startup, gdi/gdi32 loads wineps
since you added a dep between wineps and winspool.drv, the later also
gets called while loading wineps, still in the init of gdi/gdi32
however, the WINPROC_Init should be done in the init of user/user32
as user/user32 depends on gdi/gdi32, it's not called until gdi/gdi32
is initialized... you're stuck
solutions may include using delay loading (which only defers when the DLL
is actually loaded)
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
Feb. 26, 2001
Re: undefined symbol: GetPrinterDataA
by Alexandre Julliard
"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
Feb. 26, 2001
Re: Speeding up wineserver synchronization objects with shared memory
by Alexandre Julliard
"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
Feb. 26, 2001
Re: undefined symbol: GetPrinterDataA
by Eric Pouech
> Better yet, how can we tell if a dll is separated?
it's separated if it's Makefile.in doesn't contain the IMPORT directive
hence, the list of yet to be separated DLLs is:
erato:~/wine$ grep IMPORTS dlls/*/*.in
dlls/ddraw/Makefile.in:IMPORTS = user32 x11drv gdi32 kernel32
dlls/dinput/Makefile.in:IMPORTS = user32 kernel32 ntdll
dlls/gdi/Makefile.in:IMPORTS = kernel32 ntdll
dlls/kernel/Makefile.in:IMPORTS = ntdll
dlls/opengl32/Makefile.in:IMPORTS = x11drv kernel32
dlls/ttydrv/Makefile.in:IMPORTS = user32 gdi32 kernel32 ntdll
dlls/user/Makefile.in:IMPORTS = gdi32 kernel32 ntdll
dlls/winedos/Makefile.in:IMPORTS = user32 kernel32 ntdll
dlls/wineps/Makefile.in:IMPORTS = user32 gdi32 kernel32 ntdll
dlls/winsock/Makefile.in:IMPORTS = user32 kernel32 ntdll
dlls/x11drv/Makefile.in:IMPORTS = user32 gdi32 kernel32
A+
--
---------------
Eric Pouech (http://perso.wanadoo.fr/eric.pouech/)
"The future will be better tomorrow", Vice President Dan Quayle
Feb. 26, 2001