2012-11-24 65 views
0

我想知道這些代碼行背後的數學。處理指針。在if語句中,有人能夠通過與+運算符和&位運算符的數學來引導我嗎?我不明白這一點。使用按位運算符的PE文件格式指針

// check signatures -- must be a PE 
    pDosHeader = (PIMAGE_DOS_HEADER)hMap; 
    if(pDosHeader->e_magic != IMAGE_DOS_SIGNATURE) goto cleanup; 

    pNtHeaders = (PIMAGE_NT_HEADERS)((DWORD)hMap + pDosHeader->e_lfanew); 
    if(pNtHeaders->Signature != IMAGE_NT_SIGNATURE) goto cleanup; 

// Not dll 
if (pNtHeaders->FileHeader.Characteristics & IMAGE_FILE_DLL 
    && pNtHeaders->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE) goto cleanup; 

    // get last section's header... 
    pSectionHeader = (PIMAGE_SECTION_HEADER)((DWORD)hMap + pDosHeader->e_lfanew + sizeof(IMAGE_NT_HEADERS)); 
    pSection = pSectionHeader; 
pSection += (pNtHeaders->FileHeader.NumberOfSections - 1); 

回答

1

+運算符只是算術加號。當與指針一起使用時,它現在變得更加清晰,爲什麼C和C++中的指針是鍵入的 - 它不僅僅向地址添加字節,而且還增加了它指向的類型的大小。

因此,舉例來說,如果我們有:

struct stuff x; 
struct stuff *p = &x; /* p now points at x */ 
p = p + 1; 
/* the address at p has been incremented by the sizeof(struct stuff), 
    and is pointing at the next struct stuff in memeory */ 

用作二元運算符&是位與,其攜帶在兩個操作數的位。例如:

unsigned int b = 99;  /* 99 is binary 01100011 */ 
unsigned int w = b & 6; /* 6 is binary 00000110 */ 
/* w is now 2     2 is binary 00000010 */ 

它看起來像你的例子中,它是用來測試是否位掩碼IMAGE_FILE_DLL和IMAGE_FILE_EXECUTABLE_IMAGE結構中的成員設置。

+0

雅,我在說明書注意到這些值:0000 0000 0000 0000 0000 0000 0000 0010(IMAGE_FILE_EXECUTABLE_IMAGE) 0000 0000 0000 0000 0010 0000 0000 0000(IMAGE_FILE_DLL) ------------ ---------------------------- –

+1

+1和邊欄,當執行指針差異時,情況正好相反(並且很少提及) 。如果兩個相同類型的指針有差別(減),即'size_t n =(p-q);'其中p和q是兩個相同類型的指針,結果是它們之間的*類型對象*的數量;不是*字節數*(除非類型*是* char或unsigned char,那麼)。有時這可能會非常方便。 – WhozCraig

+0

@WhozCraig:好點。 – cdarke