0

これらのコード行の背後にある計算を知りたかったのです。ポインタの扱い。if ステートメントで + 演算子と & ビット単位演算子を使用して数学を教えてもらえますか? そこだけはよくわかりません。

 // 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);
4

1 に答える 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 */

二項演算子として使用される & はビットごとの AND であり、両方のオペランドで設定されたビットを運びます。例えば:

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 が構造体メンバーに設定されているかどうかをテストするために使用されているようです。

于 2012-11-24T21:31:02.373 に答える