2014-02-02 1 views
3

документации Microsoft для PE/COFF говорит о поле типа в таблице символов:PE/COFF поле типа символа

«Самый старший байт указывает ли символ является указателем, функция возвращения, или массив из базовый тип, указанный в LSB. Инструменты Microsoft используют это поле только для указания, является ли символ функцией, так что только два результирующих значения равны 0x0 и 0x20 для поля Type. "

Однако документация и winnt.h указывают, что IMAGE_SYM_DTYPE_FUNCTION = 2, а не 0x20. Даже если это считается значением MSB, это даст значение для всего поля 0x200, а не 0x20.

Что мне не хватает?

ответ

4

Проверить WINNT.H для следующих линий:

// type packing constants 

#define N_BTMASK       0x000F 
#define N_TMASK        0x0030 
#define N_TMASK1       0x00C0 
#define N_TMASK2       0x00F0 
#define N_BTSHFT       4 
#define N_TSHIFT       2 
// MACROS 

// Basic Type of x 
#define BTYPE(x) ((x) & N_BTMASK) 

// Is x a pointer? 
#ifndef ISPTR 
#define ISPTR(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_POINTER << N_BTSHFT)) 
#endif 

// Is x a function? 
#ifndef ISFCN 
#define ISFCN(x) (((x) & N_TMASK) == (IMAGE_SYM_DTYPE_FUNCTION << N_BTSHFT)) 
#endif 

Так что, кажется, официальный MSB, LSB описание неправильно - они не являются байтами, но грызет. Таким образом, 0x20 будет функцией (MS nibble = 2), возвращающей базовый тип IMAGE_SYM_TYPE_NULL (LS nibble = 0).

Смежные вопросы