Remove MIG generated exception / message handling
This allows greater flexibility for using a port set and determining whether the wait returned due to a breakpoint or process natural death.
This commit is contained in:
parent
123264b9a2
commit
f8a9a410fb
@ -1,766 +0,0 @@
|
|||||||
/*
|
|
||||||
* IDENTIFICATION:
|
|
||||||
* stub generated Sun Feb 22 20:54:31 2015
|
|
||||||
* with a MiG generated by bootstrap_cmds-91
|
|
||||||
* OPTIONS:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Module exc */
|
|
||||||
|
|
||||||
#define __MIG_check__Request__exc_subsystem__ 1
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
#include <mach/ndr.h>
|
|
||||||
#include <mach/boolean.h>
|
|
||||||
#include <mach/kern_return.h>
|
|
||||||
#include <mach/notify.h>
|
|
||||||
#include <mach/mach_types.h>
|
|
||||||
#include <mach/message.h>
|
|
||||||
#include <mach/mig_errors.h>
|
|
||||||
#include <mach/port.h>
|
|
||||||
|
|
||||||
/* BEGIN VOUCHER CODE */
|
|
||||||
|
|
||||||
#ifndef KERNEL
|
|
||||||
#if defined(__has_include)
|
|
||||||
#if __has_include(<mach/mig_voucher_support.h>)
|
|
||||||
#ifndef USING_VOUCHERS
|
|
||||||
#define USING_VOUCHERS
|
|
||||||
#endif
|
|
||||||
#ifndef __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#define __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern boolean_t voucher_mach_msg_set(mach_msg_header_t *msg) __attribute__((weak_import));
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif // __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#endif // __has_include(<mach/mach_voucher_types.h>)
|
|
||||||
#endif // __has_include
|
|
||||||
#endif // !KERNEL
|
|
||||||
|
|
||||||
/* END VOUCHER CODE */
|
|
||||||
|
|
||||||
|
|
||||||
#include <mach/std_types.h>
|
|
||||||
#include <mach/mig.h>
|
|
||||||
#include <mach/mig.h>
|
|
||||||
#include <mach/mach_types.h>
|
|
||||||
|
|
||||||
#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) */
|
|
||||||
|
|
||||||
#if !defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_)
|
|
||||||
#define __MigKernelSpecificCode _MIG_KERNEL_SPECIFIC_CODE_ /* Legacy setting */
|
|
||||||
#endif /* !defined(__MigKernelSpecificCode) */
|
|
||||||
|
|
||||||
#ifndef LimitCheck
|
|
||||||
#define LimitCheck 0
|
|
||||||
#endif /* LimitCheck */
|
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) ( ((a) < (b))? (a): (b) )
|
|
||||||
#endif /* min */
|
|
||||||
|
|
||||||
#if !defined(_WALIGN_)
|
|
||||||
#define _WALIGN_(x) (((x) + 3) & ~3)
|
|
||||||
#endif /* !defined(_WALIGN_) */
|
|
||||||
|
|
||||||
#if !defined(_WALIGNSZ_)
|
|
||||||
#define _WALIGNSZ_(x) _WALIGN_(sizeof(x))
|
|
||||||
#endif /* !defined(_WALIGNSZ_) */
|
|
||||||
|
|
||||||
#ifndef UseStaticTemplates
|
|
||||||
#define UseStaticTemplates 0
|
|
||||||
#endif /* UseStaticTemplates */
|
|
||||||
|
|
||||||
#ifndef __DeclareRcvRpc
|
|
||||||
#define __DeclareRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __DeclareRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __BeforeRcvRpc
|
|
||||||
#define __BeforeRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __BeforeRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __AfterRcvRpc
|
|
||||||
#define __AfterRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __AfterRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __DeclareRcvSimple
|
|
||||||
#define __DeclareRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __DeclareRcvSimple */
|
|
||||||
|
|
||||||
#ifndef __BeforeRcvSimple
|
|
||||||
#define __BeforeRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __BeforeRcvSimple */
|
|
||||||
|
|
||||||
#ifndef __AfterRcvSimple
|
|
||||||
#define __AfterRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __AfterRcvSimple */
|
|
||||||
|
|
||||||
#define novalue void
|
|
||||||
|
|
||||||
#define msgh_request_port msgh_local_port
|
|
||||||
#define MACH_MSGH_BITS_REQUEST(bits) MACH_MSGH_BITS_LOCAL(bits)
|
|
||||||
#define msgh_reply_port msgh_remote_port
|
|
||||||
#define MACH_MSGH_BITS_REPLY(bits) MACH_MSGH_BITS_REMOTE(bits)
|
|
||||||
|
|
||||||
#define MIG_RETURN_ERROR(X, code) {\
|
|
||||||
((mig_reply_error_t *)X)->RetCode = code;\
|
|
||||||
((mig_reply_error_t *)X)->NDR = NDR_record;\
|
|
||||||
return;\
|
|
||||||
}
|
|
||||||
|
|
||||||
/* typedefs for all requests */
|
|
||||||
|
|
||||||
#ifndef __Request__exc_subsystem__defined
|
|
||||||
#define __Request__exc_subsystem__defined
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
} __Request__exception_raise_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
} __Request__exception_raise_state_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
} __Request__exception_raise_state_identity_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
#endif /* !__Request__exc_subsystem__defined */
|
|
||||||
|
|
||||||
/* typedefs for all replies */
|
|
||||||
|
|
||||||
#ifndef __Reply__exc_subsystem__defined
|
|
||||||
#define __Reply__exc_subsystem__defined
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
kern_return_t RetCode;
|
|
||||||
} __Reply__exception_raise_t;
|
|
||||||
#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;
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t new_stateCnt;
|
|
||||||
natural_t new_state[224];
|
|
||||||
} __Reply__exception_raise_state_t;
|
|
||||||
#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;
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t new_stateCnt;
|
|
||||||
natural_t new_state[224];
|
|
||||||
} __Reply__exception_raise_state_identity_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
#endif /* !__Reply__exc_subsystem__defined */
|
|
||||||
|
|
||||||
|
|
||||||
/* union of all replies */
|
|
||||||
|
|
||||||
#ifndef __ReplyUnion__catch_exc_subsystem__defined
|
|
||||||
#define __ReplyUnion__catch_exc_subsystem__defined
|
|
||||||
union __ReplyUnion__catch_exc_subsystem {
|
|
||||||
__Reply__exception_raise_t Reply_exception_raise;
|
|
||||||
__Reply__exception_raise_state_t Reply_exception_raise_state;
|
|
||||||
__Reply__exception_raise_state_identity_t Reply_exception_raise_state_identity;
|
|
||||||
};
|
|
||||||
#endif /* __RequestUnion__catch_exc_subsystem__defined */
|
|
||||||
/* Forward Declarations */
|
|
||||||
|
|
||||||
|
|
||||||
mig_internal novalue _Xexception_raise
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
mig_internal novalue _Xexception_raise_state
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
mig_internal novalue _Xexception_raise_state_identity
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__exception_raise_t__defined)
|
|
||||||
#define __MIG_check__Request__exception_raise_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__exception_raise_t(__attribute__((__unused__)) __Request__exception_raise_t *In0P)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__exception_raise_t __Request;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(In0P->msgh_body.msgh_descriptor_count != 2) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 8)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->thread.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->task.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__exception_raise_t__codeCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 8)) / 4 < In0P->codeCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 8) + (4 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__exception_raise_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine exception_raise */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_exception_raise
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine exception_raise */
|
|
||||||
mig_internal novalue _Xexception_raise
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__exception_raise_t __Request;
|
|
||||||
typedef __Reply__exception_raise_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__exception_raise_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__exception_raise_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2401, "exception_raise")
|
|
||||||
__BeforeRcvRpc(2401, "exception_raise")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__exception_raise_t__defined)
|
|
||||||
check_result = __MIG_check__Request__exception_raise_t((__Request *)In0P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__exception_raise_t__defined) */
|
|
||||||
|
|
||||||
OutP->RetCode = catch_exception_raise(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt);
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
__AfterRcvRpc(2401, "exception_raise")
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__exception_raise_state_t__defined)
|
|
||||||
#define __MIG_check__Request__exception_raise_state_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__exception_raise_state_t(__attribute__((__unused__)) __Request__exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__exception_raise_state_t **In1PP)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__exception_raise_state_t __Request;
|
|
||||||
__Request *In1P;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
unsigned int msgh_size_delta;
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 904)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__codeCnt__defined */
|
|
||||||
msgh_size_delta = (4 * In0P->codeCnt);
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 904)) / 4 < In0P->codeCnt) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 904) + (4 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
msgh_size -= msgh_size_delta;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 8);
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__exception_raise_state_t__old_stateCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In1P->old_stateCnt > 224 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 904)) / 4 < In1P->old_stateCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 904) + (4 * In1P->old_stateCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__exception_raise_state_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine exception_raise_state */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_exception_raise_state
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
exception_type_t exception,
|
|
||||||
const exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
const thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine exception_raise_state */
|
|
||||||
mig_internal novalue _Xexception_raise_state
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__exception_raise_state_t __Request;
|
|
||||||
typedef __Reply__exception_raise_state_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Request *In1P;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__exception_raise_state_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__exception_raise_state_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2402, "exception_raise_state")
|
|
||||||
__BeforeRcvRpc(2402, "exception_raise_state")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__exception_raise_state_t__defined)
|
|
||||||
check_result = __MIG_check__Request__exception_raise_state_t((__Request *)In0P, (__Request **)&In1P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__exception_raise_state_t__defined) */
|
|
||||||
|
|
||||||
OutP->new_stateCnt = 224;
|
|
||||||
|
|
||||||
OutP->RetCode = catch_exception_raise_state(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);
|
|
||||||
if (OutP->RetCode != KERN_SUCCESS) {
|
|
||||||
MIG_RETURN_ERROR(OutP, OutP->RetCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
OutP->flavor = In1P->flavor;
|
|
||||||
OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt)));
|
|
||||||
|
|
||||||
__AfterRcvRpc(2402, "exception_raise_state")
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__exception_raise_state_identity_t__defined)
|
|
||||||
#define __MIG_check__Request__exception_raise_state_identity_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__exception_raise_state_identity_t(__attribute__((__unused__)) __Request__exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__exception_raise_state_identity_t **In1PP)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__exception_raise_state_identity_t __Request;
|
|
||||||
__Request *In1P;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
unsigned int msgh_size_delta;
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(In0P->msgh_body.msgh_descriptor_count != 2) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 904)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->thread.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->task.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__codeCnt__defined */
|
|
||||||
msgh_size_delta = (4 * In0P->codeCnt);
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 904)) / 4 < In0P->codeCnt) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 904) + (4 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
msgh_size -= msgh_size_delta;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 8);
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__exception_raise_state_identity_t__old_stateCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In1P->old_stateCnt > 224 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 904)) / 4 < In1P->old_stateCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 904) + (4 * In1P->old_stateCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__exception_raise_state_identity_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine exception_raise_state_identity */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_exception_raise_state_identity
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine exception_raise_state_identity */
|
|
||||||
mig_internal novalue _Xexception_raise_state_identity
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
integer_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__exception_raise_state_identity_t __Request;
|
|
||||||
typedef __Reply__exception_raise_state_identity_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Request *In1P;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__exception_raise_state_identity_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__exception_raise_state_identity_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2403, "exception_raise_state_identity")
|
|
||||||
__BeforeRcvRpc(2403, "exception_raise_state_identity")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__exception_raise_state_identity_t__defined)
|
|
||||||
check_result = __MIG_check__Request__exception_raise_state_identity_t((__Request *)In0P, (__Request **)&In1P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__exception_raise_state_identity_t__defined) */
|
|
||||||
|
|
||||||
OutP->new_stateCnt = 224;
|
|
||||||
|
|
||||||
OutP->RetCode = catch_exception_raise_state_identity(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);
|
|
||||||
if (OutP->RetCode != KERN_SUCCESS) {
|
|
||||||
MIG_RETURN_ERROR(OutP, OutP->RetCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
OutP->flavor = In1P->flavor;
|
|
||||||
OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt)));
|
|
||||||
|
|
||||||
__AfterRcvRpc(2403, "exception_raise_state_identity")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
mig_routine_t exc_server_routine(
|
|
||||||
mach_msg_header_t *InHeadP);
|
|
||||||
|
|
||||||
|
|
||||||
/* Description of this subsystem, for use in direct RPC */
|
|
||||||
const struct catch_exc_subsystem {
|
|
||||||
mig_server_routine_t server; /* Server routine */
|
|
||||||
mach_msg_id_t start; /* Min routine number */
|
|
||||||
mach_msg_id_t end; /* Max routine number + 1 */
|
|
||||||
unsigned int maxsize; /* Max msg size */
|
|
||||||
vm_address_t reserved; /* Reserved */
|
|
||||||
struct routine_descriptor /*Array of routine descriptors */
|
|
||||||
routine[3];
|
|
||||||
} catch_exc_subsystem = {
|
|
||||||
exc_server_routine,
|
|
||||||
2401,
|
|
||||||
2404,
|
|
||||||
(mach_msg_size_t)sizeof(union __ReplyUnion__catch_exc_subsystem),
|
|
||||||
(vm_address_t)0,
|
|
||||||
{
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xexception_raise, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_t)},
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xexception_raise_state, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_state_t)},
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xexception_raise_state_identity, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__exception_raise_state_identity_t)},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mig_external boolean_t exc_server
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
register mig_routine_t routine;
|
|
||||||
|
|
||||||
OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0);
|
|
||||||
OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port;
|
|
||||||
/* Minimal size: routine() will update it if different */
|
|
||||||
OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
|
|
||||||
OutHeadP->msgh_local_port = MACH_PORT_NULL;
|
|
||||||
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
|
|
||||||
|
|
||||||
if ((InHeadP->msgh_id > 2403) || (InHeadP->msgh_id < 2401) ||
|
|
||||||
((routine = catch_exc_subsystem.routine[InHeadP->msgh_id - 2401].stub_routine) == 0)) {
|
|
||||||
((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
|
|
||||||
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
(*routine) (InHeadP, OutHeadP);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mig_external mig_routine_t exc_server_routine
|
|
||||||
(mach_msg_header_t *InHeadP)
|
|
||||||
{
|
|
||||||
register int msgh_id;
|
|
||||||
|
|
||||||
msgh_id = InHeadP->msgh_id - 2401;
|
|
||||||
|
|
||||||
if ((msgh_id > 2) || (msgh_id < 0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return catch_exc_subsystem.routine[msgh_id].stub_routine;
|
|
||||||
}
|
|
@ -1,771 +0,0 @@
|
|||||||
/*
|
|
||||||
* IDENTIFICATION:
|
|
||||||
* stub generated Sat Feb 21 18:10:52 2015
|
|
||||||
* with a MiG generated by bootstrap_cmds-91
|
|
||||||
* OPTIONS:
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* Module mach_exc */
|
|
||||||
|
|
||||||
#define __MIG_check__Request__mach_exc_subsystem__ 1
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <mach/ndr.h>
|
|
||||||
#include <mach/boolean.h>
|
|
||||||
#include <mach/kern_return.h>
|
|
||||||
#include <mach/notify.h>
|
|
||||||
#include <mach/mach_types.h>
|
|
||||||
#include <mach/message.h>
|
|
||||||
#include <mach/mig_errors.h>
|
|
||||||
#include <mach/port.h>
|
|
||||||
|
|
||||||
/* BEGIN VOUCHER CODE */
|
|
||||||
|
|
||||||
#ifndef KERNEL
|
|
||||||
#if defined(__has_include)
|
|
||||||
#if __has_include(<mach/mig_voucher_support.h>)
|
|
||||||
#ifndef USING_VOUCHERS
|
|
||||||
#define USING_VOUCHERS
|
|
||||||
#endif
|
|
||||||
#ifndef __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#define __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
extern boolean_t voucher_mach_msg_set(mach_msg_header_t *msg) __attribute__((weak_import));
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#endif // __VOUCHER_FORWARD_TYPE_DECLS__
|
|
||||||
#endif // __has_include(<mach/mach_voucher_types.h>)
|
|
||||||
#endif // __has_include
|
|
||||||
#endif // !KERNEL
|
|
||||||
|
|
||||||
/* END VOUCHER CODE */
|
|
||||||
|
|
||||||
|
|
||||||
#include <mach/std_types.h>
|
|
||||||
#include <mach/mig.h>
|
|
||||||
#include <mach/mig.h>
|
|
||||||
#include <mach/mach_types.h>
|
|
||||||
|
|
||||||
#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) */
|
|
||||||
|
|
||||||
#if !defined(__MigKernelSpecificCode) && defined(_MIG_KERNEL_SPECIFIC_CODE_)
|
|
||||||
#define __MigKernelSpecificCode _MIG_KERNEL_SPECIFIC_CODE_ /* Legacy setting */
|
|
||||||
#endif /* !defined(__MigKernelSpecificCode) */
|
|
||||||
|
|
||||||
#ifndef LimitCheck
|
|
||||||
#define LimitCheck 0
|
|
||||||
#endif /* LimitCheck */
|
|
||||||
|
|
||||||
#ifndef min
|
|
||||||
#define min(a,b) ( ((a) < (b))? (a): (b) )
|
|
||||||
#endif /* min */
|
|
||||||
|
|
||||||
#if !defined(_WALIGN_)
|
|
||||||
#define _WALIGN_(x) (((x) + 3) & ~3)
|
|
||||||
#endif /* !defined(_WALIGN_) */
|
|
||||||
|
|
||||||
#if !defined(_WALIGNSZ_)
|
|
||||||
#define _WALIGNSZ_(x) _WALIGN_(sizeof(x))
|
|
||||||
#endif /* !defined(_WALIGNSZ_) */
|
|
||||||
|
|
||||||
#ifndef UseStaticTemplates
|
|
||||||
#define UseStaticTemplates 0
|
|
||||||
#endif /* UseStaticTemplates */
|
|
||||||
|
|
||||||
#ifndef __DeclareRcvRpc
|
|
||||||
#define __DeclareRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __DeclareRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __BeforeRcvRpc
|
|
||||||
#define __BeforeRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __BeforeRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __AfterRcvRpc
|
|
||||||
#define __AfterRcvRpc(_NUM_, _NAME_)
|
|
||||||
#endif /* __AfterRcvRpc */
|
|
||||||
|
|
||||||
#ifndef __DeclareRcvSimple
|
|
||||||
#define __DeclareRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __DeclareRcvSimple */
|
|
||||||
|
|
||||||
#ifndef __BeforeRcvSimple
|
|
||||||
#define __BeforeRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __BeforeRcvSimple */
|
|
||||||
|
|
||||||
#ifndef __AfterRcvSimple
|
|
||||||
#define __AfterRcvSimple(_NUM_, _NAME_)
|
|
||||||
#endif /* __AfterRcvSimple */
|
|
||||||
|
|
||||||
#define novalue void
|
|
||||||
|
|
||||||
#define msgh_request_port msgh_local_port
|
|
||||||
#define MACH_MSGH_BITS_REQUEST(bits) MACH_MSGH_BITS_LOCAL(bits)
|
|
||||||
#define msgh_reply_port msgh_remote_port
|
|
||||||
#define MACH_MSGH_BITS_REPLY(bits) MACH_MSGH_BITS_REMOTE(bits)
|
|
||||||
|
|
||||||
#define MIG_RETURN_ERROR(X, code) {\
|
|
||||||
((mig_reply_error_t *)X)->RetCode = code;\
|
|
||||||
((mig_reply_error_t *)X)->NDR = NDR_record;\
|
|
||||||
return;\
|
|
||||||
}
|
|
||||||
|
|
||||||
/* typedefs for all requests */
|
|
||||||
|
|
||||||
#ifndef __Request__mach_exc_subsystem__defined
|
|
||||||
#define __Request__mach_exc_subsystem__defined
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
} __Request__mach_exception_raise_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
} __Request__mach_exception_raise_state_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
} __Request__mach_exception_raise_state_identity_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
#endif /* !__Request__mach_exc_subsystem__defined */
|
|
||||||
|
|
||||||
/* typedefs for all replies */
|
|
||||||
|
|
||||||
#ifndef __Reply__mach_exc_subsystem__defined
|
|
||||||
#define __Reply__mach_exc_subsystem__defined
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
kern_return_t RetCode;
|
|
||||||
} __Reply__mach_exception_raise_t;
|
|
||||||
#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;
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t new_stateCnt;
|
|
||||||
natural_t new_state[224];
|
|
||||||
} __Reply__mach_exception_raise_state_t;
|
|
||||||
#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;
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t new_stateCnt;
|
|
||||||
natural_t new_state[224];
|
|
||||||
} __Reply__mach_exception_raise_state_identity_t;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
#endif /* !__Reply__mach_exc_subsystem__defined */
|
|
||||||
|
|
||||||
|
|
||||||
/* union of all replies */
|
|
||||||
|
|
||||||
#ifndef __ReplyUnion__catch_mach_exc_subsystem__defined
|
|
||||||
#define __ReplyUnion__catch_mach_exc_subsystem__defined
|
|
||||||
union __ReplyUnion__catch_mach_exc_subsystem {
|
|
||||||
__Reply__mach_exception_raise_t Reply_mach_exception_raise;
|
|
||||||
__Reply__mach_exception_raise_state_t Reply_mach_exception_raise_state;
|
|
||||||
__Reply__mach_exception_raise_state_identity_t Reply_mach_exception_raise_state_identity;
|
|
||||||
};
|
|
||||||
#endif /* __RequestUnion__catch_mach_exc_subsystem__defined */
|
|
||||||
/* Forward Declarations */
|
|
||||||
|
|
||||||
|
|
||||||
mig_internal novalue _Xmach_exception_raise
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
mig_internal novalue _Xmach_exception_raise_state
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
mig_internal novalue _Xmach_exception_raise_state_identity
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP);
|
|
||||||
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__mach_exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__mach_exception_raise_t__defined)
|
|
||||||
#define __MIG_check__Request__mach_exception_raise_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_t(__attribute__((__unused__)) __Request__mach_exception_raise_t *In0P)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__mach_exception_raise_t __Request;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(In0P->msgh_body.msgh_descriptor_count != 2) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 16)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->thread.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->task.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_t__codeCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 16)) / 8 < In0P->codeCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 16) + (8 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__mach_exception_raise_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__mach_exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_mach_exception_raise
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise */
|
|
||||||
mig_internal novalue _Xmach_exception_raise
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__mach_exception_raise_t __Request;
|
|
||||||
typedef __Reply__mach_exception_raise_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__mach_exception_raise_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__mach_exception_raise_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2405, "mach_exception_raise")
|
|
||||||
__BeforeRcvRpc(2405, "mach_exception_raise")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__mach_exception_raise_t__defined)
|
|
||||||
check_result = __MIG_check__Request__mach_exception_raise_t((__Request *)In0P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__mach_exception_raise_t__defined) */
|
|
||||||
|
|
||||||
OutP->RetCode = catch_mach_exception_raise(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt);
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
__AfterRcvRpc(2405, "mach_exception_raise")
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__mach_exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__mach_exception_raise_state_t__defined)
|
|
||||||
#define __MIG_check__Request__mach_exception_raise_state_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_t **In1PP)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__mach_exception_raise_state_t __Request;
|
|
||||||
__Request *In1P;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
unsigned int msgh_size_delta;
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if ((In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__codeCnt__defined */
|
|
||||||
msgh_size_delta = (8 * In0P->codeCnt);
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
msgh_size -= msgh_size_delta;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16);
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_t__old_stateCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In1P->old_stateCnt > 224 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__mach_exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise_state */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_mach_exception_raise_state
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
exception_type_t exception,
|
|
||||||
const mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
const thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise_state */
|
|
||||||
mig_internal novalue _Xmach_exception_raise_state
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack(4)
|
|
||||||
#endif
|
|
||||||
typedef struct {
|
|
||||||
mach_msg_header_t Head;
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__mach_exception_raise_state_t __Request;
|
|
||||||
typedef __Reply__mach_exception_raise_state_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Request *In1P;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__mach_exception_raise_state_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__mach_exception_raise_state_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2406, "mach_exception_raise_state")
|
|
||||||
__BeforeRcvRpc(2406, "mach_exception_raise_state")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__mach_exception_raise_state_t__defined)
|
|
||||||
check_result = __MIG_check__Request__mach_exception_raise_state_t((__Request *)In0P, (__Request **)&In1P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__mach_exception_raise_state_t__defined) */
|
|
||||||
|
|
||||||
OutP->new_stateCnt = 224;
|
|
||||||
|
|
||||||
OutP->RetCode = catch_mach_exception_raise_state(In0P->Head.msgh_request_port, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);
|
|
||||||
if (OutP->RetCode != KERN_SUCCESS) {
|
|
||||||
MIG_RETURN_ERROR(OutP, OutP->RetCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
OutP->flavor = In1P->flavor;
|
|
||||||
OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt)));
|
|
||||||
|
|
||||||
__AfterRcvRpc(2406, "mach_exception_raise_state")
|
|
||||||
}
|
|
||||||
|
|
||||||
#if ( __MigTypeCheck )
|
|
||||||
#if __MIG_check__Request__mach_exc_subsystem__
|
|
||||||
#if !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined)
|
|
||||||
#define __MIG_check__Request__mach_exception_raise_state_identity_t__defined
|
|
||||||
|
|
||||||
mig_internal kern_return_t __MIG_check__Request__mach_exception_raise_state_identity_t(__attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t *In0P, __attribute__((__unused__)) __Request__mach_exception_raise_state_identity_t **In1PP)
|
|
||||||
{
|
|
||||||
|
|
||||||
typedef __Request__mach_exception_raise_state_identity_t __Request;
|
|
||||||
__Request *In1P;
|
|
||||||
#if __MigTypeCheck
|
|
||||||
unsigned int msgh_size;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
unsigned int msgh_size_delta;
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
msgh_size = In0P->Head.msgh_size;
|
|
||||||
if (!(In0P->Head.msgh_bits & MACH_MSGH_BITS_COMPLEX) ||
|
|
||||||
(In0P->msgh_body.msgh_descriptor_count != 2) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912)) || (msgh_size > (mach_msg_size_t)sizeof(__Request)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->thread.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->thread.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if (In0P->task.type != MACH_MSG_PORT_DESCRIPTOR ||
|
|
||||||
In0P->task.disposition != 17)
|
|
||||||
return MIG_TYPE_ERROR;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt(&In0P->codeCnt, In0P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__codeCnt__defined */
|
|
||||||
msgh_size_delta = (8 * In0P->codeCnt);
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In0P->codeCnt > 2 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 8 < In0P->codeCnt) ||
|
|
||||||
(msgh_size < (mach_msg_size_t)(sizeof(__Request) - 912) + (8 * In0P->codeCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
msgh_size -= msgh_size_delta;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
*In1PP = In1P = (__Request *) ((pointer_t) In0P + msgh_size_delta - 16);
|
|
||||||
|
|
||||||
#if defined(__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined)
|
|
||||||
if (In0P->NDR.int_rep != NDR_record.int_rep)
|
|
||||||
__NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt(&In1P->old_stateCnt, In1P->NDR.int_rep);
|
|
||||||
#endif /* __NDR_convert__int_rep__Request__mach_exception_raise_state_identity_t__old_stateCnt__defined */
|
|
||||||
#if __MigTypeCheck
|
|
||||||
if ( In1P->old_stateCnt > 224 )
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
if (((msgh_size - (mach_msg_size_t)(sizeof(__Request) - 912)) / 4 < In1P->old_stateCnt) ||
|
|
||||||
(msgh_size != (mach_msg_size_t)(sizeof(__Request) - 912) + (4 * In1P->old_stateCnt)))
|
|
||||||
return MIG_BAD_ARGUMENTS;
|
|
||||||
#endif /* __MigTypeCheck */
|
|
||||||
|
|
||||||
return MACH_MSG_SUCCESS;
|
|
||||||
}
|
|
||||||
#endif /* !defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */
|
|
||||||
#endif /* __MIG_check__Request__mach_exc_subsystem__ */
|
|
||||||
#endif /* ( __MigTypeCheck ) */
|
|
||||||
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise_state_identity */
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
kern_return_t catch_mach_exception_raise_state_identity
|
|
||||||
(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt
|
|
||||||
);
|
|
||||||
|
|
||||||
/* Routine mach_exception_raise_state_identity */
|
|
||||||
mig_internal novalue _Xmach_exception_raise_state_identity
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
|
|
||||||
#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_port_descriptor_t thread;
|
|
||||||
mach_msg_port_descriptor_t task;
|
|
||||||
/* end of the kernel processed data */
|
|
||||||
NDR_record_t NDR;
|
|
||||||
exception_type_t exception;
|
|
||||||
mach_msg_type_number_t codeCnt;
|
|
||||||
int64_t code[2];
|
|
||||||
int flavor;
|
|
||||||
mach_msg_type_number_t old_stateCnt;
|
|
||||||
natural_t old_state[224];
|
|
||||||
mach_msg_trailer_t trailer;
|
|
||||||
} Request;
|
|
||||||
#ifdef __MigPackStructs
|
|
||||||
#pragma pack()
|
|
||||||
#endif
|
|
||||||
typedef __Request__mach_exception_raise_state_identity_t __Request;
|
|
||||||
typedef __Reply__mach_exception_raise_state_identity_t Reply;
|
|
||||||
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
Request *In0P = (Request *) InHeadP;
|
|
||||||
Request *In1P;
|
|
||||||
Reply *OutP = (Reply *) OutHeadP;
|
|
||||||
#ifdef __MIG_check__Request__mach_exception_raise_state_identity_t__defined
|
|
||||||
kern_return_t check_result;
|
|
||||||
#endif /* __MIG_check__Request__mach_exception_raise_state_identity_t__defined */
|
|
||||||
|
|
||||||
__DeclareRcvRpc(2407, "mach_exception_raise_state_identity")
|
|
||||||
__BeforeRcvRpc(2407, "mach_exception_raise_state_identity")
|
|
||||||
|
|
||||||
#if defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined)
|
|
||||||
check_result = __MIG_check__Request__mach_exception_raise_state_identity_t((__Request *)In0P, (__Request **)&In1P);
|
|
||||||
if (check_result != MACH_MSG_SUCCESS)
|
|
||||||
{ MIG_RETURN_ERROR(OutP, check_result); }
|
|
||||||
#endif /* defined(__MIG_check__Request__mach_exception_raise_state_identity_t__defined) */
|
|
||||||
|
|
||||||
OutP->new_stateCnt = 224;
|
|
||||||
|
|
||||||
OutP->RetCode = catch_mach_exception_raise_state_identity(In0P->Head.msgh_request_port, In0P->thread.name, In0P->task.name, In0P->exception, In0P->code, In0P->codeCnt, &In1P->flavor, In1P->old_state, In1P->old_stateCnt, OutP->new_state, &OutP->new_stateCnt);
|
|
||||||
if (OutP->RetCode != KERN_SUCCESS) {
|
|
||||||
MIG_RETURN_ERROR(OutP, OutP->RetCode);
|
|
||||||
}
|
|
||||||
|
|
||||||
OutP->NDR = NDR_record;
|
|
||||||
|
|
||||||
|
|
||||||
OutP->flavor = In1P->flavor;
|
|
||||||
OutP->Head.msgh_size = (mach_msg_size_t)(sizeof(Reply) - 896) + (((4 * OutP->new_stateCnt)));
|
|
||||||
|
|
||||||
__AfterRcvRpc(2407, "mach_exception_raise_state_identity")
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef mig_external
|
|
||||||
mig_external
|
|
||||||
#else
|
|
||||||
extern
|
|
||||||
#endif /* mig_external */
|
|
||||||
mig_routine_t mach_exc_server_routine(
|
|
||||||
mach_msg_header_t *InHeadP);
|
|
||||||
|
|
||||||
|
|
||||||
/* Description of this subsystem, for use in direct RPC */
|
|
||||||
const struct catch_mach_exc_subsystem {
|
|
||||||
mig_server_routine_t server; /* Server routine */
|
|
||||||
mach_msg_id_t start; /* Min routine number */
|
|
||||||
mach_msg_id_t end; /* Max routine number + 1 */
|
|
||||||
unsigned int maxsize; /* Max msg size */
|
|
||||||
vm_address_t reserved; /* Reserved */
|
|
||||||
struct routine_descriptor /*Array of routine descriptors */
|
|
||||||
routine[3];
|
|
||||||
} catch_mach_exc_subsystem = {
|
|
||||||
mach_exc_server_routine,
|
|
||||||
2405,
|
|
||||||
2408,
|
|
||||||
(mach_msg_size_t)sizeof(union __ReplyUnion__catch_mach_exc_subsystem),
|
|
||||||
(vm_address_t)0,
|
|
||||||
{
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xmach_exception_raise, 6, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_t)},
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xmach_exception_raise_state, 9, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_t)},
|
|
||||||
{ (mig_impl_routine_t) 0,
|
|
||||||
(mig_stub_routine_t) _Xmach_exception_raise_state_identity, 11, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__mach_exception_raise_state_identity_t)},
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
mig_external boolean_t mach_exc_server
|
|
||||||
(mach_msg_header_t *InHeadP, mach_msg_header_t *OutHeadP)
|
|
||||||
{
|
|
||||||
/*
|
|
||||||
* typedef struct {
|
|
||||||
* mach_msg_header_t Head;
|
|
||||||
* NDR_record_t NDR;
|
|
||||||
* kern_return_t RetCode;
|
|
||||||
* } mig_reply_error_t;
|
|
||||||
*/
|
|
||||||
|
|
||||||
register mig_routine_t routine;
|
|
||||||
|
|
||||||
OutHeadP->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REPLY(InHeadP->msgh_bits), 0);
|
|
||||||
OutHeadP->msgh_remote_port = InHeadP->msgh_reply_port;
|
|
||||||
/* Minimal size: routine() will update it if different */
|
|
||||||
OutHeadP->msgh_size = (mach_msg_size_t)sizeof(mig_reply_error_t);
|
|
||||||
OutHeadP->msgh_local_port = MACH_PORT_NULL;
|
|
||||||
OutHeadP->msgh_id = InHeadP->msgh_id + 100;
|
|
||||||
#if TARGET_OSX_USE_64BIT_EXCEPTIONS
|
|
||||||
puts("64 bit");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
if ((InHeadP->msgh_id > 2407) || (InHeadP->msgh_id < 2405) ||
|
|
||||||
((routine = catch_mach_exc_subsystem.routine[InHeadP->msgh_id - 2405].stub_routine) == 0)) {
|
|
||||||
((mig_reply_error_t *)OutHeadP)->NDR = NDR_record;
|
|
||||||
((mig_reply_error_t *)OutHeadP)->RetCode = MIG_BAD_ID;
|
|
||||||
printf("msgh_id %d\n", InHeadP->msgh_id);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
(*routine) (InHeadP, OutHeadP);
|
|
||||||
return TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
mig_external mig_routine_t mach_exc_server_routine
|
|
||||||
(mach_msg_header_t *InHeadP)
|
|
||||||
{
|
|
||||||
register int msgh_id;
|
|
||||||
|
|
||||||
msgh_id = InHeadP->msgh_id - 2405;
|
|
||||||
|
|
||||||
if ((msgh_id > 2) || (msgh_id < 0))
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
return catch_mach_exc_subsystem.routine[msgh_id].stub_routine;
|
|
||||||
}
|
|
@ -1,9 +1,8 @@
|
|||||||
#include "proctl_darwin.h"
|
#include "proctl_darwin.h"
|
||||||
|
|
||||||
|
|
||||||
static const unsigned char info_plist[]
|
static const unsigned char info_plist[]
|
||||||
__attribute__ ((section ("__TEXT,__info_plist"),used)) =
|
__attribute__ ((section ("__TEXT,__info_plist"),used)) =
|
||||||
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
|
||||||
"<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
|
"<!DOCTYPE plist PUBLIC \"-//Apple Computer//DTD PLIST 1.0//EN\""
|
||||||
" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n"
|
||||||
"<plist version=\"1.0\">\n"
|
"<plist version=\"1.0\">\n"
|
||||||
@ -22,187 +21,141 @@ __attribute__ ((section ("__TEXT,__info_plist"),used)) =
|
|||||||
"</dict>\n"
|
"</dict>\n"
|
||||||
"</plist>\n";
|
"</plist>\n";
|
||||||
|
|
||||||
static thread_act_t _global_thread;
|
kern_return_t
|
||||||
|
acquire_mach_task(int tid,
|
||||||
|
mach_port_name_t *task,
|
||||||
|
mach_port_t *port_set,
|
||||||
|
mach_port_t *exception_port,
|
||||||
|
mach_port_t *notification_port)
|
||||||
|
{
|
||||||
|
kern_return_t kret;
|
||||||
|
mach_port_t prev_not;
|
||||||
|
mach_port_t self = mach_task_self();
|
||||||
|
|
||||||
kern_return_t
|
kret = task_for_pid(self, tid, task);
|
||||||
acquire_mach_task(int tid, mach_port_name_t *task, mach_port_t *exception_port) {
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
kern_return_t kret;
|
|
||||||
mach_port_t prev_not;
|
|
||||||
mach_port_t self = mach_task_self();
|
|
||||||
|
|
||||||
kret = task_for_pid(self, tid, task);
|
// Allocate exception port.
|
||||||
if (kret != KERN_SUCCESS) return kret;
|
kret = mach_port_allocate(self, MACH_PORT_RIGHT_RECEIVE, exception_port);
|
||||||
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
kret = mach_port_allocate(self, MACH_PORT_RIGHT_RECEIVE, exception_port);
|
kret = mach_port_insert_right(self, *exception_port, *exception_port, MACH_MSG_TYPE_MAKE_SEND);
|
||||||
if (kret != KERN_SUCCESS) return kret;
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
kret = mach_port_insert_right(self, *exception_port, *exception_port, MACH_MSG_TYPE_MAKE_SEND);
|
kret = task_set_exception_ports(*task, EXC_MASK_BREAKPOINT|EXC_MASK_SOFTWARE, *exception_port,
|
||||||
if (kret != KERN_SUCCESS) return kret;
|
EXCEPTION_DEFAULT, THREAD_STATE_NONE);
|
||||||
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
kret = mach_port_request_notification(self, *task, MACH_NOTIFY_DEAD_NAME, 0, *exception_port, MACH_MSG_TYPE_MAKE_SEND_ONCE,
|
// Allocate notification port to alert of when the process dies.
|
||||||
&prev_not);
|
kret = mach_port_allocate(self, MACH_PORT_RIGHT_RECEIVE, notification_port);
|
||||||
if (kret != KERN_SUCCESS) return kret;
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
// Set exception port
|
kret = mach_port_insert_right(self, *notification_port, *notification_port, MACH_MSG_TYPE_MAKE_SEND);
|
||||||
return task_set_exception_ports(*task, EXC_MASK_BREAKPOINT|EXC_MASK_SOFTWARE, *exception_port,
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
EXCEPTION_DEFAULT, THREAD_STATE_NONE);
|
|
||||||
|
kret = mach_port_request_notification(self, *task, MACH_NOTIFY_DEAD_NAME, 0, *notification_port,
|
||||||
|
MACH_MSG_TYPE_MAKE_SEND_ONCE, &prev_not);
|
||||||
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
|
// Create port set.
|
||||||
|
kret = mach_port_allocate(self, MACH_PORT_RIGHT_PORT_SET, port_set);
|
||||||
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
|
// Move exception and notification ports to port set.
|
||||||
|
kret = mach_port_move_member(self, *exception_port, *port_set);
|
||||||
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
|
return mach_port_move_member(self, *notification_port, *port_set);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *
|
char *
|
||||||
find_executable(int pid) {
|
find_executable(int pid) {
|
||||||
static char pathbuf[PATH_MAX];
|
static char pathbuf[PATH_MAX];
|
||||||
proc_pidpath(pid, pathbuf, PATH_MAX);
|
proc_pidpath(pid, pathbuf, PATH_MAX);
|
||||||
return pathbuf;
|
return pathbuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
kern_return_t
|
kern_return_t
|
||||||
get_threads(task_t task, void *slice) {
|
get_threads(task_t task, void *slice) {
|
||||||
kern_return_t kret;
|
kern_return_t kret;
|
||||||
thread_act_array_t list;
|
thread_act_array_t list;
|
||||||
mach_msg_type_number_t count;
|
mach_msg_type_number_t count;
|
||||||
|
|
||||||
kret = task_threads(task, &list, &count);
|
kret = task_threads(task, &list, &count);
|
||||||
if (kret != KERN_SUCCESS) {
|
if (kret != KERN_SUCCESS) {
|
||||||
return kret;
|
return kret;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(slice, (void*)list, count*sizeof(list[0]));
|
memcpy(slice, (void*)list, count*sizeof(list[0]));
|
||||||
|
|
||||||
kret = vm_deallocate(mach_task_self(), (vm_address_t) list, count * sizeof(list[0]));
|
kret = vm_deallocate(mach_task_self(), (vm_address_t) list, count * sizeof(list[0]));
|
||||||
if (kret != KERN_SUCCESS) return kret;
|
if (kret != KERN_SUCCESS) return kret;
|
||||||
|
|
||||||
return (kern_return_t)0;
|
return (kern_return_t)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
thread_count(task_t task) {
|
thread_count(task_t task) {
|
||||||
kern_return_t kret;
|
kern_return_t kret;
|
||||||
thread_act_array_t list;
|
thread_act_array_t list;
|
||||||
mach_msg_type_number_t count;
|
mach_msg_type_number_t count;
|
||||||
|
|
||||||
kret = task_threads(task, &list, &count);
|
kret = task_threads(task, &list, &count);
|
||||||
if (kret != KERN_SUCCESS) return -1;
|
if (kret != KERN_SUCCESS) return -1;
|
||||||
|
|
||||||
kret = vm_deallocate(mach_task_self(), (vm_address_t) list, count * sizeof(list[0]));
|
kret = vm_deallocate(mach_task_self(), (vm_address_t) list, count * sizeof(list[0]));
|
||||||
if (kret != KERN_SUCCESS) return -1;
|
if (kret != KERN_SUCCESS) return -1;
|
||||||
|
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct exc_msg {
|
mach_port_t
|
||||||
mach_msg_header_t Head;
|
mach_port_wait(mach_port_t port_set) {
|
||||||
mach_msg_body_t msgh_body;
|
kern_return_t kret;
|
||||||
mach_msg_port_descriptor_t thread;
|
thread_act_t thread;
|
||||||
mach_msg_port_descriptor_t task;
|
union
|
||||||
NDR_record_t NDR;
|
{
|
||||||
exception_type_t exception;
|
mach_msg_header_t hdr;
|
||||||
mach_msg_type_number_t codeCnt;
|
char data[256];
|
||||||
exception_data_t code;
|
} msg;
|
||||||
char pad[512];
|
|
||||||
} exc_msg_t;
|
|
||||||
|
|
||||||
thread_act_t
|
// Wait for mach msg.
|
||||||
mach_port_wait(mach_port_t port) {
|
kret = mach_msg(&msg.hdr, MACH_RCV_MSG|MACH_RCV_INTERRUPT,
|
||||||
mach_msg_return_t msg = mach_msg_server_once(exc_server, sizeof(exc_msg_t), port, MACH_RCV_INTERRUPT|MACH_MSG_TIMEOUT_NONE);
|
0, sizeof(msg.data), port_set, 0, MACH_PORT_NULL);
|
||||||
if (msg == MACH_RCV_INTERRUPTED) return msg;
|
|
||||||
if (msg != MACH_MSG_SUCCESS) {
|
if (kret == MACH_RCV_INTERRUPTED || kret != MACH_MSG_SUCCESS) return 0;
|
||||||
return -1;
|
|
||||||
}
|
mach_msg_body_t *bod = (mach_msg_body_t*)(&msg.hdr + 1);
|
||||||
return _global_thread;
|
mach_msg_port_descriptor_t *desc = (mach_msg_port_descriptor_t *)(bod + 1);
|
||||||
}
|
thread = desc[0].name;
|
||||||
|
|
||||||
// 64 bit exception handlers
|
// Exception
|
||||||
|
switch (msg.hdr.msgh_id) {
|
||||||
kern_return_t
|
case 2401: // Exception
|
||||||
catch_mach_exception_raise(
|
kret = thread_suspend(thread);
|
||||||
mach_port_t exception_port,
|
if (kret != KERN_SUCCESS) return 0;
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
// Send our reply back so the kernel knows this exception has been handled.
|
||||||
exception_type_t exception,
|
mig_reply_error_t reply;
|
||||||
mach_exception_data_t code,
|
mach_msg_header_t *rh = &reply.Head;
|
||||||
mach_msg_type_number_t codeCnt)
|
rh->msgh_bits = MACH_MSGH_BITS(MACH_MSGH_BITS_REMOTE(msg.hdr.msgh_bits), 0);
|
||||||
{
|
rh->msgh_remote_port = msg.hdr.msgh_remote_port;
|
||||||
_global_thread = (thread_act_t)thread;
|
rh->msgh_size = (mach_msg_size_t) sizeof(mig_reply_error_t);
|
||||||
thread_suspend(thread);
|
rh->msgh_local_port = MACH_PORT_NULL;
|
||||||
return KERN_SUCCESS;
|
rh->msgh_id = msg.hdr.msgh_id + 100;
|
||||||
}
|
|
||||||
|
reply.NDR = NDR_record;
|
||||||
kern_return_t
|
reply.RetCode = KERN_SUCCESS;
|
||||||
catch_mach_exception_raise_state(
|
|
||||||
mach_port_t exception_port,
|
kret = mach_msg(&reply.Head, MACH_SEND_MSG|MACH_SEND_INTERRUPT, rh->msgh_size, 0,
|
||||||
exception_type_t exception,
|
MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL);
|
||||||
const mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
if (kret != MACH_MSG_SUCCESS) return 0;
|
||||||
int *flavor,
|
break;
|
||||||
const thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
case 72: // Death
|
||||||
thread_state_t new_state,
|
return msg.hdr.msgh_local_port;
|
||||||
mach_msg_type_number_t *new_stateCnt)
|
}
|
||||||
{
|
|
||||||
return KERN_SUCCESS;
|
return thread;
|
||||||
}
|
|
||||||
|
|
||||||
kern_return_t
|
|
||||||
catch_mach_exception_raise_state_identity(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt)
|
|
||||||
{
|
|
||||||
return KERN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// 32 bit exception handlers
|
|
||||||
|
|
||||||
kern_return_t
|
|
||||||
catch_exception_raise(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt)
|
|
||||||
{
|
|
||||||
_global_thread = (thread_act_t)thread;
|
|
||||||
thread_suspend(thread);
|
|
||||||
return KERN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
kern_return_t
|
|
||||||
catch_exception_raise_state(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
exception_type_t exception,
|
|
||||||
const mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
const thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt)
|
|
||||||
{
|
|
||||||
return KERN_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
kern_return_t
|
|
||||||
catch_exception_raise_state_identity(
|
|
||||||
mach_port_t exception_port,
|
|
||||||
mach_port_t thread,
|
|
||||||
mach_port_t task,
|
|
||||||
exception_type_t exception,
|
|
||||||
mach_exception_data_t code,
|
|
||||||
mach_msg_type_number_t codeCnt,
|
|
||||||
int *flavor,
|
|
||||||
thread_state_t old_state,
|
|
||||||
mach_msg_type_number_t old_stateCnt,
|
|
||||||
thread_state_t new_state,
|
|
||||||
mach_msg_type_number_t *new_stateCnt)
|
|
||||||
{
|
|
||||||
return KERN_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,10 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type OSProcessDetails struct {
|
type OSProcessDetails struct {
|
||||||
task C.mach_port_name_t
|
task C.mach_port_name_t
|
||||||
exceptionPort C.mach_port_t
|
portSet C.mach_port_t
|
||||||
|
exceptionPort C.mach_port_t
|
||||||
|
notificationPort C.mach_port_t
|
||||||
}
|
}
|
||||||
|
|
||||||
func (dbp *DebuggedProcess) Halt() (err error) {
|
func (dbp *DebuggedProcess) Halt() (err error) {
|
||||||
@ -41,7 +43,8 @@ func (dbp *DebuggedProcess) LoadInformation() error {
|
|||||||
err error
|
err error
|
||||||
)
|
)
|
||||||
|
|
||||||
if ret := C.acquire_mach_task(C.int(dbp.Pid), &dbp.os.task, &dbp.os.exceptionPort); ret != C.KERN_SUCCESS {
|
ret := C.acquire_mach_task(C.int(dbp.Pid), &dbp.os.task, &dbp.os.portSet, &dbp.os.exceptionPort, &dbp.os.notificationPort)
|
||||||
|
if ret != C.KERN_SUCCESS {
|
||||||
return fmt.Errorf("could not acquire mach task %d", ret)
|
return fmt.Errorf("could not acquire mach task %d", ret)
|
||||||
}
|
}
|
||||||
exe, err = dbp.findExecutable()
|
exe, err = dbp.findExecutable()
|
||||||
@ -173,12 +176,13 @@ func (dbp *DebuggedProcess) findExecutable() (*macho.File, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func trapWait(dbp *DebuggedProcess, pid int) (int, error) {
|
func trapWait(dbp *DebuggedProcess, pid int) (int, error) {
|
||||||
port := C.mach_port_wait(dbp.os.exceptionPort)
|
port := C.mach_port_wait(dbp.os.portSet)
|
||||||
if port == C.MACH_RCV_INTERRUPTED {
|
switch port {
|
||||||
|
case C.MACH_RCV_INTERRUPTED:
|
||||||
return -1, ManualStopError{}
|
return -1, ManualStopError{}
|
||||||
}
|
case 0:
|
||||||
|
return -1, fmt.Errorf("error while waiting for task")
|
||||||
if port == 0 {
|
case dbp.os.notificationPort:
|
||||||
_, status, err := wait(dbp.Pid, 0)
|
_, status, err := wait(dbp.Pid, 0)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return -1, err
|
return -1, err
|
||||||
|
@ -24,7 +24,7 @@ boolean_t mach_exc_server(
|
|||||||
mach_msg_header_t *OutHeadP);
|
mach_msg_header_t *OutHeadP);
|
||||||
|
|
||||||
kern_return_t
|
kern_return_t
|
||||||
acquire_mach_task(int, mach_port_name_t *, mach_port_t *);
|
acquire_mach_task(int, mach_port_name_t*, mach_port_t*, mach_port_t*, mach_port_t*);
|
||||||
|
|
||||||
char *
|
char *
|
||||||
find_executable(int pid);
|
find_executable(int pid);
|
||||||
@ -35,5 +35,5 @@ get_threads(task_t task, void *);
|
|||||||
int
|
int
|
||||||
thread_count(task_t task);
|
thread_count(task_t task);
|
||||||
|
|
||||||
thread_act_t
|
mach_port_t
|
||||||
mach_port_wait(mach_port_t);
|
mach_port_wait(mach_port_t);
|
||||||
|
Loading…
Reference in New Issue
Block a user