Aric Stewart : wineboot: Copy windows file protection files at boot
time.
Alexandre Julliard
julliard at wine.codeweavers.com
Mon Jul 17 08:14:48 CDT 2006
Module: wine
Branch: refs/heads/master
Commit: b8183db2ec49c0548eefb1db2803150d7bb289e4
URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b8183db2ec49c0548eefb1db2803150d7bb289e4
Author: Aric Stewart <aric at codeweavers.com>
Date: Sat Jul 15 13:54:57 2006 +0900
wineboot: Copy windows file protection files at boot time.
---
programs/wineboot/Makefile.in | 2 -
programs/wineboot/wineboot.c | 84 +++++++++++++++++++++++++++++++++++++++++
2 files changed, 85 insertions(+), 1 deletions(-)
diff --git a/programs/wineboot/Makefile.in b/programs/wineboot/Makefile.in
index 4dc8754..1bfcafd 100644
--- a/programs/wineboot/Makefile.in
+++ b/programs/wineboot/Makefile.in
@@ -4,7 +4,7 @@ SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = wineboot.exe
APPMODE = -mconsole
-IMPORTS = advapi32 kernel32
+IMPORTS = version advapi32 kernel32
C_SRCS = \
wineboot.c
diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c
index 7e14af9..2fa3c2d 100644
--- a/programs/wineboot/wineboot.c
+++ b/programs/wineboot/wineboot.c
@@ -525,6 +525,88 @@ end:
return res==ERROR_SUCCESS?TRUE:FALSE;
}
+/*
+ * WFP is Windows File Protection, in NT5 and Windows 2000 it maintains a cache
+ * of known good dlls and scans through and replaces corrupted DLLs with these
+ * 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
+ * system dlls that we expect and need
+ */
+static int ProcessWindowsFileProtection(void)
+{
+ WIN32_FIND_DATA finddata;
+ LPSTR custom_dllcache = NULL;
+ static const CHAR default_dllcache[] = "C:\\Windows\\System32\\dllcache";
+ HANDLE find_handle;
+ BOOL find_rc;
+ DWORD rc;
+ HKEY hkey;
+ LPCSTR dllcache;
+ CHAR find_string[MAX_PATH];
+ CHAR windowsdir[MAX_PATH];
+
+ rc = RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon", &hkey );
+ if (rc == ERROR_SUCCESS)
+ {
+ DWORD sz = 0;
+ rc = RegQueryValueEx( hkey, "SFCDllCacheDir", 0, NULL, NULL, &sz);
+ if (rc == ERROR_MORE_DATA)
+ {
+ sz++;
+ custom_dllcache = HeapAlloc(GetProcessHeap(),0,sz);
+ RegQueryValueEx( hkey, "SFCDllCacheDir", 0, NULL, (LPBYTE)custom_dllcache, &sz);
+ }
+ }
+ RegCloseKey(hkey);
+
+ if (custom_dllcache)
+ dllcache = custom_dllcache;
+ else
+ dllcache = default_dllcache;
+
+ strcpy(find_string,dllcache);
+ strcat(find_string,"\\*.*");
+
+ GetWindowsDirectory(windowsdir,MAX_PATH);
+
+ find_handle = FindFirstFile(find_string,&finddata);
+ find_rc = find_handle != INVALID_HANDLE_VALUE;
+ while (find_rc)
+ {
+ CHAR targetpath[MAX_PATH];
+ CHAR currentpath[MAX_PATH];
+ UINT sz;
+ UINT sz2;
+ CHAR tempfile[MAX_PATH];
+
+ if (strcmp(finddata.cFileName,".") == 0 ||
+ strcmp(finddata.cFileName,"..") == 0)
+ {
+ find_rc = FindNextFile(find_handle,&finddata);
+ continue;
+ }
+
+ sz = MAX_PATH;
+ sz2 = MAX_PATH;
+ VerFindFile(VFFF_ISSHAREDFILE, finddata.cFileName, windowsdir,
+ windowsdir, currentpath, &sz, targetpath,&sz2);
+ sz = MAX_PATH;
+ rc = VerInstallFile(0, finddata.cFileName, finddata.cFileName,
+ (LPSTR) dllcache, targetpath, currentpath, tempfile,&sz);
+ if (rc != ERROR_SUCCESS)
+ {
+ WINE_ERR("WFP: %s error 0x%lx\n",finddata.cFileName,rc);
+ DeleteFile(tempfile);
+ }
+ find_rc = FindNextFile(find_handle,&finddata);
+ }
+ FindClose(find_handle);
+ HeapFree(GetProcessHeap(),0,custom_dllcache);
+ return 1;
+}
+
struct op_mask {
BOOL w9xonly; /* Perform only operations done on Windows 9x */
BOOL ntonly; /* Perform only operations done on Windows NT */
@@ -593,6 +675,8 @@ int main( int argc, char *argv[] )
(ops.ntonly || !ops.prelogin ||
ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICESONCE],
TRUE, FALSE )) &&
+ (ops.ntonly || !ops.prelogin ||
+ ProcessWindowsFileProtection()) &&
(ops.ntonly || !ops.prelogin || !ops.startup ||
ProcessRunKeys( HKEY_LOCAL_MACHINE, runkeys_names[RUNKEY_RUNSERVICES],
FALSE, FALSE )) &&
More information about the wine-cvs
mailing list