Ejemplo n.º 1
0
void write_mem(mach_vm_address_t addr, mach_vm_address_t buf, int len) {
    // Write the traced process's memory, starting at addr, up to addr+len.
    kern_return_t ret = 0;
    ret = mach_vm_write(task, addr, buf, len);
    error(ret);
    ret = mach_vm_copy(task, addr, 10, addr);
    error(ret);
    
/*
    size_t written = 0;

    while (written < len) {
        // Write a single word of data at at time to the traced process's
        // address space.
        errno = 0;
        int data = 0;
        memcpy(&data, buf+written, std::min(sizeof(data), len-written));
        int ret = ptrace(PT_WRITE_D, pid, addr+written, data);
        if (errno) {
            perror("Error: PT_WRITE_D");
        }
        written += sizeof(data);
    }
*/
}
Ejemplo n.º 2
0
PassRefPtr<SharedMemory> SharedMemory::createWithVMCopy(void* data, size_t size)
{
    ASSERT(size);

    mach_vm_address_t address;
    kern_return_t kr = mach_vm_allocate(mach_task_self(), &address, round_page(size), VM_FLAGS_ANYWHERE);
    if (kr != KERN_SUCCESS) {
        LOG_ERROR("Failed to allocate mach_vm_allocate shared memory (%zu bytes). %s (%x)", size, mach_error_string(kr), kr); 
        return 0;
    }
    
    if (data) {
        kr = mach_vm_copy(mach_task_self(), toVMAddress(data), round_page(size), address);
        if (kr != KERN_SUCCESS) {
            LOG_ERROR("Failed to vm_copy in to shared memory (%zu bytes). %s (%x)", size, mach_error_string(kr), kr); 
            mach_vm_deallocate(mach_task_self(), address, round_page(size));
            return 0;
        }
    }

    // Create a Mach port that represents the shared memory.
    mach_port_t port;
    memory_object_size_t memoryObjectSize = round_page(size);
    kr = mach_make_memory_entry_64(mach_task_self(), &memoryObjectSize, address, VM_PROT_DEFAULT, &port, MACH_PORT_NULL);

    if (kr != KERN_SUCCESS) {
        LOG_ERROR("Failed to create a mach port for shared memory. %s (%x)", mach_error_string(kr), kr);
        mach_vm_deallocate(mach_task_self(), address, round_page(size));
        return 0;
    }

    ASSERT(memoryObjectSize >= round_page(size));

    RefPtr<SharedMemory> sharedMemory(adoptRef(new SharedMemory));
    sharedMemory->m_size = size;
    sharedMemory->m_data = toPointer(address);
    sharedMemory->m_port = port;

    return sharedMemory.release();
}