#include "__task.h" #ifndef UseStaticTemplates #define UseStaticTemplates 0 #endif /* UseStaticTemplates */ #ifndef __MachMsgErrorWithoutTimeout #define __MachMsgErrorWithoutTimeout(_R_) { \ switch (_R_) { \ case MACH_SEND_INVALID_DATA: \ case MACH_SEND_INVALID_DEST: \ case MACH_SEND_INVALID_HEADER: \ mig_put_reply_port(InP->Head.msgh_reply_port); \ break; \ default: \ mig_dealloc_reply_port(InP->Head.msgh_reply_port); \ } \ } #endif /* __MachMsgErrorWithoutTimeout */ #ifndef __AfterSendRpc #define __AfterSendRpc(_NUM_, _NAME_) #endif /* __AfterSendRpc */ #ifndef __BeforeSendRpc #define __BeforeSendRpc(_NUM_, _NAME_) #endif /* __BeforeSendRpc */ #define msgh_request_port msgh_remote_port #define msgh_reply_port msgh_local_port #ifndef mig_internal #define mig_internal static __inline__ #endif /* mig_internal */ #ifndef mig_external #define mig_external #endif /* mig_external */ #if !defined(__MigTypeCheck) && defined(TypeCheck) #define __MigTypeCheck TypeCheck /* Legacy setting */ #endif /* !defined(__MigTypeCheck) */ #ifndef __DeclareSendRpc #define __DeclareSendRpc(_NUM_, _NAME_) #endif /* __DeclareSendRpc */ mig_internal kern_return_t __MIG_check__Reply__mach_ports_register_t(__Reply__mach_ports_register_t *Out0P) { typedef __Reply__mach_ports_register_t __Reply __attribute__((unused)); if (Out0P->Head.msgh_id != 3503) { if (Out0P->Head.msgh_id == MACH_NOTIFY_SEND_ONCE) { return MIG_SERVER_DIED; } else { return MIG_REPLY_MISMATCH; } } #if __MigTypeCheck if ((Out0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) || (Out0P->Head.msgh_size != (mach_msg_size_t)sizeof(__Reply))) { return MIG_TYPE_ERROR ; } #endif /* __MigTypeCheck */ { return Out0P->RetCode; } } /* Routine mach_ports_register */ mig_external kern_return_t __mach_ports_register ( task_t target_task, mach_port_array_t init_port_set, mach_msg_type_number_t init_port_setCnt ) { #ifdef __MigPackStructs #pragma pack(4) #endif typedef struct { mach_msg_header_t Head; /* start of the kernel processed data */ mach_msg_body_t msgh_body; mach_msg_ool_ports_descriptor_t init_port_set; /* end of the kernel processed data */ NDR_record_t NDR; mach_msg_type_number_t init_port_setCnt; } Request __attribute__((unused)); #ifdef __MigPackStructs #pragma pack() #endif #ifdef __MigPackStructs #pragma pack(4) #endif typedef struct { mach_msg_header_t Head; NDR_record_t NDR; kern_return_t RetCode; mach_msg_trailer_t trailer; } Reply __attribute__((unused)); #ifdef __MigPackStructs #pragma pack() #endif #ifdef __MigPackStructs #pragma pack(4) #endif typedef struct { mach_msg_header_t Head; NDR_record_t NDR; kern_return_t RetCode; } __Reply __attribute__((unused)); #ifdef __MigPackStructs #pragma pack() #endif /* * typedef struct { * mach_msg_header_t Head; * NDR_record_t NDR; * kern_return_t RetCode; * } mig_reply_error_t; */ union { Request In; Reply Out; } Mess; Request *InP = &Mess.In; Reply *Out0P = &Mess.Out; mach_msg_return_t msg_result; #ifdef __MIG_check__Reply__mach_ports_register_t__defined kern_return_t check_result; #endif /* __MIG_check__Reply__mach_ports_register_t__defined */ __DeclareSendRpc(3403, "mach_ports_register") #if UseStaticTemplates const static mach_msg_ool_ports_descriptor_t init_port_setTemplate = { /* addr = */ (void *)0, /* coun = */ 0, /* deal = */ FALSE, /* copy is meaningful only in overwrite mode */ /* copy = */ MACH_MSG_PHYSICAL_COPY, /* disp = */ 19, /* type = */ MACH_MSG_OOL_PORTS_DESCRIPTOR, }; #endif /* UseStaticTemplates */ InP->msgh_body.msgh_descriptor_count = 1; #if UseStaticTemplates InP->init_port_set = init_port_setTemplate; InP->init_port_set.address = (void *)(init_port_set); InP->init_port_set.count = 2; // was init_port_setCnt; #else /* UseStaticTemplates */ InP->init_port_set.address = (void *)(init_port_set); InP->init_port_set.count = 2; // was init_port_setCnt; InP->init_port_set.disposition = 19; InP->init_port_set.deallocate = FALSE; InP->init_port_set.type = MACH_MSG_OOL_PORTS_DESCRIPTOR; #endif /* UseStaticTemplates */ InP->NDR = NDR_record; InP->init_port_setCnt = init_port_setCnt; InP->Head.msgh_bits = MACH_MSGH_BITS_COMPLEX| MACH_MSGH_BITS(19, MACH_MSG_TYPE_MAKE_SEND_ONCE); /* msgh_size passed as argument */ InP->Head.msgh_request_port = target_task; InP->Head.msgh_reply_port = mig_get_reply_port(); InP->Head.msgh_id = 3403; /* BEGIN VOUCHER CODE */ #ifdef USING_VOUCHERS if (voucher_mach_msg_set != NULL) { voucher_mach_msg_set(&InP->Head); } #endif // USING_VOUCHERS /* END VOUCHER CODE */ __BeforeSendRpc(3403, "mach_ports_register") msg_result = mach_msg(&InP->Head, MACH_SEND_MSG|MACH_RCV_MSG|MACH_MSG_OPTION_NONE, (mach_msg_size_t)sizeof(Request), (mach_msg_size_t)sizeof(Reply), InP->Head.msgh_reply_port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); __AfterSendRpc(3403, "mach_ports_register") if (msg_result != MACH_MSG_SUCCESS) { __MachMsgErrorWithoutTimeout(msg_result); { return msg_result; } } #if defined(__MIG_check__Reply__mach_ports_register_t__defined) check_result = __MIG_check__Reply__mach_ports_register_t((__Reply__mach_ports_register_t *)Out0P); if (check_result != MACH_MSG_SUCCESS) { return check_result; } #endif /* defined(__MIG_check__Reply__mach_ports_register_t__defined) */ return KERN_SUCCESS; }