Alexandre Julliard : wineboot: Convert the rest of the code to Unicode.

Alexandre Julliard julliard at winehq.org
Fri Dec 21 07:28:23 CST 2007


Module: wine
Branch: master
Commit: 4a58b2847c50a3695e8a9fd4df70fbad7872b9e3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=4a58b2847c50a3695e8a9fd4df70fbad7872b9e3

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Thu Dec 20 16:16:17 2007 +0100

wineboot: Convert the rest of the code to Unicode.

Fix Windows File Protection handling to use the correct system directory.

---

 programs/wineboot/wineboot.c |  105 +++++++++++++++++------------------------
 1 files changed, 44 insertions(+), 61 deletions(-)

diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 6e21b17..99ba1b4 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -77,6 +77,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineboot);
 extern BOOL shutdown_close_windows( BOOL force );
 extern void kill_processes( BOOL kill_desktop );
 
+static WCHAR windowsdir[MAX_PATH];
 
 /* Performs the rename operations dictated in %SystemRoot%\Wininit.ini.
  * Returns FALSE if there was an error, or otherwise if all is ok.
@@ -483,79 +484,81 @@ end:
  * known good versions. The only programs that should install into this dll
  * cache are Windows Updates and IE (which is treated like a Windows Update)
  *
- * Implementing this allows installing ie in win2k mode to actaully install the
+ * Implementing this allows installing ie in win2k mode to actually install the
  * system dlls that we expect and need
  */
 static int ProcessWindowsFileProtection(void)
 {
-    WIN32_FIND_DATA finddata;
-    LPSTR custom_dllcache = NULL;
-    static CHAR default_dllcache[] = "C:\\Windows\\System32\\dllcache";
+    static const WCHAR winlogonW[] = {'S','o','f','t','w','a','r','e','\\',
+                                      'M','i','c','r','o','s','o','f','t','\\',
+                                      'W','i','n','d','o','w','s',' ','N','T','\\',
+                                      'C','u','r','r','e','n','t','V','e','r','s','i','o','n','\\',
+                                      'W','i','n','l','o','g','o','n',0};
+    static const WCHAR cachedirW[] = {'S','F','C','D','l','l','C','a','c','h','e','D','i','r',0};
+    static const WCHAR dllcacheW[] = {'\\','d','l','l','c','a','c','h','e','\\','*',0};
+    static const WCHAR wildcardW[] = {'\\','*',0};
+    WIN32_FIND_DATAW finddata;
     HANDLE find_handle;
     BOOL find_rc;
     DWORD rc;
     HKEY hkey;
-    LPSTR dllcache;
-    CHAR find_string[MAX_PATH];
-    CHAR windowsdir[MAX_PATH];
+    LPWSTR dllcache = NULL;
 
-    rc = RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", &hkey );
-    if (rc == ERROR_SUCCESS)
+    if (!RegOpenKeyW( HKEY_LOCAL_MACHINE, winlogonW, &hkey ))
     {
         DWORD sz = 0;
-        rc = RegQueryValueEx( hkey, "SFCDllCacheDir", 0, NULL, NULL, &sz);
-        if (rc == ERROR_MORE_DATA)
+        if (!RegQueryValueExW( hkey, cachedirW, 0, NULL, NULL, &sz))
         {
-            sz++;
-            custom_dllcache = HeapAlloc(GetProcessHeap(),0,sz);
-            RegQueryValueEx( hkey, "SFCDllCacheDir", 0, NULL, (LPBYTE)custom_dllcache, &sz);
+            sz += sizeof(WCHAR);
+            dllcache = HeapAlloc(GetProcessHeap(),0,sz + sizeof(wildcardW));
+            RegQueryValueExW( hkey, cachedirW, 0, NULL, (LPBYTE)dllcache, &sz);
+            strcatW( dllcache, wildcardW );
         }
     }
     RegCloseKey(hkey);
 
-    if (custom_dllcache)
-        dllcache = custom_dllcache;
-    else
-        dllcache = default_dllcache;
-
-    strcpy(find_string,dllcache);
-    strcat(find_string,"\\*.*");
-
-    GetWindowsDirectory(windowsdir,MAX_PATH);
+    if (!dllcache)
+    {
+        DWORD sz = GetSystemDirectoryW( NULL, 0 );
+        dllcache = HeapAlloc( GetProcessHeap(), 0, sz * sizeof(WCHAR) + sizeof(dllcacheW));
+        GetSystemDirectoryW( dllcache, sz );
+        strcatW( dllcache, dllcacheW );
+    }
 
-    find_handle = FindFirstFile(find_string,&finddata);
+    find_handle = FindFirstFileW(dllcache,&finddata);
     find_rc = find_handle != INVALID_HANDLE_VALUE;
     while (find_rc)
     {
-        CHAR targetpath[MAX_PATH];
-        CHAR currentpath[MAX_PATH];
+        static const WCHAR dotW[] = {'.',0};
+        static const WCHAR dotdotW[] = {'.','.',0};
+        WCHAR targetpath[MAX_PATH];
+        WCHAR currentpath[MAX_PATH];
         UINT sz;
         UINT sz2;
-        CHAR tempfile[MAX_PATH];
+        WCHAR tempfile[MAX_PATH];
 
-        if (strcmp(finddata.cFileName,".") == 0 ||
-            strcmp(finddata.cFileName,"..") == 0)
+        if (strcmpW(finddata.cFileName,dotW) == 0 || strcmpW(finddata.cFileName,dotdotW) == 0)
         {
-            find_rc = FindNextFile(find_handle,&finddata);
+            find_rc = FindNextFileW(find_handle,&finddata);
             continue;
         }
 
         sz = MAX_PATH;
         sz2 = MAX_PATH;
-        VerFindFile(VFFF_ISSHAREDFILE, finddata.cFileName, windowsdir, 
-                windowsdir, currentpath, &sz, targetpath,&sz2);
+        VerFindFileW(VFFF_ISSHAREDFILE, finddata.cFileName, windowsdir,
+                     windowsdir, currentpath, &sz, targetpath, &sz2);
         sz = MAX_PATH;
-        rc = VerInstallFile(0, finddata.cFileName, finddata.cFileName,
-                            dllcache, targetpath, currentpath, tempfile,&sz);
+        rc = VerInstallFileW(0, finddata.cFileName, finddata.cFileName,
+                             dllcache, targetpath, currentpath, tempfile, &sz);
         if (rc != ERROR_SUCCESS)
         {
-            WINE_ERR("WFP: %s error 0x%x\n",finddata.cFileName,rc);
-            DeleteFile(tempfile);
+            WINE_ERR("WFP: %s error 0x%x\n",wine_dbgstr_w(finddata.cFileName),rc);
+            DeleteFileW(tempfile);
         }
-        find_rc = FindNextFile(find_handle,&finddata);
+        find_rc = FindNextFileW(find_handle,&finddata);
     }
     FindClose(find_handle);
-    HeapFree(GetProcessHeap(),0,custom_dllcache);
+    HeapFree(GetProcessHeap(),0,dllcache);
     return 1;
 }
 
@@ -714,36 +717,16 @@ static const struct option long_options[] =
 int main( int argc, char *argv[] )
 {
     /* First, set the current directory to SystemRoot */
-    TCHAR gen_path[MAX_PATH];
-    DWORD res;
     int optc;
     int end_session = 0, force = 0, kill = 0, restart = 0, shutdown = 0;
 
-    res=GetWindowsDirectory( gen_path, sizeof(gen_path) );
-    
-    if( res==0 )
+    GetWindowsDirectoryW( windowsdir, MAX_PATH );
+    if( !SetCurrentDirectoryW( windowsdir ) )
     {
-	WINE_ERR("Couldn't get the windows directory - error %d\n",
-		GetLastError() );
-
-	return 100;
-    }
-
-    if( res>=sizeof(gen_path) )
-    {
-	WINE_ERR("Windows path too long (%d)\n", res );
-
-	return 100;
-    }
-
-    if( !SetCurrentDirectory( gen_path ) )
-    {
-        WINE_ERR("Cannot set the dir to %s (%d)\n", gen_path, GetLastError() );
-
+        WINE_ERR("Cannot set the dir to %s (%d)\n", wine_dbgstr_w(windowsdir), GetLastError() );
         return 100;
     }
 
-
     while ((optc = getopt_long(argc, argv, short_options, long_options, NULL )) != -1)
     {
         switch(optc)




More information about the wine-cvs mailing list