CreateThread crash

225
02 сентября 2018, 23:50
DWORD WINAPI getOffset(uintptr_t BaseAddy, uintptr_t endAddy, byte aob[], int bytessize, LPVOID returnValue)
{
    MessageBox(NULL, "321", "123", MB_OK);
    return 0;
}

Вызываю:

CreateThread(NULL, NULL, reinterpret_cast<LPTHREAD_START_ROUTINE>(getOffset(BaseAddy + 0xd7d000, endAddy, presentAOB, 11, &presentOffset)), NULL, NULL, NULL);

Происходит краш программы сразу после MessageBox (на самом return 0). В чем может быть проблема и как ее исправить?

Answer 1

Ваша функция getOffset возвращает 0, который вы переинтерпретируете в null-указатель и передаете в качестве указателя на функцию потока. Разумеется, все падает.

Функция потока не может быть null-указателем.

Если ваша задача состоит в том, чтобы вызвать вашу функцию из потока с вышеприведенными параметрами, то делать вам это придется следующим образом

  1. Написать функцию потока, из которой будет делаться вызов getOffset

    DWORD myThreadFunction(LPVOID p)
    {
      ...
      getOffset(...);
      return 0;
    }
    
  2. Подготовить структуру для передачи ваших параметров в поток, заполнить ее и передать указатель на нее в CreateThread вместе с указателем на функцию потока

    struct MyThreadParams
    {
      uintptr_t BaseAddy, endAddy;
      byte *aob;
      int bytessize;
      LPVOID returnValue;
    };
    ...
    MyThreadParams params = 
      { BaseAddy + 0xd7d000, endAddy, presentAOB, 11, &presentOffset };
    CreateThread(NULL, 0, myThreadFunction, &params, 0, NULL);
    
  3. В функции потока получить этот указатель на структуру и использовать ее поля как аргументы для вызова вашей функции getOffset

    DWORD myThreadFunction(LPVOID p)
    {
      MyThreadParams *params = (MyThreadParams *) params;
      getOffset(params->BaseAddy, params->endAddy, params->aob, params->bytessize, 
        params->returnValue);
      return 0;
    }
    
READ ALSO
Правильно ли я корректирую движение в игре при падении fps?

Правильно ли я корректирую движение в игре при падении fps?

Изучаю движок cocos2d-x, не очень знаком с этой темой, поэтому не уверен, верно ли всё сделал

231
unsigned char как байтовое число

unsigned char как байтовое число

На MSDN указано, что в C++ никогда не было типа byte и вместо него следует использовать тип unsigned charНо при попытке вывести такое значение

244
minGW для qt на windows 64-bit(и не только)

minGW для qt на windows 64-bit(и не только)

Я сейчас второй раз устанавливаю qtИ так как в первый раз я не понял что minGW можно скачать с qt,я решил переустановить qt чтобы вместе с ним получить...

254