[Bug 33904] Face Noir demo crashes on start without native d3dx9_36 ('D3DXLoadSkinMeshFromXof' must return 'ID3DXSkinInfo' interface even with no skinning info present)

wine-bugs at winehq.org wine-bugs at winehq.org
Wed Jul 1 16:52:27 CDT 2015


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

Anastasius Focht <focht at gmx.net> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
                URL|http://spiele.download.t-on |http://www.gamershell.com/d
                   |line.de/dladvert/115472     |ownload_101805.shtml
                 CC|                            |focht at gmx.net
            Summary|Face Noir demo crashes on   |Face Noir demo crashes on
                   |start without native        |start without native
                   |d3dx9_36                    |d3dx9_36
                   |                            |('D3DXLoadSkinMeshFromXof'
                   |                            |must return 'ID3DXSkinInfo'
                   |                            |interface even with no
                   |                            |skinning info present)
     Ever confirmed|0                           |1

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

confirming.

--- snip ---
$ pwd
/home/focht/.wine/drive_c/Program Files/Face Noir Demo

$ WINEDEBUG=+tid,+seh,+relay,+d3d,+d3dx,+d3dxof wine ./Face\ Noir.exe >>log.txt
2>&1
...
002e:Call KERNEL32.CreateFileA(0032f680
".\\data.dcp",80000000,00000003,0032f520,00000003,00000080,00000000)
ret=004d6ce8
002e:Ret  KERNEL32.CreateFileA() retval=0000007c ret=004d6ce8
...
002e:Call KERNEL32.CreateFileA(16067710
"actors\\logos\\logos.act3d",80000000,00000003,0032d908,00000003,00000080,00000000)
ret=004d6ce8
002e:Ret  KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8
...
002e:Call KERNEL32.CreateFileA(00af6fc3
"actors\\logos\\logos.script",80000000,00000003,0032d674,00000003,00000080,00000000)
ret=004d6ce8
002e:Ret  KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8
...
002e:Call KERNEL32.CreateFileA(00af7126
"actors\\logos\\logos.x",80000000,00000003,0032d734,00000003,00000080,00000000)
ret=004d6ce8
002e:Ret  KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8
...
002e:Call d3dx9_36.D3DXFileCreate(00b35750) ret=0049ecff
002e:trace:d3dx:D3DXFileCreate d3dxfile 0xb35750.
...
002e:Call d3dxof.DirectXFileCreate(01a27ca8) ret=7ed58284
002e:trace:d3dxof:DirectXFileCreate (0x1a27ca8)
002e:trace:d3dxof:IDirectXFileImpl_Create ((nil),0x1a27ca8)
...
002e:Ret  d3dx9_36.D3DXFileCreate() retval=00000000 ret=0049ecff
002e:trace:d3dx:d3dx9_file_RegisterTemplates iface 0x1a27ca0, data 0x575c20,
size 3278.
002e:trace:d3dxof:IDirectXFileImpl_RegisterTemplates
(0x27b3020/0x27b3020)->(0x575c20,3278)
002e:trace:d3dxof:IDirectXFileImpl_RegisterTemplates Registered templates (36):
Header - {3d82ab43-62da-11cf-ab39-0020af71e433}
Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433}
Coords2d - {f6f23f44-7686-11cf-8f52-0040333594a3}
...
StringProperty - {7f0f21e0-bfe1-11d1-82c0-00a0c9697271}
PropertyBag - {7f0f21e1-bfe1-11d1-82c0-00a0c9697271}
ExternalVisual - {98116aa0-bdba-11d1-82c0-00a0c9697271}
RightHanded - {7f5d5ea0-d53a-11d1-82c0-00a0c9697271}
...
002e:trace:d3dx:d3dx9_file_CreateEnumObject iface 0x1a27ca0, source 0x32fa34,
options 0x3, enum_object 0xb35754.
...
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject
(0x27b3020/0x27b3020)->(0x32f98c,2,0x32f9a0)
002e:trace:d3dxof:IDirectXFileEnumObjectImpl_Create (0x32f8bc)
...
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Source in memory at
0xb2fe60 with size 3913
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject File size is 3913 bytes
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Registered templates (55):
Header - {3d82ab43-62da-11cf-ab39-0020af71e433}
Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433}
Coords2d - {f6f23f44-7686-11cf-8f52-0040333594a3} 
...
FloatKeys - {10dd46a9-775b-11cf-8f52-0040333594a3}
TimedFloatKeys - {f406b180-7b3b-11cf-8f52-0040333594a3}
AnimationKey - {10dd46a8-775b-11cf-8f52-0040333594a3}
002e:trace:d3dxof:IDirectXFileEnumObjectImpl_GetNextDataObject
(0x1a27cd0/0x1a27cd0)->(0x32f988)
002e:trace:d3dxof:IDirectXFileDataImpl_Create (0x32f904)
...
002e:Call
d3dx9_36.D3DXLoadSkinMeshFromXof(01a60990,00000220,00156a68,0032f838,0032f834,00000000,0032f82c,0032f83c,0032f844)
ret=004a7047
002e:trace:d3dx:D3DXLoadSkinMeshFromXof (0x1a60990, 220, 0x156a68, 0x32f838,
0x32f834, (nil), 0x32f82c, 0x32f83c, 0x32f844)
002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1a60990, size 0x32f5a8, data
0x32f5a4.
002e:trace:d3dxof:IDirectXFileDataImpl_GetData
(0x1a60968/0x1a60968)->((null),0x32f52c,0x32f5a4)
...
002e:trace:d3dx:d3dx9_mesh_OptimizeInplace iface 0x1a28308, flags 0x32000000,
adjacency_in (nil), adjacency_out (nil), face_remap_out (nil), vertex_remap_out
(nil). 
...
002e:trace:d3dx:d3dx9_mesh_GenerateAdjacency iface 0x1a28308, epsilon
0.00000000e+00, adjacency 0x1a28588. 
...
002e:Ret  d3dx9_36.D3DXLoadSkinMeshFromXof() retval=00000000 ret=004a7047
...
002e:trace:d3dx:d3dx9_mesh_GetNumFaces iface 0x1a28308.
002e:trace:seh:raise_exception code=c0000005 flags=0 addr=0x4a9013 ip=004a9013
tid=002e
002e:trace:seh:raise_exception  info[0]=00000000
002e:trace:seh:raise_exception  info[1]=00000000
002e:trace:seh:raise_exception  eax=00000000 ebx=00b1bbd8 ecx=00b30e08
edx=7bcfcb48 esi=00000002 edi=00000000
002e:trace:seh:raise_exception  ebp=009d4c88 esp=0032f80c cs=0023 ds=002b
es=002b fs=0063 gs=006b flags=00010206
002e:trace:seh:call_stack_handlers calling handler at 0x52002a code=c0000005
flags=0 
--- snip ---

I suspect the missing skinning information being the problem here.

Debugging the call yields:

--- snip ---
Wine-dbg>n
3664        if (skin_info_out) *skin_info_out = mesh_data.skin_info;

Wine-dbg>p mesh_data

{num_vertices=0x6, num_poly_faces=0x2, num_tri_faces=0x2, vertices=0x19fa7d0,
num_tri_per_face=0x1a4e4c8, indices=0x19fa820, fvf=0x112, num_normals=0x6,
normals=0x19fa840, normal_indices=0x19fa890, tex_coords=0x19fa930,
vertex_colors=0x0(nil), num_materials=0x1, materials=0x19fa8b0,
material_indices=0x19fa900, skin_info=(nil), nb_bones=0}
--- snip ---

The skinning info is not present hence a NULL ID3DXSkinInfo out pointer is set.
I found no 'parse_mesh' trace (warn) messages.

There is one succeeding 'd3dx9_36.D3DXLoadSkinMeshFromXof' call before:

--- snip ---
...
002e:Call KERNEL32.CreateFileA(00b7dfdb
"actors\\jack\\jack.x",80000000,00000003,0032d738,00000003,00000080,00000000)
ret=004d6ce8
002e:Ret  KERNEL32.CreateFileA() retval=ffffffff ret=004d6ce8
...
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Source in memory at
0xb8ab48 with size 429181
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject File size is 429181 bytes
002e:trace:d3dxof:IDirectXFileImpl_CreateEnumObject Registered templates (52):
Header - {3d82ab43-62da-11cf-ab39-0020af71e433}
Vector - {3d82ab5e-62da-11cf-ab39-0020af71e433} 
...
XSkinMeshHeader - {3cf169ce-ff7c-44ab-93c0-f78f62d172e2}
SkinWeights - {6f0d123b-bad2-4167-a0d0-80224f25fabb}
002e:trace:d3dxof:IDirectXFileEnumObjectImpl_GetNextDataObject
(0x1766da8/0x1766da8)->(0x32f988)
002e:trace:d3dxof:IDirectXFileDataImpl_Create (0x32f904) 
...
002e:Call
d3dx9_36.D3DXLoadSkinMeshFromXof(01aae758,00000220,00156a68,0032f83c,0032f838,00000000,0032f830,0032f840,0032f848)
ret=004a7047
002e:trace:d3dx:D3DXLoadSkinMeshFromXof (0x1aae758, 220, 0x156a68, 0x32f83c,
0x32f838, (nil), 0x32f830, 0x32f840, 0x32f848)
002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1aae758, size 0x32f5a8, data
0x32f5a4.
002e:trace:d3dxof:IDirectXFileDataImpl_GetData
(0x1785ab8/0x1785ab8)->((null),0x32f52c,0x32f5a4) 
...
002e:trace:d3dx:parse_skin_mesh_info (0x1785cd0, 0x32f694, 0)
002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1785cd0, size 0x32f528, data
0x32f524.
002e:trace:d3dxof:IDirectXFileDataImpl_GetData
(0x1aae948/0x1aae948)->((null),0x32f4cc,0x32f524)
002e:trace:d3dx:D3DXCreateSkinInfoFVF (7506, 112, 37, 0x32f6d0)
002e:trace:d3dx:D3DXDeclaratorFromFVF fvf 0x112, declaration 0x32f2cc.
002e:trace:d3dx:D3DXCreateSkinInfo num_vertices 7506, declaration 0x32f2cc,
num_bones 37, skin_info 0x32f6d0.
...
002e:trace:d3dx:d3dx9_skin_info_SetDeclaration iface 0x1769628, declaration
0x32f2cc.
002e:trace:d3dx:D3DXFVFFromDeclarator (0x1769634, 0x1769630)
002e:trace:d3dx:d3dx9_file_data_Unlock iface 0x1785cd0.
002e:trace:d3dx:d3dx9_file_data_Release 0x1785cd0 decreasing refcount to 1.
002e:trace:d3dx:d3dx9_file_data_GetChild iface 0x1aae758, id 0x4, object
0x32f590.
002e:trace:d3dx:d3dx9_file_data_AddRef 0x1aae998 increasing refcount to 2.
002e:trace:d3dx:d3dx9_file_data_GetType iface 0x1aae998, guid 0x32f594.
002e:trace:d3dxof:IDirectXFileDataImpl_GetType
(0x1aae970/0x1aae970)->(0x32f52c)
002e:trace:d3dx:parse_skin_mesh_info (0x1aae998, 0x32f694, 0)
002e:trace:d3dx:d3dx9_file_data_Lock iface 0x1aae998, size 0x32f528, data
0x32f524.
002e:trace:d3dxof:IDirectXFileDataImpl_GetData
(0x1aae970/0x1aae970)->((null),0x32f4cc,0x32f524)
002e:trace:d3dx:d3dx9_skin_info_SetBoneName iface 0x1769628, bone_idx 0, name
"Spine_5". 
...
--- snip ---

The file 'data.dcp' is actually a Wintermute Engine data file, one can see the
signature at the beginning.
Wikipedia also lists the game using the engine:

https://en.wikipedia.org/wiki/Wintermute_Engine#Games_developed_with_Wintermute

I found a tool which allows to unpack the data file:

http://forum.xentax.com/viewtopic.php?f=32&t=9625

http://www.mediafire.com/download/rard7tih3dwmqjf/DCP_Unpacker.exe

--- snip ---
$ wine ./DCP_Unpacker.exe data.dcp
...
WinterMute Engine Unpacker by Vash v1.0.1 -vash.romhacking.it-

Extracting 2106 files
11455A4BExtracing actors\Animation\Base.X [1 on 2106]
Extracing actors\Animation\Dord.png [2 on 2106]
Extracing actors\Animation\Dord.X [3 on 2106]
Extracing actors\Animation\Gun.X [4 on 2106]
Extracing actors\Animation\Gun_Jack.png [5 on 2106]
...
Extracing actors\logos\logos.act3d [580 on 2106]
Extracing actors\logos\logos.script [581 on 2106]
Extracing actors\logos\logos.X [582 on 2106]
Extracing actors\logos\Logo_1.png [583 on 2106]
Extracing actors\logos\Logo_2.png [584 on 2106]
Extracing actors\logos\Logo_Publisher.png [585 on 2106]
Extracing actors\logos\PROVV.png [586 on 2106]
...
Extracing ui_elements\win.bmp [2101 on 2106]
Extracing ui_elements\win.image [2102 on 2106]
Extracing ui_elements\win_inactive.bmp [2103 on 2106]
Extracing ui_elements\win_inactive.image [2104 on 2106]
Extracing ui_elements\win_mod.image [2105 on 2106]
Extracing ui_elements\win_mod.png [2106 on 2106]
--- snip ---

Inspecting 'actors\logos\logos.X' reveals there is no skinning info.

--- snip ---
$ grep -HR Skin  | uniq

Binary file actors/greta/greta.X matches
Binary file actors/Harlem/Heaven/Heaven.X matches
actors/inventario/inventario.x:template XSkinMeshHeader {
actors/inventario/inventario.x: WORD nMaxSkinWeightsPerVertex;
actors/inventario/inventario.x: WORD nMaxSkinWeightsPerFace;
actors/inventario/inventario.x:template SkinWeights {
actors/inventario/inventario.x:  XSkinMeshHeader {
actors/inventario/inventario.x:  SkinWeights {
Binary file actors/jack/jack.X matches
actors/Loc_GlenCove/Door/Door.X:template XSkinMeshHeader {
actors/Loc_GlenCove/Door/Door.X: WORD nMaxSkinWeightsPerVertex;
actors/Loc_GlenCove/Door/Door.X: WORD nMaxSkinWeightsPerFace;
actors/Loc_GlenCove/Door/Door.X:template SkinWeights {
actors/Loc_GlenCove/Door/Door.X:  XSkinMeshHeader {
actors/Loc_GlenCove/Door/Door.X:  SkinWeights {
actors/Loc_Melville/herman/herman.X:template XSkinMeshHeader {
actors/Loc_Melville/herman/herman.X: WORD nMaxSkinWeightsPerVertex;
actors/Loc_Melville/herman/herman.X: WORD nMaxSkinWeightsPerFace;
actors/Loc_Melville/herman/herman.X:template SkinWeights {
actors/Loc_Melville/herman/herman.X:  XSkinMeshHeader {
actors/Loc_Melville/herman/herman.X:  SkinWeights {
actors/Loc_Melville/policeman/policeman.X:template XSkinMeshHeader {
actors/Loc_Melville/policeman/policeman.X: WORD nMaxSkinWeightsPerVertex;
actors/Loc_Melville/policeman/policeman.X: WORD nMaxSkinWeightsPerFace;
actors/Loc_Melville/policeman/policeman.X:template SkinWeights {
actors/Loc_Melville/policeman/policeman.X:  XSkinMeshHeader {
actors/Loc_Melville/policeman/policeman.X:  SkinWeights {
Binary file actors/Loc_Melville/policeman_stealth_01/policeman_stealth_01.X
matches
Binary file actors/Loc_Melville/policeman_stealth_02/policeman_stealth_02.X
matches
Binary file actors/Loc_Melville/policeman_stealth_03/policeman_stealth_03.X
matches
Binary file actors/marsetti/marsetti.X matches
--- snip ---

MSDN doesn't specifically talk about this case, only mentioning what happens
when effect instance information is missing:

https://msdn.microsoft.com/en-us/library/windows/desktop/bb172899%28v=vs.85%29.aspx

Even with no actual skinning info present, the game engine still tries to call
methods on ID3DXSkinInfo (-> ID3DXSkinInfo::GetNumBones() -> 0), hence at least
an interface must be returned.

--- snip ---
...
004A9010  8B41 08  MOV EAX,DWORD PTR DS:[ECX+8]
004A9013  8B08     MOV ECX,DWORD PTR DS:[EAX]    ; ID3DXSkinInfo == NULL *boom*
004A9015  8B51 24  MOV EDX,DWORD PTR DS:[ECX+24] ; &ID3DXSkinInfo::GetNumBones
004A9018  50       PUSH EAX
004A9019  FFD2     CALL EDX
004A901B  C3       RETN
...
--- snip ---

$ sha1sum FaceNoir_Demo_Eng.zip 
32dce4d1eb732b12afe69b8af50023cbde1b3e19  FaceNoir_Demo_Eng.zip

$ du -sh FaceNoir_Demo_Eng.zip 
563M    FaceNoir_Demo_Eng.zip

$ wine --version
wine-1.7.46-118-g7a3c988

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