1*83812f67SIngo Weinhold // AreaSupport.cpp 2*83812f67SIngo Weinhold 3*83812f67SIngo Weinhold #include "AreaSupport.h" 4*83812f67SIngo Weinhold 5*83812f67SIngo Weinhold // get_area_for_address 6*83812f67SIngo Weinhold status_t get_area_for_address(void * address,int32 size,area_id * area,int32 * offset,void ** areaBaseAddress)7*83812f67SIngo WeinholdUserlandFSUtil::get_area_for_address(void* address, int32 size, area_id* area, 8*83812f67SIngo Weinhold int32* offset, void** areaBaseAddress) 9*83812f67SIngo Weinhold { 10*83812f67SIngo Weinhold // check parameters 11*83812f67SIngo Weinhold if (!area || !offset || size < 0) 12*83812f67SIngo Weinhold return B_BAD_VALUE; 13*83812f67SIngo Weinhold // catch NULL address case 14*83812f67SIngo Weinhold if (!address) { 15*83812f67SIngo Weinhold *area = -1; 16*83812f67SIngo Weinhold *offset = 0; 17*83812f67SIngo Weinhold return B_OK; 18*83812f67SIngo Weinhold } 19*83812f67SIngo Weinhold // get area and in-area offset 20*83812f67SIngo Weinhold *area = area_for(address); 21*83812f67SIngo Weinhold if (*area < 0) 22*83812f67SIngo Weinhold return *area; 23*83812f67SIngo Weinhold area_info areaInfo; 24*83812f67SIngo Weinhold status_t error = get_area_info(*area, &areaInfo); 25*83812f67SIngo Weinhold if (error != B_OK) 26*83812f67SIngo Weinhold return error; 27*83812f67SIngo Weinhold // check the size 28*83812f67SIngo Weinhold *offset = (uint8*)address - (uint8*)areaInfo.address; 29*83812f67SIngo Weinhold if (*offset + size > (int32)areaInfo.size) 30*83812f67SIngo Weinhold return B_BAD_VALUE; 31*83812f67SIngo Weinhold if (areaBaseAddress) 32*83812f67SIngo Weinhold *areaBaseAddress = areaInfo.address; 33*83812f67SIngo Weinhold return B_OK; 34*83812f67SIngo Weinhold } 35