| 1225 | } |
| 1226 | |
| 1227 | void convert_callback_utow( int id, void *u_callback, int u_callback_len, void *w_callback, int w_callback_len, bool wow64 ) |
| 1228 | { |
| 1229 | const struct callback_def *c, *end, *best; |
| 1230 | |
| 1231 | if (!(c = find_first_callback_def_by_id( id, wow64 ))) |
| 1232 | { |
| 1233 | memcpy( w_callback, u_callback, u_callback_len ); |
| 1234 | return; |
| 1235 | } |
| 1236 | |
| 1237 | if (wow64) end = wow64_callback_data + wow64_callback_data_size; |
| 1238 | else end = callback_data + callback_data_size; |
| 1239 | |
| 1240 | best = NULL; |
| 1241 | while (c != end && c->id == id) |
| 1242 | { |
| 1243 | if (c->w_callback_len == w_callback_len && c->u_callback_len == u_callback_len) |
| 1244 | { |
| 1245 | best = c; |
| 1246 | break; |
| 1247 | } |
| 1248 | if ((!best || best->w_callback_len > w_callback_len) |
| 1249 | && c->u_callback_len == u_callback_len && c->w_callback_len <= w_callback_len) |
| 1250 | best = c; |
| 1251 | if (!best && c->u_callback_len == u_callback_len) |
| 1252 | best = c; |
| 1253 | ++c; |
| 1254 | } |
| 1255 | if (!best) |
| 1256 | { |
| 1257 | ERR( "Could not find id %d, u_callback_len %d, w_callback_len %d.\n", id, u_callback_len, w_callback_len ); |
| 1258 | best = find_first_callback_def_by_id( id, wow64 ); |
| 1259 | } |
| 1260 | |
| 1261 | if (best->w_callback_len != w_callback_len || best->u_callback_len != u_callback_len) |
| 1262 | WARN( "Found len %d, %d for id %d, len %d, %d.\n", best->w_callback_len, best->u_callback_len, |
| 1263 | id, w_callback_len, u_callback_len ); |
| 1264 | |
| 1265 | if (best->conv_w_from_u) best->conv_w_from_u( w_callback, u_callback ); |
| 1266 | else memcpy( w_callback, u_callback, u_callback_len ); |
| 1267 | } |
| 1268 | |
| 1269 | #if defined(__x86_64__) || defined(__aarch64__) |
| 1270 | #define STEAMCLIENT_UNIX_WOW64_FUNC( name ) \ |
no test coverage detected