Другое С/С++ Вопрос - Ответ

Roger571

Известный
58
31
help me
Пытаюсь подменить дополнительные цвета SAMPа на свои, но все хорошо до какого-то момента.
Начинаю подменять с адреса 0xB4E67C 128 цветов, примерно так:

C++:
int iPoint = 0xB4E67C;
for(int i = 0; i < 128; i++)
{
    memset_safe((uint32_t *)iPoint, colors[i][0], 1);
    iPoint+=0x1;
    memset_safe((uint32_t *)iPoint, colors[i][1], 1);
    iPoint+=0x1;
    memset_safe((uint32_t *)iPoint, colors[i][2], 1);
    iPoint+=0x1;
    memset_safe((uint32_t *)iPoint, colors[i][3], 1);
    iPoint+=0x1;
}
Если попробовать инициализировать это во время загрузки - краш по адресу 0x004C74B8
Если попробовать во время игры, варнинги в чат и затем краш. Тоже самое, если заставить игру загружать кастомный carcols.dat
С установленным антикрашем, варнинги в чат летят, но при этом цвета работают правильно

Так же путем экспериментов выяснил, что если в blue подставить число большее 235, все заработает. При этом цвета подменяются правильно и без краша, если не подменять больше 53.

UPD
Остальные цвета нормально прописываются после коннекта/полного подключения samp.dll

UPD2
Работает без крашей только для уже созданных авто, при создании новых авто появяются варнинги по адресу 4C74E1
 
Последнее редактирование:

Sonik Mells

Известный
12
2
wndproc хукани и там обрывай
Все работает, но мне глобальные нажатия на... не нужны. А локальные(для нашего процесса) не получается осуществить.

C++:
HHOOK keyboardHook;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
   {
      PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
      printf("key: %i\n", key->vkCode);
   }
   return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
int main()
{
   keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);
   return 0;
}

Можно с проверкой if(GAME->IsInForeground()), но что то меня такой вариант не привлекает.
 
Последнее редактирование:

MISTER_GONWIK

Всефорумный гонщик
Всефорумный модератор
1,260
1,740
Все работает, но мне глобальные нажатия на... не нужны. А локальные(для нашего процесса) не получается осуществить.

C++:
HHOOK keyboardHook;
LRESULT CALLBACK KeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
   if (wParam == WM_KEYDOWN && nCode == HC_ACTION)
   {
      PKBDLLHOOKSTRUCT key = (PKBDLLHOOKSTRUCT)lParam;
      printf("key: %i\n", key->vkCode);
   }
   return CallNextHookEx(keyboardHook, nCode, wParam, lParam);
}
int main()
{
   keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardProc, NULL, NULL);
   return 0;
}

Можно с проверкой if(GAME->IsInForeground()), но что то меня такой вариант не привлекает.

У сфа есть свой хук, его и используй
 

Sonik Mells

Известный
12
2
Я уже нашел и сделал все) почти все)
C++:
if (uMsg == WM_KEYDOWN)
{
    SF->getSAMP()->getChat()->AddChatMessage(D3DCOLOR_XRGB(80, 0xEA, 100), "out: %i", wParam);
}

SF->getGame()->registerWndProcCallback(SFGame::WndProcCallbackPriority::HIGH_CB_PRIORITY, WndProc);
Теперь вопрос, а как LMENU(LAlt) отловить? не выводит его.
И какой HIGH_CB_... правильней использовать?

Пока, только так придумал
C++:
bool CALLBACK SendPacket(stRakNetHookParams *params)
{
    if (params->packetId == ID_PLAYER_SYNC)
    {
        stOnFootData data;
        params->bitStream->ResetReadPointer();
        params->bitStream->IgnoreBits(8);
        params->bitStream->Read((PCHAR)&data, sizeof(data));
        if (data.sKeys == 1024)
        {
            return true;
        }
    }
    return true;
}
 
Последнее редактирование:

ishi

Известный
493
110
C++:
  for (int i = dstart; i < dend; i++)
     {
       ReadProcessMemory(procHandle, &i, &snzh, 14, NULL);
       if (!strcmp(snzh,SL))
       fout << "meow";
     }
делая шаг по байту, проходит память модуля, и должно записывать данные в массив, но почему-то записываются лишь первые 4 и последние 2
по логике, должно проходить по одному байту, и записывать данные, смещая их с начала в конец (или наоборот, не важно), т.к. записывает одно и тоже,с разностью в один конечный/начальный байт, но пишет не в каждый, и это меня убивает - не могу исправить, вот и всё. Знает кто, в чём ошибка? ._.

upd вместо 14 байт, я пробовал ставить sizeof(snzh) (т.к. это адрес массива), но результат не менялся
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Хз чё ты делаешь, но strcmp для сравнивания строк, а не байт. Если всё таки нужно сравнивать строки, то в каждую записывай \0 в конец.
 

ishi

Известный
493
110
Хз чё ты делаешь, но strcmp для сравнивания строк, а не байт. Если всё таки нужно сравнивать строки, то в каждую записывай \0 в конец.
Вообще у меня проблема не в сравнении, а в том что записывает не во весь массив, но в первые 4 и последние 2 байта

(кстати насчёт нуля, в массиве в конце ноль есть, просто лапы из попы и я обрезал скрин так, что один байт потерялся)
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
Ты получаешь ссылку на переменную i, а не адрес, хранимый в ней.
Преобразовывай к LPCVOID.
 

itsLegend

Фонд борьбы за жуков 🐞
Администратор
2,695
1,448
(LPCVOID)i или (const void*)i, желательно.
 
  • Нравится
Реакции: ishi