Указатели формата файла PE с использованием побитовых операторов

Я хотел знать математику за этими строками кода. Работа с указателями. Может ли кто-нибудь провести меня по математике с операторами + и & побитовый оператор в операторе 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);

0

Решение

Оператор + — это просто арифметический плюс. При использовании с указателями теперь становится понятнее, почему указатели в 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 в элементах структуры.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]