ZwMapViewOfSection/InheritDispostion

Discussion in 'WASM.BEGINNERS' started by l_inc, May 28, 2008.

  1. l_inc

    l_inc New Member

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

    z0mailbox z0

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

    JamesB New Member

    Blog Posts:
    0
    z0mailbox

    нет

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

    l_inc New Member

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

    wasm_test wasm test user

    Blog Posts:
    0
    l_inc
    так несложно проверить)
     
  6. l_inc

    l_inc New Member

    Blog Posts:
    0
    Great
    Ну во-первых, лень было. Если кто-то уже знает наверняка, то легче спросить. Если никто не ответит, буду проверять.
    А во-вторых я больше доверяю определенным участникам форума, чем своим экспериментам. Мало ли какие случаи я не учту...
     
  7. l_inc

    l_inc New Member

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

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

    l_inc New Member

    Blog Posts:
    0
    Такая распространенная функция. Неужели никого не интересовал смысл параметра собственными руками вызываемой функции?
     
  9. wasm_test

    wasm_test wasm test user

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

    l_inc New Member

    Blog Posts:
    0
    Great
    Может только в том случае, когда при вызове NtCreateProcess SectionHandle указывается нулем?
    И можно поинтересоваться, откуда цитата?
     
  11. wasm_test

    wasm_test wasm test user

    Blog Posts:
    0
    Обработанные doxygen'ом исходники Windows 2000.