Проблема с ZwMapViewOfSection, непонятный C00000F1

Тема в разделе "WASM.NT.KERNEL", создана пользователем happiness, 7 авг 2007.

  1. happiness

    happiness New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2007
    Сообщения:
    2
    Вызываю ZwMapViewOfSection в драйвере и получаю C00000F1 (неверный 3-й параметр).

    Вызов примерно такой:
    Код (Text):
    1. local yahoo:PVOID
    2.  
    3. invoke  ZwMapViewOfSection, hKSection, -1, ADDR yahoo, 0, 0, 0, ADDR blabla, ViewShare, 0, PAGE_READWRITE
    Попробовал разобраться в проблеме и трейсил работу этой функции, нашел такую интересность - переменная yahoo имеет адрес вроде F8xxxxxxh, а в функции ZwMapViewOfSection идет сравнение 3-го параметра (как раз наш yahoo) с MmHighestUserAddress, который в моем билде == 7FFEFFFFh

    Вот дизассемблированный кусок ZwMapViewOfSection из ntkrnlpa.exe:
    Код (Text):
    1. ...
    2. 805a6068 mov     eax,dword ptr [nt!MmHighestUserAddress (80557bbc)] ; eax = 7ffeffff
    3. 805a606d lea     edx,[eax-10000h]
    4. 805a6073 cmp     ecx,edx                        ; eax == 7ffdffff, ecx == 0
    5. 805a6075 ja      nt!NtMapViewOfSection+0x128 (805a6082)         ; пронесло
    6. 805a6077 sub     eax,ecx
    7. 805a6079 sub     eax,10000h                     ; eax = 7ffcffff
    8. 805a607e cmp     eax,edi                        ; eax == 7ffcffff, edi == f827ac78
    9. 805a6080 jae     nt!NtMapViewOfSection+0x132 (805a608c)         ; хочу прыгнуть, но не прыгается :(
    10. 805a6082 mov     eax,0C00000F1h                     ; добро пожаловать в ад
    11. 805a6087 jmp     nt!NtMapViewOfSection+0x38e (805a62e8)
    12. -----------------[ внимание ]----------------------------
    13. 805a608c lea     eax,[edi+ecx]                      ; тут начинается провека параметра 4
    14. 805a608f or      edx,0FFFFFFFFh                     ; мне очень надо сюда =)
    15. 805a6092 mov     ecx,dword ptr [ebp+14h]
    16. ...
    ничего не понимаю в общем, уже 9 часов мучаюсь...

    ах да, вопрос забыл озвучить =)
    как не получать эту злую ошибку и получить нормальный результат?
    буду благодарен за любой пинок в любую (желательно правильную) сторону
     
  2. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    happiness
    Адрес точно f827ac78, а не скажем 78ac27а8?
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Странная проверка на *BaseAddress <= MmHighestUserAddress... У тебя случаем PreviousMode не равно ли UserMode ?
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Известная фича. Некоторые функции из native API работают только с параметрами, лежащими в юзерском пространстве памяти. Нужно с помощью MmProbeAndLockPages и MmMapLockedPages отмаппить ядерную память в юзерскую.
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Да не, это не вроде проверка того, что переменная содержащая адрес лежит в юзермоде, а сама желаемая база лежит в юзермоде.. то есть нельзя отмапить на системные адреса что-то.. вот кусок сорса:

    Код (Text):
    1.     try {
    2. ...
    3.         CapturedBase = *BaseAddress;
    4.         CapturedViewSize = *ViewSize;
    5.     } except( ... ) { ... }
    6.  
    7.     //
    8.     // Make sure the specified starting and ending addresses are
    9.     // within the user part of the virtual address space.
    10.     //
    11.  
    12.     if (CapturedBase > MM_HIGHEST_VAD_ADDRESS) {
    13.  
    14.         //
    15.         // Invalid base address.
    16.         //
    17.  
    18.         return STATUS_INVALID_PARAMETER_3;
    19.     }
    20.  
    21.     if (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)CapturedBase) <
    22.                                                         CapturedViewSize) {
    23.  
    24.         //
    25.         // Invalid region size;
    26.         //
    27.  
    28.         return STATUS_INVALID_PARAMETER_3;
    29.  
    30.     }
    Судя по всему это те две проверки, которые видны в дизасм листинге
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Кстати а чем не катит прямой вызов MmMapViewOfSection ? Там нет проверок на то, годе какие аргументы лежат
     
  7. happiness

    happiness New Member

    Публикаций:
    0
    Регистрация:
    6 авг 2007
    Сообщения:
    2
    crypto, абсолютно точно

    gilg, вот я и думал - фича это или баг =) оказывается все-таки фича

    Great, MmMapView вполне катит, просто логику понять не могу - нафига такие непонятные ограничения ставить :dntknw:
    Кстати, твой вариант кода не очень подходит т.к. у меня BaseAddress == NULL

    всем спасибо, пойду пробовать
     
  8. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Из ядра нельзя вызывать никакие нативные функции для работы с вирутальной памятью. Видимо, считается, что достаточно чисто ядерных средств. А вообще хрен их разберешь 8)