xlive: add initial stub dll (1/3)

Austin English austinenglish at gmail.com
Tue Nov 2 02:11:28 CDT 2010


This dll is not a core part of windows (at least, not yet), but I
think it should be considered for inclusion in Wine. A bit of
explanation is necessary:

xlive.dll comes from Games for Windows (1,2), whose installer depends
on .Net 3.5 (can be skipped with the /nodotnet parameter). Native
fails on wine, however, unless a native msasn1.dll is provided,
because xlive.dll is digitally signed (so implementing our own
msasn1.dll won't help). As it currently stands, users can't play any
'Game for Windows' that doesn't have a Windows license.

Ignoring the licensing problem, the current xlive.dll doesn't seem to
work for 'online' purposes, see AppDB reports(3).

Of course, our own xlive.dll will not solve the problem of online
stuff not working (which may be either a Wine bug or the GFWL servers
blocking Wine), but it does allow users to play their games. This is
similar to the current situation with wuapi.dll.

This patch series works well enough for Fallout 3 to run and play
through the intro level, removing the need for native xlive.dll and
msasn1.dll. Saving games doesn't yet work, though I need to get more
testcases before fixing that. Of course, those users already playing
with native xlive.dll won't notice a difference, because of
DLL_WINE_PREATTACH returning FALSE ;-).

1: http://www.microsoft.com/games/en-US/index.aspx
2: http://en.wikipedia.org/wiki/Games_for_Windows
3: http://appdb.winehq.org/objectManager.php?sClass=version&iId=14723

-- 
-Austin
-------------- next part --------------
From 8eb2611426aa77fd78b322ee780b8177b180a578 Mon Sep 17 00:00:00 2001
From: Austin English <austinenglish at gmail.com>
Date: Tue, 2 Nov 2010 01:37:08 +0000
Subject: [PATCH 2/4] xlive: stub

---
 configure.ac           |    1 +
 dlls/xlive/Makefile.in |    6 +
 dlls/xlive/main.c      |  127 ++++++++++++++++++++++++++
 dlls/xlive/xlive.spec  |  237 ++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 371 insertions(+), 0 deletions(-)
 create mode 100644 dlls/xlive/Makefile.in
 create mode 100644 dlls/xlive/main.c
 create mode 100644 dlls/xlive/xlive.spec

diff --git a/configure.ac b/configure.ac
index eb3285a..69b62ba 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2799,6 +2799,7 @@ WINE_CONFIG_DLL(xinput1_2)
 WINE_CONFIG_DLL(xinput1_3,,[xinput])
 WINE_CONFIG_TEST(dlls/xinput1_3/tests)
 WINE_CONFIG_DLL(xinput9_1_0)
+WINE_CONFIG_DLL(xlive)
 WINE_CONFIG_DLL(xmllite)
 WINE_CONFIG_TEST(dlls/xmllite/tests)
 WINE_CONFIG_MAKEFILE([documentation])
diff --git a/dlls/xlive/Makefile.in b/dlls/xlive/Makefile.in
new file mode 100644
index 0000000..7dc4efd
--- /dev/null
+++ b/dlls/xlive/Makefile.in
@@ -0,0 +1,6 @@
+MODULE    = xlive.dll
+
+C_SRCS = \
+	main.c
+
+ at MAKE_DLL_RULES@
diff --git a/dlls/xlive/main.c b/dlls/xlive/main.c
new file mode 100644
index 0000000..92d63e8
--- /dev/null
+++ b/dlls/xlive/main.c
@@ -0,0 +1,127 @@
+/*
+ * Copyright 2010 Austin English
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+
+#include "config.h"
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(xlive);
+
+BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
+{
+    TRACE("(0x%p, %d, %p)\n", hinstDLL, fdwReason, lpvReserved);
+
+    switch (fdwReason)
+    {
+        case DLL_WINE_PREATTACH:
+            return FALSE;    /* prefer native version */
+        case DLL_PROCESS_ATTACH:
+            DisableThreadLibraryCalls(hinstDLL);
+            break;
+        case DLL_PROCESS_DETACH:
+            break;
+    }
+
+    return TRUE;
+}
+
+/* This DLL is completely undocumented. DLL ordinal functions were found using winedump
+   and number of parameters determined using python ctypes. See http://docs.python.org/library/ctypes.html */
+
+INT WINAPI XLIVE_651(DWORD unknown, DWORD unknown2, DWORD unknown3, DWORD unknown4)
+{
+    // very verbose
+    WARN("stub: %d %d %d %d\n", unknown, unknown2, unknown3, unknown4);
+    return 0;
+}
+
+INT WINAPI XLIVE_652(DWORD unknown)
+{
+    FIXME("stub: %d\n", unknown);
+    return 0;
+}
+
+INT WINAPI XLIVE_5000(DWORD unknown)
+{
+    FIXME("stub: %d\n", unknown);
+    return 0;
+}
+
+// Potentially a cdecl
+INT WINAPI XLIVE_5001(DWORD unknown)
+{
+    FIXME("stub: %d\n", unknown);
+    return 0;
+}
+
+INT WINAPI XLIVE_5002(void)
+{
+    //very very verbose
+    WARN("stub\n");
+    return 0;
+}
+
+INT WINAPI XLIVE_5030(DWORD unknown)
+{
+    FIXME("stub: %d\n", unknown);
+    return 0;
+}
+
+/* from xliveless
+extern "C"  int __stdcall XUserGetName (DWORD dwUserId, char * pBuffer, DWORD dwBufLen) {
+        trace ("xlive_5263: XUserGetName (%d, .. , %d)\n", dwUserId, dwBufLen);
+        if (dwBufLen < 8)
+                return 1;
+        memcpy (pBuffer, "Player1", 8);
+        return 0;
+*/
+
+// Called when trying to save a game.
+INT WINAPI XLIVE_5263(DWORD dwUserId, char *pBuffer, DWORD dwBufLen)
+{
+    FIXME("stub: %d %s %d\n", dwUserId, pBuffer, dwBufLen);
+    // Native returns 21 for me when called with '1,2,3'
+    // Needed for save games, I think. 
+    if (dwBufLen < 8)
+        return 1;
+    memcpy (pBuffer, "Player1", 8);
+    return 0;
+}
+
+INT WINAPI XLIVE_5267(DWORD unknown, DWORD unknown2, DWORD unknown3)
+{
+    FIXME("stub: %d %d %d\n", unknown, unknown2, unknown3);
+    return 0;
+}
+
+INT WINAPI XLIVE_5270(DWORD unknown, DWORD unknown2)
+{
+    FIXME("stub: %d %d\n", unknown, unknown2);
+    return 0;
+}
+
+INT WINAPI XLIVE_5310(void)
+{
+    FIXME("stub\n");
+    return 0;
+}
diff --git a/dlls/xlive/xlive.spec b/dlls/xlive/xlive.spec
new file mode 100644
index 0000000..15e8050
--- /dev/null
+++ b/dlls/xlive/xlive.spec
@@ -0,0 +1,237 @@
+1 stub -noname @
+2 stub -noname @
+3 stub -noname @
+4 stub -noname @
+5 stub -noname @
+6 stub -noname @
+7 stub -noname @
+8 stub -noname @
+9 stub -noname @
+10 stub -noname @
+11 stub -noname @
+12 stub -noname @
+13 stub -noname @
+14 stub -noname @
+15 stub -noname @
+16 stub -noname @
+17 stub -noname @
+18 stub -noname @
+19 stub -noname @
+20 stub -noname @
+21 stub -noname @
+22 stub -noname @
+23 stub -noname @
+24 stub -noname @
+25 stub -noname @
+26 stub -noname @
+27 stub -noname @
+28 stub -noname @
+29 stub -noname @
+30 stub -noname @
+31 stub -noname @
+32 stub -noname @
+33 stub -noname @
+34 stub -noname @
+35 stub -noname @
+37 stub -noname @
+38 stub -noname @
+39 stub -noname @
+40 stub -noname @
+51 stub -noname @
+52 stub -noname @
+53 stub -noname @
+54 stub -noname @
+55 stub -noname @
+56 stub -noname @
+57 stub -noname @
+58 stub -noname @
+60 stub -noname @
+62 stub -noname @
+63 stub -noname @
+64 stub -noname @
+65 stub -noname @
+66 stub -noname @
+67 stub -noname @
+68 stub -noname @
+69 stub -noname @
+70 stub -noname @
+71 stub -noname @
+72 stub -noname @
+73 stub -noname @
+75 stub -noname @
+76 stub -noname @
+77 stub -noname @
+78 stub -noname @
+79 stub -noname @
+81 stub -noname @
+82 stub -noname @
+83 stub -noname @
+84 stub -noname @
+472 stub -noname @
+473 stub -noname @
+474 stub -noname @
+476 stub -noname @
+477 stub -noname @
+478 stub -noname @
+479 stub -noname @
+651 stdcall -noname XLIVE_651(long long long long)
+652 stdcall -noname XLIVE_652()
+653 stub -noname @
+1082 stub -noname @
+1083 stub -noname @
+5000 stdcall -noname XLIVE_5000(long)
+# Not sure if cdecl, check with vpovirk
+5001 stdcall -noname XLIVE_5001(long)
+5002 stdcall -noname XLIVE_5002()
+5003 stub -noname @
+5005 stub -noname @
+5006 stub -noname @
+5007 stub -noname @
+5008 stub -noname @
+5010 stub -noname @
+5011 stub -noname @
+5012 stub -noname @
+5016 stub -noname @
+5017 stub -noname @
+5018 stub -noname @
+5019 stub -noname @
+5020 stub -noname @
+5021 stub -noname @
+5022 stub -noname @
+5023 stub -noname @
+5024 stub -noname @
+5025 stub -noname @
+5026 stub -noname @
+5027 stub -noname @
+5028 stub -noname @
+5029 stub -noname @
+5030 stdcall -noname XLIVE_5030(long)
+5031 stub -noname @
+5032 stub -noname @
+5034 stub -noname @
+5035 stub -noname @
+5036 stub -noname @
+5037 stub -noname @
+5038 stub -noname @
+5039 stub -noname @
+5206 stub -noname @
+5208 stub -noname @
+5209 stub -noname @
+5210 stub -noname @
+5212 stub -noname @
+5214 stub -noname @
+5215 stub -noname @
+5216 stub -noname @
+5230 stub -noname @
+5231 stub -noname @
+5233 stub -noname @
+5234 stub -noname @
+5235 stub -noname @
+5236 stub -noname @
+5237 stub -noname @
+5238 stub -noname @
+5250 stub -noname @
+5251 stub -noname @
+5252 stub -noname @
+5254 stub -noname @
+5255 stub -noname @
+5256 stub -noname @
+5257 stub -noname @
+5258 stub -noname @
+5259 stub -noname @
+5260 stub -noname @
+5261 stub -noname @
+5262 stub -noname @
+5263 stdcall -noname XLIVE_5263(long long long)
+5264 stub -noname @
+5265 stub -noname @
+5266 stub -noname @
+5267 stdcall -noname XLIVE_5267(long long long)
+5270 stdcall -noname XLIVE_5270(long long)
+5271 stub -noname @
+5273 stub -noname @
+5274 stub -noname @
+5275 stub -noname @
+5276 stub -noname @
+5277 stub -noname @
+5278 stub -noname @
+5279 stub -noname @
+5280 stub -noname @
+5281 stub -noname @
+5282 stub -noname @
+5284 stub -noname @
+5285 stub -noname @
+5286 stub -noname @
+5287 stub -noname @
+5288 stub -noname @
+5289 stub -noname @
+5290 stub -noname @
+5291 stub -noname @
+5292 stub -noname @
+5293 stub -noname @
+5294 stub -noname @
+5295 stub -noname @
+5296 stub -noname @
+5297 stub -noname @
+5298 stub -noname @
+5299 stub -noname @
+5300 stub -noname @
+5303 stub -noname @
+5304 stub -noname @
+5305 stub -noname @
+5306 stub -noname @
+5307 stub -noname @
+5308 stub -noname @
+5309 stub -noname @
+5310 stdcall -noname XLIVE_5310()
+5311 stub -noname @
+5312 stub -noname @
+5313 stub -noname @
+5314 stub -noname @
+5315 stub -noname @
+5316 stub -noname @
+5317 stub -noname @
+5318 stub -noname @
+5319 stub -noname @
+5320 stub -noname @
+5321 stub -noname @
+5322 stub -noname @
+5323 stub -noname @
+5324 stub -noname @
+5325 stub -noname @
+5326 stub -noname @
+5327 stub -noname @
+5328 stub -noname @
+5329 stub -noname @
+5330 stub -noname @
+5331 stub -noname @
+5332 stub -noname @
+5333 stub -noname @
+5334 stub -noname @
+5335 stub -noname @
+5336 stub -noname @
+5337 stub -noname @
+5338 stub -noname @
+5339 stub -noname @
+5340 stub -noname @
+5341 stub -noname @
+5342 stub -noname @
+5343 stub -noname @
+5344 stub -noname @
+5345 stub -noname @
+5346 stub -noname @
+5347 stub -noname @
+5348 stub -noname @
+5349 stub -noname @
+5350 stub -noname @
+5351 stub -noname @
+5352 stub -noname @
+5354 stub -noname @
+5355 stub -noname @
+5356 stub -noname @
+5357 stub -noname @
+5358 stub -noname @
+5359 stub -noname @
+5360 stub -noname @
+5361 stub -noname @
+5365 stub -noname @
-- 
1.6.4.4


More information about the wine-patches mailing list