Доброго времени суток.
Я в студии создал свою секцию, #pragma data_seg(".1111"), как получить в коде её адрес?
Компилирую по заданной базе и нахоху пока так:
Здравствуйте, reider, Вы писали:
R>Доброго времени суток. R>Я в студии создал свою секцию, #pragma data_seg(".1111"), как получить в коде её адрес? R>Компилирую по заданной базе и нахоху пока так: R>
Как минимум, для получения pNtHeaders вызвать ImageNtHeader из Dbghelp.dll (документированная "отладочная" версия) или RtlImageNtHeader из ntdll.dll (недокументированная внутренняя версия)
Я ещё не вижу, зачем dwImportDirectoryVA , но если надо, то [Rtl]ImageDirectoryEntryToData[Ex]
R>Компилирую по заданной базе
R> lpFile = (LPVOID)0x00400000;
Да, базу можно узнать GetModuleHandle вызовом. Для exe просто передать NULL как имя, для DLL-запомнить в DLLmain, в общем случае GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и передачей своей глобальной переменной.
Здравствуйте, Alexander G, Вы писали:
AG>Здравствуйте, reider, Вы писали:
R>>Компилирую по заданной базе
R>> lpFile = (LPVOID)0x00400000;
AG>Да, базу можно узнать GetModuleHandle вызовом. Для exe просто передать NULL как имя, для DLL-запомнить в DLLmain, в общем случае GetModuleHandleEx с флагом GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS и передачей своей глобальной переменной.
Здравствуйте, EreTIk, Вы писали:
ETI>Здравствуйте, reider, Вы писали:
R>>Я имел ввиду некой прагмой или макросом
ETI>__ImageBase
А на секцию? Например .reloc
Здравствуйте, reider, Вы писали:
R>Есть ли более человеческий способ?
А такое не пойдет ?
#pragma data_seg(".1111")
int x = 5;
#pragma data_seg()
int main()
{
int * px = &x;
}
Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.
Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть
Здравствуйте, flаt, Вы писали:
F>Дело не сколько в Vista, а в присутствии ".reloc" и флаге ASLR. Да и до неё ImageBase мог выставляться флагом линкера.
Со вторым согласен, а насчет первого сомнения. Зачем релокировать EXE, если с него загрузка и начинается ?
Во всяком случае я не слышал, чтобы до Vista hInstance не был равен 0x400000 без того, чтобы это установить в опциях линкера, что для EXE практически никто не делал.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, reider, Вы писали:
R>>Есть ли более человеческий способ?
PD>А такое не пойдет ?
PD>
PD>#pragma data_seg(".1111")
PD>int x = 5;
PD>#pragma data_seg()
PD>int main()
PD>{
PD> int * px = &x;
PD>}
PD>
PD>Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.
PD>Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть
Адрес базы у меня именно такой потому как я выключил reloc секции указав параметр "фиксированная база".
Так не получилось, так как в секции много переменных и линкер их перемешивает.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Здравствуйте, reider, Вы писали:
R>>Есть ли более человеческий способ?
PD>А такое не пойдет ?
PD>
PD>#pragma data_seg(".1111")
PD>int x = 5;
PD>#pragma data_seg()
PD>int main()
PD>{
PD> int * px = &x;
PD>}
PD>
PD>Иными словами, взять указатель на первую переменную в секции. Для надежности можно сбросить 12 младших бит в указателе, хотя (сейчас попробовал) они и так сброшены.
PD>Кстати, ты зря думаешь, что hInstance = 0x00400000. Начиная с Vista, он где угодно может быть
Спасибо, понял в чём ошибка. У меня секция была в отдельном cpp файле, который имел h файл с extern.
Так вот Адрес начала секции равен адресу присваиваемому первой переменной extern вне зависимости от её положения в секции
Но это укзатель на данные секции. А мне интересен адрес заголовка секции