1*043036a2SApple OSS Distributions #ifndef IPC_UTILS_H 2*043036a2SApple OSS Distributions #define IPC_UTILS_H 3*043036a2SApple OSS Distributions 4*043036a2SApple OSS Distributions #include <mach/mach.h> 5*043036a2SApple OSS Distributions #include <mach/message.h> 6*043036a2SApple OSS Distributions #include <mach/mach_error.h> 7*043036a2SApple OSS Distributions #include <stdio.h> 8*043036a2SApple OSS Distributions #include <stdlib.h> 9*043036a2SApple OSS Distributions #include <stdbool.h> 10*043036a2SApple OSS Distributions #include <sys/code_signing.h> 11*043036a2SApple OSS Distributions 12*043036a2SApple OSS Distributions /* 13*043036a2SApple OSS Distributions * Common IPC utilities for XNU tests 14*043036a2SApple OSS Distributions * 15*043036a2SApple OSS Distributions * This header provides standardized message structures and utilities 16*043036a2SApple OSS Distributions * for common IPC patterns used across multiple test files. 17*043036a2SApple OSS Distributions */ 18*043036a2SApple OSS Distributions 19*043036a2SApple OSS Distributions #ifdef __cplusplus 20*043036a2SApple OSS Distributions extern "C" { 21*043036a2SApple OSS Distributions #endif 22*043036a2SApple OSS Distributions 23*043036a2SApple OSS Distributions /* Message structure for sending a single port */ 24*043036a2SApple OSS Distributions typedef struct { 25*043036a2SApple OSS Distributions mach_msg_header_t header; 26*043036a2SApple OSS Distributions mach_msg_body_t body; 27*043036a2SApple OSS Distributions mach_msg_port_descriptor_t port; 28*043036a2SApple OSS Distributions } ipc_single_port_msg_t; 29*043036a2SApple OSS Distributions 30*043036a2SApple OSS Distributions /* Message structure for sending multiple ports in an array */ 31*043036a2SApple OSS Distributions typedef struct { 32*043036a2SApple OSS Distributions mach_msg_header_t header; 33*043036a2SApple OSS Distributions mach_msg_body_t body; 34*043036a2SApple OSS Distributions mach_msg_ool_ports_descriptor_t ports_descriptor; 35*043036a2SApple OSS Distributions } ipc_port_array_msg_t; 36*043036a2SApple OSS Distributions 37*043036a2SApple OSS Distributions /* Generic message structure with trailer for receiving */ 38*043036a2SApple OSS Distributions typedef struct { 39*043036a2SApple OSS Distributions mach_msg_header_t header; 40*043036a2SApple OSS Distributions mach_msg_body_t body; 41*043036a2SApple OSS Distributions union { 42*043036a2SApple OSS Distributions /* Single port descriptor */ 43*043036a2SApple OSS Distributions struct { 44*043036a2SApple OSS Distributions mach_msg_port_descriptor_t port; 45*043036a2SApple OSS Distributions } single; 46*043036a2SApple OSS Distributions 47*043036a2SApple OSS Distributions /* Port array descriptor */ 48*043036a2SApple OSS Distributions struct { 49*043036a2SApple OSS Distributions mach_msg_ool_ports_descriptor_t ports_descriptor; 50*043036a2SApple OSS Distributions } array; 51*043036a2SApple OSS Distributions } data; 52*043036a2SApple OSS Distributions mach_msg_max_trailer_t trailer; 53*043036a2SApple OSS Distributions } ipc_receive_msg_t; 54*043036a2SApple OSS Distributions 55*043036a2SApple OSS Distributions /* 56*043036a2SApple OSS Distributions * Port Management Functions 57*043036a2SApple OSS Distributions */ 58*043036a2SApple OSS Distributions 59*043036a2SApple OSS Distributions /* Create a new receive port with send right */ 60*043036a2SApple OSS Distributions mach_port_t ipc_create_receive_port(void); 61*043036a2SApple OSS Distributions 62*043036a2SApple OSS Distributions /* Create a receive port with specific options */ 63*043036a2SApple OSS Distributions mach_port_t ipc_create_receive_port_with_options(uint32_t mpo_flags); 64*043036a2SApple OSS Distributions 65*043036a2SApple OSS Distributions /* Safely deallocate a port */ 66*043036a2SApple OSS Distributions void ipc_deallocate_port(mach_port_t port); 67*043036a2SApple OSS Distributions 68*043036a2SApple OSS Distributions /* Insert a send right to a receive right */ 69*043036a2SApple OSS Distributions kern_return_t ipc_insert_send_right(mach_port_t receive_port); 70*043036a2SApple OSS Distributions 71*043036a2SApple OSS Distributions /* 72*043036a2SApple OSS Distributions * Single Port Messaging Functions 73*043036a2SApple OSS Distributions */ 74*043036a2SApple OSS Distributions 75*043036a2SApple OSS Distributions /* Send a single port to destination */ 76*043036a2SApple OSS Distributions kern_return_t ipc_send_port(mach_port_t destination, mach_port_t port, 77*043036a2SApple OSS Distributions mach_msg_type_name_t disposition); 78*043036a2SApple OSS Distributions 79*043036a2SApple OSS Distributions /* Receive a single port from destination */ 80*043036a2SApple OSS Distributions kern_return_t ipc_receive_port(mach_port_t destination, mach_port_t *port); 81*043036a2SApple OSS Distributions 82*043036a2SApple OSS Distributions /* 83*043036a2SApple OSS Distributions * Port Array Messaging Functions 84*043036a2SApple OSS Distributions */ 85*043036a2SApple OSS Distributions 86*043036a2SApple OSS Distributions /* Send an array of ports to destination */ 87*043036a2SApple OSS Distributions kern_return_t ipc_send_port_array(mach_port_t destination, 88*043036a2SApple OSS Distributions mach_port_t *ports, mach_msg_type_number_t count, 89*043036a2SApple OSS Distributions mach_msg_type_name_t disposition); 90*043036a2SApple OSS Distributions 91*043036a2SApple OSS Distributions /* Receive an array of ports from destination */ 92*043036a2SApple OSS Distributions kern_return_t ipc_receive_port_array(mach_port_t destination, 93*043036a2SApple OSS Distributions mach_port_t **ports, mach_msg_type_number_t *count); 94*043036a2SApple OSS Distributions 95*043036a2SApple OSS Distributions /* 96*043036a2SApple OSS Distributions * Generic Messaging Functions 97*043036a2SApple OSS Distributions */ 98*043036a2SApple OSS Distributions 99*043036a2SApple OSS Distributions /* Send a pre-constructed message */ 100*043036a2SApple OSS Distributions kern_return_t ipc_send_message(mach_msg_header_t *msg); 101*043036a2SApple OSS Distributions 102*043036a2SApple OSS Distributions /* Receive a message into a pre-allocated buffer */ 103*043036a2SApple OSS Distributions kern_return_t ipc_receive_message(mach_port_t destination, ipc_receive_msg_t *msg, 104*043036a2SApple OSS Distributions mach_msg_size_t max_size); 105*043036a2SApple OSS Distributions 106*043036a2SApple OSS Distributions /* 107*043036a2SApple OSS Distributions * Security and Code Signing Utilities 108*043036a2SApple OSS Distributions */ 109*043036a2SApple OSS Distributions 110*043036a2SApple OSS Distributions /* Check if IPC hardening is disabled (CS_CONFIG_GET_OUT_OF_MY_WAY) */ 111*043036a2SApple OSS Distributions bool ipc_hardening_disabled(void); 112*043036a2SApple OSS Distributions 113*043036a2SApple OSS Distributions #ifdef __cplusplus 114*043036a2SApple OSS Distributions } 115*043036a2SApple OSS Distributions #endif 116*043036a2SApple OSS Distributions 117*043036a2SApple OSS Distributions #endif /* IPC_UTILS_H */ 118