Leaked source code of windows server 2003
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

628 lines
22 KiB

/*==========================================================================
*
* Copyright (C) 1999-2002 Microsoft Corporation. All Rights Reserved.
*
* File: dncore.h
* Content: DIRECT NET CORE HEADER FILE
*@@BEGIN_MSINTERNAL
* History:
* Date By Reason
* ==== == ======
* 07/21/99 mjn Created
* 10/08/99 jtk Moved COM interfaces into separate files
* 11/09/99 mjn Moved Worker Thread constants/structures to separate file
* 12/23/99 mjn Hand all NameTable update sends from Host to worker thread
* 12/23/99 mjn Added host migration structures and functions
* 12/28/99 mjn Added DNCompleteOutstandingOperations
* 12/28/99 mjn Added NameTable version to Host migration message
* 12/28/99 mjn Moved Async Op stuff to Async.h
* 01/03/00 mjn Added DNPrepareToDeletePlayer
* 01/04/00 mjn Added code to allow outstanding ops to complete at host migration
* 01/06/00 mjn Moved NameTable stuff to NameTable.h
* 01/07/00 mjn Moved Misc Functions to DNMisc.h
* 01/08/00 mjn Added DN_INTERNAL_MESSAGE_CONNECT_FAILED
* 01/08/00 mjn Removed unused connection info
* 01/09/00 mjn Added Application Description routines
* Changed SEND/ACK NAMETABLE to SEND/ACK CONNECT INFO
* 01/10/00 mjn Added DNSendUpdateAppDescMessage and DN_UserUpdateAppDesc
* 01/11/00 mjn Use CPackedBuffers instead of DN_ENUM_BUFFER_INFOs
* Moved Application Description stuff to AppDesc.h
* Moved Connect/Disconnect stuff to Connect.h
* 01/13/00 mjn Added CFixedPools for CRefCountBuffers
* 01/14/00 mjn Removed pvUserContext from DN_NAMETABLE_ENTRY_INFO
* 01/14/00 mjn Moved Message stuff to Message.h
* 01/15/00 mjn Replaced DN_COUNT_BUFFER with CRefCountBuffer
* 01/16/00 mjn Modified User message handler definition
* Moved User call back stuff to User.h
* 01/17/00 mjn Added DN_MSG_INTERNAL_VOICE_SEND and DN_MSG_INTERNAL_BUFFER_IN_USE
* 01/18/00 mjn Moved NameTable info structures to NameTable.h
* 01/19/00 mjn Added structures for NameTable Operation List
* 01/20/00 mjn Moved internal messages to Message.h
* 01/21/00 mjn Removed DNAcknowledgeHostRequest
* 01/23/00 mjn Added DN_MSG_INTERNAL_HOST_DESTROY_PLAYER
* 01/24/00 mjn Implemented NameTable operation list clean up
* 01/25/00 mjn Changed Host Migration to multi-step affair
* 01/26/00 mjn Implemented NameTable re-sync at host migration
* 01/27/00 mjn Reordered DN_MSG_INTERNAL's
* 01/31/00 mjn Added Internal FPM's for RefCountBuffers
* 02/09/00 mjn Implemented DNSEND_COMPLETEONPROCESS
* 03/23/00 mjn Implemented RegisterLobby()
* 04/04/00 mjn Added DN_MSG_INTERNAL_TERMINATE_SESSION
* 04/09/00 mjn Added support for CAsyncOp
* 04/11/00 mjn Moved DN_INTERNAL_MESSAGE_HEADER from Async.h
* 04/11/00 mjn Added DIRECTNETOBJECT bilink for CAsyncOps
* 04/23/00 mjn Replaced DN_MSG_INTERNAL_SEND_PROCESSED with DN_MSG_INTERNAL_REQ_PROCESS_COMPLETION
* mjn Replaced DN_MSG_INTERNAL_SEND_PROCESSED_COMPLETE with DN_MSG_INTERNAL_PROCESS_COMPLETION
* 04/26/00 mjn Removed DN_ASYNC_OP and related functions
* 04/28/00 mjn Code clean up - removed comments and unused consts/structs/funcs
* 05/23/00 mjn Added DN_MSG_INTERNAL_INSTRUCTED_CONNECT_FAILED
* 07/05/00 mjn Removed references to DN_MSG_INTERNAL_ENUM_WITH_APPLICATION_GUID,DN_MSG_INTERNAL_ENUM,DN_MSG_INTERNAL_ENUM_RESPONSE
* 07/07/00 mjn Added pNewHost as host migration target to DirectNetObject
* 07/09/00 rmt Bug #38323 - RegisterLobby needs a DPNHANDLE parameter.
* 07/12/00 mjn Moved internal messages back to Message.h
* 07/17/00 mjn Add signature to DirectNetObject
* 07/28/00 mjn Added m_bilinkConnections to DirectNetObject
* 07/30/00 mjn Added CPendingDeletion
* 07/31/00 mjn Added CQueuedMsg
* 08/05/00 mjn Added m_bilinkActiveList and csActiveList
* 08/06/00 mjn Added CWorkerJob
* 08/09/00 mjn Added csConnectionList and m_bilinkIndicated
* 08/11/00 mjn Added DN_OBJECT_FLAG_HOST_MIGRATING_2 flag (!)
* 08/23/00 mjn Added DN_OBJECT_FLAG_DPNSVR_REGISTERED
* 08/23/00 mjn Added CNameTableOp
* 09/04/00 mjn Added CApplicationDesc
* 09/13/00 rmt Bug #44625 - DPVOICE: Multihomed machines are not always enumerable (Added DN_OBJECT_FLAG_LOCALHOST flag).
* 02/05/01 mjn Removed unused debug members from DIRECTNETOBJECT
* mjn Added CCallbackThread
* 03/30/01 mjn Changes to prevent multiple loading/unloading of SP's
* mjn Added pConnectSP,dwMaxFrameSize
* mjn Removed blSPCapsList
* 04/04/01 mjn Re-ordered DirectNetObject fields
* mjn Revised minor version number for DirectX8.1
* mjn Added voice and lobby sigs
* 04/05/01 mjn Added DPNID parameter to DNProcessHostMigration3()
* 04/13/01 mjn Added m_bilinkRequestList
* 05/17/01 mjn Added dwRunningOpCount,hRunningOpEvent,dwWaitingThreadID to track threads performing NameTable operations
* 10/08/01 vanceo Added multicast support
*@@END_MSINTERNAL
*
***************************************************************************/
#ifndef __DNCORE_H__
#define __DNCORE_H__
#include "AppDesc.h"
#include "HandleTable.h"
#include "NameTable.h"
//**********************************************************************
// Constant definitions
//**********************************************************************
//
// Core version history
//
// 0.1 DirectX 8.0
// 0.2 DirectX 8.1
// 0.3 PocketPC
// 0.4
// 0.5 Windows Server 2003
// 0.6 DirectX 9.0
//
#define DN_VERSION_MAJOR 0x0000
#define DN_VERSION_MINOR 0x0005
#define DN_VERSION_CURRENT ((DN_VERSION_MAJOR << 16) | DN_VERSION_MINOR)
#define DN_OBJECT_FLAG_INITIALIZED 0x80000000
#ifndef DPNBUILD_NOLOBBY
#define DN_OBJECT_FLAG_LOBBY_AWARE 0x40000000
#endif // ! DPNBUILD_NOLOBBY
#define DN_OBJECT_FLAG_DPNSVR_REGISTERED 0x20000000
#define DN_OBJECT_FLAG_LOCALHOST 0x10000000
#define DN_OBJECT_FLAG_DISALLOW_ENUMS 0x04000000
#define DN_OBJECT_FLAG_LISTENING 0x02000000
#define DN_OBJECT_FLAG_ENUMERATING 0x01000000
#define DN_OBJECT_FLAG_HOST_CONNECTED 0x00400000 // the original host will never have this flag set
#define DN_OBJECT_FLAG_CONNECTING 0x00200000
#define DN_OBJECT_FLAG_CONNECTED 0x00100000
#define DN_OBJECT_FLAG_DISCONNECTING 0x00040000
#define DN_OBJECT_FLAG_CLOSING_IMMEDIATE 0x00020000
#define DN_OBJECT_FLAG_CLOSING 0x00010000
#define DN_OBJECT_FLAG_HOST_MIGRATING_WAIT 0x00004000 // Wait for running operations to finish
#define DN_OBJECT_FLAG_HOST_MIGRATING_2 0x00002000
#define DN_OBJECT_FLAG_HOST_MIGRATING 0x00001000
#ifndef DPNBUILD_NOPARAMVAL
#define DN_OBJECT_FLAG_PARAMVALIDATION 0x00000010
#endif // !DPNBUILD_NOPARAMVAL
#ifndef DPNBUILD_NOMULTICAST
#define DN_OBJECT_FLAG_MULTICAST 0x00000008
#endif // ! DPNBUILD_NOMULTICAST
#define DN_OBJECT_FLAG_PEER 0x00000004
#define DN_OBJECT_FLAG_CLIENT 0x00000002
#ifndef DPNBUILD_NOSERVER
#define DN_OBJECT_FLAG_SERVER 0x00000001
#endif // ! DPNBUILD_NOSERVER
#define DN_GUID_STR_LEN 38 // {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
#define DN_FLAG_STR_LEN 5 // FALSE (or TRUE or YES or NO)
#if ((defined(DPNBUILD_ONLYONESP)) && (defined(DPNBUILD_ONLYONEADAPTER)))
#define MAX_HOST_ADDRESSES 1
#else // ! DPNBUILD_ONLYONESP or ! DPNBUILD_ONLYONEADAPTER
#define MAX_HOST_ADDRESSES 8
#endif // ! DPNBUILD_ONLYONESP or ! DPNBUILD_ONLYONEADAPTER
#undef DPF_SUBCOMP
#define DPF_SUBCOMP DN_SUBCOMP_CORE // Used by Debug Logging to determine sub-component
//**********************************************************************
// Macro definitions
//**********************************************************************
#ifndef DPNBUILD_NOPARAMVAL
#define TRY _try
#define EXCEPT(a) _except( a )
#endif // !DPNBUILD_NOPARAMVAL
//**********************************************************************
// Global definitions
//**********************************************************************
extern DN_PROTOCOL_INTERFACE_VTBL g_ProtocolVTBL;
#ifndef DPNBUILD_LIBINTERFACE
extern LONG g_lCoreObjectCount;
#endif // ! DPNBUILD_LIBINTERFACE
//**********************************************************************
// Structure definitions
//**********************************************************************
typedef struct IDirectPlay8Address IDirectPlay8Address; // DPNAddr.h
typedef struct IDirectPlay8LobbiedApplication IDirectPlay8LobbiedApplication;
typedef struct IDirectPlayVoiceNotify *PDIRECTPLAYVOICENOTIFY;
class CAsyncOp;
class CServiceProvider;
class CSyncEvent;
#ifndef DPNBUILD_NOVOICE
//
// Voice Additions
//
// this is the number of clients of IDirectPlayVoice in this process
// this is actually a ridiculously large number of client slots.
//
#define MAX_VOICE_CLIENTS 32
#endif // !DPNBUILD_NOVOICE
typedef struct _DIRECTNETOBJECT
{
#ifdef DPNBUILD_LIBINTERFACE
//
// For lib interface builds, the interface Vtbl and refcount are embedded in the object itself.
//
LPVOID lpVtbl; // must be first entry in structure
LONG lRefCount;
#endif // DPNBUILD_LIBINTERFACE
BYTE Sig[4]; // Signature
//
// DirectNet object flags
// Protected by csDirectNetObject
//
DWORD volatile dwFlags;
//
// User information
// Protected by csDirectNetObject
//
PVOID pvUserContext;
PFNDPNMESSAGEHANDLER pfnDnUserMessageHandler;
//
// Shutdown info
// Protected by csDirectNetObject
//
DWORD volatile dwLockCount; // Count to prevent closing
DNHANDLE hLockEvent; // Set when dwLockCount=0
//
// Protocol information
// Protected by csDirectNetObject
//
LONG volatile lProtocolRefCount; // Protocol usage
CSyncEvent *hProtocolShutdownEvent;// No outstanding protocol operations
HANDLE pdnProtocolData;
//
// Listen information
// Protected by csDirectNetObject
//
CAsyncOp *pListenParent; // LISTEN async op
DWORD dwMaxFrameSize; // Max frame size (cached for enum payload size checks)
//
// Connect information
// Protected by csDirectNetObject
//
CAsyncOp *pConnectParent; // CONNECT async op
PVOID pvConnectData; // Connect data
DWORD dwConnectDataSize;
CServiceProvider *pConnectSP; // SP used to connect (cached for future connects)
IDirectPlay8Address *pIDP8ADevice; // SP Local Device
IDirectPlay8Address *pConnectAddress; // Connect Address (cached) for clients
//
// Host migration information
// Protected by csDirectNetObject
//
CNameTableEntry *pNewHost; // Host migration target
DWORD volatile dwRunningOpCount; // Running operation count (wait for them during host migration)
DNHANDLE hRunningOpEvent; // Running operation event (set when running ops finish)
DWORD volatile dwWaitingThreadID; // Last thread to wait for outstanding running operations
//
// Outstanding callback threads (use csCallbackThreads)
// Protected by csCallbackThreads
//
CBilink m_bilinkCallbackThreads;
#ifdef DBG
//
// Outstanding CAsyncOps
// Protected by csAsyncOperations
//
CBilink m_bilinkAsyncOps;
#endif // DBG
//
// Outstanding CConnections
// Protected by csConnectionList
//
CBilink m_bilinkConnections;
CBilink m_bilinkIndicated; // Indicated connections
//
// Active CAsyncOps (w/ protocol handles, no requests)
// Protected by csActiveList
//
CBilink m_bilinkActiveList;
//
// Request CAsyncOps (no active CAsyncOps)
// Protected by csActiveList
//
CBilink m_bilinkRequestList;
//
// CBilink of NameTable pending deletions
// Protected by csNameTableOpList
//
CBilink m_bilinkPendingDeletions;
//
// Protected by csServiceProviders
//
#ifdef DPNBUILD_ONLYONESP
CServiceProvider * pOnlySP;
#else // ! DPNBUILD_ONLYONESP
CBilink m_bilinkServiceProviders;
#endif // ! DPNBUILD_ONLYONESP
#ifndef DPNBUILD_NONSEQUENTIALWORKERQUEUE
//
// Protected by csWorkerQueue
//
CBilink m_bilinkWorkerJobs;
#endif // ! DPNBUILD_NONSEQUENTIALWORKERQUEUE
IDirectPlay8ThreadPoolWork *pIDPThreadPoolWork; // pointer to thread pool work interface
DWORD dwClosingThreadID; // ID of thread that called Close
#ifndef DPNBUILD_NONSEQUENTIALWORKERQUEUE
LONG volatile lThreadPoolRefCount;
CSyncEvent *ThreadPoolShutDownEvent;
BOOL fProcessingWorkerJobs; // whether a thread is currently processing worker jobs or not
#endif // ! DPNBUILD_NONSEQUENTIALWORKERQUEUE
//
// Application Description
//
CApplicationDesc ApplicationDesc;
//
// Name Table
//
CNameTable NameTable;
//
// Handle Table
//
CHandleTable HandleTable;
//
// Critical Sections
//
#ifndef DPNBUILD_ONLYONETHREAD
DNCRITICAL_SECTION csDirectNetObject; // access control critical section
DNCRITICAL_SECTION csCallbackThreads; // CS to protect callback thread list CBilink
#ifdef DBG
DNCRITICAL_SECTION csAsyncOperations; // CS to protect outstanding async CBilink
#endif // DBG
DNCRITICAL_SECTION csActiveList; // CS to protect active list of AsyncOps
DNCRITICAL_SECTION csConnectionList; // CS to protect Connection list
DNCRITICAL_SECTION csNameTableOpList; // CS to protect NameTable operation list
DNCRITICAL_SECTION csServiceProviders; // CS to protect Service Provider list
#ifndef DPNBUILD_NONSEQUENTIALWORKERQUEUE
DNCRITICAL_SECTION csWorkerQueue; // CS to protect worker thread job queue
#endif // ! DPNBUILD_NONSEQUENTIALWORKERQUEUE
#ifndef DPNBUILD_NOVOICE
DNCRITICAL_SECTION csVoice; // CS to protect voice
#endif // !DPNBUILD_NOVOICE
#endif // !DPNBUILD_ONLYONETHREAD
#ifndef DPNBUILD_NOVOICE
//
// Voice Additions
// Protected by csVoice
//
BYTE VoiceSig[4];
PDIRECTPLAYVOICENOTIFY lpDxVoiceNotifyServer;
PDIRECTPLAYVOICENOTIFY lpDxVoiceNotifyClient;
//
// Send Target Cache for voice targets on DV_SendSpeechEx
// Protected by csVoice
//
DWORD nTargets; // number of used entries in the target list
DWORD nTargetListLen; // max number of target list entries list can hold
PDPNID pTargetList; // ptr to target list array
DWORD nExpandedTargets; // simplified list of targets, removes dup's
DWORD nExpandedTargetListLen; // max number of target list entries list can hold
PDPNID pExpandedTargetList; // ptr to array of simplified list of targets
#endif // !DPNBUILD_NOVOICE
#ifndef DPNBUILD_NOLOBBY
//
// Lobby additions
//
BYTE LobbySig[4];
DPNHANDLE dpnhLobbyConnection; // Lobby Connection to update
IDirectPlay8LobbiedApplication *pIDP8LobbiedApplication;
#endif // ! DPNBUILD_NOLOBBY
#ifndef DPNBUILD_NOMULTICAST
//
// Multicast additions
// Protected by csDirectNetObject
//
CConnection *pMulticastSend; // Multicast send connection
CBilink m_bilinkMulticast; // Multicast receive connections
#endif // ! DPNBUILD_NOMULTICAST
#ifdef DPNBUILD_PREALLOCATEDMEMORYMODEL
BOOL fPoolsPrepopulated; // whether these pools have been prepopulated yet or not
CFixedPool EnumReplyMemoryBlockPool; // pool for enum reply buffers
#endif // DPNBUILD_PREALLOCATEDMEMORYMODEL
} DIRECTNETOBJECT, *PDIRECTNETOBJECT;
//**********************************************************************
// Variable definitions
//**********************************************************************
extern CFixedPool g_RefCountBufferPool;
extern CFixedPool g_SyncEventPool;
extern CFixedPool g_ConnectionPool;
extern CFixedPool g_GroupConnectionPool;
extern CFixedPool g_GroupMemberPool;
extern CFixedPool g_NameTableEntryPool;
extern CFixedPool g_NameTableOpPool;
extern CFixedPool g_AsyncOpPool;
extern CFixedPool g_PendingDeletionPool;
extern CFixedPool g_QueuedMsgPool;
extern CFixedPool g_WorkerJobPool;
extern CFixedPool g_MemoryBlockTinyPool;
extern CFixedPool g_MemoryBlockSmallPool;
extern CFixedPool g_MemoryBlockMediumPool;
extern CFixedPool g_MemoryBlockLargePool;
extern CFixedPool g_MemoryBlockHugePool;
#ifdef DPNBUILD_LIBINTERFACE
extern DWORD g_dwDP8StartupFlags;
#endif // DPNBUILD_LIBINTERFACE
//**********************************************************************
// Function prototypes
//**********************************************************************
BOOL DNGlobalsInit(HANDLE hModule);
VOID DNGlobalsDeInit();
//
// DirectNet Core Message Handler
//
HRESULT DN_CoreMessageHandler(PVOID const pv,
const DWORD dwMsgId,
const HANDLE hEndPt,
PBYTE const pData,
const DWORD dwDataSize,
PVOID const pvUserContext,
const HANDLE hProtocol,
const HRESULT hr);
//
// Protocol Ref Counts
//
void DNProtocolAddRef(DIRECTNETOBJECT *const pdnObject);
void DNProtocolRelease(DIRECTNETOBJECT *const pdnObject);
#ifndef DPNBUILD_NONSEQUENTIALWORKERQUEUE
//
// Thread pool ref counts
//
void DNThreadPoolAddRef(DIRECTNETOBJECT *const pdnObject);
void DNThreadPoolRelease(DIRECTNETOBJECT *const pdnObject);
#endif // DPNBUILD_NONSEQUENTIALWORKERQUEUE
#ifndef DPNBUILD_NOHOSTMIGRATE
//
// DirectNet - Host Migration routines
//
HRESULT DNFindNewHost(DIRECTNETOBJECT *const pdnObject,
DPNID *const pdpnidNewHost);
HRESULT DNPerformHostMigration1(DIRECTNETOBJECT *const pdnObject,
const DPNID dpnidOldHost);
HRESULT DNPerformHostMigration2(DIRECTNETOBJECT *const pdnObject);
HRESULT DNPerformHostMigration3(DIRECTNETOBJECT *const pdnObject,
void *const pMsg);
HRESULT DNProcessHostMigration1(DIRECTNETOBJECT *const pdnObject,
void *const pvMsg);
HRESULT DNProcessHostMigration2(DIRECTNETOBJECT *const pdnObject,
void *const pMsg);
HRESULT DNProcessHostMigration3(DIRECTNETOBJECT *const pdnObject,
const DPNID dpnid);
HRESULT DNCompleteOutstandingOperations(DIRECTNETOBJECT *const pdnObject);
HRESULT DNCheckReceivedAllVersions(DIRECTNETOBJECT *const pdnObject);
HRESULT DNCleanUpNameTable(DIRECTNETOBJECT *const pdnObject);
HRESULT DNSendHostMigrateCompleteMessage(DIRECTNETOBJECT *const pdnObject);
#endif // !DPNBUILD_NOHOSTMIGRATE
//
// DirectNet - Protocol Interface (message handler callback functions)
//
HRESULT DNPIIndicateEnumQuery(void *const pvUserContext,
void *const pvEndPtContext,
const HANDLE hCommand,
void *const pvEnumQueryData,
const DWORD dwEnumQueryDataSize);
HRESULT DNPIIndicateEnumResponse(void *const pvUserContext,
const HANDLE hCommand,
void *const pvCommandContext,
void *const pvEnumResponseData,
const DWORD dwEnumResponseDataSize);
HRESULT DNPIIndicateConnect(void *const pvUserContext,
void *const pvListenContext,
const HANDLE hEndPt,
void **const ppvEndPtContext);
HRESULT DNPIIndicateDisconnect(void *const pvUserContext,
void *const pvEndPtContext);
HRESULT DNPIIndicateConnectionTerminated(void *const pvUserContext,
void *const pvEndPtContext,
const HRESULT hr);
HRESULT DNPIIndicateReceive(void *const pvUserContext,
void *const pvEndPtContext,
void *const pvData,
const DWORD dwDataSize,
const HANDLE hBuffer,
const DWORD dwFlags);
HRESULT DNPICompleteListen(void *const pvUserContext,
void **const ppvCommandContext,
const HRESULT hr,
const HANDLE hCommand);
HRESULT DNPICompleteListenTerminate(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr);
HRESULT DNPICompleteEnumQuery(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr);
HRESULT DNPICompleteEnumResponse(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr);
HRESULT DNPICompleteConnect(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr,
const HANDLE hEndPt,
void **const ppvEndPtContext);
HRESULT DNPICompleteDisconnect(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr);
HRESULT DNPICompleteSend(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr,
DWORD dwFirstFrameRTT,
DWORD dwFirstFrameRetryCount);
HRESULT DNPIAddressInfoConnect(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr,
IDirectPlay8Address *const pHostAddress,
IDirectPlay8Address *const pDeviceAddress );
HRESULT DNPIAddressInfoEnum(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr,
IDirectPlay8Address *const pHostAddress,
IDirectPlay8Address *const pDeviceAddress );
HRESULT DNPIAddressInfoListen(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hr,
IDirectPlay8Address *const pDeviceAddress );
#ifndef DPNBUILD_NOMULTICAST
HRESULT DNPIIndicateReceiveUnknownSender(void *const pvUserContext,
void *const pvListenCommandContext,
IDirectPlay8Address *const pSenderAddress,
void *const pvData,
const DWORD dwDataSize,
const HANDLE hBuffer);
HRESULT DNPICompleteMulticastConnect(void *const pvUserContext,
void *const pvCommandContext,
const HRESULT hrProt,
const HANDLE hEndPt,
void **const ppvEndPtContext);
#endif // DPNBUILD_NOMULTICAST
//**********************************************************************
// Class prototypes
//**********************************************************************
#endif // __DNCORE_H__