void JITLinker::ReferenceHelper :: writeReference(MemoryWriter& writer, void* vaddress, bool relative, size_t disp) { if (!_owner->_virtualMode) { ref_t address = (ref_t)vaddress; // calculate relative address if (relative) address -= ((ref_t)writer.Address() + 4); writer.writeDWord(address + disp); } else if (relative) { writer.writeRef(((ref_t)vaddress | mskRelCodeRef), disp); } else writer.writeRef((ref_t)vaddress, disp); }
void JITCompiler32 :: fixVMT(MemoryWriter& vmtWriter, void* classClassVAddress, void* packageVAddress, int count, bool virtualMode) { _Memory* image = vmtWriter.Memory(); // update class package reference if available if (packageVAddress != NULL) { int position = vmtWriter.Position(); vmtWriter.seek(position - 0x10); if (virtualMode) { vmtWriter.writeRef((ref_t)packageVAddress, 0); } else vmtWriter.writeDWord((int)packageVAddress); vmtWriter.seek(position); } // update class vmt reference if available if (classClassVAddress != NULL) { vmtWriter.seek(vmtWriter.Position() - 4); if (virtualMode) { vmtWriter.writeRef((ref_t)classClassVAddress, 0); } else vmtWriter.writeDWord((int)classClassVAddress); } // if in virtual mode mark method addresses as reference if (virtualMode) { ref_t entryPosition = vmtWriter.Position(); for (int i = 0 ; i < count ; i++) { image->addReference(mskCodeRef, entryPosition + 4); entryPosition += 8; } } }