请高手指教以下代码是啥意思?解决方案

请高手指教以下代码是啥意思?
在修改PE文件的源代码中,有这么一条语句,看了半天不懂
还请高手指教:
// 得到代码偏移,用代码段起始RVA减去此段的物理偏移
// 应为程序的入口计算公式是一个相对的偏移地址,计算公式为:
// 代码的写入地址+dwCodeOffset.
dwCodeOffset=header->opt_head.BaseOfCode-header->section_header[0].PointerToRawData;

// 保存旧的程序入口地址.
dwOldEntryAddress=header->opt_head.AddressOfEntryPoint;

// 计算新的程序入口地址.  
dwNewEntryAddress=dwEntryWrite+dwCodeOffset;
按照个人的理解这是计算PE新的入口地址的代码,但是有点不是太懂!PointerToRawData应该是指向硬盘中文件的指针,跟BaseOfCode(文件映射的执行代码RVA)好像不能发生什么关系吧。
请大侠不吝赐教,感激!
分数不多见谅!

------解决方案--------------------
ImageBase :指出文件的优先装入地址。也就是说当文件被执行时,如果可能的话,Windows优先将文件装入到由ImageBase字段指定的地址中,只有指定的地址已经被其他模块使用时,文件才被装入到其他地址中。一般EXE文件的默认优先装入地址被定为00400000h,而DLL文件的默认优先装入地址被定为10000000h。

AdressOfEntryPoint表示程序被装载入内存后的开始执行点,为一个RVA地址。如果在一个可执行文件上附加了一段代码并想让这段代码首先被执行,那么只需要将这个入口地址指向附加的代码就可以了。
估摸着楼主就是想修改这个地址 ^_^。

PE文件中所有节的属性都被定义在节表中,节表由一系列的IMAGE_SECTION_HEADER结构排列而成,每个结构用来描述一个节,结构的排列顺序和它们描述的节在文件中的排列顺序是一致的。

IMAGE_SECTION_HEADER结构的定义如下:

IMAGE_SECTION_HEADER STRUCT

Name1 db IMAGE_SIZEOF_SHORT_NAME dup(?) ;8个字节的节区名称

union Misc

PhysicalAddress dd ?

VirtualSize dd ? ;节区的尺寸

ends

VirtualAddress dd ? ;节区的RVA地址

SizeOfRawData dd ? ;在文件中对齐后的尺寸

PointerToRawData dd ? ;在文件中的偏移

PointerToRelocations dd ? ;在OBJ文件中使用

PointerToLinenumbers dd ? ;行号表的位置(供调试用)

NumberOfRelocations dw ? ;在OBJ文件中使用

NumberOfLinenumbers dw ? ;行号表中行号的数量

Characteristics dd ? ;节的属性

IMAGE_SECTION_HEADER ENDS

举个例子,某个PE文件的区块表中关于代码段的描述如下:
代码段的文件偏移地址为 PointerToRawData = 500, 大小SizeOfRawData = 400,
代码段的RVA偏移地址为 VirtualAddress  = 1000, VirtualSize = 400.
意思是指代码段的起始点在文件偏移为500处,大小为400,如果装入内存,那么代码段将被装入虚拟偏移为1000处,大小仍为400。

那么,从文件装入代码段到内存需要偏移dwCodeOffset = VirtualAddress - PointerToRawData = 500;
有了这个偏移量dwCodeOffset,我们就能完成代码段的文件偏移到虚拟偏移的转换。

如:
文件偏移为800的地方在代码段内,那么这个文件偏移地址装载入内存后的RVA将是 800+dwCodeOffset = 1300.

至于楼主这个:
// 计算新的程序入口地址.
dwNewEntryAddress=dwEntryWrite+dwCodeOffset; //文件偏移到虚拟偏移(RVA)的转换
估计dwEntryWrite是个文件偏移,在这个地方写入了某些数据,然后需要将程序入口点改到这个地方。
但是由于程序入口点指的是一个RVA值,所以需要将dwEntryWrite由文件偏移转换为RVA