[PATCH 3/4] dplayx: Missing parameter checks, updated tests

Ismael Barros razielmine at gmail.com
Mon Jul 20 10:52:51 CDT 2009


---
 dlls/dplayx/dplay.c        |  242 +++++++++++++++++++++------
 dlls/dplayx/dplaysp.c      |    2 +-
 dlls/dplayx/tests/dplayx.c |  389 ++++++++++++++++++++++++--------------------
 3 files changed, 403 insertions(+), 230 deletions(-)

diff --git a/dlls/dplayx/dplay.c b/dlls/dplayx/dplay.c
index 0c33bb3..31ca31a 100644
--- a/dlls/dplayx/dplay.c
+++ b/dlls/dplayx/dplay.c
@@ -872,6 +872,11 @@ static HRESULT DP_IF_Close( IDirectPlay2Impl* This, BOOL bAnsi )
     hr = (*This->dp2->spData.lpCB->Close)();
   }
 
+  if ( !FAILED(hr) )
+  {
+    This->dp2->bConnectionOpen = FALSE;
+  }
+
   return hr;
 }
 
@@ -988,11 +993,6 @@ static HRESULT DP_IF_CreateGroup
          This, lpMsgHdr, lpidGroup, lpGroupName, lpData, dwDataSize,
          dwFlags, bAnsi );
 
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
-  {
-    return DPERR_UNINITIALIZED;
-  }
-
   /* If the name is not specified, we must provide one */
   if( DPID_UNKNOWN == *lpidGroup )
   {
@@ -1100,9 +1100,24 @@ static HRESULT WINAPI DirectPlay2AImpl_CreateGroup
           ( LPDIRECTPLAY2A iface, LPDPID lpidGroup, LPDPNAME lpGroupName,
             LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
 {
+  IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
+
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidGroup == NULL ||
+      !This->dp2->bConnectionOpen ||
+      dwDataSize >= MAXDWORD ||
+      ( lpData == NULL && dwDataSize != 0 ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   *lpidGroup = DPID_UNKNOWN;
 
-  return DP_IF_CreateGroup( (IDirectPlay2AImpl*)iface, NULL, lpidGroup,
+  return DP_IF_CreateGroup( This, NULL, lpidGroup,
                             lpGroupName, lpData, dwDataSize, dwFlags, TRUE );
 }
 
@@ -1110,9 +1125,24 @@ static HRESULT WINAPI DirectPlay2WImpl_CreateGroup
           ( LPDIRECTPLAY2 iface, LPDPID lpidGroup, LPDPNAME lpGroupName,
             LPVOID lpData, DWORD dwDataSize, DWORD dwFlags )
 {
+  IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
+
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidGroup == NULL ||
+      !This->dp2->bConnectionOpen ||
+      dwDataSize >= MAXDWORD ||
+      ( lpData == NULL && dwDataSize != 0 ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   *lpidGroup = DPID_UNKNOWN;
 
-  return DP_IF_CreateGroup( (IDirectPlay2AImpl*)iface, NULL, lpidGroup,
+  return DP_IF_CreateGroup( This, NULL, lpidGroup,
                             lpGroupName, lpData, dwDataSize, dwFlags, FALSE );
 }
 
@@ -1385,10 +1415,6 @@ static HRESULT DP_IF_CreatePlayer
   TRACE( "(%p)->(%p,%p,%p,%p,0x%08x,0x%08x,%u)\n",
          This, lpidPlayer, lpPlayerName, hEvent, lpData,
          dwDataSize, dwFlags, bAnsi );
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
-  {
-    return DPERR_UNINITIALIZED;
-  }
 
   if( dwFlags == 0 )
   {
@@ -1460,9 +1486,17 @@ static HRESULT DP_IF_CreatePlayer
   }
   else
   {
-    /* FIXME: Would be nice to perhaps verify that we don't already have
-     *        this player.
-     */
+    /* Verify that we don't already have this player */
+
+    lpPlayerList lpPlayers = NULL;
+    DPQ_FIND_ENTRY( This->dp2->lpSysGroup->players, players,
+                    lpPData->dpid, ==, *lpidPlayer, lpPlayers );
+
+    if (lpPlayers != NULL)
+    {
+      return DPERR_CANTCREATEPLAYER;
+    }
+
   }
 
   /* We pass creation flags, so we can distinguish sysplayers and not count them in the current
@@ -1588,11 +1622,21 @@ static HRESULT WINAPI DirectPlay2AImpl_CreatePlayer
 {
   IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
 
-  if( lpidPlayer == NULL )
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidPlayer == NULL || !This->dp2->bConnectionOpen )
   {
     return DPERR_INVALIDPARAMS;
   }
 
+  if ( This->dp2->lpSessionDesc->dwFlags & DPSESSION_NEWPLAYERSDISABLED )
+  {
+    return DPERR_CANTCREATEPLAYER;
+  }
+
   if( dwFlags & DPPLAYER_SERVERPLAYER )
   {
     *lpidPlayer = DPID_SERVERPLAYER;
@@ -1612,11 +1656,21 @@ static HRESULT WINAPI DirectPlay2WImpl_CreatePlayer
 {
   IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
 
-  if( lpidPlayer == NULL )
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidPlayer == NULL || !This->dp2->bConnectionOpen )
   {
     return DPERR_INVALIDPARAMS;
   }
 
+  if ( This->dp2->lpSessionDesc->dwFlags & DPSESSION_NEWPLAYERSDISABLED )
+  {
+    return DPERR_CANTCREATEPLAYER;
+  }
+
   if( dwFlags & DPPLAYER_SERVERPLAYER )
   {
     *lpidPlayer = DPID_SERVERPLAYER;
@@ -1951,6 +2005,17 @@ static HRESULT DP_IF_EnumGroupPlayers
     return DPERR_UNINITIALIZED;
   }
 
+  if( !This->dp2->bConnectionOpen )
+  {
+    return DPERR_NOSESSIONS;
+  }
+
+  if( ( lpEnumPlayersCallback2 == NULL ) ||
+      ( ( dwFlags & DPENUMPLAYERS_SESSION ) && ( lpguidInstance == NULL ) ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   /* Find the group */
   if( ( lpGData = DP_FindAnyGroup( This, idGroup ) ) == NULL )
   {
@@ -2198,7 +2263,12 @@ static HRESULT DP_IF_EnumSessions
     return DPERR_UNINITIALIZED;
   }
 
-  /* Can't enumerate if the interface is already open */
+  if( (lpsd == NULL) || (lpsd->dwSize != sizeof(DPSESSIONDESC2)) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
+  /* Can't enumerate if the session is already open */
   if( This->dp2->bConnectionOpen )
   {
     return DPERR_GENERIC;
@@ -2380,6 +2450,11 @@ static HRESULT DP_IF_GetPlayerCaps
     return DPERR_UNINITIALIZED;
   }
 
+  if ( lpDPCaps->dwSize != sizeof(DPCAPS) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   /* Query the service provider */
   data.idPlayer = idPlayer;
   data.dwFlags  = dwFlags;
@@ -2624,6 +2699,11 @@ static HRESULT DP_IF_GetPlayerData
     return DPERR_INVALIDPLAYER;
   }
 
+  if( lpdwDataSize == NULL )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   /* How much buffer is required? */
   if( dwFlags & DPSET_LOCAL )
   {
@@ -2764,7 +2844,12 @@ static HRESULT DP_GetSessionDesc
     return DPERR_UNINITIALIZED;
   }
 
-  if( ( lpData == NULL ) && ( lpdwDataSize == NULL ) )
+  if( !This->dp2->bConnectionOpen )
+  {
+    return DPERR_NOSESSIONS;
+  }
+
+  if( ( lpdwDataSize == NULL ) || ( *lpdwDataSize >= MAXDWORD ) )
   {
     return DPERR_INVALIDPARAMS;
   }
@@ -2828,14 +2913,9 @@ static HRESULT DP_SecureOpen
   FIXME( "(%p)->(%p,0x%08x,%p,%p): partial stub\n",
          This, lpsd, dwFlags, lpSecurity, lpCredentials );
 
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
-  {
-    return DPERR_UNINITIALIZED;
-  }
-
-  if( lpsd->dwSize != sizeof(DPSESSIONDESC2) )
+  if( ( lpsd == NULL ) ||
+      ( lpsd->dwSize != sizeof(DPSESSIONDESC2) ) )
   {
-    TRACE( ": rejecting invalid dpsd size (%d).\n", lpsd->dwSize );
     return DPERR_INVALIDPARAMS;
   }
 
@@ -2848,7 +2928,18 @@ static HRESULT DP_SecureOpen
   /* If we're enumerating, kill the thread */
   DP_KillEnumSessionThread( This );
 
-  if( dwFlags & DPOPEN_CREATE )
+  if( dwFlags & DPOPEN_JOIN )
+  {
+    LPDPSESSIONDESC2 current = NULL;
+    while( ( current = NS_WalkSessions( This->dp2->lpNameServerData ) ) )
+    {
+      if ( IsEqualGUID( &lpsd->guidInstance, &current->guidInstance ) )
+        break;
+    }
+    if ( current == NULL )
+      return DPERR_NOSESSIONS;
+  }
+  else if( dwFlags & DPOPEN_CREATE )
   {
     /* Rightoo - this computer is the host and the local computer needs to be
        the name server so that others can join this session */
@@ -2926,6 +3017,10 @@ static HRESULT DP_SecureOpen
     ERR( "Couldn't create name server/system player: %s\n",
          DPLAYX_HresultToString(hr) );
   }
+  else
+  {
+    This->dp2->bConnectionOpen = TRUE;
+  }
 
   return hr;
 }
@@ -3151,9 +3246,8 @@ static HRESULT DP_IF_SetPlayerData
   }
 
   /* Parameter check */
-  if( ( lpData == NULL ) &&
-      ( dwDataSize != 0 )
-    )
+  if( ( ( lpData == NULL ) && ( dwDataSize != 0 ) ) ||
+      ( dwDataSize >= MAXDWORD ) )
   {
     return DPERR_INVALIDPARAMS;
   }
@@ -3253,14 +3347,18 @@ static HRESULT DP_SetSessionDesc
   TRACE( "(%p)->(%p,0x%08x,%u,%u)\n",
          This, lpSessDesc, dwFlags, bInitial, bAnsi );
 
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  if( dwFlags || (lpSessDesc == NULL) )
   {
-    return DPERR_UNINITIALIZED;
+    return DPERR_INVALIDPARAMS;
   }
 
-  if( dwFlags )
+  /* Illegal combinations of flags */
+  if ( ( lpSessDesc->dwFlags & DPSESSION_MIGRATEHOST ) &&
+       ( lpSessDesc->dwFlags & ( DPSESSION_CLIENTSERVER |
+                                 DPSESSION_MULTICASTSERVER |
+                                 DPSESSION_SECURESERVER ) ) )
   {
-    return DPERR_INVALIDPARAMS;
+    return DPERR_INVALIDFLAGS;
   }
 
   /* Only the host is allowed to update the session desc */
@@ -3305,6 +3403,17 @@ static HRESULT WINAPI DirectPlay2AImpl_SetSessionDesc
           ( LPDIRECTPLAY2A iface, LPDPSESSIONDESC2 lpSessDesc, DWORD dwFlags )
 {
   IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
+
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( !This->dp2->bConnectionOpen )
+  {
+    return DPERR_NOSESSIONS;
+  }
+
   return DP_SetSessionDesc( This, lpSessDesc, dwFlags, FALSE, TRUE );
 }
 
@@ -3312,6 +3421,17 @@ static HRESULT WINAPI DirectPlay2WImpl_SetSessionDesc
           ( LPDIRECTPLAY2 iface, LPDPSESSIONDESC2 lpSessDesc, DWORD dwFlags )
 {
   IDirectPlay2Impl *This = (IDirectPlay2Impl *)iface;
+
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( !This->dp2->bConnectionOpen )
+  {
+    return DPERR_NOSESSIONS;
+  }
+
   return DP_SetSessionDesc( This, lpSessDesc, dwFlags, FALSE, TRUE );
 }
 
@@ -3488,11 +3608,6 @@ static HRESULT DP_IF_CreateGroupInGroup
          This, idParentGroup, lpidGroup, lpGroupName, lpData,
          dwDataSize, dwFlags, bAnsi );
 
-  if( This->dp2->connectionInitialized == NO_PROVIDER )
-  {
-    return DPERR_UNINITIALIZED;
-  }
-
   /* Verify that the specified parent is valid */
   if( ( lpGParentData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This,
                                          idParentGroup ) ) == NULL
@@ -3576,6 +3691,19 @@ static HRESULT WINAPI DirectPlay3AImpl_CreateGroupInGroup
 {
   IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface;
 
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidGroup == NULL ||
+      !This->dp2->bConnectionOpen ||
+      dwDataSize >= MAXDWORD ||
+      ( lpData == NULL && dwDataSize != 0 ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   *lpidGroup = DPID_UNKNOWN;
 
   return DP_IF_CreateGroupInGroup( This, NULL, idParentGroup, lpidGroup,
@@ -3590,6 +3718,19 @@ static HRESULT WINAPI DirectPlay3WImpl_CreateGroupInGroup
 {
   IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface;
 
+  if( This->dp2->connectionInitialized == NO_PROVIDER )
+  {
+    return DPERR_UNINITIALIZED;
+  }
+
+  if( lpidGroup == NULL ||
+      !This->dp2->bConnectionOpen ||
+      dwDataSize >= MAXDWORD ||
+      ( lpData == NULL && dwDataSize != 0 ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   *lpidGroup = DPID_UNKNOWN;
 
   return DP_IF_CreateGroupInGroup( This, NULL, idParentGroup, lpidGroup,
@@ -3940,6 +4081,17 @@ static HRESULT DP_IF_EnumGroupsInGroup
     return DPERR_UNINITIALIZED;
   }
 
+  if( !This->dp2->bConnectionOpen )
+  {
+    return DPERR_NOSESSIONS;
+  }
+
+  if( ( lpEnumPlayersCallback2 == NULL ) ||
+      ( ( dwFlags & DPENUMGROUPS_SESSION ) && ( lpguidInstance == NULL ) ) )
+  {
+    return DPERR_INVALIDPARAMS;
+  }
+
   if( ( lpGData = DP_FindAnyGroup( (IDirectPlay2AImpl*)This, idGroup ) ) == NULL )
   {
     return DPERR_INVALIDGROUP;
@@ -4331,13 +4483,6 @@ static HRESULT WINAPI DirectPlay3AImpl_InitializeConnection
           ( LPDIRECTPLAY3A iface, LPVOID lpConnection, DWORD dwFlags )
 {
   IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface;
-
-  /* This may not be externally invoked once either an SP or LP is initialized */
-  if( This->dp2->connectionInitialized != NO_PROVIDER )
-  {
-    return DPERR_ALREADYINITIALIZED;
-  }
-
   return DP_IF_InitializeConnection( This, lpConnection, dwFlags, TRUE );
 }
 
@@ -4345,13 +4490,6 @@ static HRESULT WINAPI DirectPlay3WImpl_InitializeConnection
           ( LPDIRECTPLAY3 iface, LPVOID lpConnection, DWORD dwFlags )
 {
   IDirectPlay3Impl *This = (IDirectPlay3Impl *)iface;
-
-  /* This may not be externally invoked once either an SP or LP is initialized */
-  if( This->dp2->connectionInitialized != NO_PROVIDER )
-  {
-    return DPERR_ALREADYINITIALIZED;
-  }
-
   return DP_IF_InitializeConnection( This, lpConnection, dwFlags, FALSE );
 }
 
diff --git a/dlls/dplayx/dplaysp.c b/dlls/dplayx/dplaysp.c
index bd3e2c1..aabe5b5 100644
--- a/dlls/dplayx/dplaysp.c
+++ b/dlls/dplayx/dplaysp.c
@@ -871,7 +871,7 @@ static HRESULT WINAPI IDirectPlaySPImpl_SetSPData
   IDirectPlaySPImpl *This = (IDirectPlaySPImpl *)iface;
 
 /*  TRACE( "Called on process 0x%08lx\n", GetCurrentProcessId() ); */
-  TRACE( "(%p)->(%p,0x%08x,0x%08x)\n",
+  TRACE( "(%p)->(%p,%d,0x%08x)\n",
          This, lpData, dwDataSize, dwFlags );
 
 #if 0
diff --git a/dlls/dplayx/tests/dplayx.c b/dlls/dplayx/tests/dplayx.c
index 44ba5cf..3276b6f 100644
--- a/dlls/dplayx/tests/dplayx.c
+++ b/dlls/dplayx/tests/dplayx.c
@@ -693,7 +693,7 @@ static void init_TCPIP_provider( LPDIRECTPLAY4 pDP,
     }
 
     hr = IDirectPlayX_InitializeConnection( pDP, pAddress, 0 );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
     HeapFree( GetProcessHeap(), 0, pAddress );
 
@@ -751,7 +751,7 @@ static void test_DirectPlayCreate(void)
     if ( hr == DP_OK )
         IDirectPlayX_Release( pDP );
     hr = DirectPlayCreate( (LPGUID) &DPSPGUID_TCPIP, &pDP, NULL );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     if ( hr == DP_OK )
         IDirectPlayX_Release( pDP );
 
@@ -917,9 +917,9 @@ static BOOL CALLBACK EnumConnections_cb2( LPCGUID lpguidSP,
     if( IsEqualGUID(lpguidSP, &DPSPGUID_TCPIP) )
     {
         hr = IDirectPlayX_InitializeConnection( pDP, lpConnection, 0 );
-        todo_wine checkHR( DP_OK, hr );
+        checkHR( DP_OK, hr );
         hr = IDirectPlayX_InitializeConnection( pDP, lpConnection, 0 );
-        todo_wine checkHR( DPERR_ALREADYINITIALIZED, hr );
+        checkHR( DPERR_ALREADYINITIALIZED, hr );
     }
 
     return TRUE;
@@ -961,7 +961,7 @@ static void test_GetCaps(void)
 
     /* dpcaps not ininitialized */
     hr = IDirectPlayX_GetCaps( pDP, &dpcaps, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpcaps.dwSize = sizeof(DPCAPS);
 
@@ -969,37 +969,33 @@ static void test_GetCaps(void)
          dwFlags<=DPGETCAPS_GUARANTEED;
          dwFlags+=DPGETCAPS_GUARANTEED)
     {
-
         hr = IDirectPlayX_GetCaps( pDP, &dpcaps, dwFlags );
-        todo_wine checkHR( DP_OK, hr );
-
+        checkHR( DP_OK, hr );
 
-        if ( hr == DP_OK )
+        check( sizeof(DPCAPS), dpcaps.dwSize );
+        checkFlags( DPCAPS_ASYNCSUPPORTED |
+                    DPCAPS_GUARANTEEDOPTIMIZED |
+                    DPCAPS_GUARANTEEDSUPPORTED,
+                    dpcaps.dwFlags, FLAGS_DPCAPS );
+        check( 0,     dpcaps.dwMaxQueueSize );
+        check( 0,     dpcaps.dwHundredBaud );
+        check( 500,   dpcaps.dwLatency );
+        check( 65536, dpcaps.dwMaxLocalPlayers );
+        check( 20,    dpcaps.dwHeaderLength );
+        check( 5000,  dpcaps.dwTimeout );
+
+        switch (dwFlags)
         {
-            check( sizeof(DPCAPS), dpcaps.dwSize );
-            check( DPCAPS_ASYNCSUPPORTED |
-                   DPCAPS_GUARANTEEDOPTIMIZED |
-                   DPCAPS_GUARANTEEDSUPPORTED,
-                   dpcaps.dwFlags );
-            check( 0,     dpcaps.dwMaxQueueSize );
-            check( 0,     dpcaps.dwHundredBaud );
-            check( 500,   dpcaps.dwLatency );
-            check( 65536, dpcaps.dwMaxLocalPlayers );
-            check( 20,    dpcaps.dwHeaderLength );
-            check( 5000,  dpcaps.dwTimeout );
-
-            switch (dwFlags)
-            {
-            case 0:
-                check( 65479,   dpcaps.dwMaxBufferSize );
-                check( 65536,   dpcaps.dwMaxPlayers );
-                break;
-            case DPGETCAPS_GUARANTEED:
-                check( 1048547, dpcaps.dwMaxBufferSize );
-                check( 64,      dpcaps.dwMaxPlayers );
-                break;
-            default: break;
-            }
+        case 0:
+            check( 65479,   dpcaps.dwMaxBufferSize );
+            check( 65536,   dpcaps.dwMaxPlayers );
+            break;
+        case DPGETCAPS_GUARANTEED:
+            check( 1048547, dpcaps.dwMaxBufferSize );
+            check( 64,      dpcaps.dwMaxPlayers );
+            break;
+        default:
+            break;
         }
     }
 
@@ -1067,14 +1063,17 @@ static void test_Open(void)
 
     /* Service provider not initialized */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     init_TCPIP_provider( pDP_server, "127.0.0.1", 0 );
     init_TCPIP_provider( pDP, "127.0.0.1", 0 );
 
     /* Uninitialized  dpsd */
+    hr = IDirectPlayX_Open( pDP_server, NULL, DPOPEN_CREATE );
+    checkHR( DPERR_INVALIDPARAMS, hr );
+
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
 
     dpsd_server.dwSize = sizeof(DPSESSIONDESC2);
@@ -1084,45 +1083,46 @@ static void test_Open(void)
 
     /* Regular operation */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
+
 
     /* Opening twice */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_ALREADYINITIALIZED, hr );
+    checkHR( DPERR_ALREADYINITIALIZED, hr );
 
     /* Session flags */
     IDirectPlayX_Close( pDP_server );
 
     dpsd_server.dwFlags = DPSESSION_CLIENTSERVER | DPSESSION_MIGRATEHOST;
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDFLAGS, hr );
+    checkHR( DPERR_INVALIDFLAGS, hr );
 
     dpsd_server.dwFlags = DPSESSION_MULTICASTSERVER | DPSESSION_MIGRATEHOST;
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDFLAGS, hr );
+    checkHR( DPERR_INVALIDFLAGS, hr );
 
     dpsd_server.dwFlags = DPSESSION_SECURESERVER | DPSESSION_MIGRATEHOST;
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDFLAGS, hr );
+    checkHR( DPERR_INVALIDFLAGS, hr );
 
 
     /* Joining sessions */
     /* - Checking how strict dplay is with sizes */
     dpsd.dwSize = 0;
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd.dwSize = sizeof(DPSESSIONDESC2)-1;
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd.dwSize = sizeof(DPSESSIONDESC2)+1;
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd.dwSize = sizeof(DPSESSIONDESC2);
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr ); /* Only checks for size, not guids */
+    checkHR( DPERR_NOSESSIONS, hr ); /* Only checks for size, not guids */
 
 
     dpsd.guidApplication = appGuid;
@@ -1130,30 +1130,30 @@ static void test_Open(void)
 
 
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr );
+    checkHR( DPERR_NOSESSIONS, hr );
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_JOIN | DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr ); /* Second flag is ignored */
+    checkHR( DPERR_NOSESSIONS, hr ); /* Second flag is ignored */
 
     dpsd_server.dwFlags = 0;
 
 
     /* Join to normal session */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
     IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb2, pDP, 0 );
 
 
     /* Already initialized session */
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_ALREADYINITIALIZED, hr );
+    checkHR( DPERR_ALREADYINITIALIZED, hr );
 
 
     /* Checking which is the error checking order */
     dpsd_server.dwSize = 0;
 
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd_server.dwSize = sizeof(DPSESSIONDESC2);
 
@@ -1162,7 +1162,7 @@ static void test_Open(void)
     IDirectPlayX_Close( pDP_server );
     U2(dpsd_server).lpszPasswordA = (LPSTR) "hadouken";
     hr = IDirectPlayX_Open( pDP_server, &dpsd_server, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
     IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb2,
                                pDP, DPENUMSESSIONS_PASSWORDREQUIRED );
@@ -1223,6 +1223,12 @@ static LPDIRECTPLAY4 create_session(DPSESSIONDESC2 *lpdpsd)
     hr = IDirectPlayX_Open( pDP, lpdpsd, DPOPEN_CREATE );
     todo_wine checkHR( DP_OK, hr );
 
+    if ( hr != DP_OK )
+    {
+        todo_wine win_skip("Open not implemented\n");
+        return NULL;
+    }
+
     if ( ! (lpdpsd->dwFlags & DPSESSION_NEWPLAYERSDISABLED) )
     {
         ZeroMemory( &name, sizeof(DPNAME) );
@@ -1231,7 +1237,7 @@ static LPDIRECTPLAY4 create_session(DPSESSIONDESC2 *lpdpsd)
 
         hr = IDirectPlayX_CreatePlayer( pDP, &dpid, &name, NULL, NULL,
                                         0, DPPLAYER_SERVERPLAYER );
-        todo_wine checkHR( DP_OK, hr );
+        checkHR( DP_OK, hr );
     }
 
     return pDP;
@@ -1270,13 +1276,7 @@ static void test_EnumSessions(void)
     /* Session with no size */
     hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb,
                                     &callbackData, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
-
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "EnumSessions not implemented\n" );
-        return;
-    }
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd.dwSize = sizeof(DPSESSIONDESC2);
 
@@ -1285,9 +1285,15 @@ static void test_EnumSessions(void)
     callbackData.dwCounter1 = -1;
     hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb,
                                     &callbackData, 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
     check( 0, callbackData.dwCounter1 );
 
+    if ( hr != DP_OK )
+    {
+        todo_wine win_skip( "EnumSessions not implemented\n" );
+        return;
+    }
+
 
     dpsd.guidApplication = appGuid;
 
@@ -1337,19 +1343,19 @@ static void test_EnumSessions(void)
     for (i=0; i<N_SESSIONS; i++)
     {
         pDPserver[i] = create_session( &dpsd_server[i] );
+        if ( pDPserver[i] == NULL )
+        {
+            todo_wine win_skip( "EnumSessions not implemented\n");
+            return;
+        }
     }
 
 
     /* Invalid params */
     callbackData.dwCounter1 = -1;
-    hr = IDirectPlayX_EnumSessions( pDP, &dpsd, 0, EnumSessions_cb,
-                                    &callbackData, -1 );
-    checkHR( DPERR_INVALIDPARAMS, hr );
-
     hr = IDirectPlayX_EnumSessions( pDP, NULL, 0, EnumSessions_cb,
                                     &callbackData, 0 );
     checkHR( DPERR_INVALIDPARAMS, hr );
-
     check( -1, callbackData.dwCounter1 );
 
 
@@ -1619,13 +1625,7 @@ static void test_SessionDesc(void)
 
     /* No sessions open */
     hr = IDirectPlayX_SetSessionDesc( pDP[0], NULL, 0 );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr );
-
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip("Get/SetSessionDesc not implemented\n");
-        return;
-    }
+    checkHR( DPERR_NOSESSIONS, hr );
 
     hr = IDirectPlayX_GetSessionDesc( pDP[0], NULL, NULL );
     checkHR( DPERR_NOSESSIONS, hr );
@@ -1637,10 +1637,18 @@ static void test_SessionDesc(void)
 
 
     /* Host */
-    IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
+    hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
+    checkHR( DP_OK, hr );
     /* Peer */
-    IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
-                               pDP[1], 0 );
+    hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
+                                    pDP[1], 0 );
+    todo_wine checkHR( DP_OK, hr );
+
+    if ( hr != DP_OK )
+    {
+        skip( "Get/SetSessionDesc not implemented\n" );
+        return;
+    }
 
     for (i=0; i<2; i++)
     {
@@ -1787,19 +1795,19 @@ static void test_CreatePlayer(void)
     init_TCPIP_provider( pDP[1], "127.0.0.1", 0 );
 
 
-    /* Session not open */
+    /* Invalid session */
     hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid, NULL, NULL, NULL, 0, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
-
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "CreatePlayer not implemented\n" );
-        return;
-    }
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
     dpsd.dwSize = sizeof(DPSESSIONDESC2);
     dpsd.guidApplication = appGuid;
-    IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
+
+    /* Session not open */
+    hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid, NULL, NULL, NULL, 0, 0 );
+    checkHR( DPERR_INVALIDPARAMS, hr );
+
+    hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
+    checkHR( DP_OK, hr );
 
 
     /* Player name */
@@ -1899,7 +1907,13 @@ static void test_CreatePlayer(void)
     checkHR( DP_OK, hr );
     hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
                                     pDP[1], 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
+
+    if ( hr !=DP_OK )
+    {
+        skip( "CreatePlayer not implemented\n" );
+        return;
+    }
 
 
     hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid, NULL, NULL, NULL,
@@ -1971,19 +1985,19 @@ static void test_GetPlayerCaps(void)
     playerCaps.dwSize = 0;
 
     hr = IDirectPlayX_GetPlayerCaps( pDP[0], 0, &playerCaps, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
+
+    playerCaps.dwSize = sizeof(DPCAPS);
+
+    hr = IDirectPlayX_GetPlayerCaps( pDP[0], 0, &playerCaps, 0 );
+    todo_wine checkHR( DPERR_INVALIDPLAYER, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
+    if ( hr != DPERR_INVALIDPLAYER )
     {
         todo_wine win_skip( "GetPlayerCaps not implemented\n" );
         return;
     }
 
-    playerCaps.dwSize = sizeof(DPCAPS);
-
-    hr = IDirectPlayX_GetPlayerCaps( pDP[0], 0, &playerCaps, 0 );
-    checkHR( DPERR_INVALIDPLAYER, hr );
-
     hr = IDirectPlayX_GetPlayerCaps( pDP[0], 2, &playerCaps, 0 );
     checkHR( DPERR_INVALIDPLAYER, hr );
 
@@ -2133,16 +2147,12 @@ static void test_PlayerData(void)
     /* Invalid player */
     hr = IDirectPlayX_SetPlayerData( pDP, 0, (LPVOID) lpData,
                                      dwDataSize, 0 );
-    todo_wine checkHR( DPERR_INVALIDPLAYER, hr );
+    checkHR( DPERR_INVALIDPLAYER, hr );
 
-    hr = IDirectPlayX_GetPlayerData( pDP, 0, lpDataGet, &dwDataSizeGet, 0 );
-    todo_wine checkHR( DPERR_INVALIDPLAYER, hr );
+    hr = IDirectPlayX_GetPlayerData( pDP, 0, lpDataGet,
+                                     &dwDataSizeGet, 0 );
+    checkHR( DPERR_INVALIDPLAYER, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "Get/SetPlayerData not implemented\n" );
-        return;
-    }
 
     /* Create the player */
     /* By default, the data is remote */
@@ -2150,6 +2160,7 @@ static void test_PlayerData(void)
                                     dwDataSize, 0 );
     checkHR( DP_OK, hr );
 
+
     /* Invalid parameters */
     hr = IDirectPlayX_SetPlayerData( pDP, dpid, NULL, dwDataSize, 0 );
     checkHR( DPERR_INVALIDPARAMS, hr );
@@ -2191,9 +2202,15 @@ static void test_PlayerData(void)
     strcpy(lpDataGet, lpDataFake);
     hr = IDirectPlayX_GetPlayerData( pDP, dpid, lpDataGet, &dwDataSizeGet, 0 );
     checkHR( DP_OK, hr );
-    check( dwDataSize, dwDataSizeGet );
+    todo_wine check( dwDataSize, dwDataSizeGet );
     checkStr( lpData, lpDataGet );
 
+    if ( dwDataSize != dwDataSizeGet )
+    {
+        skip( "GetPlayerData not implemented\n" );
+        return;
+    }
+
     /* Flag tests */
     dwDataSizeGet = dwDataSizeFake;
     strcpy(lpDataGet, lpDataFake);
@@ -2393,7 +2410,7 @@ static void test_PlayerName(void)
     hr = IDirectPlayX_SetPlayerName( pDP[0], 0, &playerName, 0 );
     todo_wine checkHR( DPERR_INVALIDPLAYER, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
+    if ( hr != DPERR_INVALIDPLAYER )
     {
         todo_wine win_skip( "Get/SetPlayerName not implemented\n" );
         return;
@@ -3088,21 +3105,16 @@ static void test_CreateGroup(void)
     /* No session */
     hr = IDirectPlayX_CreateGroup( pDP, &idGroup,
                                    NULL, NULL, 0, 0 );
-    todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
+    checkHR( DPERR_INVALIDPARAMS, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "CreateGroup not implemented\n" );
-        return;
-    }
 
     hr = IDirectPlayX_CreateGroupInGroup( pDP, 0, &idGroup,
                                           NULL, NULL, 0, 0 );
-    checkHR( DPERR_INVALIDGROUP, hr );
+    todo_wine checkHR( DPERR_INVALIDGROUP, hr );
 
     hr = IDirectPlayX_CreateGroupInGroup( pDP, 2, &idGroup,
                                           NULL, NULL, 0, 0 );
-    checkHR( DPERR_INVALIDGROUP, hr );
+    todo_wine checkHR( DPERR_INVALIDGROUP, hr );
 
 
     hr = IDirectPlayX_Open( pDP, &dpsd, DPOPEN_CREATE );
@@ -3111,7 +3123,6 @@ static void test_CreateGroup(void)
                                NULL, NULL, NULL, 0, 0 );
 
 
-
     /* With name */
     hr = IDirectPlayX_CreateGroup( pDP, &idGroup,
                                    NULL, NULL, 0, 0 );
@@ -3149,7 +3160,10 @@ static void test_CreateGroup(void)
         dwDataSizeGet = 1024;
         hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0, lpDataGet,
                                    &dwDataSizeGet );
-        checkHR( DP_OK, hr );
+        todo_wine checkHR( DP_OK, hr );
+        if ( hr != DP_OK )
+            continue;
+
         if ( NULL == U1(lpDataGet->dpnName).lpszShortNameA )
         {
             check( 48, dwDataSizeGet );
@@ -3182,6 +3196,10 @@ static void test_CreateGroup(void)
     checkHR( DPERR_INVALIDPARAMS, hr );
 
     hr = IDirectPlayX_CreateGroup( pDP, &idGroup,
+                                   NULL, NULL, 0, 0 );
+    checkHR( DP_OK, hr );
+
+    hr = IDirectPlayX_CreateGroup( pDP, &idGroup,
                                    NULL, (LPVOID) lpData, dwDataSize, 0 );
     checkHR( DP_OK, hr );
 
@@ -3199,8 +3217,12 @@ static void test_CreateGroup(void)
     checkHR( DPERR_INVALIDPARAMS, hr );
 
     hr = IDirectPlayX_CreateGroupInGroup( pDP, idGroup, &idGroup,
+                                          NULL, NULL, 0, 0 );
+    todo_wine checkHR( DP_OK, hr );
+
+    hr = IDirectPlayX_CreateGroupInGroup( pDP, idGroup, &idGroup,
                                           NULL, (LPVOID)lpData, dwDataSize, 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
 
 
     hr = IDirectPlayX_CreateGroup( pDP, &idGroupParent,
@@ -3209,12 +3231,15 @@ static void test_CreateGroup(void)
 
 
     /* Message checking */
-    for (i=0; i<5; i++)
+    for (i=0; i<7; i++)
     {
         dwDataSizeGet = 1024;
         hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0, lpDataGet,
                                    &dwDataSizeGet );
-        checkHR( DP_OK, hr );
+        todo_wine checkHR( DP_OK, hr );
+        if ( hr != DP_OK )
+            continue;
+
         check( 48 + lpDataGet->dwDataSize, dwDataSizeGet );
         check( DPID_SYSMSG, idFrom );
         checkConv( DPSYS_CREATEPLAYERORGROUP, lpDataGet->dwType, dpMsgType2str );
@@ -3269,7 +3294,10 @@ static void test_CreateGroup(void)
         dwDataSizeGet = 1024;
         hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0, lpDataGet,
                                    &dwDataSizeGet );
-        checkHR( DP_OK, hr );
+        todo_wine checkHR( DP_OK, hr );
+        if ( hr != DP_OK )
+            continue;
+
         check( 48, dwDataSizeGet );
         check( DPID_SYSMSG, idFrom );
         checkConv( DPSYS_CREATEPLAYERORGROUP, lpDataGet->dwType, dpMsgType2str );
@@ -3321,7 +3349,7 @@ static void test_CreateGroup(void)
 
     /* Messages are received */
     check_messages( pDP, &dpid, 1, &callbackData );
-    checkStr( "S0,", callbackData.szTrace1 );
+    todo_wine checkStr( "S0,", callbackData.szTrace1 );
 
 
     /* - Client/Server */
@@ -3341,7 +3369,7 @@ static void test_CreateGroup(void)
 
     /* No messages */
     check_messages( pDP, &dpid, 1, &callbackData );
-    checkStr( "S0,", callbackData.szTrace1 ); /* Or at least there
+    todo_wine checkStr( "S0,", callbackData.szTrace1 ); /* Or at least there
                                                  shouldn't be messages... */
 
 
@@ -3563,14 +3591,9 @@ static void test_EnumPlayers(void)
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumPlayers( pDP[0], NULL, EnumPlayers_cb,
                                    &callbackData, 0 );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr );
+    checkHR( DPERR_NOSESSIONS, hr );
     check( 0, callbackData.dwCounter1 );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "EnumPlayers not implemented\n" );
-        return;
-    }
 
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumPlayers( pDP[0], (LPGUID) &appGuid, EnumPlayers_cb,
@@ -3638,9 +3661,15 @@ static void test_EnumPlayers(void)
     hr = IDirectPlayX_EnumPlayers( pDP[0], NULL, EnumPlayers_cb,
                                    &callbackData, 0 );
     checkHR( DP_OK, hr );
-    check( 2, callbackData.dwCounter1 );
-    checkStr( "20", callbackData.szTrace1 );
-    checkStr( "ALL:SERVERPLAYER:", callbackData.szTrace2 );
+    todo_wine check( 2, callbackData.dwCounter1 );
+    todo_wine checkStr( "20", callbackData.szTrace1 );
+    todo_wine checkStr( "ALL:SERVERPLAYER:", callbackData.szTrace2 );
+
+    if ( 2 != callbackData.dwCounter1 )
+    {
+        skip( "EnumPlayers not implemented\n" );
+        return;
+    }
 
     callbackData.dwCounter1 = 0;
     callbackData.szTrace2[0] = 0;
@@ -3884,14 +3913,9 @@ static void test_EnumGroups(void)
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumGroups( pDP[0], NULL, EnumGroups_cb,
                                   &callbackData, 0 );
-    todo_wine checkHR( DPERR_NOSESSIONS, hr );
+    checkHR( DPERR_NOSESSIONS, hr );
     check( 0, callbackData.dwCounter1 );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "EnumGroups not implemented\n" );
-        return;
-    }
 
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumGroups( pDP[0], (LPGUID) &appGuid, EnumGroups_cb,
@@ -3958,7 +3982,8 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 2, callbackData.dwCounter1 );
     checkStr( "02", callbackData.szTrace1 );
-    checkStr( "ALL:HIDDEN:", callbackData.szTrace2 );
+    todo_wine checkStr( "ALL:HIDDEN:", callbackData.szTrace2 );
+
 
     callbackData.dwCounter1 = 0;
     callbackData.szTrace2[0] = 0;
@@ -3976,7 +4001,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 2, callbackData.dwCounter1 ); /* Guid is ignored */
     checkStr( "02", callbackData.szTrace1 );
-    checkStr( "ALL:HIDDEN:", callbackData.szTrace2 );
+    todo_wine checkStr( "ALL:HIDDEN:", callbackData.szTrace2 );
 
 
     /* Enumerating from a remote session */
@@ -3985,7 +4010,13 @@ static void test_EnumGroups(void)
     hr = IDirectPlayX_EnumSessions( pDP[2], &dpsd[2], 0,
                                     EnumSessions_cb_EnumGroups,
                                     &callbackData, 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
+
+    if ( hr != DP_OK )
+    {
+        skip( "not ready yet\n" );
+        return;
+    }
 
     /* - Open session */
     callbackData.pDP = pDP[2];
@@ -4008,7 +4039,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 4, callbackData.dwCounter1 );
     checkStr( "0234", callbackData.szTrace1 );
-    checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData.szTrace2 );
+    todo_wine checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData.szTrace2 );
 
     /* Flag tests */
     callbackData.dwCounter1 = 0;
@@ -4018,7 +4049,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 4, callbackData.dwCounter1 );
     checkStr( "0234", callbackData.szTrace1 );
-    checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData.szTrace2 );
+    todo_wine checkStr( "ALL:HIDDEN:ALL:STAGINGAREA:", callbackData.szTrace2 );
 
     callbackData.dwCounter1 = 0;
     callbackData.szTrace2[0] = 0;
@@ -4027,7 +4058,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 1, callbackData.dwCounter1 );
     checkStr( "2", callbackData.szTrace1 );
-    checkStr( "HIDDEN:", callbackData.szTrace2 );
+    todo_wine checkStr( "HIDDEN:", callbackData.szTrace2 );
 
     callbackData.dwCounter1 = 0;
     callbackData.szTrace2[0] = 0;
@@ -4036,7 +4067,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 2, callbackData.dwCounter1 );
     checkStr( "34", callbackData.szTrace1 );
-    checkStr( "LOCAL:"
+    todo_wine checkStr( "LOCAL:"
               "LOCAL,DPENUMGROUPS_STAGINGAREA:", callbackData.szTrace2 );
 
     callbackData.dwCounter1 = 0;
@@ -4046,7 +4077,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 2, callbackData.dwCounter1 );
     checkStr( "02", callbackData.szTrace1 );
-    checkStr( "REMOTE:"
+    todo_wine checkStr( "REMOTE:"
               "REMOTE,DPENUMGROUPS_HIDDEN:", callbackData.szTrace2 );
 
     callbackData.dwCounter1 = 0;
@@ -4056,7 +4087,7 @@ static void test_EnumGroups(void)
     checkHR( DP_OK, hr );
     check( 1, callbackData.dwCounter1 );
     checkStr( "4", callbackData.szTrace1 );
-    checkStr( "STAGINGAREA:", callbackData.szTrace2 );
+    todo_wine checkStr( "STAGINGAREA:", callbackData.szTrace2 );
 
 
     IDirectPlayX_Release( pDP[0] );
@@ -4103,13 +4134,8 @@ static void test_EnumGroupsInGroup(void)
     init_TCPIP_provider( pDP[1], "127.0.0.1", 0 );
 
     hr = IDirectPlayX_Open( pDP[0], &dpsd[0], DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "EnumGroupsInGroup not implemented\n" );
-        return;
-    }
 
     /* Create groups */
     /*
@@ -4148,8 +4174,14 @@ static void test_EnumGroupsInGroup(void)
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumGroupsInGroup( pDP[0], 0, NULL, EnumGroups_cb,
                                          &callbackData, 0 );
-    checkHR( DPERR_INVALIDGROUP, hr );
-    check( 0, callbackData.dwCounter1 );
+    todo_wine checkHR( DPERR_INVALIDGROUP, hr );
+    todo_wine check( 0, callbackData.dwCounter1 );
+
+    if ( hr != DPERR_INVALIDGROUP )
+    {
+        skip( "EnumGroupsInGroup not implemented\n" );
+        return;
+    }
 
     callbackData.dwCounter1 = 0;
     hr = IDirectPlayX_EnumGroupsInGroup( pDP[0], 10, NULL, EnumGroups_cb,
@@ -4326,12 +4358,12 @@ static void test_groups_p2p(void)
     init_TCPIP_provider( pDP[1], "127.0.0.1", 0 );
 
     hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
                                     pDP[1], 0 );
     todo_wine checkHR( DP_OK, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
+    if ( hr != DP_OK )
     {
         todo_wine win_skip( "dplay not implemented enough for this test yet\n" );
         return;
@@ -4560,13 +4592,13 @@ static void test_groups_cs(void)
 
     dpsd.dwFlags = DPSESSION_CLIENTSERVER;
     hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
     dpsd.dwFlags = 0;
     hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
                                     pDP[1], 0 );
     todo_wine checkHR( DP_OK, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
+    if ( hr != DP_OK )
     {
         todo_wine win_skip( "dplay not implemented enough for this test yet\n" );
         return;
@@ -4810,19 +4842,19 @@ static void test_Send(void)
     /* Incorrect players */
     hr = IDirectPlayX_Send( pDP[0], 0, 1, 2,
                             (LPVOID) message, messageSize );
-    todo_wine checkHR( DPERR_INVALIDPLAYER, hr );
-
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "Send not implemented\n" );
-        return;
-    }
+    checkHR( DPERR_INVALIDPLAYER, hr );
 
 
     IDirectPlayX_CreatePlayer( pDP[0], &dpid[0], NULL, NULL, NULL, 0, 0 );
     IDirectPlayX_CreatePlayer( pDP[0], &dpid[1], NULL, NULL, NULL, 0, 0 );
     IDirectPlayX_CreatePlayer( pDP[0], &dpid[2], NULL, NULL, NULL, 0, 0 );
-    IDirectPlayX_CreatePlayer( pDP[1], &dpid[3], NULL, NULL, NULL, 0, 0 );
+    hr = IDirectPlayX_CreatePlayer( pDP[1], &dpid[3], NULL, NULL, NULL, 0, 0 );
+
+    if ( hr != DP_OK )
+    {
+        todo_wine win_skip( "Send not implemented\n" );
+        return;
+    }
 
     /* Purge player creation messages */
     check_messages( pDP[0], dpid, 4, &callbackData );
@@ -5134,7 +5166,7 @@ static void test_Receive(void)
                                lpData, &dwDataSize );
     todo_wine checkHR( DPERR_INVALIDPARAMS, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
+    if ( hr != DPERR_INVALIDPARAMS )
     {
         todo_wine win_skip( "Receive not implemented\n" );
         return;
@@ -5151,6 +5183,7 @@ static void test_Receive(void)
                                lpData, &dwDataSize );
     checkHR( DPERR_INVALIDPARAMS, hr );
 
+
     /* No messages yet */
     hr = IDirectPlayX_Receive( pDP, &idFrom, &idTo, 0,
                                NULL, &dwDataSize );
@@ -5946,13 +5979,8 @@ static void test_remote_data_replication(void)
 
     /* Host */
     hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
-    if ( hr == DPERR_UNINITIALIZED )
-    {
-        todo_wine win_skip( "dplay not implemented enough for this test yet\n" );
-        return;
-    }
 
     hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid[0],
                                     NULL, NULL, NULL, 0, 0 );
@@ -5961,7 +5989,13 @@ static void test_remote_data_replication(void)
     /* Peer */
     hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
                                     pDP[1], 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
+
+    if ( hr != DP_OK )
+    {
+        skip( "dplay not implemented enough for this test yet\n" );
+        return;
+    }
 
     hr = IDirectPlayX_CreatePlayer( pDP[1], &dpid[1],
                                     NULL, NULL, NULL, 0, 0 );
@@ -5975,7 +6009,7 @@ static void test_remote_data_replication(void)
         checkFlags( DPPLAYER_LOCAL, dwFlags, FLAGS_DPPLAYER );
         /* Remote (0,1) (1,0) */
         IDirectPlayX_GetPlayerFlags( pDP[i], dpid[!i], &dwFlags );
-        checkFlags( 0, dwFlags, FLAGS_DPPLAYER );
+        todo_wine checkFlags( 0, dwFlags, FLAGS_DPPLAYER );
     }
 
     /* Set data for a local player */
@@ -6164,13 +6198,8 @@ static void test_host_migration()
 
     /* Host */
     hr = IDirectPlayX_Open( pDP[0], &dpsd, DPOPEN_CREATE );
-    todo_wine checkHR( DP_OK, hr );
+    checkHR( DP_OK, hr );
 
-    if ( hr != DP_OK )
-    {
-        todo_wine win_skip( "dplay not implemented enough for this test yet\n" );
-        return;
-    }
 
     hr = IDirectPlayX_CreatePlayer( pDP[0], &dpid[0], NULL, NULL, NULL, 0, 0 );
     checkHR( DP_OK, hr );
@@ -6178,7 +6207,13 @@ static void test_host_migration()
     /* Peer */
     hr = IDirectPlayX_EnumSessions( pDP[1], &dpsd, 0, EnumSessions_cb_join,
                                     pDP[1], 0 );
-    checkHR( DP_OK, hr );
+    todo_wine checkHR( DP_OK, hr );
+
+    if ( hr != DP_OK )
+    {
+        skip( "dplay not implemented enough for this test yet\n" );
+        return;
+    }
 
     hr = IDirectPlayX_CreatePlayer( pDP[1], &dpid[1], NULL, NULL, NULL, 0, 0 );
     checkHR( DP_OK, hr );
-- 
1.6.3.3




More information about the wine-patches mailing list