| 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) Seperate 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 seperate 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 |