[Bug 39269] FX Interactive Webplayer fails to install, reporting 'File not found' (SHFileOperation FO_MOVE operation with wildcard source fails)

wine-bugs at winehq.org wine-bugs at winehq.org
Sun Sep 13 10:21:36 CDT 2015


https://bugs.winehq.org/show_bug.cgi?id=39269

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |download, Installer
             Status|UNCONFIRMED                 |NEW
                URL|                            |http://downloadnavy.fxinter
                   |                            |active.com/wu_updates_priva
                   |                            |te/FXWebPlayer.exe
                 CC|                            |focht at gmx.net
          Component|-unknown                    |shell32
            Summary|missing stub for            |FX Interactive Webplayer
                   |downloading/installing .m2i |fails to install, reporting
                   |file                        |'File not found'
                   |                            |(SHFileOperation FO_MOVE
                   |                            |operation with wildcard
                   |                            |source fails)
     Ever confirmed|0                           |1

--- Comment #1 from Anastasius Focht <focht at gmx.net> ---
Hello folks,

confirming.

The download is completely fine.

Although "FIXME" stub messages could indicate some missing functionality in
many cases it's not the culprit and they tend to be rather harmless.

--- snip ---
$ WINEDEBUG=+tid,+seh,+relay,+wininet wine ./FXWebPlayer.exe >>log.txt 2>&1
...
002d:Call KERNEL32.OutputDebugStringA(007e4c90 "[WuUpdater] 00% Descargando
C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i:
") ret=0046a011
...
002d:Call wininet.HttpOpenRequestA(00000002,00491dd4 "GET",005e9240
"wu_updates_public/fxwebplayer.w2i",00491dd8
"HTTP/1.0",00000000,004a48ec,04000000,00000000) ret=004729a3
...
002d:trace:wininet:HTTP_HttpSendRequestW full request -> "GET
/wu_updates_public/fxwebplayer.w2i HTTP/1.0\r\nAccept: */*\r\nHost:
downloadnavy.fxinteractive.com\r\nUser-Agent: Mozilla/4.0 (compatible;
)\r\n\r\n"
...
002d:trace:wininet:HTTP_GetResponseHeaders version [L"HTTP/1.1"] status code
[L"200"] status text [L"OK"]
...
002d:trace:wininet:HTTP_GetResponseHeaders got line "Content-Length: 4189201",
now interpreting
...
002d:Call KERNEL32.OutputDebugStringA(007e4c98 "Down...") ret=0046a068
...
002d:Call KERNEL32.CreateFileA(005e8f68
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i",40000000,00000007,00000000,00000002,00000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000b4 ret=0046a1fe
...
002d:Call wininet.InternetReadFile(00000003,005ea4e8,0000ffff,007e5c84)
ret=00471f99
...
002d:trace:wininet:netconn_read read 60496 bytes
002d:trace:wininet:HTTPREQ_Read retrieved 60496 bytes (4189201)
002d:trace:wininet:WININET_Release object 0x157808 refcount = 1
002d:trace:wininet:InternetReadFile -- TRUE (0) (bytes read: 60496)
002d:Ret  wininet.InternetReadFile() retval=00000001 ret=00471f99
...
002d:Call KERNEL32.OutputDebugStringA(007e4c88 "4189201 bytes a -0.00 KB/s\n")
ret=0046a011
...
002d:Call KERNEL32.CreateFileA(005e8f68
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i",80000000,00000003,00000000,00000003,08000000,00000000)
ret=0046b983
002d:Ret  KERNEL32.CreateFileA() retval=000000ac ret=0046b983
002d:Call KERNEL32.GetFileSize(000000ac,007e6550) ret=0046b995
002d:Ret  KERNEL32.GetFileSize() retval=003fec11 ret=0046b995
002d:Call KERNEL32.SetFilePointer(000000ac,00000000,00000000,00000002)
ret=0046abd5
002d:Ret  KERNEL32.SetFilePointer() retval=003fec11 ret=0046abd5
002d:Call KERNEL32.SetFilePointer(000000ac,fffffffc,00000000,00000002)
ret=0046abe6
002d:Ret  KERNEL32.SetFilePointer() retval=003fec0d ret=0046abe6
002d:Call KERNEL32.ReadFile(000000ac,007e6504,00000004,007e64e8,00000000)
ret=0046abfa
002d:Ret  KERNEL32.ReadFile() retval=00000001 ret=0046abfa
002d:Call advapi32.CryptAcquireContextA(007e64d4,00000000,00491ecc "Microsoft
Base Cryptographic Provider v1.0",00000001,00000000) ret=00473ef6
...
002d:Ret  advapi32.CryptAcquireContextA() retval=00000000 ret=00473ef6
002d:Call
advapi32.CryptCreateHash(00000000,00008004,00000000,00000000,007e64dc)
ret=00473f45
002d:Ret  advapi32.CryptCreateHash() retval=00000000 ret=00473f45
...
002d:Call
advapi32.CryptVerifySignatureA(00000000,005ea4e8,00000080,00000000,00000000,00000000)
ret=00473f8f
002d:Ret  advapi32.CryptVerifySignatureA() retval=00000000 ret=00473f8f
002d:Call advapi32.CryptDestroyHash(00000000) ret=00473fa1
002d:Ret  advapi32.CryptDestroyHash() retval=00000000 ret=00473fa1
002d:Call KERNEL32.GetLastError() ret=00456aee
002d:Ret  KERNEL32.GetLastError() retval=00000006 ret=00456aee
...
002d:Call KERNEL32.OutputDebugStringA(007e54b0 "[WuUpdater] Firma no verificada
para
'C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i'.\n")
ret=0046a011
...
002d:Call KERNEL32.CreateFileA(005faa40
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/7zr.exe",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005fa640
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/dbghelp.dll",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005fa640
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/FXCaps.dll",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005fa640
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/Fxp.dll",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005f0be8
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/fxplanet.ocx",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005f0b80
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/FXWebPlayer.exe",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005f0b80
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/MFC71.dll",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005f0b80
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\data/mfc80.dll",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005f0be8
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\wu2_install.IT.cfg",c0000000,00000007,00000000,00000002,08000000,00000000)
ret=0046a1fe
002d:Ret  KERNEL32.CreateFileA() retval=000000e0 ret=0046a1fe
...
002d:Call KERNEL32.CreateFileA(005e8f68
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i",80000000,00000003,00000000,00000003,00000000,00000000)
ret=0040247a
002d:Ret  KERNEL32.CreateFileA() retval=000000ac ret=0040247a
002d:Call KERNEL32.CloseHandle(000000ac) ret=00402489
002d:Ret  KERNEL32.CloseHandle() retval=00000001 ret=00402489
002d:Call KERNEL32.DeleteFileA(005e8f68
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer.w2i")
ret=0046c61a
002d:Ret  KERNEL32.DeleteFileA() retval=00000001 ret=0046c61a
...
002d:Call KERNEL32.lstrlenA(007e5c6c "Descarga de W2I completada con \xe9xito")
ret=00468559
...
002d:Call KERNEL32.lstrlenA(007e533c "ProcessInstallW2I
(C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer ->
C:\\users\\Public\\Application Data\\FXWebPlayer, FXWebPlayer)") ret=00468559
...
002d:Call KERNEL32.lstrlenA(005f0209 "DEST") ret=00401811
...
002d:Call KERNEL32.lstrlenA(005faac8 "C:\\users\\Public\\Application
Data\\FXWebPlayer") ret=00403c59
...
002d:Call KERNEL32.lstrlenA(007e5028 "W2I:Rename C:\\users\\Public\\Application
Data\\FXWebPlayer\\npfxplanet.dll -> C:\\users\\Public\\Application
Data\\FXWebPlayer\\_npfxplanet.dll") ret=00468559
...
002d:Call shell32.SHFileOperationA(007e587c) ret=004117b9
...
002d:Ret  shell32.SHFileOperationA() retval=00000402 ret=004117b9
...
002d:Call KERNEL32.lstrlenA(007e5030 "ERROR ProcessInstallW2I (RENAME)")
ret=00468559
...
002d:Call KERNEL32.lstrlenA(007e5028 "W2I:Move
C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\Data\\*.*
-> C:\\users\\Public\\Application Data\\FXWebPlayer") ret=00468559
...
002d:Call KERNEL32.CreateDirectoryA(005ea418 "C:\\users\\Public\\Application
Data\\FXWebPlayer",00000000) ret=00411398
002d:Ret  KERNEL32.CreateDirectoryA() retval=00000001 ret=00411398
002d:Call shell32.SHFileOperationA(007e587c) ret=0041140d
002d:Call KERNEL32.MultiByteToWideChar(00000000,00000000,007e5914
"C:\\users\\focht\\Temp\\{02B22974-0252-4c1a-AC08-0346941DEA7A}\\fxwebplayer\\Data\\*.*",00000051,00000000,00000000)
ret=7e22ac06
...
002d:Ret  shell32.SHFileOperationA() retval=000004c7 ret=0041140d
002d:Call KERNEL32.GetLastError() ret=00456aee
002d:Ret  KERNEL32.GetLastError() retval=00000012 ret=00456aee
...
002d:Call KERNEL32.lstrlenA(007e5030 "ERROR ProcessInstallW2I (MOVE)")
ret=00468559
...
002d:Call shell32.ShellExecuteExA(007e6488) ret=0040db54
...
002d:Call KERNEL32.CreateProcessW(00000000,007e5070
L"\"C:\\users\\Public\\Application Data\\FXWebPlayer\\FXWebPlayer.exe\" /url
connect",00000000,00000000,00000000,00000410,00000000,00156ee8
L"C:\\users\\Public\\Application Data\\FXWebPlayer",007e4b40,007e4b30)
ret=7e223af6
002d:Ret  KERNEL32.CreateProcessW() retval=00000000 ret=7e223af6
...
002d:Call
KERNEL32.FormatMessageW(00001000,00000000,00000002,00000000,007e3bc8,00000800,00000000)
ret=7e2275f6
002d:Ret  KERNEL32.FormatMessageW() retval=00000011 ret=7e2275f6
002d:Call user32.MessageBoxW(00000000,007e3bc8 L"File not
found.\r\n",00000000,00000010) ret=7e22761e
--- snip ---

The bootstrapper downloads and verifies package successfully.
It unpacks the files to a temporary location:

--- snip ---
$ ls -1sh
users/focht/Temp/\{02B22974-0252-4c1a-AC08-0346941DEA7A\}/fxwebplayer/data/
total 8.8M
328K 7zr.exe
796K dbghelp.dll
 32K FXCaps.dll
224K Fxp.dll
844K fxplanet.ocx
980K FXWebPlayer.exe
1.1M MFC71.dll
1.1M mfc80.dll
4.0K Microsoft.VC80.CRT.manifest
4.0K Microsoft.VC80.MFC.manifest
488K msvcp71.dll
536K msvcp80.dll
340K msvcr71.dll
612K msvcr80.dll
932K npfxplanet.dll
4.0K packages.wu2
748K w2i.exe
4.0K wu2_uninstall.cfg
4.0K WuDescriptor.upd
--- snip ---

It then proceeds to execute some script/config items which seems to be a custom
installer engine.

'wu2_install.EN.cfg':

--- snip ---
//Renombra el plugin
Rename {
    From    "$DEST\npfxplanet.dll"
    To        "$DEST\_npfxplanet.dll"
}

Rename {
    From    "$DEST\fxplanet.ocx"
    To        "$DEST\_fxplanet.ocx"
}

//Copia los archivos
Move {
    Source "$SRC\Data\*.*"
    Destination "$DEST"
}
...
--- snip ---

The culprit (as already seen in trace log) is 'FO_MOVE' operation of
'SHFileOperation':

--- snip ---
Wine-dbg>c
Stopped on breakpoint 1 at 0x7e469c6f SHFileOperationA
[/home/focht/projects/wine/wine.repo/src/dlls/shell32/shlfileop.c:867] in
shell32
867    {
Wine-dbg>p *lpFileOp
{hwnd=(nil), wFunc=0x1,
pFrom="C:\users\focht\Temp\{02B22974-0252-4c1a-AC08-0346941DEA7A}\fxwebplayer\Data\*.*",
pTo="C:\users\Public\Application Data\FXWebPlayer", fFlags=0x614,
fAnyOperationsAborted=0x5adc0000, hNameMappings=0x7e, lpszProgressTitle=***
invalid address 0x5ac00000 ***}

...
Wine-dbg>bt
Backtrace:
=>0 0x7e46b304 move_files(lpFileOp=0x7e57e2, flFrom=0x7e5784, flTo=0x7e576c)
[/home/focht/projects/wine/wine.repo/src/dlls/shell32/shlfileop.c:1404] in
shell32 (0x007e57b8)
  1 0x7e469da7 SHFileOperationA+0x137(lpFileOp=<couldn't compute location>)
[/home/focht/projects/wine/wine.repo/src/dlls/shell32/shlfileop.c:887] in
shell32 (0x007e5828)
  2 0x0041140d in fxwebplayer (+0x1140c) (0x007e5914)

Wine-dbg>p *flFrom
{feFiles=0x1429c0, num_alloc=0x20, dwNumFiles=0x13, bAnyFromWildcard=0x1,
bAnyDirectories=0, bAnyDontExist=0}

Wine-dbg>p *flFrom->feFiles
{attributes=0x20,
szDirectory="C:\users\focht\Temp\{02B22974-0252-4c1a-AC08-0346941DEA7A}\fxwebplayer\Data",
szFilename="7zr.exe",
szFullPath="C:\users\focht\Temp\{02B22974-0252-4c1a-AC08-0346941DEA7A}\fxwebplayer\Data\7zr.exe",
bFromWildcard=0x1, bFromRelative=0, bExists=0}

Wine-dbg>p *flTo
{feFiles=0x144750, num_alloc=0x20, dwNumFiles=0x1, bAnyFromWildcard=0,
bAnyDirectories=0x1, bAnyDontExist=0}

Wine-dbg>p *flTo->feFiles
{attributes=0x10, szDirectory="C:\users\Public\Application Data",
szFilename="FXWebPlayer", szFullPath="C:\users\Public\Application
Data\FXWebPlayer", bFromWildcard=0, bFromRelative=0, bExists=0x1}

Wine-dbg>n
1422        if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) &&
Wine-dbg>n
1424            flFrom->dwNumFiles > flTo->dwNumFiles)
Wine-dbg>n
1423            !flFrom->bAnyDirectories &&
Wine-dbg>n
1426            return ERROR_CANCELLED;

--- snip ---

Source:
https://source.winehq.org/git/wine.git/blob/637bcd5de91bb1265b58c41af660749cc4d66994:/dlls/shell32/shlfileop.c#l1402

--- snip ---
1402 /* the FO_MOVE operation */
1403 static int move_files(LPSHFILEOPSTRUCTW lpFileOp, const FILE_LIST *flFrom,
const FILE_LIST *flTo)
1404 {
1405     DWORD i;
1406     INT mismatched = 0;
1407     const FILE_ENTRY *entryToMove;
1408     const FILE_ENTRY *fileDest;
1409 
1410     if (!flFrom->dwNumFiles)
1411         return ERROR_SUCCESS;
1412 
1413     if (!flTo->dwNumFiles)
1414         return ERROR_FILE_NOT_FOUND;
1415 
1416     if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) &&
1417         flTo->dwNumFiles > 1 && flFrom->dwNumFiles > 1)
1418     {
1419         return ERROR_CANCELLED;
1420     }
1421 
1422     if (!(lpFileOp->fFlags & FOF_MULTIDESTFILES) &&
1423         !flFrom->bAnyDirectories &&
1424         flFrom->dwNumFiles > flTo->dwNumFiles)
1425     {
1426         return ERROR_CANCELLED;
1427     }
...
--- snip ---

The code was introduced with this huge commit:
https://source.winehq.org/git/wine.git/commitdiff/1be970d48572d6f988eeedb6e39bf57b141b555e
("shell32: Reimplement a factored SHFileOperation.") several years ago.

Interesting it went unnoticed all the time. A wildcard move operation is not
that uncommon.

$ sha1sum FXWebPlayer.exe 
7ac6feccd6fd4438cf3d773b4a792c9d31458778  FXWebPlayer.exe

$ du -sh FXWebPlayer.exe 
744K    FXWebPlayer.exe

$ wine --version
wine-1.7.51-102-ga7e294c

Regards

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list