Вызываю ZwMapViewOfSection в драйвере и получаю C00000F1 (неверный 3-й параметр). Вызов примерно такой: Код (Text): local yahoo:PVOID 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): ... 805a6068 mov eax,dword ptr [nt!MmHighestUserAddress (80557bbc)] ; eax = 7ffeffff 805a606d lea edx,[eax-10000h] 805a6073 cmp ecx,edx ; eax == 7ffdffff, ecx == 0 805a6075 ja nt!NtMapViewOfSection+0x128 (805a6082) ; пронесло 805a6077 sub eax,ecx 805a6079 sub eax,10000h ; eax = 7ffcffff 805a607e cmp eax,edi ; eax == 7ffcffff, edi == f827ac78 805a6080 jae nt!NtMapViewOfSection+0x132 (805a608c) ; хочу прыгнуть, но не прыгается :( 805a6082 mov eax,0C00000F1h ; добро пожаловать в ад 805a6087 jmp nt!NtMapViewOfSection+0x38e (805a62e8) -----------------[ внимание ]---------------------------- 805a608c lea eax,[edi+ecx] ; тут начинается провека параметра 4 805a608f or edx,0FFFFFFFFh ; мне очень надо сюда =) 805a6092 mov ecx,dword ptr [ebp+14h] ... ничего не понимаю в общем, уже 9 часов мучаюсь... ах да, вопрос забыл озвучить =) как не получать эту злую ошибку и получить нормальный результат? буду благодарен за любой пинок в любую (желательно правильную) сторону
Странная проверка на *BaseAddress <= MmHighestUserAddress... У тебя случаем PreviousMode не равно ли UserMode ?
Известная фича. Некоторые функции из native API работают только с параметрами, лежащими в юзерском пространстве памяти. Нужно с помощью MmProbeAndLockPages и MmMapLockedPages отмаппить ядерную память в юзерскую.
Да не, это не вроде проверка того, что переменная содержащая адрес лежит в юзермоде, а сама желаемая база лежит в юзермоде.. то есть нельзя отмапить на системные адреса что-то.. вот кусок сорса: Код (Text): try { ... CapturedBase = *BaseAddress; CapturedViewSize = *ViewSize; } except( ... ) { ... } // // Make sure the specified starting and ending addresses are // within the user part of the virtual address space. // if (CapturedBase > MM_HIGHEST_VAD_ADDRESS) { // // Invalid base address. // return STATUS_INVALID_PARAMETER_3; } if (((ULONG_PTR)MM_HIGHEST_VAD_ADDRESS - (ULONG_PTR)CapturedBase) < CapturedViewSize) { // // Invalid region size; // return STATUS_INVALID_PARAMETER_3; } Судя по всему это те две проверки, которые видны в дизасм листинге
Кстати а чем не катит прямой вызов MmMapViewOfSection ? Там нет проверок на то, годе какие аргументы лежат
crypto, абсолютно точно gilg, вот я и думал - фича это или баг =) оказывается все-таки фича Great, MmMapView вполне катит, просто логику понять не могу - нафига такие непонятные ограничения ставить Кстати, твой вариант кода не очень подходит т.к. у меня BaseAddress == NULL всем спасибо, пойду пробовать
Из ядра нельзя вызывать никакие нативные функции для работы с вирутальной памятью. Видимо, считается, что достаточно чисто ядерных средств. А вообще хрен их разберешь 8)