Code:
unsigned long delta = (current_base - image_base);
unsigned int fixup = *(unsigned short*)(table); table += 2;
unsigned int type = (fixup >> 12) & 0x0f;
unsigned int offs = (fixup & 0xfff);
switch( type )
{
case 0: /* IMAGE_REL_BASED_ABSOLUTE */
break; /* ignore */
case 1: /* IMAGE_REL_BASED_HIGH */
*(unsigned short*)(block_rva + offs) += (delta >> 16) & 0xffff;
break;
case 2: /* IMAGE_REL_BASED_LOW */
*(unsigned short*)(block_rva + offs) += (delta & 0xffff);
break;
case 3: /* IMAGE_REL_BASED_ABSOLUTE */
*(unsigned long*)(block_rva + offs) += delta;
break;
default:
say_error("WTF? Int's not Win32 PE fixupt type");
exit(-1);
}