Module: wine Branch: master Commit: 00b9c975d4bd3a24ae41c99057d7a1a32f329c00 URL: https://source.winehq.org/git/wine.git/?a=commit;h=00b9c975d4bd3a24ae41c9905...
Author: Alexandre Julliard julliard@winehq.org Date: Thu Mar 18 11:24:17 2021 +0100
setupapi: Add a few printer directory ids.
Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/setupapi/Makefile.in | 2 +- dlls/setupapi/dirid.c | 63 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 54 insertions(+), 11 deletions(-)
diff --git a/dlls/setupapi/Makefile.in b/dlls/setupapi/Makefile.in index 70ffd23d245..e89d1f25b56 100644 --- a/dlls/setupapi/Makefile.in +++ b/dlls/setupapi/Makefile.in @@ -2,7 +2,7 @@ EXTRADEFS = -D_SETUPAPI_ MODULE = setupapi.dll IMPORTLIB = setupapi IMPORTS = uuid version advapi32 rpcrt4 kernelbase -DELAYIMPORTS = cabinet shell32 wintrust ole32 winspool.drv comdlg32 user32 +DELAYIMPORTS = cabinet shell32 wintrust ole32 comdlg32 user32
EXTRADLLFLAGS = -mno-cygwin
diff --git a/dlls/setupapi/dirid.c b/dlls/setupapi/dirid.c index ec263d9f181..b28e8b9dffd 100644 --- a/dlls/setupapi/dirid.c +++ b/dlls/setupapi/dirid.c @@ -28,7 +28,6 @@ #include "wingdi.h" #include "winuser.h" #include "winnls.h" -#include "winspool.h" #include "setupapi.h" #include "shlobj.h" #include "setupapi_private.h" @@ -46,9 +45,22 @@ struct user_dirid WCHAR *str; };
+#ifdef __i386__ +static const WCHAR printer_env[] = L"w32x86"; +#elif defined __x86_64__ +static const WCHAR printer_env[] = L"x64"; +#elif defined __arm__ +static const WCHAR printer_env[] = L"arm"; +#elif defined __aarch64__ +static const WCHAR printer_env[] = L"arm64"; +#else +#error not defined for this cpu +#endif + static int nb_user_dirids; /* number of user dirids in use */ static int alloc_user_dirids; /* number of allocated user dirids */ static struct user_dirid *user_dirids; +static const WCHAR *printer_dirids[5]; /* 66000..66004 */ static const WCHAR *system_dirids[MAX_SYSTEM_DIRID+1]; static const WCHAR *csidl_dirids[MAX_CSIDL_DIRID-MIN_CSIDL_DIRID+1];
@@ -74,7 +86,6 @@ static const WCHAR *create_system_dirid( int dirid ) { WCHAR buffer[MAX_PATH+32], *str; int len; - DWORD needed;
switch(dirid) { @@ -122,11 +133,11 @@ static const WCHAR *create_system_dirid( int dirid ) lstrcatW( buffer, L"\system" ); break; case DIRID_SPOOL: - GetWindowsDirectoryW( buffer, MAX_PATH ); + GetSystemDirectoryW( buffer, MAX_PATH ); lstrcatW( buffer, L"\spool" ); break; case DIRID_SPOOLDRIVERS: - GetWindowsDirectoryW( buffer, MAX_PATH ); + GetSystemDirectoryW( buffer, MAX_PATH ); lstrcatW( buffer, L"\spool\drivers" ); break; case DIRID_USERPROFILE: @@ -135,11 +146,9 @@ static const WCHAR *create_system_dirid( int dirid ) case DIRID_LOADER: return L"C:\"; /* FIXME */ case DIRID_PRINTPROCESSOR: - if (!GetPrintProcessorDirectoryW(NULL, NULL, 1, (LPBYTE)buffer, sizeof(buffer), &needed)) - { - WARN( "cannot retrieve print processor directory\n" ); - return get_unknown_dirid(); - } + GetSystemDirectoryW( buffer, MAX_PATH ); + lstrcatW( buffer, L"\spool\prtprocs\" ); + lstrcatW( buffer, printer_env ); break; default: FIXME( "unknown dirid %d\n", dirid ); @@ -150,6 +159,35 @@ static const WCHAR *create_system_dirid( int dirid ) return str; }
+static const WCHAR *create_printer_dirid( DWORD dirid ) +{ + WCHAR buffer[MAX_PATH+32], *str; + int len; + + switch (dirid) + { + case 66000: /* printer driver */ + GetSystemDirectoryW( buffer, MAX_PATH ); + lstrcatW( buffer, L"\spool\drivers\" ); + lstrcatW( buffer, printer_env ); + break; + case 66001: /* print processor */ + return create_system_dirid( DIRID_PRINTPROCESSOR ); + case 66002: /* system directory (FIXME: only for native architecture) */ + GetSystemDirectoryW( buffer, MAX_PATH ); + break; + case 66003: /* color directory */ + return create_system_dirid( DIRID_COLOR ); + case 66004: /* asp files directory */ + default: + FIXME( "unsupported dirid %d\n", dirid ); + return get_unknown_dirid(); + } + len = (lstrlenW(buffer) + 1) * sizeof(WCHAR); + if ((str = HeapAlloc( GetProcessHeap(), 0, len ))) memcpy( str, buffer, len ); + return str; +} + static const WCHAR *get_csidl_dir( DWORD csidl ) { WCHAR buffer[MAX_PATH], *str; @@ -172,7 +210,12 @@ const WCHAR *DIRID_get_string( int dirid )
if (dirid == DIRID_ABSOLUTE || dirid == DIRID_ABSOLUTE_16BIT) dirid = DIRID_NULL;
- if (dirid >= DIRID_USER) + if (dirid >= 66000 && dirid <= 66004) + { + if (!printer_dirids[dirid - 66000]) printer_dirids[dirid - 66000] = create_printer_dirid( dirid ); + return printer_dirids[dirid - 66000]; + } + else if (dirid >= DIRID_USER) { for (i = 0; i < nb_user_dirids; i++) if (user_dirids[i].id == dirid) return user_dirids[i].str;