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

Все знают, что в сервисных приложениях необходимо переопределять функцию 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
13.03.2018, 17:58
    #39614288
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервис и HEAP_CREATE_ENABLE_EXECUTE
SOFT FOR YOUВсе знают, что в сервисных приложениях необходимо переопределять функцию GetServiceController

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

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

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

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

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


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

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

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

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

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

Меня интересует, почему вдруг executable память стала некорректно работать. И как это исправить.
...
Рейтинг: 0 / 0
13.03.2018, 19:42
    #39614357
rashid.abzalov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервис и HEAP_CREATE_ENABLE_EXECUTE
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
13.03.2018, 19:51
    #39614361
YuRock
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сервис и HEAP_CREATE_ENABLE_EXECUTE
rashid.abzalov,

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

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

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

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


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