Не могу подкачать страницу из драйвера! Шо делать?

Тема в разделе "WASM.WIN32", создана пользователем Godness, 27 сен 2005.

  1. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Вообщем такая лажа - не могу подкачать страницу из драйвера, т.е. страница всеже подкачивается но управление мне не возвращается! :dntknw: Вот смотрите
    Код (Text):
    1.  
    2.    
    3.     push     dwAddr <- нужная мне страница
    4.     call     GetPte
    5.     mov      eax, [eax] <- беру соотв. PTE и проверяю сброшена ли страница на диск
    6.  
    7.     test     al, 1
    8.     jnz      page_in_memory
    9.     ;если страница сброшена, то ставлю свой обработчик
    10.     ;и обращаюсь к странице, но назад управление не
    11.     ;получаю!!!!
    12.    
    13.     push     fs
    14.     push     ds
    15.        
    16.     mov      ax, 23h <- на всякий случай
    17.     mov      ds, ax
    18.     mov      ax, 30h
    19.     mov      fs, ax
    20.        
    21.     push     offset ExceptionHandler
    22.     push     dword ptr fs:[0]
    23.     mov      dword ptr fs:[0], esp
    24.  
    25.     mov      SafeEip, offset SafePlace
    26.     mov      PrevEbp, ebp
    27.     mov      PrevEsp, esp
    28.  
    29.     sti  <- поднимаю флаг прерывания, т.к. все это происходит в другом обработчик прерывания - 0xD
    30.  SafePlace:
    31.     add      already_patched, 2
    32.     mov      eax, dwAddr
    33.     mov      eax, [eax] <- генерирую исключение
    34.     add      already_patched, 0x100
    35.  
    36.     pop      dword ptr fs:[0]
    37.     add      esp, 4
    38.        
    39.     pop      ds
    40.     pop      fs
    41.  
    42.     cli
    43.     jmp      page_in_memory
    44.        
    45.     nop
    46.     nop
    47.     nop
    48.  
    49.     ExceptionHandler:
    50.  
    51.     push     ds  <- управления даже не попадает сюда!
    52.     mov      ax, 23h
    53.     mov      ds, ax
    54.     add      already_patched, 0x10000000
    55.     pop      ds
    56.        
    57.     mov      eax, dword ptr [esp + 0Ch] //pContext
    58.     push     SafeEip
    59.     push     PrevEsp
    60.     push     PrevEbp
    61.        
    62.     pop      dword ptr [eax + 0B4h]
    63.     pop      dword ptr [eax + 0C4h]
    64.     pop      dword ptr [eax + 0B8h]
    65.  
    66.     xor     eax, eax
    67.     ret
    68.  
    69.  page_in_memory:
    70.  
     
  2. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    процедура GetPte взята из исходников IceExt, в ней можно не сомневатся



    Как уже писал управления даже не попадает в установленный мной обработчик исключений! :-\ Вот такая лажа! Что может быть не так? И как это вообще сделать?
     
  3. _staier

    _staier New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2003
    Сообщения:
    738
    Адрес:
    Ukraine
    я в драйверах ни бум-бум но использование шестнадцатиразрядных регистров кажетсяя мне подозрительным
     
  4. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    staier



    Да уж - точно не шариш :) Шестнадцатиразрядные регистры тут не причем, это я ж там сегменты настраиваю...



    Там я мелким почерком написал, что вся эта байда выполняется в обработчике 0xD прерывания, из него то мне и нужно подкачать страницу. Народ, ну скажите что нибудь умное! - таво и гляди и мне шонибудь умное придет в голову ~|:)
     
  5. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Я подумал что IRQL слишком высокий, но это врядле, т.к. система то не падает, а вот управления я не получаю назад! Да и вызов GetCurrentIRQL из обработчика, чето приводит к краху
     
  6. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.552
    Адрес:
    Russia
    хм ... я не претендую на звание .. но всеже .. скажу\спрошу

    вы пишите

    test al, 1

    jnz page_in_memory


    а вы уверены что нужно именно так проверять биты в структуре PTE ?? там же струтура типа :

    31 ---- 12 --биты-- 0



    Также надо проверять битовый флаг Valid ..

    Ну ладно страница подкачивается - это хорошо ...



    И еще Зачем в fs помещать 30h.

    Да и вопрос - уверн что исключение вызывается ? может эта страница присутствует и в нее нормально записываются данные и никаких исключений.
     
  7. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    TermoSINteZ



    на "вы" не надо! мне то всего ничего - 24 года, так что на вы не надо



    именно нулевой бит в PTE определяет присутствие страницы, это стопудово, и та проверка совершенно правильна тут даже сомниватся не приходится.



    в fs заношу 30h, т.к. этот код является обработчиком прерывания 0xD и соответственно может быть вызван в любой ситуации, а fs=30h стандартное его состояния для режима ядра - ...ну я ж исключение через него обрабатываю



    Да и вопрос - уверн что исключение вызывается ? может эта страница присутствует и в нее нормально записываются данные и никаких исключений.



    если страница присутствует, то управление передается на метку page_in_memory, и там я с ней нормально работаю - это проверено ужо 15000 раз.



    По сути то дела (насколько я понимаю), обращение к сброшеной странице не должно являтся исключением (т.е. мне воовсе не обязательно ставить обработчик, как я это делаю), но просто уже я настолько за#бался, что даже просто нету слов - одни... это, как говорится - нех#й матерится
     
  8. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Вообще-то суть общей проблемы в следующем

    имеется код ринг3 вот такой

    nop

    nop

    int 6

    nop

    nop



    При выполнении данного кода возникает исключение #GP т.е. инт0xD (все же int 6 просто так ему выполнить нельзя). На инт0xD сидит мой обработчик, который пытается поставить в обработчике исключений этой проги бряк 0xCC, дабы знать де остановится (...ну надо мне так)

    ну делаю я так, сначала получаю адресс обработчика


    Код (Text):
    1.  
    2.         pushad
    3.  
    4.         push     fs
    5.         mov      ax, 38h
    6.         mov      fs, ax
    7.         mov      eax, dword ptr fs:[0]
    8.         mov      eax, [eax + 4]
    9.         mov      dwAddr, eax
    10.         pop      fs
    11.        
    12.         push     dwAddr
    13.         call     GetPte
    14.         mov      eax, [eax]
    15.         mov      SavedPTE, eax
    16.  
    17.         test     al, 1
    18.         jnz      page_in_memory
    19.  
    20.  




    тут тоже все нормально. и потом смотрю, что если он в памяти, то ставлю бряк 0xCC и все путем, а если же нет - то вот такая вот лажа :dntknw:
     
  9. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    Отвечать, как подкачать страницу в память из обработчика прерывания, воовсе не обязательно... Ну, просто скажите что нибудь умное! :)
     
  10. DelExe

    DelExe New Member

    Публикаций:
    0
    Регистрация:
    22 авг 2005
    Сообщения:
    165
    Существуют механизмы для работы с памятью в режиме прерывания (высокий IRQL). Для примера: списки, фиксация... Чем это тебе не подходит ?
     
  11. Godness

    Godness Мёртвый дзена

    Публикаций:
    0
    Регистрация:
    27 ноя 2002
    Сообщения:
    90
    А конкретней может сказать какие функции копать?
     
  12. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    IoCreateMdl/MmProbeAndLockPages/MmMapLockedPages