Возмозно ли создать процесс в Windows пользовательском режиме, что бы он не был привязан к конкретному файлу, а находился только в оперативке? Смотрел справку Небета по NativeApi. Но мне не удалось запустить исходник в полной мере. Хотя хендел процесса и получал. Если не ошибаюсь файл становится невозможно удалить после выполнения функции NT::ZwCreateSection(&hSection, SECTION_ALL_ACCESS, &oa, 0, PAGE_EXECUTE, SEC_IMAGE, hFile); или этой NT::ZwCreateProcess(&hProcess, PROCESS_ALL_ACCESS, &oa, NtCurrentProcess(), TRUE, hSection, 0, 0); Ещё пробовал следующее: на FAT32 запускаю калькулятор и стираю файл прямым обращением к жёсткому диску. Файла нет а процесс работает. Или просто с дискеты файл запускаю и вытаскиваю её. Хотелось бы сконструировать процесс в режиме пользователя стандартными функциями API, но только чтобы процесс не был привязан к файлу. Как вы думаете это можно реализовать?
Ну как же... просто данных в оперативке не бывает, пока чтото не запустишь. >>А так смотри работу ZwCreateProcess и пиши частичный аналог.
Aspire Калькулятор у меня работал просто замечательно. С диска ему ничего не надо было по видимому читать
Видимо винда просто не пыталась его свопить. А так результат не предсказуем. Дальше ещё дот нет будет - вот тот точно без файла - хрен
Можно найти нужный хэндл файл (ZwQuerySystemInformation(SystemHandleInformation)) скопировать его себе с другими атрибутами и удалить файл. Скопировать хэндл файла как я описал выше с атрибутами DUPLICATE_CLOSE_SOURCE, и закрыть все хэндлы файла, либо при создании процесса создавать 2 секции одну привязанную к файлу вторую нет и с одной скопировать образ в другую ну и передать хэндл воторой секции в ZwCreateProcess только при создании процесса вручную естественно нужно будет создать стэкт, основной поток, проинформировать csrss иначе нечего не будет работать, а вообще я не в курсе создастся ли процесс из секции не привязанной к файлу нужно пробовать.
Dian а разве при откате свопа читается оригинал файла на диске? Думаю при этом восстанавливаются сохраненные раннее из оперативки страницы памяти, куда включены секции как кода так и данных. А запуск из файла происходит по параметрам шапки файла а не как при редактировании, где ввиду импортов и асоциаций рабочий размер памяти процесса может варьировать.
Когда файл проецируется только на чтение (а так и бывает при запуске процесса) в свопе места не выделяется. По мере обращения возникают ошибки страниц и нужные страницы считываются с диска прямо из нужного файла. Когда системе требуются свободные страницы, они просто уничтожаются и при следующем обращении снова возникает ошибка страницы и снова страница считывается с оригинала на диске в файле. Если удалишь файл - неоткуда будет читать страницы и все свалится как карточный домик. Могу предложить два варианта: 1) Заблокировать в памяти весь образ, чтобы страницы не выгружались с физической памяти. См. VirtualLock (user-mode), MmProbeAndLockPages (kernel-mode) 2) Весь образ запротектить на PAGE_READWRITE (или PAGE_WRITECOPY, насчет этого не уверен), тогда винда выделит частные копии страниц, которые будет свопить в файл подкачки, а оригинал на диске больше не будут трогать.