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.