Маппинг памяти в юзермод из ядра

Тема в разделе "WASM.NT.KERNEL", создана пользователем steelfactor, 23 дек 2007.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Работал над созданием потока в юзермоде из r0. На форуме прочел Ms Rem'a о том, что при вызове ZwAllocateVirtuаlMemory, параметры *BaseAddress и AllocateSize должны находится в юзермодной памяти, иначе ничего не выйдет. Вызов фукнции GetUserMappedAddress успешно возвращает промаппленые адреса, но последующий вызов ZwAllocateVirtuаlMemory с этими адресами вываливается с 0xc0000005. Где ступил?
    Код (Text):
    1. PVOID GetUserMappedAddress(PMDL pMdl, PVOID arg, ULONG size)
    2. {
    3.     pMdl = IoAllocateMdl(arg, size, FALSE, FALSE, NULL);
    4.     MmProbeAndLockPages(pMdl, KernelMode, IoWriteAccess);
    5.     return MmMapLockedPagesSpecifyCache(pMdl, UserMode, MmCached, NULL, FALSE, NormalPagePriority);
    6. }
    7. ........................
    8.  
    9.     PVOID result = ExAllocatePool(NonPagedPool, sizeof(USER_STACK));
    10.     PUSER_STACK stack = (PUSER_STACK)GetUserMappedAddress(pMdl, result, sizeof(USER_STACK));
    11.     result = ExAllocatePool(NonPagedPool, sizeof(ULONG));
    12.     PULONG alloc_size = (PULONG)GetUserMappedAddress(pMdl, result, sizeof(ULONG));
    13.     status = ZwAllocateVirtualMemory(hProcess, &stack->ExpandableStackBottom, 0, alloc_size, MEM_RESERVE, PAGE_READWRITE);
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    steelfactor


    Откуда берешь ZwAllocateVirtualMemory(hProcess
     
  3. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    я весь код не показывал, для удобочитаемости, но с этим все в порядке :)
    Я уже нашел ошибку :) усе работает.
    Ступил вот здесь
    Код (Text):
    1. PULONG alloc_size = (PULONG)GetUserMappedAddress(pMdl, result, sizeof(ULONG));
    alloc_size фактически находился в стеке ядра, поэтому ZwAllocateVirtualMemory и не могла определить 4-й параметр AllocateSize
     
  4. 0x56

    0x56 New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2008
    Сообщения:
    63
    можно вопрос
    если промэпить кусок ядерной памяти с помощью MmMapLockedPagesSpecifyCache в контексте чужого процесса KeStackAttachProcess/KeUnstackDetachProcess будет он доступен из ЮЗЕРМОД после KeUnstackDetachProcess ?
     
  5. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    0x56
    Думаю да. По идее ссылка на промаппленую память должна существовать до вызова MmUnlockPages и IoFreeMdl
     
  6. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    не обязательно в юзермодной части адреса в параметрах находиться должны (если через int 2e вызываешь - адреса в параметрах могут быть ядерными, ибо PreviousMode устанавливается в KernelMode) - а в противном случае (если, скажем, из хука вызываешь прямой обработчик ZwAllocateVirtualMemory который в SDT лежит) - PreviousMode у тебя стоит в UserMode и потому обработчик все проверяет. (MM_HIGHEST_USER_ADDRESS если не ошибаюсь навскидку)
     
  7. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    ECk
    Да, знаю. Просто я мудохался, прошу прощения за грубое слово, с созданием стека юзермодного потока из ядра, а там 2 и 4 аргументы ZwAllocateVirtualMemory под стек должны лежать в юзермоде (при вызове функции из SST напрямую, ядром на не экспортируется).
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Есть фнукции, которые чекают адреса на валидность в юзермоде независимо от KeGetPreviousMode

    Будет. Мапирование, фактически, создает ссылку на ту же физическую страницу.