This version of directplay has been revamped since beta 1.  The following 
is a description of the most used/tested features.

We anticipate an application using DirectPlayEnumerate() to determine the
service providers available, and then opening one of the GUID's
returned in the callback with DirectPlayCreate().  The product ships with 
3 providers in 2 dlls. Serial Modem, TCP/IP, IPX.  A null modem 
connection will be available before retail release.

Once connected, the user should select whether they wish to Create a
game or connect to one.  For the creation case, call Open() with the game 
parameters set.  For connection, call EnumerateSessions(), have the user 
pick a game, and then open that game.

A game may create multiple local players.  I suggest that you use the
Event available in the createplayer call for synchronization.  This event 
will be signaled when a message is available for a given character.

You should always do a destroyplayer() on any locally created players before
you try and exit.

You should always close() before exiting.

close() will not succeed unless you have destroyed all local players.
In addition, if you are the game creator all players must be destroyed.

Latency is not a guaranteed value by any means.  If latency is trully
important to you -- then you should check appliation to application latency 
by measuring it yourself.

It is important to keep packet sizes as small as possible.  The Modem
case currently uses 8 bytes as a message header.  This will be reduced to 
no more than 4 for retail.

It is important to limit the amount of messages that can be generated.  
Immortal Klowns, for example, issues a message for every keystroke.  Someone 
pounding on the keyboard will bring IKlowns to its knees.  It is better if 
you sample keyboard input at a particular rate, or otherwise limit the input.

The group apis have not been tested extentsively.

Always rememeber that DirectPlay implements unreliable communications.  
You can't count on a message getting to its destination.

InvitePlayer, RSVP, and SavePlayer are unimplemented.

SaveSession is only implemented for the modem case.  Basically, it
allows you to save the phone number of someone you wish to call.  
You can then retrieve this by enumerating previous sessions.

You tell a system message from others because it comes form player 0.

Regarding DPMSG_ADDPLAYER:dwPlayerType:  Currently, it is FALSE if the
structure refers to a group and TRUE otherwise.  This field may disappear.  
If it does, you will be able to determine this information from the dwType 
field.

The way to get in contact with the person who wrote DirectPlay and ask about
it is the CIS forums.

Good luck and hope to see you on the forums.
