windows-wow64-registry-20080208
authorJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 9 Feb 2008 02:30:17 +0000 (02:30 +0000)
committerJeffrey Altman <jaltman@secure-endpoints.com>
Sat, 9 Feb 2008 02:30:17 +0000 (02:30 +0000)
LICENSE MIT

Enable the 32-bit tools that are distributed for use in the WOW64 environment
to access the 64-bit registry keys instead of the 32-bit versions.  This
will remove the need to support both 64-bit and 32-bit versions of the
values.

23 files changed:
src/WINNT/afsd/NTMakefile
src/WINNT/afsd/afskfw.c
src/WINNT/afsd/afsshare.c
src/WINNT/afsd/cm.h
src/WINNT/afsd/fs.c
src/WINNT/afsd/fs_utils.c
src/WINNT/afsd/smb.c
src/WINNT/afsd/symlink.c
src/WINNT/afsreg/afsreg.c
src/WINNT/afsreg/afsreg.h
src/WINNT/client_creds/NTMakefile
src/WINNT/client_creds/advtab.cpp
src/WINNT/client_creds/creds.cpp
src/WINNT/client_creds/main.cpp
src/WINNT/client_creds/misc.cpp
src/WINNT/client_creds/settings.cpp
src/WINNT/client_creds/shortcut.cpp
src/WINNT/client_creds/window.cpp
src/WINNT/client_exp/NTMakefile
src/WINNT/client_exp/afs_shl_ext.cpp
src/WINNT/client_exp/gui2fs.cpp
src/WINNT/client_exp/shell_ext.cpp
src/WINNT/client_exp/submounts_dlg.cpp

index bdce860..9aab931 100644 (file)
@@ -412,7 +412,7 @@ $(EXEDIR)\symlink.exe: $(SLOBJS) $(OUT)\symlink.res  $(EXELIBS)
        $(EXEPREP)
 
 # afsshare.exe
-$(EXEDIR)\afsshare.exe: $(OUT)\afsshare.obj $(OUT)\afsshare.res
+$(EXEDIR)\afsshare.exe: $(OUT)\afsshare.obj $(OUT)\afsshare.res $(EXELIBS)
        $(EXECONLINK)
         $(_VC_MANIFEST_EMBED_EXE)
        $(EXEPREP)
index 69bd459..352f480 100644 (file)
@@ -497,6 +497,34 @@ KFW_cleanup(void)
         FreeLibrary(hKrb5);
 }
 
+typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
+static int IsWow64()
+{
+    static int init = TRUE;
+    static int bIsWow64 = FALSE;
+
+    if (init) {
+        HMODULE hModule;
+        LPFN_ISWOW64PROCESS fnIsWow64Process = NULL;
+
+        hModule = GetModuleHandle(TEXT("kernel32"));
+        if (hModule) {
+            fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(hModule, "IsWow64Process");
+  
+            if (NULL != fnIsWow64Process)
+            {
+                if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
+                {
+                    // on error, assume FALSE.
+                    // in other words, do nothing.
+                }
+            }
+            FreeLibrary(hModule);
+        }
+        init = FALSE;
+    }
+    return bIsWow64;
+}
 
 int
 KFW_accept_dotted_usernames(void)
@@ -506,7 +534,7 @@ KFW_accept_dotted_usernames(void)
     DWORD value = 1;
 
     code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         len = sizeof(value);
         code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL,
@@ -515,7 +543,7 @@ KFW_accept_dotted_usernames(void)
     }
     if (code != ERROR_SUCCESS) {
         code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
-                             0, KEY_QUERY_VALUE, &parmKey);
+                             0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
         if (code == ERROR_SUCCESS) {
             len = sizeof(value);
             code = RegQueryValueEx(parmKey, "AcceptDottedPrincipalNames", NULL, NULL,
@@ -535,7 +563,7 @@ KFW_use_krb524(void)
     DWORD use524 = 0;
 
     code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         len = sizeof(use524);
         code = RegQueryValueEx(parmKey, "Use524", NULL, NULL,
@@ -544,7 +572,7 @@ KFW_use_krb524(void)
     }
     if (code != ERROR_SUCCESS) {
         code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
-                             0, KEY_QUERY_VALUE, &parmKey);
+                             0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
         if (code == ERROR_SUCCESS) {
             len = sizeof(use524);
             code = RegQueryValueEx(parmKey, "Use524", NULL, NULL,
@@ -563,7 +591,7 @@ KFW_is_available(void)
     DWORD enableKFW = 1;
 
     code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         len = sizeof(enableKFW);
         code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL,
@@ -573,7 +601,7 @@ KFW_is_available(void)
     
     if (code != ERROR_SUCCESS) {
         code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
-                             0, KEY_QUERY_VALUE, &parmKey);
+                             0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
         if (code == ERROR_SUCCESS) {
             len = sizeof(enableKFW);
             code = RegQueryValueEx(parmKey, "EnableKFW", NULL, NULL,
index 3e6dd27..6b3adcd 100644 (file)
@@ -32,7 +32,7 @@ main(int argc, char **argv) {
                         0,
                         NULL,
                         REG_OPTION_NON_VOLATILE,
-                        KEY_READ|KEY_WRITE,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ|KEY_WRITE,
                         NULL,
                         &hkSubmounts,
                         NULL) == ERROR_SUCCESS) 
@@ -50,7 +50,7 @@ main(int argc, char **argv) {
                                 0,
                                 NULL,
                                 REG_OPTION_NON_VOLATILE,
-                                KEY_READ,
+                                (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ,
                                 NULL,
                                 &hkParameters,
                                 NULL) == ERROR_SUCCESS) 
index a1776da..4273392 100644 (file)
@@ -89,6 +89,7 @@
 #define CM_ERROR_INEXACT_MATCH          (CM_ERROR_BASE+54)
 #define CM_ERROR_BPLUS_NOMATCH          (CM_ERROR_BASE+55)
 #define CM_ERROR_EAS_NOT_SUPPORTED      (CM_ERROR_BASE+56)
+#define CM_ERROR_RANGE_NOT_LOCKED       (CM_ERROR_BASE+57)
 
 /* Used by cm_FollowMountPoint and cm_GetVolumeByName */
 #define RWVOL  0
index 87896d8..e7c987d 100644 (file)
@@ -702,7 +702,7 @@ static DWORD IsFreelance(void)
     DWORD enabled = 0;
 
     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         dummyLen = sizeof(cm_freelanceEnabled);
         code = RegQueryValueEx(parmKey, "FreelanceClient", NULL, NULL,
@@ -721,7 +721,7 @@ static const char * NetbiosName(void)
     DWORD enabled = 0;
 
     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         dummyLen = sizeof(buffer);
         code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,
@@ -4036,7 +4036,7 @@ CSCPolicyCmd(struct cmd_syndesc *asp, void *arock)
                         0, 
                         "AFS", 
                         REG_OPTION_NON_VOLATILE,
-                        KEY_WRITE,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE,
                         NULL, 
                         &hkCSCPolicy,
                         NULL );
@@ -4084,7 +4084,7 @@ CSCPolicyCmd(struct cmd_syndesc *asp, void *arock)
                         0, 
                         "AFS", 
                         REG_OPTION_NON_VOLATILE,
-                        KEY_READ|KEY_QUERY_VALUE,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ|KEY_QUERY_VALUE,
                         NULL, 
                         &hkCSCPolicy,
                         NULL );
index cc19bf1..884fc8e 100644 (file)
@@ -197,7 +197,8 @@ void fs_utils_InitMountRoot()
     char *pmount=mountRoot;
     DWORD len=sizeof(mountRoot)-1;
     printf("int mountroot \n");
-    if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, KEY_QUERY_VALUE, &parmKey)!= ERROR_SUCCESS) 
+    if ((RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY, 0, 
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey)!= ERROR_SUCCESS)
          || (RegQueryValueEx(parmKey, "Mountroot", NULL, NULL,(LPBYTE)(mountRoot), &len)!= ERROR_SUCCESS)
          || (len==sizeof(mountRoot)-1)
          ) 
@@ -215,4 +216,3 @@ void fs_utils_InitMountRoot()
     strcpy(cm_back_slash_mount_root+1,pmount);
     cm_back_slash_mount_root[0]='\\';
 }
-
index ca9f514..32b7727 100644 (file)
@@ -2639,7 +2639,11 @@ void smb_MapNTError(long code, unsigned long *NTStatusp)
     } 
     else if (code == CM_ERROR_BAD_LEVEL) {
        NTStatus = 0xC0000148L; /* Invalid Level */
-    } else {
+    } 
+    else if (code == CM_ERROR_RANGE_NOT_LOCKED) {
+       NTStatus = 0xC000007EL; /* Range Not Locked */
+    } 
+    else {
         NTStatus = 0xC0982001L;        /* SMB non-specific error */
     }
 
index 9917e95..72da4c0 100644 (file)
@@ -101,7 +101,7 @@ static const char * NetbiosName(void)
     DWORD enabled = 0;
 
     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         dummyLen = sizeof(buffer);
         code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,
index 24a9ae0..b503ad3 100644 (file)
@@ -29,6 +29,35 @@ static long CopyValues(HKEY srcKey, HKEY dupKey);
 static long CopySubkeys(const char *srcName, HKEY srcKey,
                        const char *dupName, HKEY dupKey);
 
+typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
+int IsWow64(void)
+{
+    static int init = TRUE;
+    static int bIsWow64 = FALSE;
+
+    if (init) {
+        HMODULE hModule;
+        LPFN_ISWOW64PROCESS fnIsWow64Process = NULL;
+
+        hModule = GetModuleHandle(TEXT("kernel32"));
+        if (hModule) {
+            fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(hModule, "IsWow64Process");
+  
+            if (NULL != fnIsWow64Process)
+            {
+                if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
+                {
+                    // on error, assume FALSE.
+                    // in other words, do nothing.
+                }
+            }       
+            FreeLibrary(hModule);
+        }
+        init = FALSE;
+    }
+    return bIsWow64;
+}
+
 
 /* ----------------------- exported functions ----------------------- */
 
@@ -86,9 +115,9 @@ RegOpenKeyAlt(HKEY key,               /* [in] open key from which to start */
     if (create) {
        status = RegCreateKeyEx(key, subKeyName,
                                (DWORD)0, "AFS", REG_OPTION_NON_VOLATILE,
-                               mode, NULL, resultKeyP, &keyDisp);
+                               (IsWow64()?KEY_WOW64_64KEY:0)|mode, NULL, resultKeyP, &keyDisp);
     } else {
-       status = RegOpenKeyEx(key, subKeyName, (DWORD)0, mode, resultKeyP);
+       status = RegOpenKeyEx(key, subKeyName, (DWORD)0, (IsWow64()?KEY_WOW64_64KEY:0)|mode, resultKeyP);
     }
 
     if (resultKeyDispP) {
@@ -240,7 +269,7 @@ RegDeleteKeyAlt(HKEY key,
        /* determine if delete failed due to subkeys */
        HKEY subKey;
 
-       status = RegOpenKeyEx(key, subKeyName, 0, KEY_ALL_ACCESS, &subKey);
+       status = RegOpenKeyEx(key, subKeyName, 0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_ALL_ACCESS, &subKey);
        if (status == ERROR_SUCCESS) {
            char *keyEnum;
 
index e0bafae..a5c61e3 100644 (file)
@@ -234,6 +234,9 @@ extern long
 RegDupKeyAlt(const char *sourceKey,
             const char *targetKey);
 
+extern int 
+IsWow64(void);
+
 #ifdef __cplusplus
 };
 #endif
index 3721279..caef2be 100644 (file)
@@ -66,6 +66,7 @@ EXELIBS = \
        $(DESTDIR)\lib\afsdes.lib \
        $(DESTDIR)\lib\afsauthent.lib \
        $(DESTDIR)\lib\libafsconf.lib \
+       $(DESTDIR)\lib\afs\afsreg.lib \
        $(DESTDIR)\lib\afskfw.lib
 
 ############################################################################
index b3d6712..ce77373 100644 (file)
@@ -298,7 +298,8 @@ void Advanced_OnStartup (HWND hDlg)
    g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
 
    HKEY hk;
-   if (RegCreateKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0)
+   if (RegCreateKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0, NULL, 0,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
       {
       DWORD dwSize = sizeof(g.fStartup);
       DWORD dwType = REG_DWORD;
index 2721056..3cec15c 100644 (file)
@@ -158,7 +158,8 @@ void GetGatewayName (LPTSTR pszGateway)
 {
    *pszGateway = TEXT('\0');
    HKEY hk;
-   if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0)
+   if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
       {
       DWORD dwSize = MAX_PATH;
       DWORD dwType = REG_SZ;
@@ -240,7 +241,8 @@ BOOL IsServiceConfigured (void)
       {
       rc = TRUE;
       }
-   else if (RegOpenKey (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), &hk) == 0)
+   else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, TEXT(AFSREG_CLT_SVC_PARAM_SUBKEY), 0,
+                           (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
       {
       TCHAR szCell[ MAX_PATH ];
       DWORD dwSize = sizeof(szCell);
@@ -454,7 +456,8 @@ int GetDefaultCell (LPTSTR pszCell)
         int rc;
         HKEY hk;
 
-        if (RegOpenKey (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), &hk) == 0)
+        if (RegOpenKeyEx (HKEY_CURRENT_USER, TEXT(AFSREG_USER_OPENAFS_SUBKEY), 0,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
         {
             DWORD dwSize = sizeof(szCellA);
             DWORD dwType = REG_SZ;
index 0cdd114..c7bda7c 100644 (file)
@@ -181,7 +181,8 @@ BOOL InitApp (LPSTR pszCmdLineA)
    if (fInstall)
       {
       HKEY hk;
-      if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
+      if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0,
+                         (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
          {
          DWORD dwSize = sizeof(g.fStartup);
          DWORD dwType = REG_DWORD;
@@ -216,14 +217,16 @@ BOOL InitApp (LPSTR pszCmdLineA)
       return FALSE;
 
    HKEY hk;
-    if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
+    if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0,
+                       (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
     {
         DWORD dwSize = sizeof(g.fStartup);
         DWORD dwType = REG_DWORD;
         RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
         RegCloseKey (hk);
     }
-    else if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, &hk) == 0)
+    else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0,
+                            (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
       {
       DWORD dwSize = sizeof(g.fStartup);
       DWORD dwType = REG_DWORD;
@@ -402,7 +405,8 @@ BOOL IsServerInstalled (void)
    BOOL fInstalled = FALSE;
    HKEY hk;
 
-   if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_SVR_SVC_SUBKEY, &hk) == 0)
+   if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_SVR_SVC_SUBKEY, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
       {
       fInstalled = TRUE;
       RegCloseKey (hk);
index e759b31..7a449ee 100644 (file)
@@ -60,7 +60,8 @@ void LoadRemind (size_t iCreds)
    g.aCreds[ iCreds ].fRemind = TRUE;
 
    HKEY hk;
-   if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", &hk) == 0)
+   if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", 0,
+                    (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
       {
       DWORD dwValue = 1;
       DWORD dwSize = sizeof(dwValue);
@@ -75,7 +76,8 @@ void LoadRemind (size_t iCreds)
 void SaveRemind (size_t iCreds)
 {
    HKEY hk;
-   if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", &hk) == 0)
+   if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY "\\Reminders", 0, NULL, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
       {
       DWORD dwValue = g.aCreds[ iCreds ].fRemind;
       RegSetValueEx (hk, g.aCreds[ iCreds ].szCell, NULL, REG_DWORD, (PBYTE)&dwValue, sizeof(DWORD));
@@ -131,4 +133,3 @@ HWND GetTabChild (HWND hTab)
 
    return NULL;
 }
-
index bab9cb2..95bde30 100644 (file)
@@ -18,6 +18,7 @@ extern "C" {
 #include <windows.h>
 #include <winerror.h>
 #include <WINNT/TaLocale.h>
+#include "afscreds.h"
 #include "settings.h"
 
 
@@ -91,7 +92,8 @@ BOOL StoreSettings (HKEY hkParent,
 void EraseSettings (HKEY hkParent, LPCTSTR pszBase, LPCTSTR pszValue)
 {
    HKEY hk;
-   if (RegOpenKey (hkParent, pszBase, &hk) == 0)
+   if (RegOpenKeyEx (hkParent, pszBase, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_SET_VALUE, &hk) == 0)
       {
       RegDeleteValue (hk, pszValue);
       RegCloseKey (hk);
@@ -108,7 +110,8 @@ BOOL GetBinaryRegValue (HKEY hk,
    BOOL rc = FALSE;
 
    HKEY hkFinal;
-   if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS)
+   if (RegOpenKeyEx (hk, pszBase, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hkFinal) == ERROR_SUCCESS)
       {
       DWORD dwType;
       DWORD dwSize = (DWORD)cbData;
@@ -130,7 +133,8 @@ size_t GetRegValueSize (HKEY hk,
    size_t cb = 0;
 
    HKEY hkFinal;
-   if (RegOpenKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS)
+   if (RegOpenKeyEx (hk, pszBase, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hkFinal) == ERROR_SUCCESS)
       {
       DWORD dwType;
       DWORD dwSize = 0;
@@ -156,7 +160,8 @@ BOOL SetBinaryRegValue (HKEY hk,
    BOOL rc = FALSE;
 
    HKEY hkFinal;
-   if (RegCreateKey (hk, pszBase, &hkFinal) == ERROR_SUCCESS)
+   if (RegCreateKeyEx (hk, pszBase, 0, NULL, 0,
+                        (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hkFinal, NULL) == ERROR_SUCCESS)
       {
       DWORD dwSize = (DWORD)cbData;
 
@@ -176,7 +181,8 @@ BOOL SetBinaryRegValue (HKEY hk,
 BOOL RegDeltreeKey (HKEY hk, LPTSTR pszKey)
 {
    HKEY hkSub;
-   if (RegOpenKey (hk, pszKey, &hkSub) == 0)
+   if (RegOpenKeyEx (hk, pszKey, 0,
+                      (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, &hkSub) == 0)
       {
       TCHAR szFound[ MAX_PATH ];
       while (RegEnumKey (hkSub, 0, szFound, MAX_PATH) == 0)
index 2f6f117..7853968 100644 (file)
@@ -117,7 +117,7 @@ void Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart)
        TCHAR szParams[ 64 ] = TEXT(AFSCREDS_SHORTCUT_OPTIONS);
 
        code = RegOpenKeyEx(HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY,
-                            0, KEY_QUERY_VALUE, &hk);
+                            0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk);
        if (code == ERROR_SUCCESS) {
            len = sizeof(szParams);
            type = REG_SZ;
@@ -127,7 +127,7 @@ void Shortcut_FixStartup (LPCTSTR pszLinkName, BOOL fAutoStart)
        }
        if (code != ERROR_SUCCESS) {
            code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY,
-                                0, KEY_QUERY_VALUE, &hk);
+                                0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk);
            if (code == ERROR_SUCCESS) {
                len = sizeof(szParams);
                type = REG_SZ;
index 3cdda06..84a07e5 100644 (file)
@@ -263,7 +263,8 @@ void Main_OnInitDialog (HWND hDlg)
     GetString (szUser, IDS_UNKNOWN);
 
     HKEY hk;
-    if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_SW_VERSION_SUBKEY, &hk) == 0)
+    if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_SW_VERSION_SUBKEY, 0,
+                       (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
     {
         DWORD dwSize = sizeof(szVersion);
         DWORD dwType = REG_SZ;
@@ -463,14 +464,16 @@ void Main_OnCheckTerminate (void)
 {
     HKEY hk;
 
-    if (RegOpenKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
+    if (RegOpenKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0,
+                       (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
     {
         DWORD dwSize = sizeof(g.fStartup);
         DWORD dwType = REG_DWORD;
         RegQueryValueEx (hk, TEXT("ShowTrayIcon"), NULL, &dwType, (PBYTE)&g.fStartup, &dwSize);
         RegCloseKey (hk);
     }
-    else if (RegOpenKey (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, &hk) == 0)
+    else if (RegOpenKeyEx (HKEY_LOCAL_MACHINE, AFSREG_CLT_OPENAFS_SUBKEY, 0,
+                           (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &hk) == 0)
     {
       DWORD dwSize = sizeof(g.fStartup);
       DWORD dwType = REG_DWORD;
@@ -803,7 +806,8 @@ void Terminate_OnOK (HWND hDlg)
    g.fStartup = IsDlgButtonChecked (hDlg, IDC_STARTUP);
 
     HKEY hk;
-    if (RegCreateKey (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, &hk) == 0)
+    if (RegCreateKeyEx (HKEY_CURRENT_USER, AFSREG_USER_OPENAFS_SUBKEY, 0, NULL, 0,
+                         (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE, NULL, &hk, NULL) == 0)
     {
         DWORD dwSize = sizeof(g.fStartup);
         DWORD dwType = REG_DWORD;
index 0ad2f6c..05ed805 100644 (file)
@@ -60,6 +60,7 @@ DLLLIBS =\
        $(DESTDIR)\lib\afsauthent.lib \
        $(DESTDIR)\lib\libafsconf.lib \
        $(DESTDIR)\lib\libosi.lib \
+        $(DESTDIR)\lib\afs\afsreg.lib  \
        $(DESTDIR)\lib\afs\TaLocale.lib \
        $(DESTDIR)\lib\afs\afsutil.lib
 
index 79baf68..a9edeb9 100644 (file)
@@ -20,8 +20,10 @@ extern "C" {
 #include <winsock2.h>
 #include "help.h"
 #include "shell_ext.h"
-#include "winreg.h"
-
+#include <winreg.h>
+extern "C" {
+#include "WINNT\afsreg.h"
+}
 #ifdef _DEBUG
 #define new DEBUG_NEW
 #undef THIS_FILE
@@ -303,7 +305,7 @@ LRESULT DoValueDelete(HKEY hKey,PTCHAR pszSubKey,PTCHAR szValue=NULL)
     lResult = RegOpenKeyEx( hKey,
                            pszSubKey,
                            0,
-                           KEY_ALL_ACCESS,
+                           (IsWow64()?KEY_WOW64_64KEY:0)|KEY_ALL_ACCESS,
                            &thKey);
     if(NOERROR == lResult)
     {
@@ -347,3 +349,4 @@ STDAPI DllUnregisterServer(void)
     return S_OK;
 }      
 
+
index 3bfc1b8..704d4ec 100644 (file)
@@ -1057,7 +1057,7 @@ const char * NetbiosName(void)
     DWORD enabled = 0;
 
     code = RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,
-                         0, KEY_QUERY_VALUE, &parmKey);
+                         0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &parmKey);
     if (code == ERROR_SUCCESS) {
         dummyLen = sizeof(buffer);
         code = RegQueryValueEx(parmKey, "NetbiosName", NULL, NULL,
@@ -2181,4 +2181,3 @@ BOOL ListSymlink(CStringArray& files)
     return !error;
 }
 
-
index fa89b63..d923138 100644 (file)
@@ -79,7 +79,7 @@ CShellExt::CShellExt()
     m_bIsOverlayEnabled=FALSE;
     if (FAILED(hr))
        m_pAlloc = NULL;
-    RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,0, KEY_QUERY_VALUE, &NPKey);
+    RegOpenKeyEx(HKEY_LOCAL_MACHINE, AFSREG_CLT_SVC_PARAM_SUBKEY,0, (IsWow64()?KEY_WOW64_64KEY:0)|KEY_QUERY_VALUE, &NPKey);
     LSPsize=sizeof(ShellOption);
     code=RegQueryValueEx(NPKey, "ShellOption", NULL,
                          &LSPtype, (LPBYTE)&ShellOption, &LSPsize);
index f39a5bf..35a0ee8 100644 (file)
@@ -53,7 +53,7 @@ static CSubmountInfo *ReadSubmtInfo(const CString& strShareName)
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
-                    KEY_READ,
+                    (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ,
                     NULL, 
                     &hkSubmounts,
                     NULL );
@@ -174,7 +174,7 @@ BOOL CSubmountsDlg::FillSubmtList()
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
-                    KEY_READ|KEY_WRITE|KEY_QUERY_VALUE,
+                    (IsWow64()?KEY_WOW64_64KEY:0)|KEY_READ|KEY_WRITE|KEY_QUERY_VALUE,
                     NULL, 
                     &hkSubmounts,
                     NULL );
@@ -256,7 +256,7 @@ static BOOL AddSubmt(CSubmountInfo *pInfo)
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
-                    KEY_WRITE,
+                    (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE,
                     NULL, 
                     &hkSubmounts,
                     NULL );
@@ -278,7 +278,7 @@ static BOOL DeleteSubmt(CSubmountInfo *pInfo)
                     0, 
                     "AFS", 
                     REG_OPTION_NON_VOLATILE,
-                    KEY_WRITE,
+                    (IsWow64()?KEY_WOW64_64KEY:0)|KEY_WRITE,
                     NULL, 
                     &hkSubmounts,
                     NULL );