Alexandre Julliard : setupapi: Add a few printer directory ids.

Alexandre Julliard julliard at winehq.org
Thu Mar 18 16:43:53 CDT 2021


Module: wine
Branch: master
Commit: 00b9c975d4bd3a24ae41c99057d7a1a32f329c00
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=00b9c975d4bd3a24ae41c99057d7a1a32f329c00

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Mar 18 11:24:17 2021 +0100

setupapi: Add a few printer directory ids.

Signed-off-by: Alexandre Julliard <julliard at 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;




More information about the wine-cvs mailing list