Alexandre Julliard : ntdll: Only create the CPU registry keys on first run.

Alexandre Julliard julliard at winehq.org
Tue Sep 22 13:56:20 CDT 2009


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Tue Sep 22 17:05:02 2009 +0200

ntdll: Only create the CPU registry keys on first run.

---

 dlls/ntdll/nt.c |   21 ++++++++++++++-------
 1 files changed, 14 insertions(+), 7 deletions(-)

diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index d8bc0b9..21fefef 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -857,7 +857,7 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
     }
 }
 
-static void create_system_registry_keys( void )
+static BOOL create_system_registry_keys( void )
 {
     static const WCHAR SystemW[] = {'M','a','c','h','i','n','e','\\',
                                     'H','a','r','d','w','a','r','e','\\',
@@ -878,6 +878,7 @@ static void create_system_registry_keys( void )
     HANDLE hkey, system_key, cpu_key;
     OBJECT_ATTRIBUTES attr;
     UNICODE_STRING nameW, valueW;
+    ULONG dispos;
 
     attr.Length = sizeof(attr);
     attr.RootDirectory = 0;
@@ -887,17 +888,23 @@ static void create_system_registry_keys( void )
     attr.SecurityQualityOfService = NULL;
 
     RtlInitUnicodeString( &nameW, SystemW );
-    if (NtCreateKey( &system_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) return;
+    if (NtCreateKey( &system_key, KEY_ALL_ACCESS, &attr, 0, NULL, REG_OPTION_VOLATILE, &dispos ))
+        return FALSE;
+    if (dispos == REG_OPENED_EXISTING_KEY)
+    {
+        NtClose( system_key );
+        return FALSE;
+    }
 
     RtlInitUnicodeString( &valueW, IdentifierW );
     NtSetValueKey( system_key, &valueW, 0, REG_SZ, SysidW, sizeof(SysidW) );
 
     attr.RootDirectory = system_key;
     RtlInitUnicodeString( &nameW, fpuW );
-    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) NtClose( hkey );
+    if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, REG_OPTION_VOLATILE, NULL )) NtClose( hkey );
 
     RtlInitUnicodeString( &nameW, cpuW );
-    if (!NtCreateKey( &cpu_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
+    if (!NtCreateKey( &cpu_key, KEY_ALL_ACCESS, &attr, 0, NULL, REG_OPTION_VOLATILE, NULL ))
     {
         for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++)
         {
@@ -906,7 +913,7 @@ static void create_system_registry_keys( void )
             attr.RootDirectory = cpu_key;
             sprintfW( numW, PercentDW, i );
             RtlInitUnicodeString( &nameW, numW );
-            if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
+            if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, REG_OPTION_VOLATILE, NULL ))
             {
                 PROCESSOR_POWER_INFORMATION power_info;
                 DWORD cpuMHz;
@@ -935,6 +942,7 @@ static void create_system_registry_keys( void )
         NtClose( cpu_key );
     }
     NtClose( system_key );
+    return TRUE;
 }
 
 static void create_env_registry_keys( void )
@@ -1377,8 +1385,7 @@ void fill_cpu_info(void)
     TRACE("<- CPU arch %d, level %d, rev %d, features 0x%x\n",
           cached_sci.Architecture, cached_sci.Level, cached_sci.Revision, cached_sci.FeatureSet);
 
-    create_env_registry_keys();
-    create_system_registry_keys();
+    if (create_system_registry_keys()) create_env_registry_keys();
 }
 
 /******************************************************************************




More information about the wine-cvs mailing list