Merge documentation/status/directplay into the code.
This commit is contained in:
parent
976483e2a9
commit
e21e3d0a80
|
@ -1,4 +1,5 @@
|
||||||
/*
|
/* COM class factory for direct play lobby interfaces.
|
||||||
|
*
|
||||||
* Copyright 1999, 2000 Peter Hunnisett
|
* Copyright 1999, 2000 Peter Hunnisett
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
*
|
*
|
||||||
* Copyright 1998,1999,2000,2001 - Peter Hunnisett
|
* Copyright 1998,1999,2000,2001 - Peter Hunnisett
|
||||||
*
|
*
|
||||||
* <presently under construction - contact hunnise@nortelnetworks.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
|
|
|
@ -17,10 +17,17 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*
|
||||||
|
*
|
||||||
/* NOTE: Methods that begin with DPLAYX_ are used for dealing with
|
* NOTES:
|
||||||
* dplayx.dll data which is accessible from all processes.
|
* o Implementation of all things which are associated with dplay on
|
||||||
|
* the computer - ie shared resources and such. Methods in this
|
||||||
|
* compilation unit should not call anything out side this unit
|
||||||
|
* excepting base windows services and an interface to start the
|
||||||
|
* messaging thread.
|
||||||
|
* o Methods that begin with DPLAYX_ are used for dealing with
|
||||||
|
* dplayx.dll data which is accessible from all processes.
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
|
@ -18,6 +18,44 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* o DPMSGCMD_ENUMSESSIONSREPLY & DPMSGCMD_ENUMSESSIONSREQUEST
|
||||||
|
* Have most fields understood, but not all. Everything seems to work.
|
||||||
|
* o DPMSGCMD_REQUESTNEWPLAYERID & DPMSGCMD_NEWPLAYERIDREPLY
|
||||||
|
* Barely work. This needs to be completed for sessions to start.
|
||||||
|
* o A small issue will be the fact that DirectX 6.1(ie. DirectPlay4)
|
||||||
|
* introduces a layer of functionality inside the DP objects which
|
||||||
|
* provide guaranteed protocol delivery. This is even if the native
|
||||||
|
* protocol, IPX or modem for instance, doesn't guarantee it. I'm going
|
||||||
|
* to leave this kind of implementation to as close to the end as
|
||||||
|
* possible. However, I will implement an abstraction layer, where
|
||||||
|
* possible, for this functionality. It will do nothing to start, but
|
||||||
|
* will require only the implementation of the guaranteness to give
|
||||||
|
* final implementation.
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* - Implement mutual exclusion on object data for existing functions
|
||||||
|
* - Ensure that all dll stubs are present and the ordinals are correct
|
||||||
|
* - Addition of DirectX 7.0 functionality for direct play
|
||||||
|
* - Implement some WineLib test programs using sdk programs as a skeleton
|
||||||
|
* - Change RegEnumKeyEx enumeration pattern to allow error handling and to
|
||||||
|
* share registry implementation (or at least simplify).
|
||||||
|
* - Add in appropriate RegCloseKey calls for all the opening we're doing...
|
||||||
|
* - Fix all the buffer sizes for registry calls. They're off by one -
|
||||||
|
* but in a safe direction.
|
||||||
|
* - Fix race condition on interface destruction
|
||||||
|
* - Handles need to be correctly reference counted
|
||||||
|
* - Check if we need to deallocate any list objects when destroying
|
||||||
|
* a dplay interface
|
||||||
|
* - RunApplication process spawning needs to have correct syncronization.
|
||||||
|
* - Need to get inter lobby messages working.
|
||||||
|
* - Decypher dplay messages between applications and implement...
|
||||||
|
* - Need to implement lobby session spawning.
|
||||||
|
* - Improve footprint and realtime blocking by setting up a separate data share
|
||||||
|
* between lobby application and client since there can be multiple apps per
|
||||||
|
* client. Also get rid of offset dependency by making data offset independent
|
||||||
|
* somehow.
|
||||||
*/
|
*/
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,6 @@
|
||||||
*
|
*
|
||||||
* Copyright 2000,2001 - Peter Hunnisett
|
* Copyright 2000,2001 - Peter Hunnisett
|
||||||
*
|
*
|
||||||
* <presently under construction - contact hunnise@nortelnetworks.com>
|
|
||||||
*
|
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Lesser General Public
|
* modify it under the terms of the GNU Lesser General Public
|
||||||
* License as published by the Free Software Foundation; either
|
* License as published by the Free Software Foundation; either
|
||||||
|
@ -17,6 +15,9 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* o Messaging interface required for both DirectPlay and DirectPlayLobby.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
@ -509,4 +510,3 @@ void DP_MSG_ErrorReceived( IDirectPlay2AImpl* This, WORD wCommandId,
|
||||||
wCommandId, DPLAYX_HresultToString( lpcErrorMsg->errorCode) );
|
wCommandId, DPLAYX_HresultToString( lpcErrorMsg->errorCode) );
|
||||||
DebugBreak();
|
DebugBreak();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,12 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
* NOTES
|
||||||
|
* o Linked list implementation for dplay/dplobby. Based off of the BSD
|
||||||
|
* version found in <sys/queue.h>
|
||||||
|
* o Port it to <wine/list.h> ?
|
||||||
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef __WINE_DPLAYX_QUEUE_H
|
#ifndef __WINE_DPLAYX_QUEUE_H
|
||||||
|
|
|
@ -1,172 +0,0 @@
|
||||||
This file contains information on the implementation of the direct play
|
|
||||||
and direct play lobby features. There's lots to do and I'm not exactly
|
|
||||||
implementing it overnight! Please lend a hand.
|
|
||||||
|
|
||||||
Most methods and APIs are but stubs at this point. Examine the code
|
|
||||||
to see what has been implemented. Use -debugmsg +dplay to get a
|
|
||||||
reasonably thourough description of what's going on.
|
|
||||||
|
|
||||||
Associated DirectX user header files are include/dplay.h, include/dplobby.h.
|
|
||||||
|
|
||||||
Implementation of the DPLAY and DPLAYX dlls are both in the dlls/dplayx
|
|
||||||
directory. Here's a brief description of the function of each of the files in that
|
|
||||||
directory:
|
|
||||||
|
|
||||||
dplay.c: Implementation of all the direct play object interfaces.
|
|
||||||
|
|
||||||
dplobby.c: Implementation of all the direct play lobby interfaces.
|
|
||||||
|
|
||||||
dpclassfactory.c: Implementation of the COM class factory which can create either
|
|
||||||
direct play lobby or direct play lobby interfaces.
|
|
||||||
|
|
||||||
dpinit.h: Header file so that dpclassfactory.c can access dplay and dplobby query
|
|
||||||
functions. Shouldn't be included by anything else.
|
|
||||||
|
|
||||||
dplayx_global.h,
|
|
||||||
dplayx_global.c: Implementation of all things which are associated with dplay on
|
|
||||||
the computer - ie shared resources and such. Methods in this
|
|
||||||
compilation unit should not call anything out side this unit
|
|
||||||
excepting base windows services and an interface to start the
|
|
||||||
messaging thread.
|
|
||||||
|
|
||||||
name_server.h,
|
|
||||||
name_server.c: Implementation of all things which are associated with the name
|
|
||||||
server functionality
|
|
||||||
|
|
||||||
dplayx_main.c: LibMain executed for loading and unloading the dll. This will make
|
|
||||||
the call to dplayx_global.c to request initialization and destruction
|
|
||||||
of any global data.
|
|
||||||
|
|
||||||
dplayx_queue.h: Linked list implementation for dplay/dplobby. Based off of the BSD
|
|
||||||
version found in <sys/queue.h>
|
|
||||||
|
|
||||||
dplayx_messages.h,
|
|
||||||
dplayx_messages.c: Messaging interface required for both DirectPlay and
|
|
||||||
DirectPlayLobby.
|
|
||||||
|
|
||||||
dplaysp.c,
|
|
||||||
dplaysp.h: COM interface between DPLAYX and the service provider dlls. dplaysp.h is
|
|
||||||
something that should be included into any service provider. Basically
|
|
||||||
the COM interface is partially documented but is generally lacking in the
|
|
||||||
finer points.
|
|
||||||
|
|
||||||
Presently the architectural relationship between this files is a little shakey, but
|
|
||||||
isn't so sufficiently bad that it needs fixing yet.
|
|
||||||
|
|
||||||
I think I can safely say that any application which requires direct play
|
|
||||||
or direct play lobby will not work at this point. Priority will be to get
|
|
||||||
examples from the sdk running. Once they're at least partially working, I can
|
|
||||||
get down to trying to get some of the games working.
|
|
||||||
|
|
||||||
However, now that address separation is a reality, all binary samples provided
|
|
||||||
in the sdk can be used. I have had success spawning processes and one
|
|
||||||
directx7 example will allow creation of an app and allow another to join it.
|
|
||||||
Unfortunately, there isn't much for it to be able to do give the state of
|
|
||||||
inter directlobby or directplay messaging.
|
|
||||||
|
|
||||||
Messages which work:
|
|
||||||
|
|
||||||
For session enumeration: DPMSGCMD_ENUMSESSIONSREPLY & DPMSGCMD_ENUMSESSIONSREQUEST
|
|
||||||
have most fields understood, but not all. Everything _seems_
|
|
||||||
to work.
|
|
||||||
|
|
||||||
For playerid requesting: DPMSGCMD_REQUESTNEWPLAYERID & DPMSGCMD_NEWPLAYERIDREPLY
|
|
||||||
barely work. This needs to be completed for sessions to be
|
|
||||||
able to actually start.
|
|
||||||
|
|
||||||
A small issue will be the fact that DirectX 6.1(ie. DirectPlay4) introduces a layer of functionality
|
|
||||||
inside the DP objects which provide guaranteed protocol delivery. This is
|
|
||||||
even if the native protocol, IPX or modem for instance, doesn't guarantee it. I'm going to leave
|
|
||||||
this kind of implementation to as close to the end as possible. However, I
|
|
||||||
will implement an abstraction layer, where possible, for this functionality.
|
|
||||||
It will do nothing to start, but will require only the implementation of the
|
|
||||||
guaranteness to give final implementation.
|
|
||||||
|
|
||||||
|
|
||||||
TODO:
|
|
||||||
- (done) Header files for DP4 and DPL3
|
|
||||||
- (done) Add stub functions for all DP4 and DPL3 interfaces
|
|
||||||
- (done) Correct naming of the parameters for DP3 and DPL2
|
|
||||||
- (done) Separate out DP and DPL into multiple .c files
|
|
||||||
- (done) Allow CoCreateInstance to create the new interfaces
|
|
||||||
- (started)Implement mutual exclusion on object data for existing functions
|
|
||||||
- (done) Create and move to correct dll directories (dplay and dplayx)
|
|
||||||
- (done) Implement dplay in terms of dplayx
|
|
||||||
- (done) Need a better internal implementation for the objects which scales and
|
|
||||||
preferably doesn't involve casting structures. Solution is a crude ctor/dtor
|
|
||||||
which can actually trap some runtime errors.
|
|
||||||
- (done) More generic initialization and destruction helper methods based off
|
|
||||||
the chosen internal implementation. Solution is a crude ctor/dtor.
|
|
||||||
- Use only windows routines where an equivalent is available
|
|
||||||
- (done) Fix wine dplay.h and dplobby.h header files to allow apps to create the ansi versions
|
|
||||||
- (started) Port some WineLib test programs using sdk programs (both C and C++ progs)
|
|
||||||
- (done) Implement a lib main for the dplayx dll (required for RunApplication, etc.)
|
|
||||||
- (done)Figure out how to share the global memory correctly
|
|
||||||
- Ensure that all dll stubs are present and the ordinals are correct
|
|
||||||
- (started) Implementation of functionality
|
|
||||||
- Addition of DirectX 7.0 functionality for direct play (try to catch that moving train)
|
|
||||||
- bug fixes ;)
|
|
||||||
- Implement some WineLib test programs using sdk programs as a skeleton
|
|
||||||
- (done) Change all RegEnumKey calls to RegEnumKeyEx.
|
|
||||||
- Change RegEnumKeyEx enumeration pattern to allow error handling and to
|
|
||||||
share registry implementation (or at least simplify).
|
|
||||||
- Add in appropriate RegCloseKey calls for all the opening we're doing...
|
|
||||||
- Fix all the buffer sizes for registry calls. They're off by one - but in a safe direction.
|
|
||||||
- (done) Find out how to call the service provider dlls - they don't have a published interface!
|
|
||||||
- Fix race condition on interface destruction
|
|
||||||
- Handles need to be correctly reference counted
|
|
||||||
- Need to check if we need to deallocate any list objects when destroying
|
|
||||||
dplay interface
|
|
||||||
- RunApplication process spawning needs to have correct syncronization.
|
|
||||||
- Need to get inter lobby messages working.
|
|
||||||
- Decypher dplay messages between applications and implement...
|
|
||||||
- Need to implement lobby session spawning.
|
|
||||||
|
|
||||||
ENHANCEMENTS:
|
|
||||||
- Improve footprint and realtime blocking by setting up a separate data share
|
|
||||||
between lobby application and client since there can be multiple apps per
|
|
||||||
client. Also get rid of offset dependency by making data offset independent
|
|
||||||
somehow.
|
|
||||||
- Handle everything in UNICODE (as server does) and do conversions for ANSI
|
|
||||||
interfaces. Should cut down on dplayx code base and maintanability (marginally)
|
|
||||||
and could be used to improve efficiency of dialog with the server (it wouldn't
|
|
||||||
have to do ANSI<->UNICODE transformations).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Programs to make work:
|
|
||||||
- lserver.exe (from sdk)
|
|
||||||
- override.exe (from sdk)
|
|
||||||
- dpchat.exe (from sdk)
|
|
||||||
- duel.exe (from sdk)
|
|
||||||
- dplaunch.exe (from sdk)
|
|
||||||
|
|
||||||
Next API to implement on a per SDK program basis:
|
|
||||||
override.exe
|
|
||||||
- (calls dpserial so basic problems with that remain)
|
|
||||||
- after that ?
|
|
||||||
|
|
||||||
dplaunch.exe
|
|
||||||
- I think that everything is basically working. The launched app may not
|
|
||||||
work on the other hand.
|
|
||||||
|
|
||||||
lserver.exe
|
|
||||||
- Missing messaging portion. Everything else works.
|
|
||||||
|
|
||||||
bellhop.exe
|
|
||||||
- Need to implement lobby server support.
|
|
||||||
- ?
|
|
||||||
|
|
||||||
dpslots.exe
|
|
||||||
- Works as host except for message stuff
|
|
||||||
- Missing correct handling of receipt of playerid
|
|
||||||
|
|
||||||
Other TODO:
|
|
||||||
|
|
||||||
- look at problem with parsing the resource file for dplaunch. wrc problem?
|
|
||||||
- I should be getting the dialog box to come up for dpchat when something is selected
|
|
||||||
Call OLE32.7: CoCreateInstance(010017f0,00000000,00000001,010017e0,010094b4) ret=01002f38 fs=0237
|
|
||||||
Call ADVAPI32.188: RegOpenKeyExA(80000002,5e08dd90 "Software\\Microsoft\\DirectPlay\\Compatibility",00000000,00020019,40e7f49c) ret=5e0b6e5a fs=0237
|
|
||||||
|
|
||||||
|
|
||||||
Peter Hunnisett - hunnise@nortelnetworks.com
|
|
Loading…
Reference in New Issue