[Bug 37185] DirectPlayCreate fails to create instance in the game "Swing"
wine-bugs at winehq.org
wine-bugs at winehq.org
Sun Dec 7 17:11:19 CST 2014
https://bugs.winehq.org/show_bug.cgi?id=37185
Anastasius Focht <focht at gmx.net> changed:
What |Removed |Added
----------------------------------------------------------------------------
CC| |focht at gmx.net
--- Comment #10 from Anastasius Focht <focht at gmx.net> ---
Hello folks,
thanks for the email Bruno to interrupt my coffee break ... j/k :)
--- quote ---
The bug is: Why when running in Wine a crazy GUID is passed to
DirectPlayCreate?
--- quote ---
The game provided SP enum callback does something stupid: instead of copying
the service provider GUID it stores the address in an internal structure for
later use.
Actually it's an array of structures, with 'IPX' structure entry being indexed.
The GUID variable lives on stack within DirectPlayEnumerateAW() context so the
data only remains valid during the enumerate API call.
Source:
http://source.winehq.org/git/wine.git/blob/7e17eec75005e0e1c16b9b56422544246d772e7d:/dlls/dplayx/dplay.c#l5768
--- snip ---
5768 static HRESULT DirectPlayEnumerateAW(LPDPENUMDPCALLBACKA lpEnumCallbackA,
5769 LPDPENUMDPCALLBACKW lpEnumCallbackW,
5770 LPVOID lpContext)
5771 {
...
5803 /* Traverse all the service providers we have available */
5804 dwIndex = 0;
5805 while (1)
5806 {
5807 WCHAR subKeyName[255]; /* 255 is the maximum key size according to
MSDN */
5808 DWORD sizeOfSubKeyName = sizeof(subKeyName) / sizeof(WCHAR);
5809 HKEY hkServiceProvider;
5810 GUID serviceProviderGUID;
5811 WCHAR guidKeyContent[(2 * 16) + 1 + 6 /* This corresponds to
'{....-..-..-..-......}' */ ];
5812 DWORD sizeOfGuidKeyContent = sizeof(guidKeyContent);
5813 LONG ret_value;
...
5845 CLSIDFromString(guidKeyContent, &serviceProviderGUID );
...
5853 if (lpEnumCallbackA)
5854 {
5855 DWORD sizeOfDescription = 0;
5856
5873 if (!lpEnumCallbackA(&serviceProviderGUID, descriptionA, 6, 0,
lpContext))
5874 goto end;
...
--- snip ---
This obviously can't work with code that makes the assumption that the address
and the referenced content is still accessible outside of
DirectPlayEnumerateAW() context.
Since the data is read from registry and not very "dynamic" during runtime,
it's probably fine to retrieve and store it upon dplay creation (heap, list) to
be returned in DirectPlayEnumerateAW().
This also avoids the registry queries each time DirectPlayEnumerateAW() is
getting called.
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