50 WORD *replyCommandIds,
DWORD replyCommandIdCount,
void **lplpReplyMsg,
51 DWORD *lpdwMsgBodySize,
void **replyMsgHeader );
64 lpThreadInfo =
malloc(
sizeof( *lpThreadInfo ) );
65 if( lpThreadInfo ==
NULL )
76 ERR(
"Unable to duplicate event handle\n" );
84 lpThreadInfo->
hStart = hStart;
85 lpThreadInfo->
hDeath = hDeath;
97 ERR(
"Unable to create msg thread\n" );
103 return dwMsgThreadId;
107 free( lpThreadInfo );
117 TRACE(
"Msg thread created. Waiting on app startup\n" );
123 FIXME(
"Should signal app/wait creation failure (0x%08lx)\n", dwWaitResult );
135 ERR(
"App Read connection setting timeout fail (0x%08lx)\n", dwWaitResult );
142 TRACE(
"App created && initialized starting main message reception loop\n" );
151 TRACE(
"Msg thread exiting!\n" );
152 free( lpThreadInfo );
160 DWORD replyCommandIdCount )
170 DPQ_INSERT(
This->dp2->repliesExpected, lpReplyStructList, repliesExpected );
185 reply =
DPQ_NEXT( reply->repliesExpected ) )
207 DPQ_REMOVE(
This->dp2->repliesExpected, lpReplyStructList, repliesExpected );
213 LPVOID* lplpReplyMsg,
LPDWORD lpdwMsgBodySize,
void **replyMsgHeader )
226 for (
i = 0;
i < bufferCount; ++
i )
253 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
254 buffers[ 1 ].len =
sizeof( msgBody );
257 data.lpISP =
This->dp2->spData.lpISP;
260 data.idPlayerFrom = 0;
266 TRACE(
"Asking for player id w/ dwFlags 0x%08lx\n",
270 &lpMsg, &dwMsgSize, &msgHeader );
354 if( maxSize -
offset < 1 )
357 *inoutOffset =
offset + 1;
360 if( maxSize -
offset < 2 )
363 *inoutOffset =
offset + 2;
366 if( maxSize -
offset < 4 )
369 *inoutOffset =
offset + 4;
391 playerInfo->
id = packedPlayer->
id;
416 if( maxSize - offset < playerInfo->spDataLength )
424 if( maxSize - offset < playerInfo->playerDataLength )
434 if( maxSize - offset < playerInfo->playerCount *
sizeof(
DPID ) )
460 playerInfo->
id = packedPlayer->
id;
485 if( maxSize - offset < playerInfo->playerDataLength )
499 if( maxSize - offset < playerInfo->spDataLength )
515 if( maxSize - offset < playerInfo->playerCount *
sizeof(
DPID ) )
539 if( maxSize - offset < playerInfo->shortcutCount *
sizeof(
DPID ) )
557 DWORD spPlayerDataSize;
573 msgBody.
passwordOffset =
sizeof( msgBody ) +
sizeof( playerInfo ) + spPlayerDataSize;
575 playerInfo.
size =
sizeof( playerInfo ) + spPlayerDataSize;
577 playerInfo.
id = dpidServer;
584 playerInfo.
fixedSize =
sizeof( playerInfo );
595 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
596 buffers[ 1 ].len =
sizeof( msgBody );
598 buffers[ 2 ].len =
sizeof( playerInfo );
600 buffers[ 3 ].len = spPlayerDataSize;
604 buffers[ 5 ].len =
sizeof(
This->dp2->lpSessionDesc->dwReserved1 );
607 data.lpISP =
This->dp2->spData.lpISP;
610 data.idPlayerFrom = dpidServer;
616 TRACE(
"Sending forward player request with 0x%08lx\n", dpidServer );
620 replyCommands,
ARRAYSIZE( replyCommands ),
621 &lpMsg, &dwMsgSize, &msgHeader );
665 if ( playerInfo.
id == dpidServer )
718 FIXME(
"Name Table reply received: stub\n" );
748 DPID systemPlayerId )
754 DWORD shortNameLength = 0;
755 DWORD longNameLength = 0;
757 DWORD spPlayerDataSize;
766 if (
name->lpszShortName )
769 if (
name->lpszLongName )
779 msg.passwordOffset = 0;
782 + spPlayerDataSize + playerDataSize;
795 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
799 buffers[ 2 ].len =
sizeof( playerInfo );
801 buffers[ 3 ].len = shortNameLength;
803 buffers[ 4 ].len = longNameLength;
805 buffers[ 5 ].len = spPlayerDataSize;
806 buffers[ 5 ].pData = spPlayerData;
807 buffers[ 6 ].len = playerDataSize;
808 buffers[ 6 ].pData = playerData;
812 sendData.
lpISP =
This->dp2->spData.lpISP;
824 hr = (*
This->dp2->spData.lpCB->SendToGroupEx)( &sendData );
845 msg.playerId = playerId;
846 msg.groupId = groupId;
847 msg.createOffset = 0;
848 msg.passwordOffset = 0;
850 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
855 sendData.
lpISP =
This->dp2->spData.lpISP;
867 hr = (*
This->dp2->spData.lpCB->SendToGroupEx)( &sendData );
888 msg.tickCount = tickCount;
890 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
895 sendData.
lpISP =
This->dp2->spData.lpISP;
908 hr = (*
This->dp2->spData.lpCB->SendEx)( &sendData );
930 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
935 sendData.
lpISP =
This->dp2->spData.lpISP;
948 hr = (*
This->dp2->spData.lpCB->SendEx)( &sendData );
965 WORD *replyCommandIds,
DWORD replyCommandIdCount,
void **lplpReplyMsg,
966 DWORD *lpdwMsgBodySize,
void **replyMsgHeader )
975 replyCommandIds, replyCommandIdCount );
977 TRACE(
"Sending msg and expecting reply within %lu ticks\n", dwWaitTime );
978 hr = (*
This->dp2->spData.lpCB->SendEx)( lpData );
994 ERR(
"Wait failed 0x%08lx\n", dwWaitReturn );
1010 DWORD dwMsgBodySize,
const void *msgHeader )
1026 if( lpReplyList !=
NULL )
1032 lpcMsgBody, dwMsgBodySize );
1034 msgHeader,
This->dp2->spData.dwSPHeaderSize );
1041 ERR(
"No receipt event set - only expecting in reply mode\n" );
1064 buffers[ 0 ].len =
This->dp2->spData.dwSPHeaderSize;
1065 buffers[ 1 ].len =
sizeof( msgBody );
1068 data.lpISP =
This->dp2->spData.lpISP;
1070 data.idPlayerTo = dpidSelf;
1071 data.idPlayerFrom = 0;
1080 &lpMsg, &dwMsgSize, &msgHeader );
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
#define GetCurrentProcess()
BOOL WINAPI DuplicateHandle(IN HANDLE hSourceProcessHandle, IN HANDLE hSourceHandle, IN HANDLE hTargetProcessHandle, OUT LPHANDLE lpTargetHandle, IN DWORD dwDesiredAccess, IN BOOL bInheritHandle, IN DWORD dwOptions)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateThread(IN LPSECURITY_ATTRIBUTES lpThreadAttributes, IN DWORD dwStackSize, IN LPTHREAD_START_ROUTINE lpStartAddress, IN LPVOID lpParameter, IN DWORD dwCreationFlags, OUT LPDWORD lpThreadId)
_ACRTIMP size_t __cdecl wcsnlen(const wchar_t *, size_t)
HRESULT DP_CreatePlayer(IDirectPlayImpl *This, void *msgHeader, DPID *lpid, DPNAME *lpName, void *data, DWORD dataSize, void *spData, DWORD spDataSize, DWORD dwFlags, HANDLE hEvent, struct PlayerData **playerData, BOOL bAnsi)
HRESULT DP_AddPlayerToGroup(IDirectPlayImpl *This, DPID group, DPID player)
HRESULT DP_CreateGroup(IDirectPlayImpl *This, void *msgHeader, const DPID *lpid, const DPNAME *lpName, void *data, DWORD dataSize, DWORD dwFlags, DPID idParent, BOOL bAnsi)
#define DPSEND_GUARANTEED
#define IDirectPlaySP_GetSPPlayerData(p, a, b, c, d)
#define DPLAYI_PLAYER_PLAYERLOCAL
#define DPLAYI_PLAYER_SYSPLAYER
LPCSTR DPLAYX_HresultToString(HRESULT hr)
HRESULT DP_MSG_ReadPackedPlayer(char *data, DWORD *inoutOffset, DWORD maxSize, DPPLAYERINFO *playerInfo)
static HRESULT DP_MSG_ReadString(char *data, DWORD *inoutOffset, DWORD maxSize, WCHAR **string)
struct tagMSGTHREADINFO * LPMSGTHREADINFO
void DP_MSG_ReplyReceived(IDirectPlayImpl *This, WORD wCommandId, const void *lpcMsgBody, DWORD dwMsgBodySize, const void *msgHeader)
static void DP_MSG_UnlinkReplyStruct(IDirectPlayImpl *This, DP_MSG_REPLY_STRUCT_LIST *lpReplyStructList)
static HRESULT DP_MSG_ReadSizedString(char *data, DWORD *inoutOffset, DWORD maxSize, DWORD size, WCHAR **string)
static void DP_MSG_CleanReplyStruct(LPDP_MSG_REPLY_STRUCT_LIST lpReplyStructList, LPVOID *lplpReplyMsg, LPDWORD lpdwMsgBodySize, void **replyMsgHeader)
struct tagMSGTHREADINFO MSGTHREADINFO
HRESULT DP_MSG_SendAddPlayerToGroup(IDirectPlayImpl *This, DPID toId, DPID playerId, DPID groupId)
HRESULT DP_MSG_ForwardPlayerCreation(IDirectPlayImpl *This, DPID dpidServer, WCHAR *password)
DWORD CreateLobbyMessageReceptionThread(HANDLE hNotifyEvent, HANDLE hStart, HANDLE hDeath, HANDLE hConnRead)
static HRESULT DP_MSG_ExpectReply(IDirectPlayImpl *This, DPSP_SENDEXDATA *data, DWORD dwWaitTime, WORD *replyCommandIds, DWORD replyCommandIdCount, void **lplpReplyMsg, DWORD *lpdwMsgBodySize, void **replyMsgHeader)
void DP_MSG_ToSelf(IDirectPlayImpl *This, DPID dpidSelf)
HRESULT DP_MSG_SendPingReply(IDirectPlayImpl *This, DPID toId, DPID fromId, DWORD tickCount)
HRESULT DP_MSG_SendAddForwardAck(IDirectPlayImpl *This, DPID id)
static HRESULT DP_MSG_ReadSuperPackedPlayer(char *data, DWORD *inoutOffset, DWORD maxSize, DPPLAYERINFO *playerInfo)
static DP_MSG_REPLY_STRUCT_LIST * DP_MSG_FindAndUnlinkReplyStruct(IDirectPlayImpl *This, WORD commandId)
HRESULT DP_MSG_SendRequestPlayerId(IDirectPlayImpl *This, DWORD dwFlags, DPID *lpdpidAllocatedId)
DWORD DP_MSG_ComputeMessageSize(SGBUFFER *buffers, DWORD bufferCount)
static HRESULT DP_MSG_ReadInteger(char *data, DWORD *inoutOffset, DWORD maxSize, DWORD size, DWORD *value)
static DWORD CALLBACK DPL_MSG_ThreadMain(LPVOID lpContext)
static HANDLE DP_MSG_BuildAndLinkReplyStruct(IDirectPlayImpl *This, DP_MSG_REPLY_STRUCT_LIST *lpReplyStructList, WORD *replyCommandIds, DWORD replyCommandIdCount)
HRESULT DP_MSG_SendCreatePlayer(IDirectPlayImpl *This, DPID toId, DPID id, DWORD flags, DPNAME *name, void *playerData, DWORD playerDataSize, DPID systemPlayerId)
#define DPLAYI_SUPERPACKEDPLAYER_PLAYER_DATA_LENGTH_SIZE(mask)
#define DPMSGCMD_SUPERENUMPLAYERSREPLY
#define DPMSGCMD_CREATESESSION
#define DPLAYI_SUPERPACKEDPLAYER_SHORT_NAME_PRESENT
#define DPMSGCMD_GETNAMETABLEREPLY
#define DPLAYI_SUPERPACKEDPLAYER_SP_DATA_LENGTH_SIZE(mask)
struct tagDPMSG_CREATESESSION DPMSG_CREATESESSION
#define DPMSG_WAIT_5_SECS
#define DPLAYI_SUPERPACKEDPLAYER_LONG_NAME_PRESENT
#define DPMSGCMD_PINGREPLY
#define DPMSGCMD_ADDPLAYERTOGROUP
#define DPMSGCMD_FORWARDADDPLAYER
#define DPLAYI_SUPERPACKEDPLAYER_PARENT_ID_PRESENT
#define DPMSGCMD_REQUESTNEWPLAYERID
#define DPMSGCMD_ADDFORWARDACK
#define DPMSGCMD_NEWPLAYERIDREPLY
#define DPMSG_WAIT_60_SECS
#define DPMSGCMD_JUSTENVELOPE
#define DPMSGCMD_FORWARDADDPLAYERNACK
#define DPLAYI_SUPERPACKEDPLAYER_SHORTCUT_COUNT_SIZE(mask)
#define DPMSGMAGIC_DPLAYMSG
#define DPLAYI_SUPERPACKEDPLAYER_PLAYER_COUNT_SIZE(mask)
#define DPMSG_DEFAULT_WAIT_TIME
#define DPQ_INSERT(a, b, c)
#define DPQ_REMOVE(head, elm, field)
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
GLuint GLsizei GLsizei * length
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint GLint GLint j
_In_ LPWSTR _In_ DWORD _In_ DWORD _In_ DWORD dwFlags
BOOL WINAPI GetMessageW(_Out_ LPMSG, _In_opt_ HWND, _In_ UINT, _In_ UINT)
DWORD versionOrSystemPlayerId
DWORD versionOrSystemPlayerId
DPMSG_SENDENVELOPE envelope
DPMSG_SENDENVELOPE envelope
DP_MSG_REPLY_STRUCT replyExpected
DWORD WINAPI WaitForSingleObject(IN HANDLE hHandle, IN DWORD dwMilliseconds)
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventW(IN LPSECURITY_ATTRIBUTES lpEventAttributes OPTIONAL, IN BOOL bManualReset, IN BOOL bInitialState, IN LPCWSTR lpName OPTIONAL)
BOOL WINAPI DECLSPEC_HOTPATCH SetEvent(IN HANDLE hEvent)
TW_UINT32 TW_UINT16 TW_UINT16 MSG
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
void WINAPI DebugBreak(void)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
#define DUPLICATE_SAME_ACCESS