1 Востаннє редагувалося Fox (12.11.2017 20:37:24)

Тема: Виклик по адресi = помилка "нарушение прав доступа".

Знайшов сорци мови pawn.
I на 32 бiтах все робить.
Але якщо перевести з 32 на 64 бiта то буде помилка (в назвi вона зазначена).
Було визначено що помилка викникала при виклику функций з pawn.
И тут делема:
Я переводив функцiю в поинтер и отримав число.
Потiм викликав функцию по тому поинтеру (все працювало).
Далi виводив число перед крашем i воно було таке саме як те по якому я успiшно викликав функцiю.
0_0
Може хто бачив таке i може пояснити чому воно крашить.

От як я викликав

AMX_NATIVE_CALL  - _stdcall
typedef cell (AMX_NATIVE_CALL *AMX_NATIVE)(struct tagAMX *amx, const cell *params);

uint64_t add = n_printfs;
printf("address: %u\n", add);
((AMX_NATIVE)(add))(NULL, NULL);

Ну а вот кусочок де краш був:

  printf("CALL %u\n", f);
  *result = f(amx,params);

f то AMX_NATIVE.
Отримання f думаю не треба.
Бо адреса то правильна.
На x32 все робить.
PS: Ось лог
address: 2090547712
CALL 2090547712

Помилка:
Необработанное исключение по адресу 0x00000000064F3A00 в Test.exe: 0xC0000005: нарушение прав доступа при исполнении по адресу 0x00000000064F3A00.


Help please ^_^

2

Re: Виклик по адресi = помилка "нарушение прав доступа".

https://github.com/compuphase/pawn

Using the AMX DLL
=================
The 32-bit AMX DLL (file AMX32.DLL) uses __stdcall calling convention, which
is the most common calling convention for Win32 DLLs. If your compiler defaults
to a different calling convention (most do), you must specify the __stdcall
calling convention explicitly. This can be done in two ways:
1. a command line option for the C/C++ compiler (look up the manual)
2. setting the macros AMX_NATIVE_CALL and AMXAPI to __stdcall before including
   AMX.H. The macros AMX_NATIVE_CALL and AMXAPI are explained earlier in this
   README.

The 32-bit AMX DLL comes with import libraries for various Win32 compilers:
o  for Microsoft Visual C/C++ version 4.0 and above, use AMX32M.LIB
o  for Borland C++ version 5.0 and for Borland C++ Builder, use AMX32B.LIB
o  for Watcom C/C++ version 10.6 and 11.0, use AMX32W.LIB

The AMX DLL already includes "core" and "console" functions, which are the
equivalents of the C files AMXCORE.C and AMXCONS.C. Console output goes to a
text window (with 30 lines of 80 characters per line) that the DLL creates.
The core and console functions are automatically registered to any Pawn
program by amx_Init().

  Microsoft Visual C/C++ version 5.0 or 6.0, 32-bit:
        cl -DAMXAPI=__stdcall prun-dll.c amx32m.lib

        (Note: the "prun-dll" example does not register additional native
        functions. Therefore, AMX_NATIVE_CALL does not need to be defined.)

   Watcom C/C++ version 11.0, 32-bit:
        wcl386 /l=nt_win /dAMXAPI=__stdcall prun-dll.c amx32w.lib

        (Note: the "prun-dll" example does not register additional native
        functions. Therefore, AMX_NATIVE_CALL does not need to be defined.)

   Borland C++ version 3.1, 16-bit:
        bcc -DAMXAPI=__cdecl -W -ml prun-dll.c amx16.lib

        (Note: the program must be compiled as a Win16 application, because
        only Windows programs can use DLLs (option -W). Using large memory
        model, option -ml, is not strictly required, but it is the most
        convenient. Finally, note that the 16-bit DLL uses __cdecl calling
        convention for its exported functions, for reasons explained below.)

3

Re: Виклик по адресi = помилка "нарушение прав доступа".

Тут i знайшов)
I це переглядав одним оком.
Але тут же нема згадок про x64

4

Re: Виклик по адресi = помилка "нарушение прав доступа".

Тут є згадка про це:

If your compiler defaults to a different calling convention (most do), you must specify the __stdcall
calling convention explicitly.

Крашить скоріше тому що ви намагаєтесь передати х64 вказівник до х32 функції.
Але так як не дуже зрозумило що ви використовуваєте для розробки - важко сказати що вам робити. Подивіться на сайті майкрософту.
P.S. Дилема - судження, де предмету надаються два суперечні положення, які виключають можливість третьої. Це не синоним "проблема", "помилка" або подібне

5

Re: Виклик по адресi = помилка "нарушение прав доступа".

наскільки я зрозумів. його для х64 немає

6 Востаннє редагувалося Fox (13.11.2017 19:21:21)

Re: Виклик по адресi = помилка "нарушение прав доступа".

varkon написав:

Тут є згадка про це:

If your compiler defaults to a different calling convention (most do), you must specify the __stdcall
calling convention explicitly.

Крашить скоріше тому що ви намагаєтесь передати х64 вказівник до х32 функції.
Але так як не дуже зрозумило що ви використовуваєте для розробки - важко сказати що вам робити. Подивіться на сайті майкрософту.
P.S. Дилема - судження, де предмету надаються два суперечні положення, які виключають можливість третьої. Це не синоним "проблема", "помилка" або подібне

Visual Studio 17

Ну "два суперечні положення" в мене як раз вийшли...
Шматок мого коду працювати може а такий же код (по сутi) не робить...


А дуже важко написати свою сценарну мову типу pawn ?
Ну я то пробував зробити "асемлер" з своими командами.
А вот чи важко перевести текст скрипта в таку штуку ?
Тобто зробити компiлятор.

7

Re: Виклик по адресi = помилка "нарушение прав доступа".

vtorgashov написав:

Ну "два суперечні положення" в мене як раз вийшли...
Шматок мого коду працювати може а такий же код (по сутi) не робить...

У вас не має ніяких "суперечних положень" - ваш код просто не працює :)

vtorgashov написав:

А дуже важко написати свою сценарну мову типу pawn ?
Ну я то пробував зробити "асемлер" з своими командами.
А вот чи важко перевести текст скрипта в таку штуку ?
Тобто зробити компiлятор.

я не знаю про "чи важко зробити" - але вам або потрібна х64 библиотека для цього, або написати свій варіант. Можно було б сказати що це й є стандартна диллема - але це не так бо варіантів у вас більше ніж два )) Тим більше що ви не написали що саме хочете досягти.

8

Re: Виклик по адресi = помилка "нарушение прав доступа".

vtorgashov написав:

А дуже важко написати свою сценарну мову типу pawn ?
Ну я то пробував зробити "асемлер" з своими командами.
А вот чи важко перевести текст скрипта в таку штуку ?
Тобто зробити компiлятор.

Приблизно отак - https://llvm.org/docs/tutorial/

9

Re: Виклик по адресi = помилка "нарушение прав доступа".

varkon написав:

Тим більше що ви не написали що саме хочете досягти.

Пiдтримку pawn скрипту для написання игрового моду...
Типу викликав createcar i в грi зявилася машина.
А pawn тому що хочу зробити сумiсним з модами для samp сервера (gta sa по iнтернету).

10

Re: Виклик по адресi = помилка "нарушение прав доступа".

vtorgashov написав:

А дуже важко написати свою сценарну мову типу pawn ?
Ну я то пробував зробити "асемлер" з своими командами.
А вот чи важко перевести текст скрипта в таку штуку ?
Тобто зробити компiлятор.

Важко, й мову асемблера нині не варто робити з нуля, бо є божественний FASM, макромова якого дозволяє легко додавати нову систему команд. Приклад підтримки CHIP-8 архітектури FASM'івським асемблером.

Подякували: Fox, leofun012

11 Востаннє редагувалося Fox (14.11.2017 18:55:55)

Re: Виклик по адресi = помилка "нарушение прав доступа".

0xDADA11C7 написав:
vtorgashov написав:

А дуже важко написати свою сценарну мову типу pawn ?
Ну я то пробував зробити "асемлер" з своими командами.
А вот чи важко перевести текст скрипта в таку штуку ?
Тобто зробити компiлятор.

Важко, й мову асемблера нині не варто робити з нуля, бо є божественний FASM, макромова якого дозволяє легко додавати нову систему команд. Приклад підтримки CHIP-8 архітектури FASM'івським асемблером.

Ну не то щоб мова...
С++ програма котра дивиться файл и робить те що задано командами...
Приклад: бачить 0x90 i 4 байта числа = пошук нативу в map по числу (аля id) i виклик його.