Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.08.26;
Скачать: CL | DM;

Вниз

Перевод структуры Си на 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;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.02 c
14-85186
Mihail
2002-07-29 13:27
2002.08.26
Мастера, ПОМОГИТЕ, не могу установить.


1-85123
kerkonst
2002-08-15 11:02
2002.08.26
Как дождатся конца работы проги, запущенной через ShellExecutе


14-85234
VEG
2002-07-30 23:50
2002.08.26
Какой нужен возраст, чтобы стать


1-85100
MrAngel
2002-08-14 11:59
2002.08.26
Flat Scrolls ? С возможностью изменения всех цветов? Реально ли ?


1-84949
Orc
2002-08-15 07:02
2002.08.26
Работа с формой