unsigned int MACHFile::getSectionHeaderOffset(unsigned int nSection) { unsigned int nNumberOfSegments=getNumberOfSegments(); unsigned int nResult=0; unsigned int nCurrentSection=0; for(int i=0; i<nNumberOfSegments; i++) { nResult=getSegmentHeaderOffset(i); nResult+=getSegmentHeaderSize(); for(int j=0; j<getSegment_nsects(i); j++) { if(nCurrentSection+j==nSection) { return nResult; } nResult+=getSectionHeaderSize(); } nCurrentSection+=getSegment_nsects(i); } emit appendError(QString("Invalid section number: %1").arg(nSection)); return 0; }
bool MACHFile::isSegmentPresent(unsigned int nSegment) { if(nSegment<getNumberOfSegments()) { return true; } emit appendError(QString("Invalid Segment number: %1").arg(nSegment)); return false; }
unsigned int MACHFile::calculateRawSize() { unsigned int nResult=getMachHeaderSize(); for(int i=0; i<getNumberOfSegments(); i++) { nResult=qMax(nResult,getSegmentFileOffset(i)+getSegmentFileSize(i)); } return nResult; }
unsigned int MACHFile::getNumberOfSections() { unsigned int nResult=0; unsigned int nNumberOfSegments=getNumberOfSegments(); for(int i=0; i<nNumberOfSegments; i++) { nResult+=getSegment_nsects(i); } return nResult; }
unsigned long long MACHFile::RVAToOffset64(unsigned long long nRVA) { unsigned int nNumberOfSegments=getNumberOfSegments(); for(int i=0; i<nNumberOfSegments; i++) { if((getSegment_vmaddr64(i)<=nRVA)&&(nRVA<getSegment_vmaddr64(i)+getSegment_vmsize64(i))) { return getSegment_fileoff64(i)+nRVA-getSegment_vmaddr64(i); } } emit appendWarning(QString("Invalid RVA: %1").arg(nRVA,8,16,QChar('0'))); return -1; }
unsigned long long MACHFile::OffsetToRVA64(unsigned long long nOffset) { unsigned int nNumberOfSegments=getNumberOfSegments(); for(int i=0; i<nNumberOfSegments; i++) { if((getSegment_fileoff64(i)<=nOffset)&&(nOffset<getSegment_fileoff64(i)+getSegment_filesize64(i))) { return getSegment_vmaddr64(i)+nOffset-getSegment_fileoff64(i); } } emit appendWarning(QString("Invalid offset: %1").arg(nOffset,8,16,QChar('0'))); return -1; }
void PathComponent::render(Renderer *renderer) const { renderer->begin(RENDERTYPE_LINE_STRIP); for(int i = 0; i < getNumberOfSegments(); i++) { PathSegment *segment = getSegment(i); float increment = Path::getSubdivideLength() / segment->getLength(); renderer->vector(segment->getPoint(0.0f)); for(float t = increment; t < 1.0f; t += increment) { renderer->vector(segment->getPoint(t)); } renderer->vector(segment->getPoint(1.0f)); } renderer->end(); }