Вверх ↑
Этот топик читают: Гость
Ответов: 655
Рейтинг: 18
#1: 2016-12-15 13:12:09 ЛС | профиль | цитата
Возможно ли запустить приложение из памяти?
Имеется ввиду есть приложение которое хранит exe внутри себя, требуется запускать копии этого exe из памяти как отдельный процесс.
Стандартные компоненты могут это или может есть у кого IC?

Для чего мне это нужно:
Хочу сделать сетевое приложение для обработки данных на стороне сервера, при подключении клиентов создавать пулл на несколько подключений в виде фонового приложения, передавать данные в пулл, в случае каких-либо неполадок/превышения объема данных можно убивать пулл не отключая других клиентов.

Конечно я могу дергать фоновое приложение через winexec...но это постоянное обращение к диску на чтение файла.
Даже если всегда держать "на старте" пару запущенных копий все равно придется рано или поздно читать файл с дика, поэтому интересует запуск из памяти ибо быстрее.
карма: 0

0
Ответов: 8921
Рейтинг: 823
#2: 2016-12-15 13:29:07 ЛС | профиль | цитата
Gunnman, наверное этот компонент: TempFileStream
карма: 19

0
Ответов: 655
Рейтинг: 18
#3: 2016-12-15 13:35:24 ЛС | профиль | цитата
Леонид, Да,я пока на нем тренируюсь) но получается что файл сперва выгружаем на диск...а потом уже его читаем..а интересовался как из памяти файл запустить?
карма: 0

0
Ответов: 4628
Рейтинг: 749
#4: 2016-12-15 14:04:23 ЛС | профиль | цитата
Gunnman писал(а):
а интересовался как из памяти файл запустить?
Процесс запускается только из файла.
Можно запустить ещё раз самого себя. Можно в уже запущенный процесс записать свой код и заставить его выполниться в том процессе.
карма: 26

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#5: 2016-12-15 16:08:40 ЛС | профиль | цитата
Netspirit писал(а):
Процесс запускается только из файла.

У меня есть такой компонент (RunFromMemory называется), который запускает приложение из памяти, но его никто никогда не получит ни за какие коврижки, даже не просите. Тк это может вызвать нежелательный прецедент с вирусописателями, а обещаниям и заверениям я не верю и компонент это я не продаю.
Хотя ты прав, процессу действительно нужно имя файла, но необязательно этот файл должен быть запускной, запустить можно и прямо из памяти.

Редактировалось 5 раз(а), последний 2016-12-15 16:23:44
карма: 22

0
Ответов: 4628
Рейтинг: 749
#6: 2016-12-15 16:23:24 ЛС | профиль | цитата
nesco писал(а):
запустить можно и прямо из памяти
Я и говорю - записать код в существующий процесс и заставить этот процесс выполнить этот код внутри себя (несколькими способами). Чисто теоретически, предполагаю, можно на уровне ядра (драйвера) написать такую штуку, которая будет повторять функционал виндовой функции CreateProcess, но не требовать наличия файла на диске.
карма: 26

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#7: 2016-12-15 16:28:48 ЛС | профиль | цитата
Netspirit писал(а):
Чисто теоретически, предполагаю, можно на уровне ядра (драйвера) написать такую штуку, которая будет повторять функционал виндовой функции CreateProcess, но не требовать наличия файла на диске.

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

Редактировалось 1 раз(а), последний 2016-12-15 16:30:17
карма: 22

0
Ответов: 655
Рейтинг: 18
#8: 2016-12-15 16:56:24 ЛС | профиль | цитата
Пришел nesco сказал есть пряник, а затем взял его и съел

--- Добавлено в 2016-12-15 17:30:14

Пока в общем вижу только одно решение: при запуске основного ПО распаковывать из стрима свое фоновое приложение "node.exe" в ram disk, а от туда дергать WinExec. Быстрее только компонент nesco.

Редактировалось 5 раз(а), последний 2016-12-15 17:32:46
карма: 0

0
Разработчик
Ответов: 26113
Рейтинг: 2126
#9: 2016-12-15 18:17:55 ЛС | профиль | цитата
Gunnman писал(а):
распаковывать из стрима свое фоновое приложение "node.exe" в ram disk, а от туда дергать WinExec

Если распаковать только один раз, то приложение будет также запускаться из памяти, и тогда не факт, что компонент будет работать быстрее, тк в нем идет выделение памяти под процесс, а это не быстрая процедура.
карма: 22

0
Ответов: 655
Рейтинг: 18
#10: 2016-12-15 18:19:49 ЛС | профиль | цитата
Да один раз распаковать, потом оно уже по сути в оперативке будет лежать и от туда его exec сколько нужно.
карма: 0

0
Ответов: 4628
Рейтинг: 749
#11: 2016-12-15 18:20:35 ЛС | профиль | цитата
А зачем это?
карма: 26

0
Ответов: 655
Рейтинг: 18
#12: 2016-12-15 21:05:21 ЛС | профиль | цитата
Задача такая: обрабатывать данные от клиентов (браузеры) на сервере (генерация HTML из данных БД и конвертация HTML в PDF + по мелочи)

Как это вижу я:
TCP сервер принимает подключение, мы не знаем какую операцию запросит клиент (вдруг потребуется отчет за 4 месяца в PDF или какая-то сложная выборка в БД), т.к. операция может занять условно продолжительное время мы запускаем "пулл" - некое фоновое приложение которое в отдельном потоке займется обработкой запроса клиента/нескольких клиентов.
Приложение что-то там выполняет клиент в это время ожидает (скрипт страницы раз в сек спрашивает готов или не готов результат)..как только приложение завершит обработку данных, выгрузит готовый PDF или HTML, сообщит TCP серверу что для клиента N все готово, после чего сервер уже выдаст результат браузеру.
Далее фоновое приложение убивается.
В виду того что количество клиентов, собственно как и требуемых для них "пуллов" не известно, то фоновое приложение придется подгружать по мере подключения клиентов, подгружать имеется в виду запускать через winexec...а каждый запуск приложения - чтение файла с диска, вот чтобы не тратить время на IO диска я планирую разместить приложение в ram диске для быстрого чтения.
карма: 0

0
Ответов: 4628
Рейтинг: 749
#13: 2016-12-16 12:15:28 ЛС | профиль | цитата
Это решается многопоточным сервером. В HiAsm - TCPServerEx (только в данный момент он не многопоточный).
Кроме того, можно держать запущенный запасной экземпляр программы - как только поступает запрос, программа выполняет свою задачу, одновременно запустив ещё один запасной экземпляр. После отработки программа завершается, а запущенный ею запасной экземпляр ожидает следующего запроса.

Редактировалось 2 раз(а), последний 2016-12-16 12:25:45
карма: 26

1
Голосовали:Gunnman
Ответов: 817
Рейтинг: 52
#14: 2016-12-16 17:14:36 ЛС | профиль | цитата
Gunnman, Если вопрос актуален, см. личку, там пряник который Nesco ест
карма: 1

0
Ответов: 655
Рейтинг: 18
#15: 2016-12-16 19:30:11 ЛС | профиль | цитата
-= DriveR =-, Актуально, но пряник не получил, прием...как слышно
карма: 0

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)