Не понимаю смысла параметра InheritDispostion в функции ZwMapViewOfSection. Т.е. вроде как, если указать ViewShare, то логично предположить, что все в дальнейшем созданные процессы из дерева процессов, корнем которого является вызвавший процесс, будут иметь по тому же адресу то же самое отображение. Но тогда даже не имея хэндла FileMapping'а любой процесс имеет доступ к файлу (ну или области памяти, если FileMapping на основе INVALID_HANDLE_VALUE)? И в каком случае происходит наследование: только если при создании процесса установлен флаг bInheritHandles или всегда? А что если по адресу, где размещено отображение родительского процесса, дочерний процесс имеет базу образа? Из MapViewOfFileEx видно, что ZwMapViewOfSection вызывается всегда с флагом ViewShare. Значит ли это, что калькулятор имеет доступ ко всем отображениям эксплорера?
z0mailbox Как уже сказал JamesB, это не соответствует тому, что пишут в MSDN. all ИМХО самым разумным (и самым утешительным для меня ) вариантом было бы такое поведение: в случае вызова с параметром ViewShare отображение наследуется дочерним процессом по тому же адресу, что и в родительском процессе, но только вместе с хэндлом к FileMapping'у. Т.е. если хэндл FileMapping'а был создан наследуемым, и при создании процесса был выставлен bInheritHandles. Если же установлен ViewUnmap, а хэндл FileMapping'а наследуется, то дочерний процесс при необходимости вызывает ZwMapViewOfSection самостоятельно, но изначально отображения на его АП нет. Подтвердите или опровергните, пожалуйста, такую версию, кто знает. Но даже при таком поведении неясно, что произойдет, если отображение наследуется дочерним процессом, но у дочернего процесса по этому адресу, например, база образа. Логично было бы, если бы CreateProcess в таком случае завершался неудачей. Опять таки, кто знает, подтвердите, пожалуйста, или опровергните.
Great Ну во-первых, лень было. Если кто-то уже знает наверняка, то легче спросить. Если никто не ответит, буду проверять. А во-вторых я больше доверяю определенным участникам форума, чем своим экспериментам. Мало ли какие случаи я не учту...
Ну в общем я таки проверил. Результат не особо удовлетворительный: 1) Проекция ни в каком случае не попадает на АП дочернего процесса независимо от того, был ли указан ViewUnmap или ViewShare, и независимо от того, наследовался ли хэндл FileMapping'а. 2) Но если хэндл FileMapping'а унаследовался, то дочерний процесс может вызвать ZwMapViewOfSection, чтобы получить проекцию. Опять таки независимо от параметра InheritDispostion, указанного в родительском процессе. Кто-нибудь может сказать, так и задумано? И, собственно, тогда приходим к тому, с чего начали: в чем смысл параметра InheritDisposition?
Такая распространенная функция. Неужели никого не интересовал смысл параметра собственными руками вызываемой функции?
Внутри MiMapViewOfDataSection он записывается в MMVAD_FLAGS2::Inherit В функции MiCloneProcessAddressSpace действительно он проверяется и в зависимости от него в дочерний процесс проецируется вид. NtCreateProcess->PspCreateProcess->MmInializeProcessAddressSpace->MiCloneProcessAddressSpace, только я не понял при каких случаях действительно идет "клонирование" АП, там не всегда оно идет.
Great Может только в том случае, когда при вызове NtCreateProcess SectionHandle указывается нулем? И можно поинтересоваться, откуда цитата?