CreateProcess/ExitProcess
Тут возник один вопросик-как создать процесс, точнее его адресное пространство?
Ведь тут необходимо монтировать страницы в создающем процессе.
Больше никак?
А то ведь создание процесса можно в принципе оформить как создаваемую задачу и она бы сама себе создала все условия и перешла на точку входа проги!?
А в ExitProcess такая штука-я не могу освободить страницу где выполняется код, тогда как же освободить память процесса?
Даже если эта функция в ядре то ведь пде/пте нельзя освободить!
WaitForSingleObject(...,INFINITE);
так как существование процесса (а следовательно его адресного пространства) невозможно без существования объекта-поток и объекта-процесс и т.д. и т.п.......
освободить страницу где сейчас выполняется код невозможно, т.е. код сам себя освободить не может! тогда как выполниться инструкция следующая за вызовом функции VirtualFree сразу будет страничное нарушение, в ядре тоже самое - инструкция следующая сразу за инструкцией удаления PTE вызовет страничное нарушение
P.S. я может вопрос не так понял.....
Ну дак в этом и фишка как освободить занимаемую процессом память при его завершении?
Надо просто статус процесса установить в какое-нибудь специфическое значение, которое сигнализирует системному процессу о необходимости его завершения. При этом процессы с таким статусом не должны подвергаться планировке. После задания статуса выполнить hlt и ждать пока системный процесс не освободит память этого процесса сам.
Хотя в принципе наверно создание и завершение процесса лучше сделать именно там.
Тогда создание процесса можно сделать аналогично, ограничиваясь записью чего надо в описатель процесса и задание статуса что его надо запустить)
Но так как то тормозно получается, или так оно на самом деле?
На самом деле под софтайсом наблюдал картину, когда процесса в списке процессов (Ctrl+Alt+Del) уже нет, но секунд 20 он висит в системном списке процессов со статусом Terminating (или Deleting, не помню). Это создано для того, чтобы вызывающий процесс мог прочитать код завешения этого процесса. Аналогичная система в случае Zombie процессов в UNIX.
По поводу создания процесса: вполне вероятно что именно так и делается.
Большая часть операций по созданию/уничтожению процесса выполняется в контексте этого процесса. Операции, которые невозможно осуществить в контексте данного процесса, можно выполнить в контексте родительского процесса, в контексте первичной (системной) задачи или планировщиком в контексте произвольного процесса.