request.h 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485
  1. /*
  2. * Wine server requests
  3. *
  4. * Copyright (C) 1999 Alexandre Julliard
  5. *
  6. * This library is free software; you can redistribute it and/or
  7. * modify it under the terms of the GNU Lesser General Public
  8. * License as published by the Free Software Foundation; either
  9. * version 2.1 of the License, or (at your option) any later version.
  10. *
  11. * This library is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * Lesser General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU Lesser General Public
  17. * License along with this library; if not, write to the Free Software
  18. * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
  19. */
  20. #ifndef __WINE_SERVER_REQUEST_H
  21. #define __WINE_SERVER_REQUEST_H
  22. #include <assert.h>
  23. #include "thread.h"
  24. #include "wine/server_protocol.h"
  25. /* max request length */
  26. #define MAX_REQUEST_LENGTH 8192
  27. /* request handler definition */
  28. #define DECL_HANDLER(name) \
  29. void req_##name( const struct name##_request *req, struct name##_reply *reply )
  30. /* request functions */
  31. #ifdef __GNUC__
  32. extern void fatal_protocol_error( struct thread *thread,
  33. const char *err, ... ) __attribute__((format (printf,2,3)));
  34. extern void fatal_protocol_perror( struct thread *thread,
  35. const char *err, ... ) __attribute__((format (printf,2,3)));
  36. extern void fatal_error( const char *err, ... ) __attribute__((noreturn,format(printf,1,2)));
  37. extern void fatal_perror( const char *err, ... ) __attribute__((noreturn,format(printf,1,2)));
  38. #else
  39. extern void fatal_protocol_error( struct thread *thread, const char *err, ... );
  40. extern void fatal_protocol_perror( struct thread *thread, const char *err, ... );
  41. extern void fatal_error( const char *err, ... );
  42. extern void fatal_perror( const char *err, ... );
  43. #endif
  44. extern const char *get_config_dir(void);
  45. extern void *set_reply_data_size( size_t size );
  46. extern int receive_fd( struct process *process );
  47. extern int send_client_fd( struct process *process, int fd, obj_handle_t handle );
  48. extern void read_request( struct thread *thread );
  49. extern void write_reply( struct thread *thread );
  50. extern unsigned int get_tick_count(void);
  51. extern void open_master_socket(void);
  52. extern void close_master_socket(void);
  53. extern void lock_master_socket( int locked );
  54. extern int wait_for_lock(void);
  55. extern int kill_lock_owner( int sig );
  56. extern void trace_request(void);
  57. extern void trace_reply( enum request req, const union generic_reply *reply );
  58. /* get the request vararg data */
  59. inline static const void *get_req_data(void)
  60. {
  61. return current->req_data;
  62. }
  63. /* get the request vararg size */
  64. inline static size_t get_req_data_size(void)
  65. {
  66. return current->req.request_header.request_size;
  67. }
  68. /* get the reply maximum vararg size */
  69. inline static size_t get_reply_max_size(void)
  70. {
  71. return current->req.request_header.reply_size;
  72. }
  73. /* allocate and fill the reply data */
  74. inline static void *set_reply_data( const void *data, size_t size )
  75. {
  76. void *ret = set_reply_data_size( size );
  77. if (ret) memcpy( ret, data, size );
  78. return ret;
  79. }
  80. /* set the reply data pointer directly (will be freed by request code) */
  81. inline static void set_reply_data_ptr( void *data, size_t size )
  82. {
  83. assert( size <= get_reply_max_size() );
  84. current->reply_size = size;
  85. current->reply_data = data;
  86. }
  87. /* Everything below this line is generated automatically by tools/make_requests */
  88. /* ### make_requests begin ### */
  89. DECL_HANDLER(new_process);
  90. DECL_HANDLER(get_new_process_info);
  91. DECL_HANDLER(new_thread);
  92. DECL_HANDLER(boot_done);
  93. DECL_HANDLER(init_process);
  94. DECL_HANDLER(get_startup_info);
  95. DECL_HANDLER(init_process_done);
  96. DECL_HANDLER(init_thread);
  97. DECL_HANDLER(terminate_process);
  98. DECL_HANDLER(terminate_thread);
  99. DECL_HANDLER(get_process_info);
  100. DECL_HANDLER(set_process_info);
  101. DECL_HANDLER(get_thread_info);
  102. DECL_HANDLER(set_thread_info);
  103. DECL_HANDLER(get_dll_info);
  104. DECL_HANDLER(suspend_thread);
  105. DECL_HANDLER(resume_thread);
  106. DECL_HANDLER(load_dll);
  107. DECL_HANDLER(unload_dll);
  108. DECL_HANDLER(queue_apc);
  109. DECL_HANDLER(get_apc);
  110. DECL_HANDLER(close_handle);
  111. DECL_HANDLER(set_handle_info);
  112. DECL_HANDLER(dup_handle);
  113. DECL_HANDLER(open_process);
  114. DECL_HANDLER(open_thread);
  115. DECL_HANDLER(select);
  116. DECL_HANDLER(create_event);
  117. DECL_HANDLER(event_op);
  118. DECL_HANDLER(open_event);
  119. DECL_HANDLER(create_mutex);
  120. DECL_HANDLER(release_mutex);
  121. DECL_HANDLER(open_mutex);
  122. DECL_HANDLER(create_semaphore);
  123. DECL_HANDLER(release_semaphore);
  124. DECL_HANDLER(open_semaphore);
  125. DECL_HANDLER(create_file);
  126. DECL_HANDLER(alloc_file_handle);
  127. DECL_HANDLER(get_handle_fd);
  128. DECL_HANDLER(flush_file);
  129. DECL_HANDLER(lock_file);
  130. DECL_HANDLER(unlock_file);
  131. DECL_HANDLER(create_socket);
  132. DECL_HANDLER(accept_socket);
  133. DECL_HANDLER(set_socket_event);
  134. DECL_HANDLER(get_socket_event);
  135. DECL_HANDLER(enable_socket_event);
  136. DECL_HANDLER(set_socket_deferred);
  137. DECL_HANDLER(alloc_console);
  138. DECL_HANDLER(free_console);
  139. DECL_HANDLER(get_console_renderer_events);
  140. DECL_HANDLER(open_console);
  141. DECL_HANDLER(get_console_wait_event);
  142. DECL_HANDLER(get_console_mode);
  143. DECL_HANDLER(set_console_mode);
  144. DECL_HANDLER(set_console_input_info);
  145. DECL_HANDLER(get_console_input_info);
  146. DECL_HANDLER(append_console_input_history);
  147. DECL_HANDLER(get_console_input_history);
  148. DECL_HANDLER(create_console_output);
  149. DECL_HANDLER(set_console_output_info);
  150. DECL_HANDLER(get_console_output_info);
  151. DECL_HANDLER(write_console_input);
  152. DECL_HANDLER(read_console_input);
  153. DECL_HANDLER(write_console_output);
  154. DECL_HANDLER(fill_console_output);
  155. DECL_HANDLER(read_console_output);
  156. DECL_HANDLER(move_console_output);
  157. DECL_HANDLER(send_console_signal);
  158. DECL_HANDLER(create_change_notification);
  159. DECL_HANDLER(next_change_notification);
  160. DECL_HANDLER(create_mapping);
  161. DECL_HANDLER(open_mapping);
  162. DECL_HANDLER(get_mapping_info);
  163. DECL_HANDLER(create_snapshot);
  164. DECL_HANDLER(next_process);
  165. DECL_HANDLER(next_thread);
  166. DECL_HANDLER(next_module);
  167. DECL_HANDLER(wait_debug_event);
  168. DECL_HANDLER(queue_exception_event);
  169. DECL_HANDLER(get_exception_status);
  170. DECL_HANDLER(output_debug_string);
  171. DECL_HANDLER(continue_debug_event);
  172. DECL_HANDLER(debug_process);
  173. DECL_HANDLER(debug_break);
  174. DECL_HANDLER(set_debugger_kill_on_exit);
  175. DECL_HANDLER(read_process_memory);
  176. DECL_HANDLER(write_process_memory);
  177. DECL_HANDLER(create_key);
  178. DECL_HANDLER(open_key);
  179. DECL_HANDLER(delete_key);
  180. DECL_HANDLER(flush_key);
  181. DECL_HANDLER(enum_key);
  182. DECL_HANDLER(set_key_value);
  183. DECL_HANDLER(get_key_value);
  184. DECL_HANDLER(enum_key_value);
  185. DECL_HANDLER(delete_key_value);
  186. DECL_HANDLER(load_registry);
  187. DECL_HANDLER(unload_registry);
  188. DECL_HANDLER(save_registry);
  189. DECL_HANDLER(load_user_registries);
  190. DECL_HANDLER(set_registry_notification);
  191. DECL_HANDLER(create_timer);
  192. DECL_HANDLER(open_timer);
  193. DECL_HANDLER(set_timer);
  194. DECL_HANDLER(cancel_timer);
  195. DECL_HANDLER(get_timer_info);
  196. DECL_HANDLER(get_thread_context);
  197. DECL_HANDLER(set_thread_context);
  198. DECL_HANDLER(get_selector_entry);
  199. DECL_HANDLER(add_atom);
  200. DECL_HANDLER(delete_atom);
  201. DECL_HANDLER(find_atom);
  202. DECL_HANDLER(get_atom_name);
  203. DECL_HANDLER(init_atom_table);
  204. DECL_HANDLER(get_msg_queue);
  205. DECL_HANDLER(set_queue_mask);
  206. DECL_HANDLER(get_queue_status);
  207. DECL_HANDLER(wait_input_idle);
  208. DECL_HANDLER(send_message);
  209. DECL_HANDLER(get_message);
  210. DECL_HANDLER(reply_message);
  211. DECL_HANDLER(get_message_reply);
  212. DECL_HANDLER(set_win_timer);
  213. DECL_HANDLER(kill_win_timer);
  214. DECL_HANDLER(get_serial_info);
  215. DECL_HANDLER(set_serial_info);
  216. DECL_HANDLER(register_async);
  217. DECL_HANDLER(cancel_async);
  218. DECL_HANDLER(create_named_pipe);
  219. DECL_HANDLER(open_named_pipe);
  220. DECL_HANDLER(connect_named_pipe);
  221. DECL_HANDLER(wait_named_pipe);
  222. DECL_HANDLER(disconnect_named_pipe);
  223. DECL_HANDLER(get_named_pipe_info);
  224. DECL_HANDLER(create_window);
  225. DECL_HANDLER(link_window);
  226. DECL_HANDLER(destroy_window);
  227. DECL_HANDLER(set_window_owner);
  228. DECL_HANDLER(get_window_info);
  229. DECL_HANDLER(set_window_info);
  230. DECL_HANDLER(get_window_parents);
  231. DECL_HANDLER(get_window_children);
  232. DECL_HANDLER(get_window_children_from_point);
  233. DECL_HANDLER(get_window_tree);
  234. DECL_HANDLER(set_window_pos);
  235. DECL_HANDLER(get_window_rectangles);
  236. DECL_HANDLER(get_window_text);
  237. DECL_HANDLER(set_window_text);
  238. DECL_HANDLER(get_windows_offset);
  239. DECL_HANDLER(get_visible_region);
  240. DECL_HANDLER(get_window_region);
  241. DECL_HANDLER(set_window_region);
  242. DECL_HANDLER(get_update_region);
  243. DECL_HANDLER(redraw_window);
  244. DECL_HANDLER(set_window_property);
  245. DECL_HANDLER(remove_window_property);
  246. DECL_HANDLER(get_window_property);
  247. DECL_HANDLER(get_window_properties);
  248. DECL_HANDLER(attach_thread_input);
  249. DECL_HANDLER(get_thread_input);
  250. DECL_HANDLER(get_key_state);
  251. DECL_HANDLER(set_key_state);
  252. DECL_HANDLER(set_foreground_window);
  253. DECL_HANDLER(set_focus_window);
  254. DECL_HANDLER(set_active_window);
  255. DECL_HANDLER(set_capture_window);
  256. DECL_HANDLER(set_caret_window);
  257. DECL_HANDLER(set_caret_info);
  258. DECL_HANDLER(set_hook);
  259. DECL_HANDLER(remove_hook);
  260. DECL_HANDLER(start_hook_chain);
  261. DECL_HANDLER(finish_hook_chain);
  262. DECL_HANDLER(get_next_hook);
  263. DECL_HANDLER(create_class);
  264. DECL_HANDLER(destroy_class);
  265. DECL_HANDLER(set_class_info);
  266. DECL_HANDLER(set_clipboard_info);
  267. DECL_HANDLER(open_token);
  268. DECL_HANDLER(set_global_windows);
  269. DECL_HANDLER(adjust_token_privileges);
  270. DECL_HANDLER(get_token_privileges);
  271. DECL_HANDLER(duplicate_token);
  272. #ifdef WANT_REQUEST_HANDLERS
  273. typedef void (*req_handler)( const void *req, void *reply );
  274. static const req_handler req_handlers[REQ_NB_REQUESTS] =
  275. {
  276. (req_handler)req_new_process,
  277. (req_handler)req_get_new_process_info,
  278. (req_handler)req_new_thread,
  279. (req_handler)req_boot_done,
  280. (req_handler)req_init_process,
  281. (req_handler)req_get_startup_info,
  282. (req_handler)req_init_process_done,
  283. (req_handler)req_init_thread,
  284. (req_handler)req_terminate_process,
  285. (req_handler)req_terminate_thread,
  286. (req_handler)req_get_process_info,
  287. (req_handler)req_set_process_info,
  288. (req_handler)req_get_thread_info,
  289. (req_handler)req_set_thread_info,
  290. (req_handler)req_get_dll_info,
  291. (req_handler)req_suspend_thread,
  292. (req_handler)req_resume_thread,
  293. (req_handler)req_load_dll,
  294. (req_handler)req_unload_dll,
  295. (req_handler)req_queue_apc,
  296. (req_handler)req_get_apc,
  297. (req_handler)req_close_handle,
  298. (req_handler)req_set_handle_info,
  299. (req_handler)req_dup_handle,
  300. (req_handler)req_open_process,
  301. (req_handler)req_open_thread,
  302. (req_handler)req_select,
  303. (req_handler)req_create_event,
  304. (req_handler)req_event_op,
  305. (req_handler)req_open_event,
  306. (req_handler)req_create_mutex,
  307. (req_handler)req_release_mutex,
  308. (req_handler)req_open_mutex,
  309. (req_handler)req_create_semaphore,
  310. (req_handler)req_release_semaphore,
  311. (req_handler)req_open_semaphore,
  312. (req_handler)req_create_file,
  313. (req_handler)req_alloc_file_handle,
  314. (req_handler)req_get_handle_fd,
  315. (req_handler)req_flush_file,
  316. (req_handler)req_lock_file,
  317. (req_handler)req_unlock_file,
  318. (req_handler)req_create_socket,
  319. (req_handler)req_accept_socket,
  320. (req_handler)req_set_socket_event,
  321. (req_handler)req_get_socket_event,
  322. (req_handler)req_enable_socket_event,
  323. (req_handler)req_set_socket_deferred,
  324. (req_handler)req_alloc_console,
  325. (req_handler)req_free_console,
  326. (req_handler)req_get_console_renderer_events,
  327. (req_handler)req_open_console,
  328. (req_handler)req_get_console_wait_event,
  329. (req_handler)req_get_console_mode,
  330. (req_handler)req_set_console_mode,
  331. (req_handler)req_set_console_input_info,
  332. (req_handler)req_get_console_input_info,
  333. (req_handler)req_append_console_input_history,
  334. (req_handler)req_get_console_input_history,
  335. (req_handler)req_create_console_output,
  336. (req_handler)req_set_console_output_info,
  337. (req_handler)req_get_console_output_info,
  338. (req_handler)req_write_console_input,
  339. (req_handler)req_read_console_input,
  340. (req_handler)req_write_console_output,
  341. (req_handler)req_fill_console_output,
  342. (req_handler)req_read_console_output,
  343. (req_handler)req_move_console_output,
  344. (req_handler)req_send_console_signal,
  345. (req_handler)req_create_change_notification,
  346. (req_handler)req_next_change_notification,
  347. (req_handler)req_create_mapping,
  348. (req_handler)req_open_mapping,
  349. (req_handler)req_get_mapping_info,
  350. (req_handler)req_create_snapshot,
  351. (req_handler)req_next_process,
  352. (req_handler)req_next_thread,
  353. (req_handler)req_next_module,
  354. (req_handler)req_wait_debug_event,
  355. (req_handler)req_queue_exception_event,
  356. (req_handler)req_get_exception_status,
  357. (req_handler)req_output_debug_string,
  358. (req_handler)req_continue_debug_event,
  359. (req_handler)req_debug_process,
  360. (req_handler)req_debug_break,
  361. (req_handler)req_set_debugger_kill_on_exit,
  362. (req_handler)req_read_process_memory,
  363. (req_handler)req_write_process_memory,
  364. (req_handler)req_create_key,
  365. (req_handler)req_open_key,
  366. (req_handler)req_delete_key,
  367. (req_handler)req_flush_key,
  368. (req_handler)req_enum_key,
  369. (req_handler)req_set_key_value,
  370. (req_handler)req_get_key_value,
  371. (req_handler)req_enum_key_value,
  372. (req_handler)req_delete_key_value,
  373. (req_handler)req_load_registry,
  374. (req_handler)req_unload_registry,
  375. (req_handler)req_save_registry,
  376. (req_handler)req_load_user_registries,
  377. (req_handler)req_set_registry_notification,
  378. (req_handler)req_create_timer,
  379. (req_handler)req_open_timer,
  380. (req_handler)req_set_timer,
  381. (req_handler)req_cancel_timer,
  382. (req_handler)req_get_timer_info,
  383. (req_handler)req_get_thread_context,
  384. (req_handler)req_set_thread_context,
  385. (req_handler)req_get_selector_entry,
  386. (req_handler)req_add_atom,
  387. (req_handler)req_delete_atom,
  388. (req_handler)req_find_atom,
  389. (req_handler)req_get_atom_name,
  390. (req_handler)req_init_atom_table,
  391. (req_handler)req_get_msg_queue,
  392. (req_handler)req_set_queue_mask,
  393. (req_handler)req_get_queue_status,
  394. (req_handler)req_wait_input_idle,
  395. (req_handler)req_send_message,
  396. (req_handler)req_get_message,
  397. (req_handler)req_reply_message,
  398. (req_handler)req_get_message_reply,
  399. (req_handler)req_set_win_timer,
  400. (req_handler)req_kill_win_timer,
  401. (req_handler)req_get_serial_info,
  402. (req_handler)req_set_serial_info,
  403. (req_handler)req_register_async,
  404. (req_handler)req_cancel_async,
  405. (req_handler)req_create_named_pipe,
  406. (req_handler)req_open_named_pipe,
  407. (req_handler)req_connect_named_pipe,
  408. (req_handler)req_wait_named_pipe,
  409. (req_handler)req_disconnect_named_pipe,
  410. (req_handler)req_get_named_pipe_info,
  411. (req_handler)req_create_window,
  412. (req_handler)req_link_window,
  413. (req_handler)req_destroy_window,
  414. (req_handler)req_set_window_owner,
  415. (req_handler)req_get_window_info,
  416. (req_handler)req_set_window_info,
  417. (req_handler)req_get_window_parents,
  418. (req_handler)req_get_window_children,
  419. (req_handler)req_get_window_children_from_point,
  420. (req_handler)req_get_window_tree,
  421. (req_handler)req_set_window_pos,
  422. (req_handler)req_get_window_rectangles,
  423. (req_handler)req_get_window_text,
  424. (req_handler)req_set_window_text,
  425. (req_handler)req_get_windows_offset,
  426. (req_handler)req_get_visible_region,
  427. (req_handler)req_get_window_region,
  428. (req_handler)req_set_window_region,
  429. (req_handler)req_get_update_region,
  430. (req_handler)req_redraw_window,
  431. (req_handler)req_set_window_property,
  432. (req_handler)req_remove_window_property,
  433. (req_handler)req_get_window_property,
  434. (req_handler)req_get_window_properties,
  435. (req_handler)req_attach_thread_input,
  436. (req_handler)req_get_thread_input,
  437. (req_handler)req_get_key_state,
  438. (req_handler)req_set_key_state,
  439. (req_handler)req_set_foreground_window,
  440. (req_handler)req_set_focus_window,
  441. (req_handler)req_set_active_window,
  442. (req_handler)req_set_capture_window,
  443. (req_handler)req_set_caret_window,
  444. (req_handler)req_set_caret_info,
  445. (req_handler)req_set_hook,
  446. (req_handler)req_remove_hook,
  447. (req_handler)req_start_hook_chain,
  448. (req_handler)req_finish_hook_chain,
  449. (req_handler)req_get_next_hook,
  450. (req_handler)req_create_class,
  451. (req_handler)req_destroy_class,
  452. (req_handler)req_set_class_info,
  453. (req_handler)req_set_clipboard_info,
  454. (req_handler)req_open_token,
  455. (req_handler)req_set_global_windows,
  456. (req_handler)req_adjust_token_privileges,
  457. (req_handler)req_get_token_privileges,
  458. (req_handler)req_duplicate_token,
  459. };
  460. #endif /* WANT_REQUEST_HANDLERS */
  461. /* ### make_requests end ### */
  462. /* Everything above this line is generated automatically by tools/make_requests */
  463. #endif /* __WINE_SERVER_REQUEST_H */