http://bugs.winehq.org/show_bug.cgi?id=35166
Bug ID: 35166 Summary: NVIDIA CUDA Toolkit v5.5 installer fails (NtQueryKey with KeyNameInformation info class unsupported on server side) Product: Wine Version: 1.7.8 Hardware: x86 OS: Linux Status: NEW Severity: normal Priority: P2 Component: wineserver Assignee: wine-bugs@winehq.org Reporter: focht@gmx.net Classification: Unclassified
Hello folks,
with bug 35144 fixed the installer still fails.
The installer is wrapped. Let it unpack first and then CTRL+C when the error dialog box is shown for easier reproducing. Run the extracted main installer.
Relevant part of trace log:
--- snip --- $ pwd /home/focht/.wine/drive_c/NVIDIA/CUDA
$ WINEDEBUG=+tid,+seh,+relay,+server wine ./setup.exe >>log.txt 2>&1 ...
0023:Call advapi32.RegOpenKeyExW(80000002,011e0f10 L"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2DA75DC7-0865-4BAD-BA86-074500CC350E}",00000000,00000001,01f6e1dc) ret=101ba81a 0023: open_key( parent=001c, access=00000001, attributes=00000000, name=L"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{2DA75DC7-0865-4BAD-BA86-074500CC350E}" ) 0023: open_key() = 0 { hkey=00ac } 0023:Ret advapi32.RegOpenKeyExW() retval=00000000 ret=101ba81a ... 0023:Call KERNEL32.LoadLibraryW(00149068 L"C:\windows\system32\NTDLL.DLL") ret=101aa158 0023:Ret KERNEL32.LoadLibraryW() retval=7bc10000 ret=101aa158 0023:Call KERNEL32.GetProcAddress(7bc10000,10258070 "NtQueryKey") ret=101a9d6f 0023:Ret KERNEL32.GetProcAddress() retval=7bc21f68 ret=101a9d6f ... 0023:Call ntdll.NtQueryKey(000000ac,00000003,00000000,00000000,01f6e20c) ret=101cee1c 0023: enum_key( hkey=00ac, index=-1, info_class=3 ) 0023: enum_key() = INVALID_PARAMETER { subkeys=0, max_subkey=0, max_class=0, values=0, max_value=0, max_data=0, modif=0, total=0, namelen=0, name=L"", class=L"" } 0023:Ret ntdll.NtQueryKey() retval=c000000d ret=101cee1c 0023:Call advapi32.LsaNtStatusToWinError(c000000d) ret=101bbfc4 0023:Ret advapi32.LsaNtStatusToWinError() retval=00000057 ret=101bbfc4 0023:Call ntdll.RtlAllocateHeap(00110000,00000000,00000020) ret=101e2d58 0023:Ret ntdll.RtlAllocateHeap() retval=00130900 ret=101e2d58 0023:Call KERNEL32.RaiseException(e06d7363,00000001,00000003,01f6e18c) ret=101e6a02 0023:trace:seh:raise_exception code=e06d7363 flags=1 addr=0x7b83a8ef ip=7b83a8ef tid=0023 0023:trace:seh:raise_exception info[0]=19930520 0023:trace:seh:raise_exception info[1]=01f6e1a8 0023:trace:seh:raise_exception info[2]=102bc340 0023:trace:seh:raise_exception eax=7b826921 ebx=7b8ba000 ecx=19930520 edx=01f6e0d4 esi=01f6e178 edi=01f6e140 0023:trace:seh:raise_exception ebp=01f6e118 esp=01f6e0b4 cs=0023 ds=002b es=002b fs=0063 gs=006b flags=00000283 0023:trace:seh:call_stack_handlers calling handler at 0x10207179 code=e06d7363 flags=1 ... 0023:Call KERNEL32.OutputDebugStringW(0251d608 L" 46.115 | ERROR: [NVI2.NVInstaller] 2173@CNVInstaller::AddInstalledPackages : COM error: Exception {0x80070057; File: Registry.cpp; Line: 1086}. \n") ret=1001aa05 0023:Ret KERNEL32.OutputDebugStringW() retval=01f6d810 ret=1001aa05 --- snip ---
The strange thing is that the client side code (ntdll) really looks like it supports 'KeyNameInformation' info class in enumerate_key():
Source: http://source.winehq.org/git/wine.git/blob/97645d7a1a9eec6100c637534620ac681...
--- snip --- 211 static NTSTATUS enumerate_key( HANDLE handle, int index, KEY_INFORMATION_CLASS info_class, 212 void *info, DWORD length, DWORD *result_len ) 213 214 { 215 NTSTATUS ret; 216 void *data_ptr; 217 size_t fixed_size; 218 219 switch(info_class) 220 { 221 case KeyBasicInformation: data_ptr = ((KEY_BASIC_INFORMATION *)info)->Name; break; 222 case KeyFullInformation: data_ptr = ((KEY_FULL_INFORMATION *)info)->Class; break; 223 case KeyNodeInformation: data_ptr = ((KEY_NODE_INFORMATION *)info)->Name; break; 224 case KeyNameInformation: data_ptr = ((KEY_NAME_INFORMATION *)info)->Name; break; 225 default: 226 FIXME( "Information class %d not implemented\n", info_class ); 227 return STATUS_INVALID_PARAMETER; 228 } 229 fixed_size = (char *)data_ptr - (char *)info; 230 231 SERVER_START_REQ( enum_key ) 232 { 233 req->hkey = wine_server_obj_handle( handle ); 234 req->index = index; 235 req->info_class = info_class; 236 if (length > fixed_size) wine_server_set_reply( req, data_ptr, length - fixed_size ); 237 if (!(ret = wine_server_call( req ))) 238 { 239 switch(info_class) 240 { ... 288 case KeyNameInformation: 289 { 290 KEY_NAME_INFORMATION keyinfo; 291 fixed_size = (char *)keyinfo.Name - (char *)&keyinfo; 292 keyinfo.NameLength = reply->namelen; 293 memcpy( info, &keyinfo, min( length, fixed_size ) ); 294 } 295 break; 296 } 297 *result_len = fixed_size + reply->total; 298 if (length < *result_len) ret = STATUS_BUFFER_OVERFLOW; 299 } 300 } 301 SERVER_END_REQ; 302 return ret; 303 } --- snip ---
If we take a look at the server side ... surprise:
Source: http://source.winehq.org/git/wine.git/blob/ea919d9de483223777948422e5c134bd7...
--- snip --- 864 static void enum_key( const struct key *key, int index, int info_class, 865 struct enum_key_reply *reply ) 866 { ... 886 switch(info_class) 887 { 888 case KeyBasicInformation: 889 classlen = 0; /* only return the name */ 890 /* fall through */ 891 case KeyNodeInformation: ... 897 case KeyFullInformation: ... 919 default: 920 set_error( STATUS_INVALID_PARAMETER ); 921 return; 922 } ... --- snip ---
The server needs to support KeyNameInformation info class.
$ sha1sum cuda_5.5.20_winxp_general_32.exe 19003fc955795e1a0d01d3e72b2df91c109d1e43 cuda_5.5.20_winxp_general_32.exe
$ du -sh cuda_5.5.20_winxp_general_32.exe 460M cuda_5.5.20_winxp_general_32.exe
$ wine --version wine-1.7.8-258-g15b3ff2
Regards