]> git.cameronkatri.com Git - apple_cmds.git/blob - system_cmds/lsmp.patch
atrun: Install LaunchDaemon
[apple_cmds.git] / system_cmds / lsmp.patch
1 diff -urN system_cmds-880.60.2/lsmp.tproj/common.h system_cmds-880.100.5/lsmp.tproj/common.h
2 --- system_cmds-880.60.2/lsmp.tproj/common.h 2020-05-26 14:16:58.000000000 -0400
3 +++ system_cmds-880.100.5/lsmp.tproj/common.h 2021-01-15 00:52:22.000000000 -0500
4 @@ -25,6 +25,7 @@
5 #define system_cmds_common_h
6
7 #include <mach/mach.h>
8 +#include <mach_debug/ipc_info.h>
9 #include "json.h"
10
11 #define PROC_NAME_LEN 100
12 @@ -46,7 +47,7 @@
13 /* exception port information */
14 struct exc_port_info {
15 mach_msg_type_number_t count;
16 - mach_port_t ports[EXC_TYPES_COUNT];
17 + ipc_info_port_t ports_info[EXC_TYPES_COUNT];
18 exception_mask_t masks[EXC_TYPES_COUNT];
19 exception_behavior_t behaviors[EXC_TYPES_COUNT];
20 thread_state_flavor_t flavors[EXC_TYPES_COUNT];
21 @@ -74,7 +75,7 @@
22
23 /* private structure to wrap up per-task info */
24 typedef struct my_per_task_info {
25 - task_t task;
26 + task_read_t task;
27 pid_t pid;
28 vm_address_t task_kobject;
29 ipc_info_space_t info;
30 @@ -181,12 +182,12 @@
31
32 /* mach port related functions */
33 const char * kobject_name(natural_t kotype);
34 -void get_receive_port_context(task_t taskp, mach_port_name_t portname, mach_port_context_t *context);
35 -int get_recieve_port_status(task_t taskp, mach_port_name_t portname, mach_port_info_ext_t *info);
36 +void get_receive_port_context(task_read_t taskp, mach_port_name_t portname, mach_port_context_t *context);
37 +int get_recieve_port_status(task_read_t taskp, mach_port_name_t portname, mach_port_info_ext_t *info);
38 void show_task_mach_ports(my_per_task_info_t *taskinfo, uint32_t taskCount, my_per_task_info_t *allTaskInfos, JSON_t json);
39
40 /* task and thread related helper functions */
41 -kern_return_t collect_per_task_info(my_per_task_info_t *taskinfo, task_t target_task);
42 +kern_return_t collect_per_task_info(my_per_task_info_t *taskinfo, task_read_t target_task);
43 my_per_task_info_t * allocate_taskinfo_memory(uint32_t taskCount);
44 void deallocate_taskinfo_memory(my_per_task_info_t *data);
45 kern_return_t print_task_exception_info(my_per_task_info_t *taskinfo, JSON_t json);
46 @@ -195,8 +196,8 @@
47
48 void get_exc_behavior_string(exception_behavior_t b, char *out_string, size_t len);
49 void get_exc_mask_string(exception_mask_t m, char *out_string, size_t len);
50 -kern_return_t get_taskinfo_of_receiver_by_send_right(ipc_info_name_t *sendright, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info);
51 -kern_return_t get_ipc_info_from_lsmp_spaceinfo(mach_port_t port_name, ipc_info_name_t *out_sendright);
52 +kern_return_t get_taskinfo_of_receiver_by_send_right(ipc_info_name_t sendright, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info);
53 +kern_return_t get_taskinfo_of_receiver_by_send_right_info(ipc_info_port_t sendright_info, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info);
54
55 /* basic util functions */
56 uint32_t print_hex_data(char *outstr, uint32_t maxlen, char *prefix, char *desc, void *addr, int len);
57 diff -urN system_cmds-880.60.2/lsmp.tproj/entitlements.plist system_cmds-880.100.5/lsmp.tproj/entitlements.plist
58 --- system_cmds-880.60.2/lsmp.tproj/entitlements.plist 2015-07-21 20:13:05.000000000 -0400
59 +++ system_cmds-880.100.5/lsmp.tproj/entitlements.plist 2021-01-15 00:52:22.000000000 -0500
60 @@ -2,9 +2,7 @@
61 <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
62 <plist version="1.0">
63 <dict>
64 - <key>task_for_pid-allow</key>
65 - <true/>
66 - <key>com.apple.system-task-ports</key>
67 + <key>com.apple.system-task-ports.read</key>
68 <true/>
69 </dict>
70 </plist>
71 diff -urN system_cmds-880.60.2/lsmp.tproj/lsmp.c system_cmds-880.100.5/lsmp.tproj/lsmp.c
72 --- system_cmds-880.60.2/lsmp.tproj/lsmp.c 2019-04-09 18:58:12.000000000 -0400
73 +++ system_cmds-880.100.5/lsmp.tproj/lsmp.c 2021-01-15 00:52:22.000000000 -0500
74 @@ -19,6 +19,7 @@
75 *
76 * @APPLE_LICENSE_HEADER_END@
77 */
78 +#include <System/sys/proc.h>
79 #include <unistd.h>
80 #include <mach/mach.h>
81 #include <mach/mach_error.h>
82 @@ -32,7 +33,7 @@
83 #include "json.h"
84
85 #if (TARGET_OS_IPHONE && !TARGET_OS_SIMULATOR)
86 -#define TASK_FOR_PID_USAGE_MESG "\nPlease check your boot-args to ensure you have access to task_for_pid()."
87 +#define TASK_FOR_PID_USAGE_MESG "\nPlease check your boot-args to ensure you have access to task_read_for_pid()."
88 #else
89 #define TASK_FOR_PID_USAGE_MESG ""
90 #endif
91 @@ -72,7 +73,7 @@
92
93 int main(int argc, char *argv[]) {
94 kern_return_t ret;
95 - task_t aTask;
96 + task_read_t aTask;
97 my_per_task_info_t *taskinfo = NULL;
98 task_array_t tasks;
99 char *progname = "lsmp";
100 @@ -153,10 +154,10 @@
101 mach_port_deallocate(mach_task_self(), psets[0]);
102 vm_deallocate(mach_task_self(), (vm_address_t)psets, (vm_size_t)psetCount * sizeof(mach_port_t));
103
104 - /* convert the processor-set-priv to a list of tasks for the processor set */
105 - ret = processor_set_tasks(pset_priv, &tasks, &taskCount);
106 + /* convert the processor-set-priv to a list of task read ports for the processor set */
107 + ret = processor_set_tasks_with_flavor(pset_priv, TASK_FLAVOR_READ, &tasks, &taskCount);
108 if (ret != KERN_SUCCESS) {
109 - fprintf(stderr, "processor_set_tasks() failed: %s\n", mach_error_string(ret));
110 + fprintf(stderr, "processor_set_tasks_with_flavor() failed: %s\n", mach_error_string(ret));
111 exit(1);
112 }
113 mach_port_deallocate(mach_task_self(), pset_priv);
114 @@ -164,7 +165,7 @@
115 /* swap my current instances port to be last to collect all threads and exception port info */
116 int myTaskPosition = -1;
117 for (int i = 0; i < taskCount; i++) {
118 - if (tasks[i] == mach_task_self()){
119 + if (mach_task_is_self(tasks[i])){
120 myTaskPosition = i;
121 break;
122 }
123 @@ -181,7 +182,7 @@
124 {
125 fprintf(stderr, "warning: should run as root for best output (cross-ref to other tasks' ports).\n");
126 /* just the one process */
127 - ret = task_for_pid(mach_task_self(), lsmp_config.pid, &aTask);
128 + ret = task_read_for_pid(mach_task_self(), lsmp_config.pid, &aTask);
129 if (ret != KERN_SUCCESS) {
130 fprintf(stderr, "task_for_pid() failed: %s %s\n", mach_error_string(ret), TASK_FOR_PID_USAGE_MESG);
131 exit(1);
132 @@ -200,8 +201,9 @@
133 continue;
134 }
135
136 - if (psettaskinfo[i].pid == lsmp_config.pid)
137 + if (psettaskinfo[i].pid == lsmp_config.pid) {
138 taskinfo = &psettaskinfo[i];
139 + }
140 }
141
142 JSON_OBJECT_BEGIN(lsmp_config.json_output);
143 diff -urN system_cmds-880.60.2/lsmp.tproj/port_details.c system_cmds-880.100.5/lsmp.tproj/port_details.c
144 --- system_cmds-880.60.2/lsmp.tproj/port_details.c 2020-05-26 14:16:58.000000000 -0400
145 +++ system_cmds-880.100.5/lsmp.tproj/port_details.c 2021-01-15 00:52:22.000000000 -0500
146 @@ -232,7 +232,7 @@
147 return voucher_outstr;
148 }
149
150 -void get_receive_port_context(task_t taskp, mach_port_name_t portname, mach_port_context_t *context) {
151 +void get_receive_port_context(task_read_t taskp, mach_port_name_t portname, mach_port_context_t *context) {
152 if (context == NULL) {
153 return;
154 }
155 @@ -248,7 +248,7 @@
156 return;
157 }
158
159 -int get_recieve_port_status(task_t taskp, mach_port_name_t portname, mach_port_info_ext_t *info){
160 +int get_recieve_port_status(task_read_t taskp, mach_port_name_t portname, mach_port_info_ext_t *info){
161 if (info == NULL) {
162 return -1;
163 }
164 @@ -625,13 +625,19 @@
165 if (ret == KERN_SUCCESS && kotype != 0) {
166 JSON_OBJECT_SET(json, identifier, "0x%08x", (natural_t)kobject);
167 JSON_OBJECT_SET(json, type, "%s", kobject_name(kotype));
168 - if (desc[0]) {
169 - JSON_OBJECT_SET(json, description, "%s", desc);
170 - printf(" 0x%08x %s %s", (natural_t)kobject, kobject_name(kotype), desc);
171 - } else {
172 - printf(" 0x%08x %s", (natural_t)kobject, kobject_name(kotype));
173 - }
174 - if ((kotype == IKOT_TASK_RESUME) || (kotype == IKOT_TASK_CONTROL) || (kotype == IKOT_TASK_NAME)) {
175 +
176 + if (desc[0]) {
177 + JSON_OBJECT_SET(json, description, "%s", desc);
178 + printf(" 0x%08x %s %s", (natural_t)kobject, kobject_name(kotype), desc);
179 + } else {
180 + printf(" 0x%08x %s", (natural_t)kobject, kobject_name(kotype));
181 + }
182 +
183 + if ((kotype == IKOT_TASK_RESUME) ||
184 + (kotype == IKOT_TASK_CONTROL) ||
185 + (kotype == IKOT_TASK_READ) ||
186 + (kotype == IKOT_TASK_INSPECT) ||
187 + (kotype == IKOT_TASK_NAME)) {
188 if (taskinfo->task_kobject == kobject) {
189 /* neat little optimization since in most cases tasks have themselves in their ipc space */
190 JSON_OBJECT_SET(json, pid, %d, taskinfo->pid);
191 @@ -645,7 +651,9 @@
192 }
193 }
194
195 - if (kotype == IKOT_THREAD_CONTROL) {
196 + if ((kotype == IKOT_THREAD_CONTROL) ||
197 + (kotype == IKOT_THREAD_READ) ||
198 + (kotype == IKOT_THREAD_INSPECT)) {
199 for (int i = 0; i < taskinfo->threadCount; i++) {
200 if (taskinfo->threadInfos[i].th_kobject == kobject) {
201 printf(" (%#llx)", taskinfo->threadInfos[i].th_id);
202 @@ -673,7 +681,7 @@
203 /* not kobject - find the receive right holder */
204 my_per_task_info_t *recv_holder_taskinfo;
205 mach_port_name_t recv_name = MACH_PORT_NULL;
206 - if (KERN_SUCCESS == get_taskinfo_of_receiver_by_send_right(entry, &recv_holder_taskinfo, &recv_name)) {
207 + if (KERN_SUCCESS == get_taskinfo_of_receiver_by_send_right(*entry, &recv_holder_taskinfo, &recv_name)) {
208 mach_port_status_t port_status;
209 mach_port_info_ext_t info;
210 mach_port_context_t port_context = (mach_port_context_t)0;
211 diff -urN system_cmds-880.60.2/lsmp.tproj/task_details.c system_cmds-880.100.5/lsmp.tproj/task_details.c
212 --- system_cmds-880.60.2/lsmp.tproj/task_details.c 2020-05-26 14:16:58.000000000 -0400
213 +++ system_cmds-880.100.5/lsmp.tproj/task_details.c 2021-01-15 00:52:22.000000000 -0500
214 @@ -139,7 +139,7 @@
215 }
216 }
217
218 -kern_return_t collect_per_task_info(my_per_task_info_t *taskinfo, task_t target_task)
219 +kern_return_t collect_per_task_info(my_per_task_info_t *taskinfo, task_read_t target_task)
220 {
221 int i;
222 kern_return_t ret = KERN_SUCCESS;
223 @@ -149,10 +149,10 @@
224 taskinfo->task = target_task;
225 pid_for_task(target_task, &taskinfo->pid);
226
227 - ret = task_get_exception_ports(taskinfo->task, EXC_MASK_ALL, taskinfo->exceptionInfo.masks, &taskinfo->exceptionInfo.count, taskinfo->exceptionInfo.ports, taskinfo->exceptionInfo.behaviors, taskinfo->exceptionInfo.flavors);
228 + ret = task_get_exception_ports_info(taskinfo->task, EXC_MASK_ALL, taskinfo->exceptionInfo.masks, &taskinfo->exceptionInfo.count, taskinfo->exceptionInfo.ports_info, taskinfo->exceptionInfo.behaviors, taskinfo->exceptionInfo.flavors);
229
230 if (ret != KERN_SUCCESS) {
231 - fprintf(stderr, "task_get_exception_ports() failed: pid:%d error: %s\n",taskinfo->pid, mach_error_string(ret));
232 + fprintf(stderr, "task_get_exception_ports_info() failed: pid:%d error: %s\n",taskinfo->pid, mach_error_string(ret));
233 taskinfo->pid = 0;
234 }
235
236 @@ -180,9 +180,9 @@
237 mach_msg_type_number_t th_info_count = THREAD_IDENTIFIER_INFO_COUNT;
238 struct exc_port_info *excinfo = &(taskinfo->threadExceptionInfos[i]);
239
240 - ret = thread_get_exception_ports(threadPorts[i], EXC_MASK_ALL, excinfo->masks, &excinfo->count, excinfo->ports, excinfo->behaviors, excinfo->flavors);
241 + ret = thread_get_exception_ports_info(threadPorts[i], EXC_MASK_ALL, excinfo->masks, &excinfo->count, excinfo->ports_info, excinfo->behaviors, excinfo->flavors);
242 if (ret != KERN_SUCCESS){
243 - fprintf(stderr, "thread_get_exception_ports() failed: pid: %d thread: %d error %s\n", taskinfo->pid, threadPorts[i], mach_error_string(ret));
244 + fprintf(stderr, "thread_get_exception_ports_info() failed: pid: %d thread: %d error %s\n", taskinfo->pid, threadPorts[i], mach_error_string(ret));
245 }
246
247 if (excinfo->count != 0) {
248 @@ -236,8 +236,9 @@
249 proc_pid_to_name(taskinfo->pid, taskinfo->processName);
250
251 ret = mach_port_kernel_object(mach_task_self(), taskinfo->task, &kotype, (unsigned *)&kobject);
252 -
253 - if (ret == KERN_SUCCESS && kotype == IKOT_TASK_CONTROL) {
254 +
255 + /* Now that we are using read ports, kotype should be checked against IKOT_TASK_READ */
256 + if (ret == KERN_SUCCESS && kotype == IKOT_TASK_READ) {
257 taskinfo->task_kobject = kobject;
258 taskinfo->valid = TRUE;
259 }
260 @@ -307,23 +308,32 @@
261
262 boolean_t header_required = TRUE;
263 for (int i = 0; i < taskinfo->exceptionInfo.count; i++) {
264 - if (taskinfo->exceptionInfo.ports[i] != MACH_PORT_NULL) {
265 + if (taskinfo->exceptionInfo.ports_info[i].iip_port_object != 0) {
266 + my_per_task_info_t * _found_task;
267 +
268 if (header_required) {
269
270 - printf(" exc_port flavor <behaviors> mask \n");
271 + printf(" exc_port_object receiver_task flavor <behaviors> mask \n");
272 header_required = FALSE;
273 }
274 get_exc_behavior_string(taskinfo->exceptionInfo.behaviors[i], behavior_string, sizeof(behavior_string));
275 get_exc_mask_string(taskinfo->exceptionInfo.masks[i], mask_string, sizeof(mask_string));
276
277 JSON_OBJECT_BEGIN(json);
278 - JSON_OBJECT_SET(json, port, "0x%08x", taskinfo->exceptionInfo.ports[i]);
279 + JSON_OBJECT_SET(json, port_object, "0x%08x", taskinfo->exceptionInfo.ports_info[i].iip_port_object);
280 + JSON_OBJECT_SET(json, receiver_object, "0x%08x", taskinfo->exceptionInfo.ports_info[i].iip_receiver_object);
281 JSON_OBJECT_SET(json, flavor, "0x%03x", taskinfo->exceptionInfo.flavors[i]);
282 JSON_OBJECT_SET(json, behavior, "%s", behavior_string);
283 JSON_OBJECT_SET(json, mask, "%s", mask_string);
284 JSON_OBJECT_END(json); // exception port
285 -
286 - printf(" 0x%08x 0x%03x <%s> %s \n" , taskinfo->exceptionInfo.ports[i], taskinfo->exceptionInfo.flavors[i], behavior_string, mask_string);
287 +
288 + _found_task = get_taskinfo_by_kobject((natural_t)taskinfo->exceptionInfo.ports_info[i].iip_receiver_object);
289 +
290 + printf(" 0x%08x (%d) %s 0x%03x <%s> %s \n",
291 + taskinfo->exceptionInfo.ports_info[i].iip_port_object,
292 + _found_task->pid,
293 + _found_task->processName,
294 + taskinfo->exceptionInfo.flavors[i], behavior_string, mask_string);
295 }
296
297 }
298 @@ -389,39 +399,35 @@
299 for (int i = 0; i < excinfo->count; i++) {
300 JSON_OBJECT_BEGIN(json);
301
302 - if (excinfo->ports[i] != MACH_PORT_NULL) {
303 + if (excinfo->ports_info[i].iip_port_object != 0) {
304 if (header_required) {
305 - printf("\n exc_port flavor <behaviors> mask -> name owner\n");
306 + printf("\n exc_port_object exc_port_receiver flavor <behaviors> mask -> name owner\n");
307 header_required = FALSE;
308 }
309 get_exc_behavior_string(excinfo->behaviors[i], behavior_string, sizeof(behavior_string));
310 get_exc_mask_string(excinfo->masks[i], mask_string, sizeof(mask_string));
311
312 - JSON_OBJECT_SET(json, port, "0x%08x", excinfo->ports[i]);
313 + JSON_OBJECT_SET(json, port_object, "0x%08x", excinfo->ports_info[i].iip_port_object);
314 + JSON_OBJECT_SET(json, receiver_object, "0x%08x", excinfo->ports_info[i].iip_receiver_object);
315 JSON_OBJECT_SET(json, flavor, "0x%03x", excinfo->flavors[i]);
316 JSON_OBJECT_SET(json, behavior, "%s", behavior_string);
317 JSON_OBJECT_SET(json, mask, "%s", mask_string);
318
319 - printf(" 0x%08x 0x%03x <%s> %s " , excinfo->ports[i], excinfo->flavors[i], behavior_string, mask_string);
320 + printf(" 0x%08x 0x%08x 0x%03x <%s> %s " , excinfo->ports_info[i].iip_port_object, excinfo->ports_info[i].iip_receiver_object, excinfo->flavors[i], behavior_string, mask_string);
321
322 - ipc_info_name_t actual_sendinfo;
323 - if (KERN_SUCCESS == get_ipc_info_from_lsmp_spaceinfo(excinfo->ports[i], &actual_sendinfo)) {
324 - my_per_task_info_t *recv_holder_taskinfo;
325 - mach_port_name_t recv_name = MACH_PORT_NULL;
326 - if (KERN_SUCCESS == get_taskinfo_of_receiver_by_send_right(&actual_sendinfo, &recv_holder_taskinfo, &recv_name)) {
327 + my_per_task_info_t *recv_holder_taskinfo;
328 + mach_port_name_t recv_name = MACH_PORT_NULL;
329 + if (KERN_SUCCESS == get_taskinfo_of_receiver_by_send_right_info(excinfo->ports_info[i], &recv_holder_taskinfo, &recv_name)) {
330 + JSON_OBJECT_SET(json, name, "0x%08x", recv_name);
331 + JSON_OBJECT_SET(json, ipc-object, "0x%08x", excinfo->ports_info[i].iip_port_object);
332 + JSON_OBJECT_SET(json, pid, %d, recv_holder_taskinfo->pid);
333 + JSON_OBJECT_SET(json, process, "%s", recv_holder_taskinfo->processName);
334
335 - JSON_OBJECT_SET(json, name, "0x%08x", recv_name);
336 - JSON_OBJECT_SET(json, ipc-object, "0x%08x", actual_sendinfo.iin_object);
337 - JSON_OBJECT_SET(json, pid, %d, recv_holder_taskinfo->pid);
338 - JSON_OBJECT_SET(json, process, "%s", recv_holder_taskinfo->processName);
339 -
340 - printf(" -> 0x%08x 0x%08x (%d) %s\n",
341 - recv_name,
342 - actual_sendinfo.iin_object,
343 - recv_holder_taskinfo->pid,
344 - recv_holder_taskinfo->processName);
345 - }
346 -
347 + printf(" -> 0x%08x 0x%08x (%d) %s\n",
348 + recv_name,
349 + excinfo->ports_info[i].iip_port_object,
350 + recv_holder_taskinfo->pid,
351 + recv_holder_taskinfo->processName);
352 } else {
353 fprintf(stderr, "failed to find");
354 }
355 @@ -463,14 +469,14 @@
356 return retval;
357 }
358
359 -kern_return_t get_taskinfo_of_receiver_by_send_right(ipc_info_name_t *sendright, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info)
360 +static kern_return_t _get_taskinfo_of_receiver_by_send_right(natural_t kobject, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info)
361 {
362 *out_taskinfo = &NOT_FOUND_TASK_INFO;
363 struct k2n_table_node *k2nnode;
364
365 - for (int j = 0; j < global_taskcount; j++) {
366 - if ((k2nnode = k2n_table_lookup(global_taskinfo[j].k2ntable, sendright->iin_object))) {
367 - assert(k2nnode->info_name->iin_object == sendright->iin_object);
368 + for (unsigned int j = 0; j < global_taskcount; j++) {
369 + if ((k2nnode = k2n_table_lookup(global_taskinfo[j].k2ntable, kobject))) {
370 + assert(k2nnode->info_name->iin_object == kobject);
371
372 if (k2nnode->info_name->iin_type & MACH_PORT_TYPE_RECEIVE) {
373 *out_taskinfo = &global_taskinfo[j];
374 @@ -483,25 +489,12 @@
375 return KERN_FAILURE;
376 }
377
378 -kern_return_t get_ipc_info_from_lsmp_spaceinfo(mach_port_t port_name, ipc_info_name_t *out_sendright){
379 - kern_return_t retval = KERN_FAILURE;
380 - bzero(out_sendright, sizeof(ipc_info_name_t));
381 - my_per_task_info_t *mytaskinfo = NULL;
382 - for (int i = global_taskcount - 1; i >= 0; i--){
383 - if (global_taskinfo[i].task == mach_task_self()){
384 - mytaskinfo = &global_taskinfo[i];
385 - break;
386 - }
387 - }
388 - if (mytaskinfo) {
389 - for (int k = 0; k < mytaskinfo->tableCount; k++) {
390 - if (port_name == mytaskinfo->table[k].iin_name){
391 - bcopy(&mytaskinfo->table[k], out_sendright, sizeof(ipc_info_name_t));
392 - retval = KERN_SUCCESS;
393 - break;
394 - }
395 - }
396 - }
397 - return retval;
398 +kern_return_t get_taskinfo_of_receiver_by_send_right(ipc_info_name_t sendright, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info)
399 +{
400 + return _get_taskinfo_of_receiver_by_send_right(sendright.iin_object, out_taskinfo, out_recv_info);
401 +}
402
403 +kern_return_t get_taskinfo_of_receiver_by_send_right_info(ipc_info_port_t sendright_info, my_per_task_info_t **out_taskinfo, mach_port_name_t *out_recv_info)
404 +{
405 + return _get_taskinfo_of_receiver_by_send_right(sendright_info.iip_port_object, out_taskinfo, out_recv_info);
406 }