Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Вниз

Определение конца записи в памяти переменной или функции   Найти похожие ветки 

 
ikivio   (2002-09-09 04:36) [0]

Господа! У меня такой вопрос.
var
Buf:string;
PBuf:Pointer;
-----
Buf:="uethruhgreh";
PBuf:=@Buf;
for i:=0 to "Конец записи в памяти"
do Result:=Result+Char(Pointer(Cardinal(PBuf)+i)^);
Так вот. Как определить этот "Конец записи в памяти" ?
Помогите, кто знает !


 
Aleks1   (2002-09-09 05:49) [1]

Length(Buf) тебе поможет, надеюсь.
Токмо Buf[0] - это не то, что ты хочешь поиметь, однако.


 
Юрий Зотов   (2002-09-09 09:42) [2]

Если стоят опции по умолчанию, то "Конец записи в памяти" (той записи, на которую указывает @Buf) равен трем. При любой длине строки Buf. Поскольку сама переменная Buf - это указатель, а его длина - 4 байта.

Поэтому похоже, что код ошибочен. Вы бы рассказали о самой задаче.


 
ikivio   (2002-09-09 10:12) [3]

Вот часть кода:

function ModuleSizeFromAddress(pAddr:Pointer):Cardinal;
var
mbi:MEMORY_BASIC_INFORMATION;
begin
Result:=0;
if VirtualQuery(pAddr,mbi,SizeOf(mbi))<>0 then
Result:=mbi.RegionSize;
end;

function ShowMemoryBlockString(PMem:Pointer):string;
var
Sz,i:Cardinal;
begin
i:=0;
Sz:=ModuleSizeFromAddress(PMem);
while (i<Sz) do
begin
Result:=Char(Pointer(Cardinal(PMem)+i)^);
inc(i);
end;
end;

asm функция считываються нормально
Если PMem объявить не как Pointer,а как PChar тогда переменная
тоже с считываються нормально.
Только считываються гораздо больше,чем надо.
Например:
Var
Buf:string="string1" считаеться примерно
так: string1юф2й3ксфцкn.as34il7*&%^(&$%щж93794ждфвп


 
ikivio   (2002-09-09 10:17) [4]

Ой! Там разумеется не Result:=Char(Pointer(Cardinal(PMem)+i)^);
а: Result:=Result+Char(Pointer(Cardinal(PMem)+i)^);
Извините.


 
Delphist   (2002-09-09 12:53) [5]

Попробуй считать несколько переменных и сравнить комбинации,
которыми они заканчиваються.


 
Старый Паскалист   (2002-09-09 13:51) [6]

Есть несколько уровней разбивки памяти.

VirtualAlloc выделяет память большими кусками (страницами по 4 кБ), единица резервирования вообще 64 кБ, если я не ошибаюсь.

Чтобы выделить маленькое кол-во памяти, пользуются кучами,
которые сами выделяют через VirtualAlloc большие куски и передают
их пользователям в разбитом виде (и соответственно, сами хранят
информацию о разбивке).

Так VirtualQuery возвращает информацию о памяти, выделенной через VirtualAlloc, т.е. на самом крупном уровне.
Так что твоя строка могла быть гораздо длинней, если бы ноль не попался.

Ты посмотри, чему равен RegionSize.

Есть ф-и для работы с кучами, но мне лень сейчас во всём этом разбираться.

Но размер переменной, помещённой в стек, или размер тела функции ты всё равно так не получишь.
Размер ф-и обычно определяется как
FncSize :=
Integer(@NextFunc) - Integer(@FuncWhichSizeYouWantToFind);


 
Старый Паскалист   (2002-09-09 13:55) [7]

PS Смотри Рихтера, у него этому целая глава посвящена (или даже несколько). Нет его под рукой, к сожалению.


 
ikivio   (2002-09-10 14:06) [8]

У меня, к сожалению, нет Рихтера. Может кто просто совет даст?


 
Старый Паскалист   (2002-09-10 14:18) [9]

Скажи толком, какая задача перед тобой стоит.
(А не КАК ты её хочешь решать).
Я не уверен, что она решается только таким способом.


 
ikivio   (2002-09-10 14:57) [10]

Я пишу SareWere prog. Пароль для кодировки некотрых
внутренних вещей (например ресурсов)беру из самого ExeFile.
При этом использую разные пароли(в зависимости от того
какую процедуру из памяти считываю).
Поэтому мне точно надо знать где я читаю свою процедуру, а
где уже что-то лишнее.
Да и некоторые вещи я храню внутри asm procedure,
их мне тоже надо получить.
Все решено, загвоздка только в определении конца процедуры.


 
ikivio   (2002-09-11 04:11) [11]

FncSize :=
Integer(@NextFunc) - Integer(@FuncWhichSizeYouWantToFind);
Не дает верного результата...


 
Стрелочник   (2002-09-11 04:26) [12]

А что. Для "SareWere" программы и "так сойдет".


 
Delphist   (2002-09-11 07:46) [13]

Да... с процедурами проблеммы...
А всеже интересная и полезная задачка.


 
Alx2   (2002-09-11 08:05) [14]

>ikivio © (10.09.02 14:57)
Компилируй с построением map-файла. В нем есть вся необходимая информация.


 
ikivio   (2002-09-11 17:55) [15]

Alx2
Можно поподробнее ?


 
Alx2   (2002-09-11 18:13) [16]

>ikivio © (10.09.02 14:57)
>ikivio © (11.09.02 17:55)

Project->Options->Linker->MapFile->Detailed

Крохотная выдержка оттоль (из map файла то бишь):

0001:0000A99C GetEraYearOffset
0001:00018D14 GetErrorInfo
0001:00099090 GetErrorString
0001:0000BDAC GetExceptionClass
0001:0000BF90 GetExceptionObject
0001:000A364C GetExeName
0001:0001B05C GetFieldClassTable
0001:0009FA48 GetFieldConstraint
0001:0008EE94 GetFieldInfo
0001:00098348 GetFieldSource
0001:000002C4 GetFileSize
0001:000002BC GetFileType
0001:00005EE8 GetFileVersionInfo
0001:00005EF0 GetFileVersionInfoSize
0001:000186F4 GetFloatProp
0001:00006278 GetFocus

Здесь адреса всех процедур/функций из приложения. Кроме того, в режиме Detaild дается информация и о том, с какого адреса памяти процесса начаинается откомпилированный код заданной строки исходника. Важно только учесть, с какого адреса загрузится сам exe-файл. Но с этим проблем обычно не бывает. Адреса совпадают. Но надо бы следить за image base - мало ли что :)

PS.
Адреса действительны для адресного пр-ва процесса. Но это - само собою :)


 
Delphist   (2002-09-12 05:07) [17]

Alx2
А как программно использовать этот файл и где взять его описание?


 
Alx2   (2002-09-12 07:59) [18]

>Delphist (12.09.02 05:07)
Как-то слишком обще уж звучит: "как программно использовать"...
Когда проект уже готов - заглянуть в map-файл, найти интересующее и использовать в проекте.

А по поводу описания - достаточно взглянуть на map-файл. Там все написано что к чему.



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2002.09.23;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.008 c
3-73577
Азазелло
2002-09-03 14:48
2002.09.23
Нормально ли работает Filtered у TClientDataSet?


1-73734
Демонов Е.В.
2002-09-11 14:41
2002.09.23
Кде Найти Остальные Главы


1-73718
Alex Che
2002-09-11 12:07
2002.09.23
Время (очень быстрый таймер)


1-73687
kay
2002-09-11 04:42
2002.09.23
Panel


7-73901
soldat
2002-06-27 11:00
2002.09.23
фискальный регистратор





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский