浏览代码

+ Added KEY_WOW64_64KEY and KEY_WOW64_32KEY to Windows unit and fcl-registry/src/regdef.inc
* Fixed TRegistry.OpenKeyReadOnly and TRegistry.KeyExists methods so they preserve KEY_WOW64_xxKEY bits passed into TRegistry constructor. Based on patch from Maciej Kaczkowski, resolves #23695, #23188

git-svn-id: trunk@24824 -

sergei 12 年之前
父节点
当前提交
94d1e0c81c
共有 3 个文件被更改,包括 9 次插入2 次删除
  1. 4 0
      packages/fcl-registry/src/regdef.inc
  2. 3 2
      packages/fcl-registry/src/winreg.inc
  3. 2 0
      rtl/win/wininc/defines.inc

+ 4 - 0
packages/fcl-registry/src/regdef.inc

@@ -25,6 +25,8 @@ Const
   KEY_READ               = Windows.KEY_READ;
   KEY_READ               = Windows.KEY_READ;
   KEY_SET_VALUE          = Windows.KEY_SET_VALUE;
   KEY_SET_VALUE          = Windows.KEY_SET_VALUE;
   KEY_WRITE              = Windows.KEY_WRITE;
   KEY_WRITE              = Windows.KEY_WRITE;
+  KEY_WOW64_64KEY        = Windows.KEY_WOW64_64KEY;
+  KEY_WOW64_32KEY        = Windows.KEY_WOW64_32KEY;
 
 
 {$else}
 {$else}
 
 
@@ -47,5 +49,7 @@ Const
   KEY_READ               = $20019;
   KEY_READ               = $20019;
   KEY_SET_VALUE          = 2;
   KEY_SET_VALUE          = 2;
   KEY_WRITE              = $20006;
   KEY_WRITE              = $20006;
+  KEY_WOW64_64KEY        = $100;
+  KEY_WOW64_32KEY        = $200;
   
   
 {$endif windows}
 {$endif windows}

+ 3 - 2
packages/fcl-registry/src/winreg.inc

@@ -151,7 +151,8 @@ begin
   Result:=false;
   Result:=false;
   OldAccess:=FAccess;
   OldAccess:=FAccess;
   try
   try
-    FAccess:=KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or STANDARD_RIGHTS_READ;
+    FAccess:=KEY_QUERY_VALUE or KEY_ENUMERATE_SUB_KEYS or STANDARD_RIGHTS_READ or
+      (OldAccess and (KEY_WOW64_64KEY or KEY_WOW64_32KEY));
     KeyHandle:=GetKey(Key);
     KeyHandle:=GetKey(Key);
     if KeyHandle<>0 then
     if KeyHandle<>0 then
       begin
       begin
@@ -209,7 +210,7 @@ Var
   OldAccess: LongWord;
   OldAccess: LongWord;
 begin
 begin
   OldAccess:=fAccess;
   OldAccess:=fAccess;
-  fAccess:=KEY_READ;
+  fAccess:=KEY_READ or (OldAccess and (KEY_WOW64_64KEY or KEY_WOW64_32KEY));
   try
   try
     Result:=OpenKey(Key, False);
     Result:=OpenKey(Key, False);
   finally
   finally

+ 2 - 0
rtl/win/wininc/defines.inc

@@ -1100,6 +1100,8 @@
      KEY_QUERY_VALUE = 1;
      KEY_QUERY_VALUE = 1;
      KEY_READ = $20019;
      KEY_READ = $20019;
      KEY_SET_VALUE = 2;
      KEY_SET_VALUE = 2;
+     KEY_WOW64_64KEY = $0100;
+     KEY_WOW64_32KEY = $0200;
      KEY_WRITE = $20006;
      KEY_WRITE = $20006;
      PROCESS_ALL_ACCESS = $1f0fff;
      PROCESS_ALL_ACCESS = $1f0fff;
      PROCESS_CREATE_PROCESS = 128;
      PROCESS_CREATE_PROCESS = 128;