Yay, Dplay work! A few suggestions though: >From patch 1: > +static HRESULT WINAPI DPWSCB_GetCaps( LPDPSP_GETCAPSDATA data ) > +{ > + TRACE( "(%d,%p,0x%08x,%p)\n", > + data->idPlayer, data->lpCaps, data->dwFlags, data->lpISP ); >+ return DP_OK; > +} Is there any reason this one writes a TRACE instread of a FIXME? I noticed that patch 3 implements it, perhaps you missed this when separating the patches?
> +static HRESULT WINAPI DPWSCB_Open( LPDPSP_OPENDATA data ) > +{ > + FIXME( "(%u,%p,%p,%u,0x%08x,0x%08x) stub\n", > + data->bCreate, data->lpSPMessageHeader, data->lpISP, > + data->bReturnStatus, data->dwOpenFlags, data->dwSessionFlags ); > + return DP_OK; > +} Why does it return DP_OK while most other stubs return an error? Patch 2: > + /* Initialize internal data */ > + ZeroMemory( &dpwsData, sizeof(DPWS_DATA) ); I think memset(&dpwsData, 0, sizeof(DPWS_DATA)) is preferred over ZeroMemory. Patch 3: Where do the values like dwMaxLocalPlayers = 65536 come from? Since most functions are still stubs its hard to see where it comes from? Does native dpwsockx have the same limits? (If it does, that's a solid reason for using the same limits)