Вы должны использовать более современные mach_vm_address_t, mach_vm_size_t, mach_vm_allocate, mach_vm_offset_t, mach_vm_write () и т. Д. Насколько я помню из опыта, старые API не особенно хорошо работают на 64-битных процессы (которые могут быть весьма актуальны на 10.6). Кроме того, используйте pid_t вместо int для идентификатора процесса.
Другой постер прав, что вы неправильно передаете третий аргумент в vm_write, и, возможно, вы хотите передать & data, но вам, кстати, следует использовать mach_vm_write. Я ожидал, что ваша программа потерпит крах или попытается записать мусор так, как вы использовали vm_write, но возвращаемая ошибка, похоже, KERN_INVALID_ADDRESS, что указывает на то, что в процессе записи не удалось выполнить запись в адрес памяти.
Я считаю, что вы правильно подписали свой код, если task_for_pid возвращается без ошибок. Вам также следует использовать константу KERN_SUCCESS, а не 0, где это уместно.