status_t mem_write(void* cookie, off_t position, const void* buffer, size_t* numBytes) { void *virtualAddress; area_id area; status_t status = B_OK; /* check permissions */ if (getuid() != 0 && geteuid() != 0) { *numBytes = 0; return EPERM; } area = mem_map_target(position, *numBytes, B_WRITE_AREA, &virtualAddress); if (area < 0) { *numBytes = 0; return area; } if (user_memcpy(virtualAddress, buffer, *numBytes) != B_OK) status = B_BAD_ADDRESS; delete_area(area); return status; }
status_t mem_read(void* cookie, off_t position, void* buffer, size_t* numBytes) { void *virtualAddress; area_id area; /* check permissions */ if (getuid() != 0 && geteuid() != 0) { *numBytes = 0; return EPERM; } area = mem_map_target(position, *numBytes, B_READ_AREA, &virtualAddress); if (area < 0) { *numBytes = 0; return area; } memcpy(buffer, virtualAddress, *numBytes); delete_area(area); return B_OK; }