lsteamclient: Use a cookie to pass unix side temporary CallbackMsg_t.

This commit is contained in:
Billy Laws 2025-01-13 23:01:20 +00:00 committed by Arkadiusz Hiler
parent 0f5e178c8f
commit 2dd569b5e6
3 changed files with 24 additions and 18 deletions

View File

@ -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;

View File

@ -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;

View File

@ -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;
};