关于PE文件中IMAGE_IMPORT_BY_NAME结构读取的疑问
PE文件中IMAGE_IMPORT_BY_NAME结构,在winnt.h中定义如下:
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
该结构第二个成员 BYTE Name[1] 占用的空间大小是可变的,
那怎么设置ReadFile函数的读入的数据大小呢?
已反复观看http://bbs.pediy.com/showthread.php?t=64701此贴,
仍不解,希望高手指点明示。。
原文如下:
typedef struct _IMAGE_IMPORT_BY_NAME {
WORD Hint;
BYTE Name[1];
} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
Hint, 就是那个019d 了,BYTE Name[1], 这个变量定义看起来很奇怪,是吗?
代学生: 是的,我很少见到这种定义。
通常我们会定义 char buffer[256], BYTE data[8]; 等类型。
BYTE Name[1], 只包含一个元素的数组,它也装不下后面的"MessageBoxA"字符串啊。
代老师:这种定义是一种指针的变通用法。
如果你真要定义成数组来包含后面的字符串,你定义成多大呢?定义成100,短字符串浪费,
长字符串可能就真能碰到一个101个字符的名字,你定义的还是占不下。
所以说,这个Name[1], 不是要你往里面装东西的,C 语言里,你可以借助这个Name 变量访问到它对应的地址。
这种用法通常是很少用的。因为它毛病很多,例如结构后面不能再定义其它变量了,必须是最后一个,定义了
数组又不用它装东西,也不符合数组的初衷. 所以你只有明白这个道理就可以了。
代学生:既然它那么不好用,为什么还那样定义呢。
代老师:还是那句话,是变通。
你看,它简洁,它完成了使命。否则你就要把结构变一变,例如按常规估计应该是这样子。
WORD Hint; BYTE *pName; 然后你要求微软说,Hint 后面不要跟字符串,要跟一个地址。这样C语言好写。
好比说大部分人沿着盘山路往山上走,也有人愿意盘着荆棘往山上爬,后者绕了近路,但风险也大。
代学生:讲了这么多,其实我看一个word 后面跟着一个0字终结符字符串,还是很好理解的吗。
代老师:C 语言以其简洁,高效,使我们受益良多。但在某些特殊的情况下,它也会力不从心。有时刻当你看着一堆堆
结构套结构,一堆堆宏套宏令你头晕时,而看看它最终的list 表或二进制输出反而能令你豁然开朗。
哦,有点扯远了。 我还是最喜欢C的。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课