Форум: "Система";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Вниз
Перевод структуры Си на Pas Найти похожие ветки
← →
Burmistroff (2002-06-03 21:46) [0]Помогите пожалуйста перевести с Си на Pas:
Имеется структера
typedef struct IMAGE_IMPORT_DESCRIPTOR {
union {
DWORD Characteristics;
DWORD OriginalFirstThunk;
} u;
DWORD TimeDateStamp;
DWORD ForwarderChain;
DWORD Name;
DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;
Возникает вопрос:
1) что такое union?
2) реальный размер структуры 20 байт, но по моим подсчетам получается 24. Откуда берутся лишние 4 байта?
Благодарю за помошь
← →
vuk (2002-06-03 22:38) [1]union - объединение в C. В паскале объединению соответствует запись с вариантной частью.
IMAGE_IMPORT_DESCRIPTOR = record
u : record
case integer of
0 : (Characteristics : DWORD);
1 : (OriginalFirstThunk : DWORD);
end;
TimeDateStamp : DWORD;
ForwarderChain : DWORD;
Name : DWORD;
FirstThunk : DWORD;
end;
← →
paul_shmakov (2002-06-03 23:50) [2]только советую packed record использовать. здесь это не критично, но обчно бывает полезно.
← →
vuk (2002-06-04 00:33) [3]to paul_shmakov:
Полностью поддерживаю. Я сначала так и написал, но потом подумал, что packed в данном случае будет лишним.
← →
cdaDmitriy (2002-06-04 11:49) [4]>> Burmistroff
Твоя почта не работает У меня есть примеры использования
IMAGE_IMPORT_DESCRIPTOR
если хочешь пришли запрос на мою почту
← →
Burmistroff (2002-06-04 23:09) [5]Благодарю за помощь.
Тогда, если я не ошибаюсь, структура
typedef struct IMAGE_THUNK_DATA {
union {
uint8_t* ForwarderString;
uint32_t* Function;
uint32_t Ordinal;
PIMAGE_IMPORT_BY_NAME AddressOfData;
} u1;
} IMAGE_THUNK_DATA;
будет выглядеть вот так:
IMAGE_THUNK_DATA = packed record
u1: packed record
case integer of
0: (ForwarderString: PByte);
1: (Function_: PDWORD);
2: (Ordinal: DWORD);
3: (AddressOfData: PIMAGE_IMPORT_BY_NAME);
end;
end;
Но возникает проблема:
Если все верно, тогда каким то образом если этой структуре соответсвуют в памяти байты {75 32 F5 77}, должно получаться, что AddressOfData = {22 41 00 00} (или $4122), однако этого не происходит. Может ли все дело быть в этом "union" или ошибка где-то в другм месте?
← →
cdaDmitriy (2002-06-05 09:23) [6]>> Burmistroff
КОГДА ДОВЕДЕШЬ до "ума" эту задачу пришли мне исходники
если не жалко. Или вопросы более детально на email
← →
KSergey (2002-06-05 12:21) [7]Не понятно что значит "соответсвуют в памяти байты {75 32 F5 77}" Это адреса, данные или что? И как они соотносятся с {22 41 00 00}? Я что-то никак не скорелирую. Выразитесь яснее, пожалуйста
← →
Burmistroff (2002-06-05 15:20) [8]> cdaDmitriy
OK
> KSergey
Т.е. переменная типа ^IMAGE_THUNK_DATA имеет адрес (допустим) $4000. Причём в памяти по этому адресу (от $4000 до $4003) лежат четыре байта {75 32 F5 77}. Т.е. это данные массива IMAGE_THUNK_DATA.
Так вот, если верить словам автора http://www.wasm.zite.ru/tuts/petut06.shtml и http://ddcrack.myetang.com/material/pe_tutorial/pe-tut6.htm, этот адрес является указателем на другой массив. Опытным путём мне удалось установить адрес этого массива - $4122. Т.е. если бы всё было верно, то массив ^IMAGE_THUNK_DATA интерпритировался бы как {00 00 22 41}. Вот я и думаю, может в слове union и заложен алгоритм правильной интерпритации данных, ибо в исходниках на Си нет не каких хитрых преобразований полученного адреса (надо полагать что у них он "читается" сразу как надо).
← →
Cobalt (2002-06-14 07:27) [9]А вы не путаете содержимое файла и содержимое памяти?
Страницы: 1 вся ветка
Форум: "Система";
Текущий архив: 2002.08.26;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.007 c