Отключаем режим ленивого сна в окнах - Interlude *.dll

BIT_hack

Знающий
Участник
Сообщения
209
Розыгрыши
0
Решения
2
Репутация
79
Реакции
150
Баллы
455
В интернете нашел код на языке C++, который позволяет делать окна постоянно активными, то есть предотвращает их переход в спящий режим (или, проще говоря, их “зависание” при переключении между окнами).
Так как я разрабатываю в среде Lazarus, которая базируется на языке Pascal, я решился представить этот код, в надежде, что он окажется полезным для вас!

Чтобы избежать необходимости внедрения DLL, мы задаем имя файла entry.dll и размещаем его в папке /system с игрой, после чего игра автоматически загружает нашу библиотеку, и это — все!

Пример на Lazarus/Delphi (Нет подсветки синтаксиса Pascal)
JavaScript:
library entry;
{$mode objfpc}{$H+}
uses
  Windows;

// Функция-заглушка для замены оригинальной функции Sleep
function SleepStub: Integer; cdecl;
begin
  Result := 50; // Возвращаем 50 в качестве заглушки для функции Sleep
end;

// Объявление процедуры, отключающей "ленивый" режим сна
procedure DisableLazyMode; forward;

// Процедура для отключения режима "ленивого" сна в библиотеке "core.dll"
procedure DisableLazyMode;
var
  LazyMode: PBYTE; // Указатель на адрес функции "appSleep" в памяти
  OldProtect: DWORD; // Старое состояние защиты памяти
begin
  // Получаем указатель на функцию "appSleep" в уже загруженной библиотеке "core.dll"
  LazyMode := GetProcAddress(GetModuleHandle('core.dll'), '?appSleep@@YAXM@Z');
  if Assigned(LazyMode) then // Проверяем, найдена ли функция "appSleep"
  begin
    if VirtualProtect(LazyMode, 5, PAGE_READWRITE, @OldProtect) then // Меняем защиту памяти
    begin
      LazyMode^ := $E9; // Заменяем первый байт вызова функции на безусловный переход
      PInteger(LazyMode + 1)^ := Integer(@SleepStub) - Integer(LazyMode + 5); // Устанавливаем адрес заглушки в вызове
      VirtualProtect(LazyMode, 5, OldProtect, @OldProtect); // Восстанавливаем защиту памяти
    end;
  end;
end;
begin// Точка входа в библиотеку
  DisableLazyMode; // Вызываем процедуру для отключения "ленивого" режима сна
end.

Тот код, что нашел в интернете C++
C++:
#include <Windows.h>

extern "C" void __declspec(dllexport) __stdcall function1()
{
}

int __cdecl SleepStub()
{
    return 50;
}

void WINAPI DisableLazyMode()
{
    HINSTANCE HСore = LoadLibraryA("core.dll");

    if (HСore){
    BYTE* LazyMode = (BYTE*)GetProcAddress(HСore, "?appSleep@@YAXM@Z");

    if (!LazyMode)
        return;

    ULONG oldProtect;
    if (!VirtualProtect(LazyMode, 5, PAGE_READWRITE, &oldProtect))
        return;

    *LazyMode = 0xE9;
    *(int*)(LazyMode + 1) = (BYTE*)SleepStub - (LazyMode + 5);

    VirtualProtect(LazyMode, 5, oldProtect, &oldProtect);
}

}


BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpReserved)
{
    if (reason == DLL_PROCESS_ATTACH)
    {
        DisableLazyMode();
    
    }
    return 1;
}
 

Вот готовая entry.dll для тех кто не хочет заморачиваться с компиляцией!
Кидаем в папку system вашей игры.
 

Вложения

  • entry.zip
    28,6 КБ · Просмотры: 29
Назад
Сверху Снизу