powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сервис и HEAP_CREATE_ENABLE_EXECUTE
14 сообщений из 14, страница 1 из 1
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614267
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Весь день сегодня убил на совершенно необъяснимую штуку.
Давайте разбираться.

Все знают, что в сервисных приложениях необходимо переопределять функцию GetServiceController, которая возвращает калбек.

Я знаю, что в Windows есть возможность выделять исполняемую память, заполнять нужными значениями и вызывать как функции. У нас есть универсальный класс сервера, я стал его модифицировать, проверять врапперы - всё отлично. Но в режиме службы при остановке возникает Exception, идентифицировать который не удалось.

Сейчас я сделал простенький проект, который иллюстрирует ситуацию. Там генерируемый код просто делает прыжок в имеющийся калбек.
Есть ли возможность избежать эксепшна? Может конечно идея изначально обречённая на провал, но хочется хотя бы понимать, почему сервис работает именно так.

Листинг публикую здесь, проект прилагаю в аттаче.
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.SvcMgr, Vcl.Dialogs;

type
  TService1 = class(TService)
    procedure ServiceCreate(Sender: TObject);
  private
    { Private declarations }
    FWrapper: TServiceController;
  public
    function GetServiceController: TServiceController; override;
    { Public declarations }
  end;

var
  Service1: TService1;

implementation

{$R *.dfm}

var
  ExecutableHeap: THandle;

procedure CreateExecutableHeap;
begin
  ExecutableHeap := HeapCreate($00040000{HEAP_CREATE_ENABLE_EXECUTE}, 0, 0);
end;

procedure DestroyExecutableHeap;
begin
  HeapDestroy(ExecutableHeap);
  ExecutableHeap := 0;
end;

function AllocExecutableMemory(const Size: Integer): Pointer;
begin
  Result := nil;
  if (ExecutableHeap <> 0) then
    Result := HeapAlloc(ExecutableHeap, 0, Size);
end;

// -------------------------------------------------------------

procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := FWrapper; //ServiceController;
end;

procedure TService1.ServiceCreate(Sender: TObject);
var
  Code: PByte;
begin
  Code := AllocExecutableMemory(5);
  Code[0] := $E9;
  PInteger(@Code[1])^ := Integer(@ServiceController) - Integer(Code) - 5;

  FWrapper := Pointer(Code);

  // проверка
 // FWrapper(100500);
end;


initialization
  CreateExecutableHeap;

finalization
  DestroyExecutableHeap;

end.

...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614288
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUВсе знают, что в сервисных приложениях необходимо переопределять функцию GetServiceController

Уже смешно. Ты не поверишь, но нет, такую функцию переопределять не надо. Если в какой-то
левой библиотеке оно и сделано так, то это проблемы исключительно этой библиотеки.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614293
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ты гонишь?
Это абстрактная функция
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614296
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы гонишь?

Нет, я читаю MSDN. В отличии от.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614307
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Так это класс Delphi. Читать ты конечно можешь что угодно. Но если не переопределить функцию - будет Exception.
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614313
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOU,

Это не класс делфи. Это обычная статическая локальная функция-коллбэк
Код: plaintext
1.
2.
3.
VOID WINAPI Handler(
    DWORD fdwControl 	// requested control code  
   );


параметры которой описаны в доке про RegisterServiceCtrlHandler.

А GetServiceController - это да, абстрактный метод TService, который должен возвращать указатель на нее.
Ты можешь, конечно, изобрести велосипед и забабахать код этой функции динамически, но тогда разбирайся сам.
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614314
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТак это класс Delphi.

Воот. И именно поэтому твоё пафосное "все знают, что" и далее по тексту - совершенно
невтемное. Те, кто пишут сервисы без применения классов Дельфи, совершенно справедливо
кладут на такое знание болт.

SOFT FOR YOUЧитать ты конечно можешь что угодно.
Ага, и именно сейчас у меня открыт "Intel Architecture Software Developer’s Manual",
содержимое которого недвусмысленно намекает, что ты ещё и машинный код сформировал криво.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614352
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock,
Dimitry Sibiryakov,

Мне абсолютно всё равно, что вы читаете, используете вы стандартный класс или юзаете API. Это не важно.

Меня интересует, почему вдруг executable память стала некорректно работать. И как это исправить.
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614357
rashid.abzalov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SOFT FOR YOU,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
procedure ServiceController(CtrlCode: DWord); stdcall;
begin
  Service1.Controller(CtrlCode);
end;

function TService1.GetServiceController: TServiceController;
begin
  Result := ServiceController;
end;
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614361
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
rashid.abzalov,

он так не хочет осознанно, потому он этот код в 1-м сообщении темы, которое ты не читал, и закомментил.
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614375
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovSOFT FOR YOUЧитать ты конечно можешь что угодно.
Ага, и именно сейчас у меня открыт "Intel Architecture Software Developer’s Manual",
содержимое которого недвусмысленно намекает, что ты ещё и машинный код сформировал криво.
SOFT FOR YOUМне абсолютно всё равно, что вы читаете, используете вы стандартный класс или юзаете API. Это не важно.
Эва... Ню-ню.
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614418
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Ты хочешь сказать, у меня обычный джамп некорректный? ))
Ну-ну )
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614425
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SOFT FOR YOUТы хочешь сказать, у меня обычный джамп некорректный? ))

Ты не поверишь, но именно это написано в том мануале, который я читаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Сервис и HEAP_CREATE_ENABLE_EXECUTE
    #39614451
SOFT FOR YOU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

Не поверю
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Сервис и HEAP_CREATE_ENABLE_EXECUTE
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]