Например, вместо ReadFile(hFile, p^, ...) написано ReadFile(hFile, p, ...), причем где-нибудь совсем в другом месте программы. Данные читаются не туда, куда указывает p, а прямо в стек.
Что значит: "данные читаются не туда. куда указывает р, а прямо в стек"?
Вообще если изучить описание функции ReadFile, то вторым параметром будет указатель на буфер с данными, как и везде.
И получается, что в случае 32 бит в стек положится указатель на данные, а не сами данные!
В 64 бит картина другая. т.к. первеы 4 параметра передаются через регистры rcx, rdx, r8, r9, а остальные через стек, но и в этом случае будет передан указатель на буфер, но никак не сам буфер.
Далее, (беру Делфи, но и в Лазарусе така же штука)
Описание функций будут идентичные:
- Код: Выделить всё
function f1(pDW:PDWORD)....
function f1(var dw:dword)...
Единственная разница - в самом теле функции синтаксис будет pDW^:= или просто dw:=
Но если посмотреть в отадочнике - будет точно такой же код - передача указателей.
Аналогичныеми будут конструкции:
- Код: Выделить всё
function f21(p :Pointer)....
function f22(b:buffer)...
Вызываем их:
- Код: Выделить всё
var buff:array [0..127] of char;
pn:pointer;
..
f21(@buff);
pn:=@buff;
f22(buff);
f22(pn^);
Двоичный код получиться одинаковый. а штука ReadFile(hFile, p, ...) либо не откампилируется, либо будет падать программа, т.к. буфер будет записан в стек и перетрет адреса возврата и другие переменные..
Тут последний параметр (dwNumberOfBytesToMap) должен быть типа size_t.
А вот эта штука уже более вероятна, т.к. неизвестно что будет в старшем двойном слове.