http://bugs.winehq.org/show_bug.cgi?id=33661
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Status|UNCONFIRMED |NEW CC| |focht@gmx.net Component|-unknown |advapi32 Summary|Microsoft SQL Server |Microsoft SQL Server |Management Studio Express |Management Studio Express |2008 R2 installer fails |2008 R2 installer fails | |(missing registry | |configuration data for the | |Windows Performance | |Library) Ever Confirmed|0 |1
--- Comment #1 from Anastasius Focht focht@gmx.net 2013-05-26 06:49:30 CDT --- Hello folks,
confirming.
Interestingly even for Windows there are numerous reports about this issue - although locale related (search for "Microsoft SQL 2008 Setup: Performance Counter Registry Hive consistency check failed").
The sub-installer tries to read the registry configuration data for the Windows Performance Library which is obviously missing in Wine.
Relevant part of trace log:
--- snip --- 002e:Call KERNEL32.CreateProcessW(00336150 L"C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release\x86\setup100.exe",0032c334 L""C:\Program Files\Microsoft SQL Server\100\Setup Bootstrap\Release\x86\setup100.exe" /q /FEATURES=SSMS /ACTION=Install /ACTION=Install /WORKFLOW=Install /TIMESTAMP=20130526_124202 /LOGMARKER= /MEDIASOURCE="C:\8f85d9cd0da97d9a01988db39973b870\\" /INSTALLMEDIAPATH="C:\8f85d9cd0da97d9"...,00000000,00000000,00000001,00000020,00000000,00000000,0032c2cc,0032c318) ret=010112cf ... 0054:Call KERNEL32.__wine_kernel_init() ret=7bc5444e 002e:Ret KERNEL32.CreateProcessW() retval=00000001 ret=010112cf ... 0054:Call advapi32.RegOpenKeyExW(80000002,0155146c L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib",00000000,00020019,0033ef70) ret=0037a9a3 0054:Ret advapi32.RegOpenKeyExW() retval=00000000 ret=0037a9a3 ... 0054:Call advapi32.RegQueryValueExW(0000260c,01551220 L"Last Counter",00000000,0033efb8,00000000,0033efb4) ret=0037ac1e 0054:Ret advapi32.RegQueryValueExW() retval=00000002 ret=0037ac1e ... 0054:Call advapi32.RegQueryValueExW(0000260c,0155124c L"Last Help",00000000,0033efb8,00000000,0033efb4) ret=0037ac1e 0054:Ret advapi32.RegQueryValueExW() retval=00000002 ret=0037ac1e ... 0054:Call advapi32.RegOpenKeyExW(80000002,01551e0c L"SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib\009",00000000,00020019,0033ef70) ret=0037a9a3 0054:Ret advapi32.RegOpenKeyExW() retval=00000002 ret=0037a9a3 ... 0054:Call advapi32.RegCloseKey(0000260c) ret=030e93ab 0054:Ret advapi32.RegCloseKey() retval=00000000 ret=030e93ab ... 0054:Call KERNEL32.WriteFile(00000010,00a9cf14,000000bb,0033f04c,00000000) ret=0037a89f The performance counter registry hive is corrupted. To continue, you must repair the performance counter registry hive. For more information, see http://support.microsoft.com/kb/300956. 0054:Ret KERNEL32.WriteFile() retval=00000001 ret=0037a89f --- snip ---
The sub-installer and some components are mixed/managed code. Relevant part extracted by using "ILSpy" tool:
--- snip --- ... private bool CheckPerfMonCounter() { string text = "SOFTWARE\Microsoft\Windows NT\CurrentVersion\Perflib"; int major = Environment.get_OSVersion().get_Version().get_Major(); int lCID = CultureInfo.get_InstalledUICulture().get_LCID(); string text2; if (major >= 6 && (lCID == 1028 || lCID == 2052 || lCID == 1046)) { text2 = string.Format("{0,4}", lCID.ToString("X")).Replace(" ", "0"); } else { if (31748 == CultureInfo.get_InstalledUICulture().get_Parent().get_LCID()) { text2 = "004"; } else { text2 = string.Format("{0,3}", CultureInfo.get_InstalledUICulture().get_Parent().get_LCID().ToString("X")).Replace(" ", "0"); } } int num = -1; int num2 = -1; int num3 = -1; int num4 = -1; using (RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(text)) { if (registryKey == null) { bool result = false; return result; } num = Convert.ToInt32(registryKey.GetValue("Last Counter")); num2 = Convert.ToInt32(registryKey.GetValue("Last Help")); StringBuilder stringBuilder = new StringBuilder(text); stringBuilder.Append(Path.DirectorySeparatorChar); stringBuilder.Append(text2); using (RegistryKey registryKey2 = Registry.LocalMachine.OpenSubKey(stringBuilder.ToString())) { if (registryKey2 == null) { bool result = false; return result; } string[] array = (string[])registryKey2.GetValue("Counter"); string[] array2 = (string[])registryKey2.GetValue("Help"); int num5 = 2; if (array == null || array.Length <= 0) { bool result = false; return result; } if (string.IsNullOrEmpty(array[array.Length - 1])) { num5 = 3; } num3 = Convert.ToInt32(array[array.Length - num5]); int num6 = 2; if (array2 == null || array2.Length <= 0) { bool result = false; return result; } if (string.IsNullOrEmpty(array2[array2.Length - 1])) { num6 = 3; } num4 = Convert.ToInt32(array2[array2.Length - num6]); } } return num >= num3 && num2 >= num4; } --- snip ---
Unless there is some work on this, namely the perflib part of advapi32 you might get around by faking the registry keys.
Here is link to a diagram that shows how perfdata consumers, the registry, PDH, and performance DLLs and application providers work together:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa371643%28v=vs.85%2...
(just to get the big picture).
Regards