[PATCH 2/7] dpwsockx: Implementation of SPInit
Ismael Barros
razielmine at gmail.com
Mon Aug 31 18:50:47 CDT 2009
---
dlls/dpwsockx/Makefile.in | 2 +-
dlls/dpwsockx/dpwsockx_dll.h | 31 +++++++++++++++++++++++++++++++
dlls/dpwsockx/dpwsockx_main.c | 20 ++++++++++++++++++++
3 files changed, 52 insertions(+), 1 deletions(-)
diff --git a/dlls/dpwsockx/Makefile.in b/dlls/dpwsockx/Makefile.in
index c2c5f8c..bb02089 100644
--- a/dlls/dpwsockx/Makefile.in
+++ b/dlls/dpwsockx/Makefile.in
@@ -3,7 +3,7 @@ TOPOBJDIR = ../..
SRCDIR = @srcdir@
VPATH = @srcdir@
MODULE = dpwsockx.dll
-IMPORTS = dxguid kernel32
+IMPORTS = dxguid kernel32 ws2_32
C_SRCS = \
dpwsockx_main.c
diff --git a/dlls/dpwsockx/dpwsockx_dll.h b/dlls/dpwsockx/dpwsockx_dll.h
index 08ae11c..3c43981 100644
--- a/dlls/dpwsockx/dpwsockx_dll.h
+++ b/dlls/dpwsockx/dpwsockx_dll.h
@@ -21,10 +21,41 @@
#include "windef.h"
#include "winbase.h"
+#include "winsock2.h"
#include "winnt.h"
#include "wine/dplaysp.h"
+typedef struct tagDPWS_THREADDATA
+{
+ BOOL is_running;
+ SOCKET sock;
+ SOCKADDR_IN addr;
+ HANDLE handle;
+ LPDIRECTPLAYSP lpISP;
+} DPWS_THREADDATA, *LPDPWS_THREADDATA;
+
+typedef struct tagDPWS_DATA
+{
+ SOCKET sock;
+ DPWS_THREADDATA tcp_listener, udp_listener, dplaysrv;
+ SOCKADDR_IN nameserverAddr;
+ LPDIRECTPLAYSP lpISP;
+} DPWS_DATA, *LPDPWS_DATA;
+
+typedef struct tagDPSP_MSG_HEADER
+{
+ DWORD size; /* size & 0x000FFFFF, token & 0xFFF00000 */
+ SOCKADDR_IN SockAddr;
+} DPSP_MSG_HEADER, *LPDPSP_MSG_HEADER;
+typedef const DPSP_MSG_HEADER* LPCDPSP_MSG_HEADER;
+
+/* DPSP_MSG_HEADER->token */
+#define DPSP_MSG_TOKEN_REMOTE 0xFAB00000
+#define DPSP_MSG_TOKEN_FORWARDED 0xCAB00000
+#define DPSP_MSG_TOKEN_SERVER 0xBAB00000
+
+
HRESULT WINAPI SPInit( LPSPINITDATA );
#endif /* __WINE_DPWSOCKX_DLL_H */
diff --git a/dlls/dpwsockx/dpwsockx_main.c b/dlls/dpwsockx/dpwsockx_main.c
index 2df87b6..19255f7 100644
--- a/dlls/dpwsockx/dpwsockx_main.c
+++ b/dlls/dpwsockx/dpwsockx_main.c
@@ -23,6 +23,7 @@
#include "windef.h"
#include "winbase.h"
+#include "winsock2.h"
#include "dpwsockx_dll.h"
#include "wine/debug.h"
#include "dplay.h"
@@ -207,6 +208,9 @@ static void setup_callbacks( LPDPSP_SPCALLBACKS lpCB )
*/
HRESULT WINAPI SPInit( LPSPINITDATA lpspData )
{
+ WSADATA wsaData;
+ DPWS_DATA dpwsData;
+
TRACE( "Initializing library for %s (%s)\n",
wine_dbgstr_guid(lpspData->lpGuid), debugstr_w(lpspData->lpszName) );
@@ -219,5 +223,21 @@ HRESULT WINAPI SPInit( LPSPINITDATA lpspData )
/* Assign callback functions */
setup_callbacks( lpspData->lpCB );
+ /* Load Winsock 2.0 DLL */
+ if ( WSAStartup( MAKEWORD(2, 0), &wsaData ) != 0 )
+ {
+ ERR( "WSAStartup() failed\n" );
+ return DPERR_UNAVAILABLE;
+ }
+
+ /* Initialize internal data */
+ memset( &dpwsData, 0, sizeof(DPWS_DATA) );
+ dpwsData.lpISP = lpspData->lpISP;
+ IDirectPlaySP_SetSPData( lpspData->lpISP, &dpwsData, sizeof(DPWS_DATA),
+ DPSET_LOCAL );
+
+ /* dplay needs to know the size of the header */
+ lpspData->dwSPHeaderSize = sizeof(DPSP_MSG_HEADER);
+
return DP_OK;
}
--
1.6.4.1
More information about the wine-patches
mailing list