1 #include "mach_vm_tests.h" 2 boolean_t debug = TRUE; 3 4 int 5 main() 6 { 7 dispatch_source_t parentSource = dispatch_source_create(DISPATCH_SOURCE_TYPE_PROC, (uintptr_t)getppid(), DISPATCH_PROC_EXIT, NULL); 8 dispatch_source_set_event_handler(parentSource, ^{ 9 T_LOG("Event handler got invoked. Parent process died. Exiting"); 10 exit(1); 11 }); 12 dispatch_activate(parentSource); 13 14 const char *serviceName = MACH_VM_TEST_SERVICE_NAME; 15 16 kern_return_t ret; 17 mach_port_t bootstrap; 18 task_get_bootstrap_port(mach_task_self(), &bootstrap); 19 20 mach_port_t port; 21 mach_port_allocate(mach_task_self(), MACH_PORT_RIGHT_RECEIVE, &port); 22 23 #pragma clang diagnostic push 24 #pragma clang diagnostic ignored "-Wdeprecated" 25 ret = bootstrap_register2(bootstrap, (char *)serviceName, port, BOOTSTRAP_ALLOW_LOOKUP); 26 #pragma clang diagnostic pop 27 28 mach_msg_size_t messageSize = sizeof(ipc_message_t) + sizeof(mach_msg_trailer_t) + 64; 29 ipc_message_t *message = (ipc_message_t *)calloc(1, messageSize); 30 31 message->header.msgh_bits = MACH_MSGH_BITS_ZERO; 32 message->header.msgh_size = messageSize; 33 message->header.msgh_remote_port = MACH_PORT_NULL; 34 message->header.msgh_local_port = port; 35 36 ret = mach_msg(&message->header, MACH_RCV_MSG, 0, messageSize, port, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); 37 if (ret == KERN_SUCCESS) { 38 if (MACH_MSGH_BITS_REMOTE(message->header.msgh_bits) == MACH_MSG_TYPE_PORT_SEND) { 39 persistentReplyPort = message->header.msgh_remote_port; 40 mach_port_mod_refs(mach_task_self(), persistentReplyPort, MACH_PORT_RIGHT_SEND, 1); 41 } 42 } 43 44 mach_server_make_memory_entry(port); 45 mach_server_remap(port); 46 mach_server_read(port, VM_OP_READ); 47 //mach_server_read(port, VM_OP_WRITE); 48 mach_server_read(port, VM_OP_READ_OVERWRITE); 49 50 51 message->header.msgh_bits = MACH_MSGH_BITS_ZERO; 52 message->header.msgh_size = messageSize; 53 message->header.msgh_remote_port = MACH_PORT_NULL; 54 message->header.msgh_local_port = port; 55 56 mach_server_construct_header(message, port); 57 message->vm_op = VM_OP_EXIT; 58 ret = mach_msg(&message->header, MACH_SEND_MSG, message->header.msgh_size, 0, MACH_PORT_NULL, MACH_MSG_TIMEOUT_NONE, MACH_PORT_NULL); 59 if (ret != KERN_SUCCESS) { 60 T_LOG("ERROR: Failed to send message to client: (%d) %s\n", ret, mach_error_string(ret)); 61 return 1; 62 } 63 64 (void)parentSource; 65 66 return 0; 67 } 68