ZwMapViewOfSection/InheritDispostion

Тема в разделе "WASM.BEGINNERS", создана пользователем l_inc, 28 май 2008.

  1. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Не понимаю смысла параметра InheritDispostion в функции ZwMapViewOfSection. Т.е. вроде как, если указать ViewShare, то логично предположить, что все в дальнейшем созданные процессы из дерева процессов, корнем которого является вызвавший процесс, будут иметь по тому же адресу то же самое отображение. Но тогда даже не имея хэндла FileMapping'а любой процесс имеет доступ к файлу (ну или области памяти, если FileMapping на основе INVALID_HANDLE_VALUE)? И в каком случае происходит наследование: только если при создании процесса установлен флаг bInheritHandles или всегда? А что если по адресу, где размещено отображение родительского процесса, дочерний процесс имеет базу образа? Из MapViewOfFileEx видно, что ZwMapViewOfSection вызывается всегда с флагом ViewShare. Значит ли это, что калькулятор имеет доступ ко всем отображениям эксплорера?
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    насколько я помню на любое другое значение МапВью возвращает ИНВАЛИД_ПАРАМЕТЕР
     
  3. JamesB

    JamesB New Member

    Публикаций:
    0
    Регистрация:
    3 фев 2008
    Сообщения:
    66
    z0mailbox

    нет

    http://msdn.microsoft.com/en-us/library/ms804369.aspx
    нет. почему хз)
     
  4. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    z0mailbox
    Как уже сказал JamesB, это не соответствует тому, что пишут в MSDN.
    all
    ИМХО самым разумным (и самым утешительным для меня :) ) вариантом было бы такое поведение:
    в случае вызова с параметром ViewShare отображение наследуется дочерним процессом по тому же адресу, что и в родительском процессе, но только вместе с хэндлом к FileMapping'у. Т.е. если хэндл FileMapping'а был создан наследуемым, и при создании процесса был выставлен bInheritHandles. Если же установлен ViewUnmap, а хэндл FileMapping'а наследуется, то дочерний процесс при необходимости вызывает ZwMapViewOfSection самостоятельно, но изначально отображения на его АП нет.
    Подтвердите или опровергните, пожалуйста, такую версию, кто знает.
    Но даже при таком поведении неясно, что произойдет, если отображение наследуется дочерним процессом, но у дочернего процесса по этому адресу, например, база образа. Логично было бы, если бы CreateProcess в таком случае завершался неудачей.
    Опять таки, кто знает, подтвердите, пожалуйста, или опровергните.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    l_inc
    так несложно проверить)
     
  6. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Ну во-первых, лень было. Если кто-то уже знает наверняка, то легче спросить. Если никто не ответит, буду проверять.
    А во-вторых я больше доверяю определенным участникам форума, чем своим экспериментам. Мало ли какие случаи я не учту...
     
  7. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Ну в общем я таки проверил. Результат не особо удовлетворительный:
    1) Проекция ни в каком случае не попадает на АП дочернего процесса независимо от того, был ли указан ViewUnmap или ViewShare, и независимо от того, наследовался ли хэндл FileMapping'а.
    2) Но если хэндл FileMapping'а унаследовался, то дочерний процесс может вызвать ZwMapViewOfSection, чтобы получить проекцию. Опять таки независимо от параметра InheritDispostion, указанного в родительском процессе.

    Кто-нибудь может сказать, так и задумано? И, собственно, тогда приходим к тому, с чего начали: в чем смысл параметра InheritDisposition?
     
  8. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Такая распространенная функция. Неужели никого не интересовал смысл параметра собственными руками вызываемой функции?
     
  9. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Внутри MiMapViewOfDataSection он записывается в MMVAD_FLAGS2::Inherit
    В функции MiCloneProcessAddressSpace действительно он проверяется и в зависимости от него в дочерний процесс проецируется вид.
    NtCreateProcess->PspCreateProcess->MmInializeProcessAddressSpace->MiCloneProcessAddressSpace, только я не понял при каких случаях действительно идет "клонирование" АП, там не всегда оно идет.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    Great
    Может только в том случае, когда при вызове NtCreateProcess SectionHandle указывается нулем?
    И можно поинтересоваться, откуда цитата?
     
  11. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Обработанные doxygen'ом исходники Windows 2000.