From a022062cab2f927d6f027c1ae36238b21782fe70 Mon Sep 17 00:00:00 2001 From: Alexandre Julliard Date: Thu, 24 Sep 2009 14:22:57 +0200 Subject: [PATCH] ntdll: Move creation of the CPU-specific registry keys to wineboot. --- dlls/ntdll/nt.c | 156 ----------------------------------- programs/wineboot/wineboot.c | 122 +++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 156 deletions(-) diff --git a/dlls/ntdll/nt.c b/dlls/ntdll/nt.c index f221792dd02..b29a8ae0797 100644 --- a/dlls/ntdll/nt.c +++ b/dlls/ntdll/nt.c @@ -857,160 +857,6 @@ static inline void get_cpuinfo(SYSTEM_CPU_INFORMATION* info) } } -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','\\', - '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; - ULONG dispos; - - 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, 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, REG_OPTION_VOLATILE, NULL )) NtClose( hkey ); - - RtlInitUnicodeString( &nameW, cpuW ); - if (!NtCreateKey( &cpu_key, KEY_ALL_ACCESS, &attr, 0, NULL, REG_OPTION_VOLATILE, 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, REG_OPTION_VOLATILE, 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 ); - return TRUE; -} - -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 * @@ -1384,8 +1230,6 @@ void fill_cpu_info(void) #endif TRACE("<- CPU arch %d, level %d, rev %d, features 0x%x\n", cached_sci.Architecture, cached_sci.Level, cached_sci.Revision, cached_sci.FeatureSet); - - if (create_system_registry_keys()) create_env_registry_keys(); } /****************************************************************************** diff --git a/programs/wineboot/wineboot.c b/programs/wineboot/wineboot.c index 85e2897a0f8..2587ef58ce5 100644 --- a/programs/wineboot/wineboot.c +++ b/programs/wineboot/wineboot.c @@ -71,6 +71,7 @@ # include #endif #include +#include #include #include #include @@ -157,6 +158,125 @@ done: return ret; } +/* create the volatile hardware registry keys */ +static void create_hardware_registry_keys(void) +{ + static const WCHAR SystemW[] = {'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; + HKEY hkey, system_key, cpu_key, fpu_key; + SYSTEM_CPU_INFORMATION sci; + PROCESSOR_POWER_INFORMATION power_info; + WCHAR idW[60]; + + NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL ); + if (NtPowerInformation(ProcessorInformation, NULL, 0, &power_info, sizeof(power_info))) + power_info.MaxMhz = 0; + + /*TODO: report 64bit processors properly*/ + sprintfW( idW, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); + + if (RegCreateKeyExW( HKEY_LOCAL_MACHINE, SystemW, 0, NULL, REG_OPTION_VOLATILE, + KEY_ALL_ACCESS, NULL, &system_key, NULL )) + return; + + RegSetValueExW( system_key, IdentifierW, 0, REG_SZ, (const BYTE *)SysidW, sizeof(SysidW) ); + + if (RegCreateKeyExW( system_key, fpuW, 0, NULL, REG_OPTION_VOLATILE, + KEY_ALL_ACCESS, NULL, &fpu_key, NULL )) + fpu_key = 0; + if (RegCreateKeyExW( system_key, cpuW, 0, NULL, REG_OPTION_VOLATILE, + KEY_ALL_ACCESS, NULL, &cpu_key, NULL )) + cpu_key = 0; + + for (i = 0; i < NtCurrentTeb()->Peb->NumberOfProcessors; i++) + { + WCHAR numW[10]; + + sprintfW( numW, PercentDW, i ); + if (!RegCreateKeyExW( cpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, + KEY_ALL_ACCESS, NULL, &hkey, NULL )) + { + RegSetValueExW( hkey, IdentifierW, 0, REG_SZ, + (const BYTE *)idW, (strlenW(idW) + 1) * sizeof(WCHAR) ); + /*TODO; report amd's properly*/ + RegSetValueExW( hkey, VendorIdentifierW, 0, REG_SZ, + (const BYTE *)VenidIntelW, sizeof(VenidIntelW) ); + RegSetValueExW( hkey, mhzKeyW, 0, REG_DWORD, (BYTE *)&power_info.MaxMhz, sizeof(DWORD) ); + RegCloseKey( hkey ); + } + if (!RegCreateKeyExW( fpu_key, numW, 0, NULL, REG_OPTION_VOLATILE, + KEY_ALL_ACCESS, NULL, &hkey, NULL )) + { + RegSetValueExW( hkey, IdentifierW, 0, REG_SZ, + (const BYTE *)idW, (strlenW(idW) + 1) * sizeof(WCHAR) ); + RegCloseKey( hkey ); + } + } + RegCloseKey( fpu_key ); + RegCloseKey( cpu_key ); + RegCloseKey( system_key ); +} + +/* create the platform-specific environment registry keys */ +static void create_environment_registry_keys( void ) +{ + static const WCHAR EnvironW[] = {'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}; + + HKEY env_key; + SYSTEM_CPU_INFORMATION sci; + WCHAR buffer[60]; + + NtQuerySystemInformation( SystemCpuInformation, &sci, sizeof(sci), NULL ); + + if (RegCreateKeyW( HKEY_LOCAL_MACHINE, EnvironW, &env_key )) return; + + sprintfW( buffer, PercentDW, NtCurrentTeb()->Peb->NumberOfProcessors ); + RegSetValueExW( env_key, NumProcW, 0, REG_SZ, (BYTE *)buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) ); + + /* TODO: currently hardcoded x86, add different processors */ + RegSetValueExW( env_key, ProcArchW, 0, REG_SZ, (const BYTE *)x86W, sizeof(x86W) ); + + /* TODO: currently hardcoded Intel, add different processors */ + sprintfW( buffer, IntelCpuDescrW, sci.Level, HIBYTE(sci.Revision), LOBYTE(sci.Revision) ); + RegSetValueExW( env_key, ProcIdW, 0, REG_SZ, (BYTE *)buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) ); + + sprintfW( buffer, PercentDW, sci.Level ); + RegSetValueExW( env_key, ProcLvlW, 0, REG_SZ, (BYTE *)buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) ); + + /* Properly report model/stepping */ + sprintfW( buffer, Percent04XW, sci.Revision ); + RegSetValueExW( env_key, ProcRevW, 0, REG_SZ, (BYTE *)buffer, (strlenW(buffer) + 1) * sizeof(WCHAR) ); + + RegCloseKey( env_key ); +} + /* Performs the rename operations dictated in %SystemRoot%\Wininit.ini. * Returns FALSE if there was an error, or otherwise if all is ok. */ @@ -864,6 +984,8 @@ int main( int argc, char *argv[] ) ResetEvent( event ); /* in case this is a restart */ + create_hardware_registry_keys(); + create_environment_registry_keys(); wininit(); pendingRename();