[PATCH 5/6] [NtDll]: moved CPU related registry key creation from kernel32 to ntdll
Eric Pouech
eric.pouech at orange.fr
Tue Sep 15 14:38:23 CDT 2009
A+
---
dlls/kernel32/cpu.c | 147 ----------------------------------------
dlls/kernel32/kernel_main.c | 5 -
dlls/ntdll/nt.c | 157 +++++++++++++++++++++++++++++++++++++++++++
dlls/ntdll/thread.c | 3 +
4 files changed, 159 insertions(+), 153 deletions(-)
diff --git a/dlls/kernel32/cpu.c b/dlls/kernel32/cpu.c
index 715b151..83d99f4 100644
--- a/dlls/kernel32/cpu.c
+++ b/dlls/kernel32/cpu.c
@@ -105,150 +105,6 @@ static inline int have_cpuid(void)
static ULONGLONG cpuHz = 1000000000; /* default to a 1GHz */
-static void create_system_registry_keys( const SYSTEM_INFO *info )
-{
- static const WCHAR SystemW[] = {'M','a','c','h','i','n','e','\\',
- 'H','a','r','d','w','a','r','e','\\',
- 'D','e','s','c','r','i','p','t','i','o','n','\\',
- 'S','y','s','t','e','m',0};
- static const WCHAR fpuW[] = {'F','l','o','a','t','i','n','g','P','o','i','n','t','P','r','o','c','e','s','s','o','r',0};
- static const WCHAR cpuW[] = {'C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r',0};
- static const WCHAR IdentifierW[] = {'I','d','e','n','t','i','f','i','e','r',0};
- static const WCHAR SysidW[] = {'A','T',' ','c','o','m','p','a','t','i','b','l','e',0};
- static const WCHAR mhzKeyW[] = {'~','M','H','z',0};
- static const WCHAR VendorIdentifierW[] = {'V','e','n','d','o','r','I','d','e','n','t','i','f','i','e','r',0};
- static const WCHAR VenidIntelW[] = {'G','e','n','u','i','n','e','I','n','t','e','l',0};
- /* static const WCHAR VenidAMDW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0}; */
-
- unsigned int i;
- HANDLE hkey, system_key, cpu_key;
- OBJECT_ATTRIBUTES attr;
- UNICODE_STRING nameW, valueW;
-
- attr.Length = sizeof(attr);
- attr.RootDirectory = 0;
- attr.ObjectName = &nameW;
- attr.Attributes = 0;
- attr.SecurityDescriptor = NULL;
- attr.SecurityQualityOfService = NULL;
-
- RtlInitUnicodeString( &nameW, SystemW );
- if (NtCreateKey( &system_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) return;
-
- 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 );
-
- RtlInitUnicodeString( &nameW, cpuW );
- if (!NtCreateKey( &cpu_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
- {
- for (i = 0; i < info->dwNumberOfProcessors; i++)
- {
- char num[10], id[60];
-
- attr.RootDirectory = cpu_key;
- sprintf( num, "%d", i );
- RtlCreateUnicodeStringFromAsciiz( &nameW, num );
- if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
- {
- WCHAR idW[60];
- DWORD sizeW;
- DWORD cpuMHz = cpuHz / 1000000;
-
- /*TODO: report 64bit processors properly*/
- RtlInitUnicodeString( &valueW, IdentifierW );
- sprintf( id, "x86 Family %d Model %d Stepping %d",
- info->wProcessorLevel, HIBYTE(info->wProcessorRevision), LOBYTE(info->wProcessorRevision) );
-
- RtlMultiByteToUnicodeN( idW, sizeof(idW), &sizeW, id, strlen(id)+1 );
- NtSetValueKey( hkey, &valueW, 0, REG_SZ, idW, sizeW );
-
- /*TODO; report amd's properly*/
- RtlInitUnicodeString( &valueW, VendorIdentifierW );
- NtSetValueKey( hkey, &valueW, 0, REG_SZ, VenidIntelW, sizeof(VenidIntelW) );
-
- RtlInitUnicodeString( &valueW, mhzKeyW );
- NtSetValueKey( hkey, &valueW, 0, REG_DWORD, &cpuMHz, sizeof(DWORD) );
- NtClose( hkey );
- }
- RtlFreeUnicodeString( &nameW );
- }
- NtClose( cpu_key );
- }
- NtClose( system_key );
-}
-
-static void create_env_registry_keys( const SYSTEM_INFO *info )
-{
- static const WCHAR EnvironW[] = {'M','a','c','h','i','n','e','\\',
- 'S','y','s','t','e','m','\\',
- 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
- 'C','o','n','t','r','o','l','\\',
- 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r','\\',
- 'E','n','v','i','r','o','n','m','e','n','t',0};
- static const WCHAR NumProcW[] = {'N','U','M','B','E','R','_','O','F','_','P','R','O','C','E','S','S','O','R','S',0};
- static const WCHAR ProcArchW[] = {'P','R','O','C','E','S','S','O','R','_','A','R','C','H','I','T','E','C','T','U','R','E',0};
- static const WCHAR x86W[] = {'x','8','6',0};
- static const WCHAR ProcIdW[] = {'P','R','O','C','E','S','S','O','R','_','I','D','E','N','T','I','F','I','E','R',0};
- static const WCHAR ProcLvlW[] = {'P','R','O','C','E','S','S','O','R','_','L','E','V','E','L',0};
- static const WCHAR ProcRevW[] = {'P','R','O','C','E','S','S','O','R','_','R','E','V','I','S','I','O','N',0};
-
- HANDLE env_key;
- OBJECT_ATTRIBUTES attr;
- UNICODE_STRING nameW, valueW;
- DWORD sizeW;
-
- char nProc[10],id[60],procLevel[10],rev[10];
- WCHAR nProcW[10],idW[60],procLevelW[10],revW[10];
-
- /* Create some keys under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.
- * All these environment variables are processor related and will be read during process initialization and hence
- * show up in the environment of that process.
- */
-
- attr.Length = sizeof(attr);
- attr.RootDirectory = 0;
- attr.ObjectName = &nameW;
- attr.Attributes = 0;
- attr.SecurityDescriptor = NULL;
- attr.SecurityQualityOfService = NULL;
-
- RtlInitUnicodeString( &nameW, EnvironW );
- if (NtCreateKey( &env_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) return;
-
- sprintf( nProc, "%d", info->dwNumberOfProcessors );
- RtlMultiByteToUnicodeN( nProcW, sizeof(nProcW), &sizeW, nProc, strlen(nProc)+1 );
- RtlInitUnicodeString( &valueW, NumProcW );
- NtSetValueKey( env_key, &valueW, 0, REG_SZ, nProcW, sizeW );
-
- /* TODO: currently hardcoded x86, add different processors */
- RtlInitUnicodeString( &valueW, ProcArchW );
- NtSetValueKey( env_key, &valueW, 0, REG_SZ, x86W, sizeof(x86W) );
-
- /* TODO: currently hardcoded Intel, add different processors */
- sprintf( id, "x86 Family %d Model %d Stepping %d, GenuineIntel",
- info->wProcessorLevel, HIBYTE(info->wProcessorRevision), LOBYTE(info->wProcessorRevision) );
- RtlMultiByteToUnicodeN( idW, sizeof(idW), &sizeW, id, strlen(id)+1 );
- RtlInitUnicodeString( &valueW, ProcIdW );
- NtSetValueKey( env_key, &valueW, 0, REG_SZ, idW, sizeW );
-
- sprintf( procLevel, "%d", info->wProcessorLevel );
- RtlMultiByteToUnicodeN( procLevelW, sizeof(procLevelW), &sizeW, procLevel, strlen(procLevel)+1 );
- RtlInitUnicodeString( &valueW, ProcLvlW );
- NtSetValueKey( env_key, &valueW, 0, REG_SZ, procLevelW, sizeW );
-
- /* Properly report model/stepping */
- sprintf( rev, "%04x", info->wProcessorRevision);
- RtlMultiByteToUnicodeN( revW, sizeof(revW), &sizeW, rev, strlen(rev)+1 );
- RtlInitUnicodeString( &valueW, ProcRevW );
- NtSetValueKey( env_key, &valueW, 0, REG_SZ, revW, sizeW );
-
- NtClose( env_key );
-}
-
static inline void get_cpuinfo( SYSTEM_INFO *info )
{
unsigned int regs[4], regs2[4];
@@ -795,9 +651,6 @@ VOID WINAPI GetSystemInfo(
si->lpMinimumApplicationAddress, si->lpMaximumApplicationAddress,
si->dwActiveProcessorMask, si->dwNumberOfProcessors, si->dwProcessorType,
si->dwAllocationGranularity, si->wProcessorLevel, si->wProcessorRevision);
-
- create_system_registry_keys( &cachedsi );
- create_env_registry_keys( &cachedsi );
}
diff --git a/dlls/kernel32/kernel_main.c b/dlls/kernel32/kernel_main.c
index 3699ff7..2365e7a 100644
--- a/dlls/kernel32/kernel_main.c
+++ b/dlls/kernel32/kernel_main.c
@@ -113,14 +113,9 @@ static void set_entry_point( HMODULE module, const char *name, DWORD rva )
*/
static BOOL process_attach( HMODULE module )
{
- SYSTEM_INFO si;
SYSTEM_TIMEOFDAY_INFORMATION ti;
RTL_USER_PROCESS_PARAMETERS *params = NtCurrentTeb()->Peb->ProcessParameters;
- /* FIXME: should probably be done in ntdll */
- GetSystemInfo( &si );
- NtCurrentTeb()->Peb->NumberOfProcessors = si.dwNumberOfProcessors;
-
NtQuerySystemInformation( SystemTimeOfDayInformation, &ti, sizeof(ti), NULL );
server_start_time = ti.liKeBootTime.QuadPart;
diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c
index 632d966..d8bc0b9 100644
--- a/dlls/ntdll/nt.c
+++ b/dlls/ntdll/nt.c
@@ -857,6 +857,152 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
}
}
+static void create_system_registry_keys( void )
+{
+ static const WCHAR SystemW[] = {'M','a','c','h','i','n','e','\\',
+ 'H','a','r','d','w','a','r','e','\\',
+ 'D','e','s','c','r','i','p','t','i','o','n','\\',
+ 'S','y','s','t','e','m',0};
+ static const WCHAR fpuW[] = {'F','l','o','a','t','i','n','g','P','o','i','n','t','P','r','o','c','e','s','s','o','r',0};
+ static const WCHAR cpuW[] = {'C','e','n','t','r','a','l','P','r','o','c','e','s','s','o','r',0};
+ static const WCHAR IdentifierW[] = {'I','d','e','n','t','i','f','i','e','r',0};
+ static const WCHAR SysidW[] = {'A','T',' ','c','o','m','p','a','t','i','b','l','e',0};
+ static const WCHAR mhzKeyW[] = {'~','M','H','z',0};
+ static const WCHAR VendorIdentifierW[] = {'V','e','n','d','o','r','I','d','e','n','t','i','f','i','e','r',0};
+ static const WCHAR VenidIntelW[] = {'G','e','n','u','i','n','e','I','n','t','e','l',0};
+ /* static const WCHAR VenidAMDW[] = {'A','u','t','h','e','n','t','i','c','A','M','D',0}; */
+ static const WCHAR PercentDW[] = {'%','d',0};
+ static const WCHAR IntelCpuDescrW[] = {'x','8','6',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d',
+ ' ','S','t','e','p','p','i','n','g',' ','%','d',0};
+ unsigned int i;
+ HANDLE hkey, system_key, cpu_key;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nameW, valueW;
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &nameW;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ RtlInitUnicodeString( &nameW, SystemW );
+ if (NtCreateKey( &system_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) return;
+
+ 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 );
+
+ RtlInitUnicodeString( &nameW, cpuW );
+ if (!NtCreateKey( &cpu_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
+ {
+ for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++)
+ {
+ WCHAR numW[10], idW[60];
+
+ attr.RootDirectory = cpu_key;
+ sprintfW( numW, PercentDW, i );
+ RtlInitUnicodeString( &nameW, numW );
+ if (!NtCreateKey( &hkey, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL ))
+ {
+ PROCESSOR_POWER_INFORMATION power_info;
+ DWORD cpuMHz;
+
+ if (NtPowerInformation(ProcessorInformation, NULL, 0,
+ &power_info, sizeof(power_info)) == STATUS_SUCCESS)
+ cpuMHz = power_info.MaxMhz;
+ else
+ cpuMHz = 0;
+
+ /*TODO: report 64bit processors properly*/
+ RtlInitUnicodeString( &valueW, IdentifierW );
+ sprintfW( idW, IntelCpuDescrW,
+ cached_sci.Level, HIBYTE(cached_sci.Revision), LOBYTE(cached_sci.Revision) );
+ NtSetValueKey( hkey, &valueW, 0, REG_SZ, idW, (strlenW(idW) + 1) * sizeof(WCHAR) );
+
+ /*TODO; report amd's properly*/
+ RtlInitUnicodeString( &valueW, VendorIdentifierW );
+ NtSetValueKey( hkey, &valueW, 0, REG_SZ, VenidIntelW, sizeof(VenidIntelW) );
+
+ RtlInitUnicodeString( &valueW, mhzKeyW );
+ NtSetValueKey( hkey, &valueW, 0, REG_DWORD, &cpuMHz, sizeof(DWORD) );
+ NtClose( hkey );
+ }
+ }
+ NtClose( cpu_key );
+ }
+ NtClose( system_key );
+}
+
+static void create_env_registry_keys( void )
+{
+ static const WCHAR EnvironW[] = {'M','a','c','h','i','n','e','\\',
+ 'S','y','s','t','e','m','\\',
+ 'C','u','r','r','e','n','t','C','o','n','t','r','o','l','S','e','t','\\',
+ 'C','o','n','t','r','o','l','\\',
+ 'S','e','s','s','i','o','n',' ','M','a','n','a','g','e','r','\\',
+ 'E','n','v','i','r','o','n','m','e','n','t',0};
+ static const WCHAR NumProcW[] = {'N','U','M','B','E','R','_','O','F','_','P','R','O','C','E','S','S','O','R','S',0};
+ static const WCHAR ProcArchW[] = {'P','R','O','C','E','S','S','O','R','_','A','R','C','H','I','T','E','C','T','U','R','E',0};
+ static const WCHAR x86W[] = {'x','8','6',0};
+ static const WCHAR ProcIdW[] = {'P','R','O','C','E','S','S','O','R','_','I','D','E','N','T','I','F','I','E','R',0};
+ static const WCHAR ProcLvlW[] = {'P','R','O','C','E','S','S','O','R','_','L','E','V','E','L',0};
+ static const WCHAR ProcRevW[] = {'P','R','O','C','E','S','S','O','R','_','R','E','V','I','S','I','O','N',0};
+ static const WCHAR PercentDW[] = {'%','d',0};
+ static const WCHAR Percent04XW[] = {'%','0','4','x',0};
+ static const WCHAR IntelCpuDescrW[] = {'x','8','6',' ','F','a','m','i','l','y',' ','%','d',' ','M','o','d','e','l',' ','%','d',
+ ' ','S','t','e','p','p','i','n','g',' ','%','d',',',' ','G','e','n','u','i','n','e','I','n','t','e','l',0};
+
+ HANDLE env_key;
+ OBJECT_ATTRIBUTES attr;
+ UNICODE_STRING nameW, valueW;
+
+ WCHAR nProcW[10],idW[60],procLevelW[10],revW[10];
+
+ /* Create some keys under HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment.
+ * All these environment variables are processor related and will be read during process initialization and hence
+ * show up in the environment of that process.
+ */
+
+ attr.Length = sizeof(attr);
+ attr.RootDirectory = 0;
+ attr.ObjectName = &nameW;
+ attr.Attributes = 0;
+ attr.SecurityDescriptor = NULL;
+ attr.SecurityQualityOfService = NULL;
+
+ RtlInitUnicodeString( &nameW, EnvironW );
+ if (NtCreateKey( &env_key, KEY_ALL_ACCESS, &attr, 0, NULL, 0, NULL )) return;
+
+ sprintfW( nProcW, PercentDW, NtCurrentTeb()->Peb->NumberOfProcessors );
+ RtlInitUnicodeString( &valueW, NumProcW );
+ NtSetValueKey( env_key, &valueW, 0, REG_SZ, nProcW, (strlenW(nProcW) + 1) * sizeof(WCHAR) );
+
+ /* TODO: currently hardcoded x86, add different processors */
+ RtlInitUnicodeString( &valueW, ProcArchW );
+ NtSetValueKey( env_key, &valueW, 0, REG_SZ, x86W, sizeof(x86W) );
+
+ /* TODO: currently hardcoded Intel, add different processors */
+ sprintfW(idW, IntelCpuDescrW,
+ cached_sci.Level, HIBYTE(cached_sci.Revision), LOBYTE(cached_sci.Revision) );
+ RtlInitUnicodeString( &valueW, ProcIdW );
+ NtSetValueKey( env_key, &valueW, 0, REG_SZ, idW, (strlenW(idW) + 1) * sizeof(WCHAR) );
+
+ sprintfW( procLevelW, PercentDW, cached_sci.Level );
+ RtlInitUnicodeString( &valueW, ProcLvlW );
+ NtSetValueKey( env_key, &valueW, 0, REG_SZ, procLevelW, (strlenW(procLevelW) + 1) * sizeof(WCHAR) );
+
+ /* Properly report model/stepping */
+ sprintfW( revW, Percent04XW, cached_sci.Revision);
+ RtlInitUnicodeString( &valueW, ProcRevW );
+ NtSetValueKey( env_key, &valueW, 0, REG_SZ, revW, (strlenW(revW) + 1) * sizeof(WCHAR) );
+
+ NtClose( env_key );
+}
+
/******************************************************************
* fill_cpu_info
*
@@ -864,6 +1010,15 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info)
* - cached_sci & cpuHZ in this file
* - Peb->NumberOfProcessors
* - SharedUserData->ProcessFeatures[] array
+ *
+ * It creates a registry subhierarchy, looking like:
+ * "\HARDWARE\DESCRIPTION\System\CentralProcessor\<processornumber>\Identifier (CPU x86)".
+ * Note that there is a hierarchy for every processor installed, so this
+ * supports multiprocessor systems. This is done like Win95 does it, I think.
+ *
+ * It creates some registry entries in the environment part:
+ * "\HKLM\System\CurrentControlSet\Control\Session Manager\Environment". These are
+ * always present. When deleted, Windows will add them again.
*/
void fill_cpu_info(void)
{
@@ -1222,6 +1377,8 @@ 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();
}
/******************************************************************************
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 158bd8e..07e063a 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -315,7 +315,6 @@ HANDLE thread_init(void)
signal_init_thread( teb );
virtual_init_threading();
- fill_cpu_info();
debug_info.str_pos = debug_info.strings;
debug_info.out_pos = debug_info.output;
@@ -359,6 +358,8 @@ HANDLE thread_init(void)
user_shared_data->TickCountLowDeprecated = user_shared_data->u.TickCount.LowPart;
user_shared_data->TickCountMultiplier = 1 << 24;
+ fill_cpu_info();
+
return exe_file;
}
More information about the wine-patches
mailing list