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

4el0ve4ik

Известный
Всефорумный модератор
1,560
1,382
Мелочь, но всё же:

C++:
std::string desiredFolderName{"Example"};
void* folderNameAddress{reinterpret_cast<void*>(0x74503F)};

// Проверяем доступность страницы виртуальной памяти, в которой расположен указатель.
::MEMORY_BASIC_INFORMATION mbi{};
if (0 != ::VirtualQuery(folderNameAddress, &mbi, sizeof(mbi)) &&
    mbi.State == MEM_COMMIT && (mbi.Protect & PAGE_EXECUTE_FLAGS))
{
    // На случай, если адрес памяти указателя под защитой, меняем флаг доступа.
    ::DWORD protectionFlagsBefore{};
    if (::VirtualProtect(
        folderNameAddress,
        sizeof(void*),
        PAGE_READWRITE,
        &protectionFlagsBefore))
    {
        // Клонируем указатель, который находится по данному адресу.
        char* folderNamePtr{nullptr};
        std::memcpy(&folderNamePtr, folderNameAddress, sizeof(char*));
    
        if (nullptr != folderNamePtr)
        {
            // Если указатель валиден, то записываем значение прямо в его объект, в отличие от прошлого примера.
            // Метод перезаписи адреса, на кой направляет указатель, мне не очень нравится,
            // ибо придётся постоянно держать в памяти объект, созданный нами для сего деяния.
            // Потому делаем иначе!
        
            std::memcpy(
                folderNamePtr,
                desiredFolderName.c_str(),
                desiredFolderName.size());
        }
    }
}
А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.
 
15
11
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А ниче, что если имя папки будет больше оригинального - ты перезапишешь следующую строку? В моем методе эта проблема решена. На счет протекта памяти - это был всего лишь пример.
Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.

Справедливо, my bad. В моём примере, кроме снятия защиты памяти, вместо преобразования адреса в указатель на требуемый тип, его чтения и последующей перезаписи используется стандартная сишная функция memcpy для копирования содержимого источника в буфер назначения, при использовании которой, в отличие от прошлого примера, не возникает UB, что, несомненно, можно считать плюсом.
Strict Aliasing Violations. Справедливости ради, нужно отметить, что MSVC такой класс оптимизаций не реализует.
 
Последнее редактирование:

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
подскажите пожалуйста,как сделать чтоб машина всё время крутилась?
 

Dadazik2.0

Потрачен
6
0
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
Мужики, подскажите, как сделать невидимку в авто?
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
парни подскажите как подключить реконект к самп апи?
 
  • Bug
Реакции: kin4stat

Rei

Известный
Друг
1,633
1,703
как сделать копию пакета параметров?
C++:
template<typename... Args>
void test(Args... args)
{
	auto copied = args...; // типа так
}
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
парни подскажите пожалуйста,как найти координаты всех машин в зоне стрима кроме своей.
 

imring

Ride the Lightning
Всефорумный модератор
2,363
2,568
как сделать копию пакета параметров?
C++:
template<typename... Args>
void test(Args... args)
{
    auto copied = args...; // типа так
}
через tuple можно
C++:
template<typename... Args>
std::tuple<Args...> test(Args... args) { return std::make_tuple(args...); }
или через std::vector
C++:
template<typename... Args, typename T = std::variant<Args...> /*или std::any*/>
std::vector<T> test(Args... args) { return {args...}; }
 
  • Нравится
Реакции: legendabrn и Rei

Harrington

Новичок
1
0
Здарова, почему не могу сделать русский язык в программе (Выводятся каракули). Компилятор Dev C++ 6.3
Перепробовал все возможные способы из интернета
1647533401508.png

1647533473769.png
 

Yayachana)

Известный
33
10
Здарова, почему не могу сделать русский язык в программе (Выводятся каракули). Компилятор Dev C++ 6.3
Перепробовал все возможные способы из интернета
setlocale(LC_ALL, "ru");
 

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как подключить функцию к самп апи?
 

F0RQU1N and

Известный
1,292
502
И снова доброго времени суток господа.

Как заменить строку при подключении "SAMP 0.3.7 R3 и тд" на "SAMP 0.3.7 R1"
Просто заменить данную строку.



Возможно будет полезно:
mem::copy((PVOID)(samp + 0x85FE), (PVOID)&str_connecting, 4); //connecting
mem::copy((PVOID)(samp + 0xAB11), (PVOID)&str_entering, 4); //connected enter....
mem::copy((PVOID)(samp + 0x1074B), (PVOID)&str_fullconnected, 4); //entered
mem::copy((PVOID)(samp + 0xB7C5), (PVOID)&str_welcome, 4); //samp 037....
mem::copy((PVOID)(samp + 0x8A77), (PVOID)&str_kicked, 4); //closed
mem::copy((PVOID)(samp + 0x8AF7), (PVOID)&str_timeout, 4); //didnt respond
mem::copy((PVOID)(samp + 0xB045), (PVOID)&str_timeout, 4); //didnt respond
mem::copy((PVOID)(samp + 0x8A47), (PVOID)&str_full, 4); //is full
mem::copy((PVOID)(samp + 0xB008), (PVOID)&str_full, 4); //is full
mem::copy((PVOID)(samp + 0xA3C5), (PVOID)&str_restart, 4); //server is resta
mem::copy((PVOID)(samp + 0xA9AA), (PVOID)&str_lost, 4); //lost

mem::copy((PVOID)(samp + 0x10275), (PVOID)&uncnick, 4);
mem::copy((PVOID)(samp + 0x10285), (PVOID)&uncnick2, 4);
mem::copy((PVOID)(samp + 0x10296), (PVOID)&uncnick3, 4);
mem::copy((PVOID)(samp + 0x102A7), (PVOID)&uncnick4, 4);

mem::copy((PVOID)(samp + 0xAC70), (PVOID)&fakever, 4); //0.3.7-R3
mem::copy((PVOID)(samp + 0x5FECD), (PVOID)&fakever, 4); //0.3.7-R3
*reinterpret_cast<PVOID*>(samp + 0xB7C5) = "SAMP 0.3.7 R1"; наверна так
 
  • Bug
  • Нравится
Реакции: writeline и kin4stat

Chilim

Потрачен
71
6
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
как подключить функцию к сампапи?