diff --git a/lsteamclient/steamclient_main.c b/lsteamclient/steamclient_main.c index 4302e87b..53d5f969 100644 --- a/lsteamclient/steamclient_main.c +++ b/lsteamclient/steamclient_main.c @@ -486,17 +486,14 @@ int8_t CDECL Steam_FreeLastCallback( int32_t pipe ) int8_t CDECL Steam_BGetCallback( int32_t pipe, w_CallbackMsg_t *win_msg, int32_t *ignored ) { - u_CallbackMsg_t u_msg; struct steamclient_Steam_BGetCallback_params params = { .pipe = pipe, .w_msg = win_msg, .ignored = ignored, - .u_msg = &u_msg, }; struct steamclient_callback_message_receive_params receive_params = { - .u_msg = &u_msg, .w_msg = win_msg, }; @@ -513,6 +510,7 @@ next_event: SetLastError(0); return FALSE; } + receive_params.cookie = params.cookie; if (!(win_msg->m_pubParam = HeapAlloc( GetProcessHeap(), 0, win_msg->m_cubParam ))) return FALSE; last_callback_data = win_msg->m_pubParam; diff --git a/lsteamclient/unixlib.cpp b/lsteamclient/unixlib.cpp index c8e8b58c..cb33e2a1 100644 --- a/lsteamclient/unixlib.cpp +++ b/lsteamclient/unixlib.cpp @@ -313,15 +313,18 @@ static void (*p_Steam_NotifyMissingInterface)( int32_t, const char * ); NTSTATUS steamclient_Steam_BGetCallback( void *args ) { struct steamclient_Steam_BGetCallback_params *params = (struct steamclient_Steam_BGetCallback_params *)args; + u_CallbackMsg_t *u_msg = new u_CallbackMsg_t(); + w_CallbackMsg_t *w_msg = params->w_msg; - if (!p_Steam_BGetCallback( params->pipe, params->u_msg, params->ignored )) + if (!u_msg || !p_Steam_BGetCallback( params->pipe, u_msg, params->ignored )) params->_ret = false; else { - TRACE( "id %d, u_size %d.\n", params->u_msg->m_iCallback, params->u_msg->m_cubParam ); - params->w_msg->m_hSteamUser = params->u_msg->m_hSteamUser; - params->w_msg->m_iCallback = params->u_msg->m_iCallback; - params->w_msg->m_cubParam = callback_len_utow( params->u_msg->m_iCallback, params->u_msg->m_cubParam, false ); + TRACE( "id %d, u_size %d.\n", u_msg->m_iCallback, u_msg->m_cubParam ); + w_msg->m_hSteamUser = u_msg->m_hSteamUser; + w_msg->m_iCallback = u_msg->m_iCallback; + w_msg->m_cubParam = callback_len_utow( u_msg->m_iCallback, u_msg->m_cubParam, false ); + params->cookie = (UINT_PTR)u_msg; params->_ret = true; } @@ -331,14 +334,19 @@ NTSTATUS steamclient_Steam_BGetCallback( void *args ) NTSTATUS steamclient_callback_message_receive( void *args ) { struct steamclient_callback_message_receive_params *params = (struct steamclient_callback_message_receive_params *)args; - convert_callback_utow( params->u_msg->m_iCallback, (void *)params->u_msg->m_pubParam, - params->u_msg->m_cubParam, (void *)params->w_msg->m_pubParam, - params->w_msg->m_cubParam, false ); - if (params->w_msg->m_iCallback == 703 /* SteamAPICallCompleted_t::k_iCallback */) - { - SteamAPICallCompleted_t_137 *c = (SteamAPICallCompleted_t_137 *)params->w_msg->m_pubParam; + u_CallbackMsg_t *u_msg = (u_CallbackMsg_t *)(UINT_PTR)params->cookie; + w_CallbackMsg_t *w_msg = params->w_msg; - if (sizeof(SteamAPICallCompleted_t_137) == params->w_msg->m_cubParam) + if (!u_msg) return 0; + + convert_callback_utow( u_msg->m_iCallback, (void *)u_msg->m_pubParam, + u_msg->m_cubParam, (void *)w_msg->m_pubParam, + w_msg->m_cubParam, false ); + if (w_msg->m_iCallback == 703 /* SteamAPICallCompleted_t::k_iCallback */) + { + SteamAPICallCompleted_t_137 *c = (SteamAPICallCompleted_t_137 *)w_msg->m_pubParam; + + if (sizeof(SteamAPICallCompleted_t_137) == w_msg->m_cubParam) { int len; @@ -348,7 +356,7 @@ NTSTATUS steamclient_callback_message_receive( void *args ) } else { - WARN( "Unexpected SteamAPICallCompleted_t callback size %d, not doing API callback size conversion.", params->w_msg->m_cubParam ); + WARN( "Unexpected SteamAPICallCompleted_t callback size %d, not doing API callback size conversion.", w_msg->m_cubParam ); } } return 0; diff --git a/lsteamclient/unixlib.h b/lsteamclient/unixlib.h index 7804215b..17260d81 100644 --- a/lsteamclient/unixlib.h +++ b/lsteamclient/unixlib.h @@ -142,14 +142,14 @@ struct steamclient_Steam_BGetCallback_params { int8_t _ret; uint32_t pipe; + uint64_t cookie; w_CallbackMsg_t *w_msg; int32_t *ignored; - u_CallbackMsg_t *u_msg; }; struct steamclient_callback_message_receive_params { - u_CallbackMsg_t *u_msg; + uint64_t cookie; w_CallbackMsg_t *w_msg; };