http://bugs.winehq.org/show_bug.cgi?id=29957
Anastasius Focht focht@gmx.net changed:
What |Removed |Added ---------------------------------------------------------------------------- Keywords| |download URL| |http://www.oldapps.com/silv | |erlight.php?old_silverlight | |=11 CC| |focht@gmx.net Component|-unknown |kernel32 Summary|Silverlight 4 does not |Silverlight 4 does not |install |install (Microsoft | |PlayReady DRM scheme | |requires | |FILE_PERSISTENT_ACLS if | |returned filesystem type is | |NTFS)
--- Comment #4 from Anastasius Focht focht@gmx.net 2012-02-20 17:31:30 CST --- Hello,
the problem here is that a custom action creates the folder "C:\users\Public\Application Data\Microsoft\PlayReady" depending on certain filesystem properties of "c:".
View "Silverlight.msp" using "orca":
"InstallExecuteSequence" table:
--- snip --- SetupPlayReadyData (Not Installed or REINSTALL) and (VersionNT > 500) 6602 --- snip ---
"CustomAction" table:
--- snip --- SetupPlayReadyData 81 SLMSPRBootstrapDLL SetupPlayReadyData --- snip ---
Trace log:
--- snip --- 0025:Call KERNEL32.LoadLibraryW(0032f010 L"C:\Program Files\Microsoft Silverlight\4.0.60531.0\SLMSPRBootstrap.dll") ret=0100853c ... 0025:Ret PE DLL (proc=0x6681b7,module=0x650000 L"SLMSPRBootstrap.dll",reason=PROCESS_ATTACH,res=(nil)) retval=1 0025:Ret KERNEL32.LoadLibraryW() retval=00650000 ret=0100853c 0025:Call KERNEL32.GetProcAddress(00650000,01002bf0 "SetupPlayReadyData") ret=01008559 0025:Ret KERNEL32.GetProcAddress() retval=006c0022 ret=01008559 0025:CALL SLMSPRBootstrap.SetupPlayReadyData(<unknown, check return>) ret=0100856a ... 0025:Call advapi32.RegOpenKeyExW(80000002,006520f0 L"SOFTWARE\Microsoft\PlayReady",00000000,00020119,0032ef78) ret=00661c7c 0025:Ret advapi32.RegOpenKeyExW() retval=00000000 ret=00661c7c ... 0025:Call KERNEL32.GetFileAttributesW(00180d10 L"C:\users\Public\Application Data\Microsoft\PlayReady") ret=0069250c 0025:Ret KERNEL32.GetFileAttributesW() retval=ffffffff ret=0069250c ... 0025:Call KERNEL32.GetFullPathNameW(00180d10 L"C:\users\Public\Application Data\Microsoft\PlayReady",00000105,0032eb34,00000000) ret=0069453d 0025:Ret KERNEL32.GetFullPathNameW() retval=00000034 ret=0069453d 0025:Call shlwapi.PathStripToRootW(0032eb34 L"C:\users\Public\Application Data\Microsoft\PlayReady") ret=00694582 0025:Ret shlwapi.PathStripToRootW() retval=00000001 ret=00694582 0025:Call KERNEL32.GetVolumeInformationW(0032eb34 L"C:\",00000000,00000000,00000000,00000000,0032eb2c,0032ed40,00000105) ret=006945a6 0025:Ret KERNEL32.GetVolumeInformationW() retval=00000001 ret=006945a6 ... 0025:RET SLMSPRBootstrap.SetupPlayReadyData(00000000) retval=00000643 ret=0100856a --- snip ---
You have to debug the custom action to really see what's going on (code decrypted at runtime)...
GetVolumeInformationW() is the culprit here.
The code checks "lpFileSystemFlags" for 0x8 (FILE_PERSISTENT_ACLS) or lpFileSystemNameBuffer[0..2] == 'F','A','T'. If none of these conditions are met, an internal error is set (translated to generic 1603) and the folder is not created.
Wine reports default 'NTFS' filesystem but "lpFileSystemFlags" only contains "FILE_CASE_PRESERVED_NAMES" hence it fails here.
Code: http://source.winehq.org/git/wine.git/blob/d5ad5ca91ca6aa1a3eb2a3849bb0dbcb6...
--- snip --- 653 BOOL WINAPI GetVolumeInformationW( LPCWSTR root, LPWSTR label, DWORD label_len, 654 DWORD *serial, DWORD *filename_len, DWORD *flags, 655 LPWSTR fsname, DWORD fsname_len ) 656 { ... 771 switch(type) 772 { ... 791 default: 792 if (fsname) lstrcpynW( fsname, ntfsW, fsname_len ); 793 if (filename_len) *filename_len = 255; 794 if (flags) *flags = FILE_CASE_PRESERVED_NAMES; 795 break; 796 } --- snip ---
If you add FILE_PERSISTENT_ACLS the custom action tries to create the folder but fails because a part of folder -> "Microsoft" is not present. This is another bug.
--- snip --- 0024:Call KERNEL32.GetFullPathNameW(00181770 L"C:\users\Public\Application Data\Microsoft\PlayReady",00000105,0032eb34,00000000) ret=0069453d 0024:Ret KERNEL32.GetFullPathNameW() retval=00000034 ret=0069453d 0024:Call shlwapi.PathStripToRootW(0032eb34 L"C:\users\Public\Application Data\Microsoft\PlayReady") ret=00694582 0024:Ret shlwapi.PathStripToRootW() retval=00000001 ret=00694582 0024:Call KERNEL32.GetVolumeInformationW(0032eb34 L"C:\",00000000,00000000,00000000,00000000,0032eb2c,0032ed40,00000105) ret=006945a6 0024:Ret KERNEL32.GetVolumeInformationW() retval=00000001 ret=006945a6 0024:Call KERNEL32.GetVersionExW(0032ee1c) ret=00693e5f 0024:Ret KERNEL32.GetVersionExW() retval=00000001 ret=00693e5f 0024:Call advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW(00651fa0 L"D:(A;CIOI;GA;;;SY)(A;CIOI;GA;;;BA)(A;CIOI;GA;;;BU)(A;CIOI;GA;;;AU)",00000001,0032ef70,00000000) ret=00693f33 0024:Ret advapi32.ConvertStringSecurityDescriptorToSecurityDescriptorW() retval=00000001 ret=00693f33 0024:Call KERNEL32.CreateDirectoryW(00181770 L"C:\users\Public\Application Data\Microsoft\PlayReady",0032ef6c) ret=006929b6 0024:Ret KERNEL32.CreateDirectoryW() retval=00000000 ret=006929b6 0024:Call KERNEL32.GetLastError() ret=00692358 0024:Ret KERNEL32.GetLastError() retval=00000003 ret=00692358 ... 0024:RET SLMSPRBootstrap.SetupPlayReadyData(00000000) retval=00000643 ret=0100856a --- snip ---
Regards