Ошибка makeinlineautocalloriginal originalptr is 0

Psycho Pass

3 апреля 2021

sh3ydd
Если у стоят моды то может конфликтовать фаил gta.sa exe, поэтому нужно скачать и установить оригинальную американскую версию файла запуска игры GTA San Andreas gta_sa.exe 1.0 us. Сам так и исправлял

  • пожаловаться
  • скопировать ссылку

Psycho pass
05.04.21

sh3ydd
If you have mods, the gta.sa exe file may conflict, so you need to download and install the original American version of the GTA San Andreas game launch file gta_sa.exe 1.0 us. I corrected it myself

901
36

#pragma once #ifndef INJECTOR_HAS_INJECTORADDONS_HPP #define INJECTOR_HAS_INJECTORADDONS_HPP namespace injector { struct reg_pack { // The ordering is very important, don’t change // The first field is the last to be pushed and first to be poped // PUSHFD / POPFD uint32_t ef; // PUSHAD/POPAD — must be the lastest fields (because of esp) union { uint32_t arr[8]; struct { uint32_t edi, esi, ebp, esp, ebx, edx, ecx, eax; }; }; enum reg_name { reg_edi, reg_esi, reg_ebp, reg_esp, reg_ebx, reg_edx, reg_ecx, reg_eax }; enum ef_flag { carry_flag = 0, parity_flag = 2, adjust_flag = 4, zero_flag = 6, sign_flag = 7, direction_flag = 10, overflow_flag = 11 }; uint32_t& operator[](size_t i) { return this->arr[i]; } const uint32_t& operator[](size_t i) const { return this->arr[i]; } template<uint32_t bit> // bit starts from 0, use ef_flag enum bool flag() { return (this->ef & (1 << bit)) != 0; } bool jnb() { return flag<carry_flag>() == false; } }; } namespace injectorAddons{ namespace injectorAddons_asm { // Wrapper functor, so the assembly can use some templating template<class T> struct wrapper { static void call(injector::reg_pack* regs) { T fun; fun(*regs); } static uintptr_t retOriginalCall(uintptr_t *ptr) { static uintptr_t originalCall; uintptr_t oldcall = originalCall; if (ptr != nullptr) originalCall = *ptr; return oldcall; } }; static void *retcall; // Constructs a reg_pack and calls the wrapper functor template<class W> // where W is of type wrapper inline void __declspec(naked) make_reg_pack_and_call_ret_to_original() { _asm { // Construct the reg_pack structure on the stack pushad // Pushes general purposes registers to reg_pack add[esp + 12], 4 // Add 4 to reg_pack::esp ‘cuz of our return pointer, let it be as before this func is called pushfd // Pushes EFLAGS to reg_pack // Call wrapper sending reg_pack as parameter push esp call W::call add esp, 4 push 0 call W::retOriginalCall mov retcall, eax add esp, 4 // Destructs the reg_pack from the stack sub[esp + 12 + 4], 4 // Fix reg_pack::esp before popping it (doesn’t make a difference though) (+4 because eflags) popfd // Warning: Do not use any instruction that changes EFLAGS after this (-> sub affects EF!! <-) popad // Back to normal flow push retcall ret } } }; template<uintptr_t at, uintptr_t end, class FuncT> void MakeInlineAutoCallOriginal(FuncT func) { static FuncT static_func = func; // Stores the func object memcpy(&static_func, &func, sizeof(FuncT)); // // Encapsulates the call to static_func struct Caps { void operator()(injector::reg_pack& regs) { static_func(regs); } }; // Does the actual MakeInline return MakeInlineAutoCallOriginal<Caps>(injector::lazy_pointer<at>::get(), injector::lazy_pointer<end>::get()); } template<class FuncT> void MakeInlineAutoCallOriginal(injector::memory_pointer_tr at) { typedef injectorAddons_asm::wrapper<FuncT> functor; if (false) functor::call(nullptr); // To instantiate the template, if not done _asm will fail uintptr_t originalptr = 0; void *test = injector::MakeCALL(at, injectorAddons_asm::make_reg_pack_and_call_ret_to_original<functor>).get(); originalptr = (uintptr_t)test; if (originalptr == 0) { char errMsg[1024] = {0}; DWORD readBytes = GetModuleFileName(0, errMsg, sizeof(errMsg) — 1); errMsg[1023] = 0; MessageBoxA(0, «MakeInlineAutoCallOriginal originalptr is 0«, errMsg, 0); throw std::runtime_error(«originalptr at « __FILE__ « is 0«); } functor::retOriginalCall(&originalptr); } template<class FuncT> void MakeInlineAutoCallOriginal(injector::memory_pointer_tr at, injector::memory_pointer_tr end) { //injector::MakeRangedNOP(at, end); MakeInlineAutoCallOriginal<FuncT>(at); } template<uintptr_t at, class FuncT> void MakeInlineAutoCallOriginal(FuncT func) { return MakeInlineAutoCallOriginal<at, at + 5, FuncT>(func); } }; #endif

GTA_SA.EXE 1.0 US original version for GTA San Andreas


gta_sa.exe 1.0 us is the original US version of the GTA San Andreas launch file. It is with this file that most mods, ASI plugins, CLEO scripts and graphical ENB settings work correctly. gta_sa.exe is 14 383 616 bytes in size and is a public no-dvd 1.0 us version of the game executable. So you no longer need to mount a CD / DVD disc into the drive or into the emulator.

This EXE file is used for both the single and samp versions of the game. It solves problems with not working mods, but since it lacks more recent patches from Rockstar, immediately after installation there may be some problems with the game due to its downgrade to the original version at the time of release in 2005. It’s good that all these problems already exist
ready-made solutions, which you will find below in the text on this page.

Possible problems and solutions:
— The mouse does not work — install the script Mouse Fix;
— No required screen resolution — install script Resolution 1920×1080.

One-stop solution for problems with the game version 1.0 US:
This script and the mouse will make it work as it should and any resolution available for the monitor will allow you to select and all sorts of bugs and glitches from the developers in the game will be fixed — SilentPatch 1.1.

Thus, after installing gta_sa.exe from this page, it will be enough to install the latest version of CLEO 4.3.22 at the time of publication (if you do not already have it), which already contains the ASI Loader from Silent and then install the ASI plugin — SilentPatch.

Download gta_sa.exe 1.0 us you can follow the links below on this page.


У меня проблемы с домашним заданием, и я могу воспользоваться вашей помощью.

Я получаю какую-то ошибку, когда пытаюсь запустить свою программу. Когда я компилирую его, я получаю сообщение об успехе, но когда я пытаюсь его запустить, я получаю всплывающее окно с ошибкой «Необработанное исключение в 0x011b18d2 в Project 2.exe: 0xC0000005: Место чтения нарушения доступа 0xccccccd0». Если кто-нибудь может мне помочь, я был бы признателен, спасибо.

Это код, на который я был назначен (это нельзя изменить)

#include <iostream >
#include "stack.h"using namespace std ;
int main ()
{
Stack < int > s1 , s2 ;
int element ;

s1 . push (1); s1 . push (2); s1 . push (3);
s1 . pop ( element );
cout << " s1 popped element : " << element << endl ;

s2 = s1 ;
s2 . push (4);
s2 . pop ( element );
cout << " s2 popped element : " << element << endl ;

s1 . pop ( element );
cout << " s1 popped element : " << element << endl ;

s2 . makeEmpty ();
s2 . isEmpty () ? cout << " s2 is empty n": cout << " s2 is not empty n ";

system ("pause");
return 0;
}

Это то, что я написал, чтобы дополнить код выше

template <class DataType>
struct Node{
DataType info;
Node<DataType>*next;
};

template <class DataType>
class Stack
{
public:
Stack();
void push(DataType elementToPush);
bool pop(DataType & poppedElement);
bool peek(DataType & topElement);
Stack(const Stack<DataType> &element); // Copy constructor
~Stack(); // Destructor
Stack<DataType> & operator=(const Stack<DataType> &element); //Overload assignment operator
bool isEmpty()const;
void makeEmpty();
private:
Node<DataType>*top;
Node<DataType>*header;
inline void deepCopy(const Stack<DataType> & original);
};

template<class DataType>
Stack<DataType>::Stack()
{
Node<DataType>*top=new Node<DataType>;
}

template<class DataType> // Remove the node at the front of the list and return the element
bool Stack<DataType>::pop(DataType & poppedElement)
{
Node<DataType>*ptr=top;
ptr=ptr->next;
Node<DataType>*ptr2=ptr->next;
top->next=ptr2;
poppedElement = ptr->info;
delete ptr;
return true;
}

template<class DataType> // Return the element at the front of the list wothout deleting it
bool Stack<DataType>::peek(DataType & topElement)
{
if(top->next==NULL)
return false;
topElement=top->next->info;
return true;
}

template<class DataType> // Make a new node for the element and push it to the front of the list
void Stack<DataType>::push(DataType elementToPush)
{
Node<DataType>*ptr=top;
Node<DataType>*ptr2=new Node<DataType>;
ptr2->info=elementToPush;
ptr2->next=ptr->next;
ptr->next=ptr2;
}

template<class DataType> // Check to see if the list is empty
bool Stack<DataType>::isEmpty()const
{
return top->next==NULL;
}

template<class DataType> // Empry the list out
void Stack<DataType>::makeEmpty()
{
Node<DataType>*ptr=top;
while(top->next != NULL)
{
while(ptr->next != NULL)
ptr->next;
delete ptr->next;
}
}

template<class DataType> // Deep copy
inline void Stack<DataType>::deepCopy(const Stack<DataType> & original)
{
Node<DataType>*copyptr=new Node<DataType>;
Node<DataType>*originalptr=top;
while(originalptr != NULL)
{
originalptr=originalptr->next;
copyptr->next=new Node<DataType>;
copyptr->info=originalptr->info;
}
}

template<class DataType> // Copy Constructor
Stack<DataType>::Stack(const Stack<DataType> &element)
{
deepCopy(element);
}

template<class DataType> // Destructor
Stack<DataType>::~Stack()
{
makeEmpty();
}

template<class DataType> // Overload assignment operator
Stack<DataType> & Stack<DataType>::operator=(const Stack<DataType> &element)
{
if(this == &element)
return *this;
makeEmpty();
deepCopy(element);
return *this;
}

-3

Я получил откат на мой предыдущий ответ. Может быть, этот будет лучше принят. Если вам не нравится мой выбор пустого пространства, это то, для чего нужны симпатичные принтеры. Код ниже представляет собой исходный код переформатирован. Мои мысли включены как межлинейный глянец.

Node это деталь реализации вашего Stack, Это должно быть определено как закрытое объявление типа, размещение здесь загрязняет пространство имен. Кроме того, если этот класс имеет конструктор, который либо инициализируется next в nullptr или если бы он был задан явно, некоторые ошибки, такие как обнаруженная вами, было бы легче диагностировать. Как это стоит, после Node построен, next может указывать на случайную ячейку памяти.

template <class DataType>
struct Node {
DataType info;

Рассмотрите возможность использования умного указателя здесь.

  Node<DataType>* next; };

template <class DataType>
class Stack {
public:
Stack();

Аргумент должен быть const& чтобы избежать лишнего копирования.

  void push(DataType elementToPush);
bool pop(DataType& poppedElement);

Это может быть const метод.

  bool peek(DataType& topElement);

element это плохое имя. Конструктор копирования копирует весь стек, а не только элемент.

  Stack(const Stack<DataType>& element); // Copy constructor
~Stack(); // Destructor
Stack<DataType>& operator=(const Stack<DataType>&
element);  //Overload assignment operator
bool isEmpty() const;
void makeEmpty();
private:

Рассмотрите возможность использования умного указателя здесь.

  Node<DataType>* top;

header не используется Это должно быть удалено.

  Node<DataType>* header;
inline void deepCopy(const Stack<DataType>& original); };

template<class DataType>
Stack<DataType>::Stack() {

top следует инициализировать в nullptr в списке инициализации члена. Пустой узел вы
использование здесь не обязательно, это делает ваш код более сложным, и вы в конечном итоге пропускаете его позже.

Кроме того, это серьезная ошибка. Вы назначаете здесь локальную, а не переменную-член!

  Node<DataType>* top = new Node<DataType>; }

template<class DataType> // Remove the node at the front of the list and return the element
bool Stack<DataType>::pop(DataType& poppedElement) {

Если ты хочешь ptr быть top->next просто скажи это.

  Node<DataType>* ptr = top;
ptr = ptr->next;

это ptr2 переменная не нужна. Вам просто нужно top->next = top->next->next, Также обратите внимание, что пустой элемент head добавляет здесь шум.

  Node<DataType>* ptr2 = ptr->next;
top->next = ptr2;
poppedElement = ptr->info;
delete ptr;

Вы должны проверить на предмет недостаточного возврата для возврата false в таком случае.

  return true; }

Люди довольно прощают комментарии, но лучше, если они правильно написаны и отмечены пунктуацией.

template<class DataType> // Return the element at the front of the list wothout deleting it
bool Stack<DataType>::peek(DataType& topElement) {
if (top->next == NULL) {
return false; }

topElement = top->next->info;
return true; }

template<class DataType> // Make a new node for the element and push it to the front of the list
void Stack<DataType>::push(DataType elementToPush) {

Эта переменная не имеет смысла, просто используйте top,

  Node<DataType>* ptr = top;

ptr2 может быть создан со значениями, которые вам нужны, вместо того, чтобы быть впоследствии видоизмененным Пытаться auto ptr2 = new Node<DataType> { elementToPush, ptr->next };, Также рассмотрите возможность использования умного указателя.

  Node<DataType>* ptr2 = new Node<DataType>;
ptr2->info = elementToPush;
ptr2->next = ptr->next;
ptr->next = ptr2; }

template<class DataType> // Check to see if the list is empty
bool Stack<DataType>::isEmpty()const {
return top->next == NULL; }

Эта функция просто сломана. Вы должны переосмыслить это.

template<class DataType> // Empry the list out
void Stack<DataType>::makeEmpty() {
Node<DataType>* ptr = top;

while (top->next != NULL) {

Один while петля сделает тебя. Списки линейные, а не квадратные.

    while (ptr->next != NULL) {

Это утверждение не имеет никакого эффекта; это ничего не делает. Ваш компилятор должен предупреждать об этом, включать предупреждения или увеличивать уровень предупреждения.

      ptr->next; }

delete ptr->next; } }

Это тоже очень сломано. Вам нужно перебрать два списка, поэтому вам нужны две переменные итератора. Один итератор — это то, что вы копируете, и вам просто нужно его скопировать во время чтения. Другой видоизменяет текущий объект и имеет немного больше бухгалтерского учета.

template<class DataType> // Deep copy
inline void Stack<DataType>::deepCopy(const Stack<DataType>& original) {
Node<DataType>* copyptr = new Node<DataType>;
Node<DataType>* originalptr = top;

while (originalptr != NULL) {
originalptr = originalptr->next;
copyptr->next = new Node<DataType>;
copyptr->info = originalptr->info; } }

template<class DataType> // Copy Constructor
Stack<DataType>::Stack(const Stack<DataType>& element) {
deepCopy(element); }

template<class DataType> // Destructor
Stack<DataType>::~Stack() {

Обратите внимание, что makeEmpty не удаляет ваш пустой головной узел. Это приведет к утечке узла.

  makeEmpty(); }

template<class DataType> // Overload assignment operator
Stack<DataType>& Stack<DataType>::operator=(const Stack<DataType>&
element) {
if (this == &element) {
return *this; }

makeEmpty();

Опять же, ваш пустой головной узел вызывает здесь боль. Есть ли deepCopy создать пустой головной узел или нет? Ваше использование этого в вашем конструкторе копирования, кажется, предполагает, что это делает. Ваше использование этого здесь, кажется, предполагает, что это не так. На самом деле, я думаю, что проблема в том, что makeEmpty не удаляет ваш головной узел, в противном случае эта функция и ваш деструктор будут работать правильно.

  deepCopy(element);
return *this; }

1

Понравилась статья? Поделить с друзьями:
  • Ошибка make no rule to make target
  • Ошибка lub glue pot read manual
  • Ошибка mains ccw rot
  • Ошибка luaide dll
  • Ошибка main must return int