Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Система";
Текущий архив: 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.47 MB
Время: 0.007 c
1-84978
Natali
2002-08-14 08:56
2002.08.26
Rasapi32.dll


6-85161
heex
2002-06-14 17:38
2002.08.26
все ли в сети закрыли ДАННОЕ приложение.


3-84868
PSA
2002-08-05 15:43
2002.08.26
Из txt в dbf


14-85219
AL2002
2002-07-29 18:06
2002.08.26
Двубайтовые числа


1-85097
dmtr
2002-08-14 15:34
2002.08.26
Windows 2000 Advanced Server





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский