vrclient: Respect provided struct sizes when returning structures.

CW-Bug-Id: #22729
CW-Bug-Id: #23147
This commit is contained in:
Rémi Bernon 2023-12-15 10:20:25 +01:00 committed by Arkadiusz Hiler
parent 37dc6df5eb
commit 77c5345632
6 changed files with 503 additions and 95 deletions

View file

@ -69,18 +69,22 @@ uint32_t __thiscall winIVRInput_IVRInput_004_GetDigitalActionData( struct w_stea
w_InputDigitalActionData_t *pActionData,
uint32_t unActionDataSize, uint32_t ulRestrictToDevice )
{
w_InputDigitalActionData_t w_pActionData;
struct IVRInput_IVRInput_004_GetDigitalActionData_params params =
{
.linux_side = _this->u_iface,
.action = action,
.pActionData = pActionData,
.pActionData = pActionData ? &w_pActionData : NULL,
.unActionDataSize = unActionDataSize,
.ulRestrictToDevice = ulRestrictToDevice,
};
TRACE( "%p\n", _this );
unActionDataSize = min( unActionDataSize, sizeof(w_pActionData) );
if (pActionData) memcpy( &w_pActionData, pActionData, unActionDataSize );
VRCLIENT_CALL( IVRInput_IVRInput_004_GetDigitalActionData, &params );
if (pActionData) memcpy( pActionData, &w_pActionData, unActionDataSize );
#ifdef __x86_64__
return params._ret;
#else
@ -93,18 +97,22 @@ uint32_t __thiscall winIVRInput_IVRInput_005_GetDigitalActionData( struct w_stea
w_InputDigitalActionData_t *pActionData,
uint32_t unActionDataSize, uint32_t ulRestrictToDevice )
{
w_InputDigitalActionData_t w_pActionData;
struct IVRInput_IVRInput_005_GetDigitalActionData_params params =
{
.linux_side = _this->u_iface,
.action = action,
.pActionData = pActionData,
.pActionData = pActionData ? &w_pActionData : NULL,
.unActionDataSize = unActionDataSize,
.ulRestrictToDevice = ulRestrictToDevice,
};
TRACE( "%p\n", _this );
unActionDataSize = min( unActionDataSize, sizeof(w_pActionData) );
if (pActionData) memcpy( &w_pActionData, pActionData, unActionDataSize );
VRCLIENT_CALL( IVRInput_IVRInput_005_GetDigitalActionData, &params );
if (pActionData) memcpy( pActionData, &w_pActionData, unActionDataSize );
#ifdef __x86_64__
return params._ret;
#else
@ -117,18 +125,22 @@ uint32_t __thiscall winIVRInput_IVRInput_006_GetDigitalActionData( struct w_stea
w_InputDigitalActionData_t *pActionData,
uint32_t unActionDataSize, uint32_t ulRestrictToDevice )
{
w_InputDigitalActionData_t w_pActionData;
struct IVRInput_IVRInput_006_GetDigitalActionData_params params =
{
.linux_side = _this->u_iface,
.action = action,
.pActionData = pActionData,
.pActionData = pActionData ? &w_pActionData : NULL,
.unActionDataSize = unActionDataSize,
.ulRestrictToDevice = ulRestrictToDevice,
};
TRACE( "%p\n", _this );
unActionDataSize = min( unActionDataSize, sizeof(w_pActionData) );
if (pActionData) memcpy( &w_pActionData, pActionData, unActionDataSize );
VRCLIENT_CALL( IVRInput_IVRInput_006_GetDigitalActionData, &params );
if (pActionData) memcpy( pActionData, &w_pActionData, unActionDataSize );
#ifdef __x86_64__
return params._ret;
#else
@ -141,18 +153,22 @@ uint32_t __thiscall winIVRInput_IVRInput_007_GetDigitalActionData( struct w_stea
w_InputDigitalActionData_t *pActionData,
uint32_t unActionDataSize, uint32_t ulRestrictToDevice )
{
w_InputDigitalActionData_t w_pActionData;
struct IVRInput_IVRInput_007_GetDigitalActionData_params params =
{
.linux_side = _this->u_iface,
.action = action,
.pActionData = pActionData,
.pActionData = pActionData ? &w_pActionData : NULL,
.unActionDataSize = unActionDataSize,
.ulRestrictToDevice = ulRestrictToDevice,
};
TRACE( "%p\n", _this );
unActionDataSize = min( unActionDataSize, sizeof(w_pActionData) );
if (pActionData) memcpy( &w_pActionData, pActionData, unActionDataSize );
VRCLIENT_CALL( IVRInput_IVRInput_007_GetDigitalActionData, &params );
if (pActionData) memcpy( pActionData, &w_pActionData, unActionDataSize );
#ifdef __x86_64__
return params._ret;
#else
@ -165,18 +181,22 @@ uint32_t __thiscall winIVRInput_IVRInput_010_GetDigitalActionData( struct w_stea
w_InputDigitalActionData_t *pActionData,
uint32_t unActionDataSize, uint32_t ulRestrictToDevice )
{
w_InputDigitalActionData_t w_pActionData;
struct IVRInput_IVRInput_010_GetDigitalActionData_params params =
{
.linux_side = _this->u_iface,
.action = action,
.pActionData = pActionData,
.pActionData = pActionData ? &w_pActionData : NULL,
.unActionDataSize = unActionDataSize,
.ulRestrictToDevice = ulRestrictToDevice,
};
TRACE( "%p\n", _this );
unActionDataSize = min( unActionDataSize, sizeof(w_pActionData) );
if (pActionData) memcpy( &w_pActionData, pActionData, unActionDataSize );
VRCLIENT_CALL( IVRInput_IVRInput_010_GetDigitalActionData, &params );
if (pActionData) memcpy( pActionData, &w_pActionData, unActionDataSize );
#ifdef __x86_64__
return params._ret;
#else