Драйвер. Чтение из памяти

Тема в разделе "WASM.NT.KERNEL", создана пользователем GLEB, 17 апр 2008.

  1. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Написал простейший драйвер, по примеру из книжки Солдатова.
    Как обращаться к памяти?
    Например получить дату BIOS.

    char *bios_date = (char *)0xFFFF5; приводит к синему экрану и перезагрузке. :dntknw:

    Я в этом деле пока не шарю вообще, так что сильно не бейте :)
     
  2. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    GLEB
    Почитай про организацию памяти в реальном и защищенном режиме. На форуме есть статьи
     
  3. ECk

    ECk Member

    Публикаций:
    0
    Регистрация:
    9 апр 2004
    Сообщения:
    454
    Адрес:
    Russia
    Для чтения памяти BIOS ее надо промаппить (MmMapIoSpace/MmUnmapIoSpace)
     
  4. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    ECk
    А можно подробнее.

    В Win9x можно получить дату bios обратившись по адресу 0xFFFF5;

    Как я понял MmMapIoSpace получает виртуальный адрес из физического.

    А 0xFFFF5 это какой? виртуальный или физический?
     
  5. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Сделал так:

    char *bios_date = NULL;
    MEMORY_CACHING_TYPE cache = 0;
    PHYSICAL_ADDRESS addr;

    addr.HighPart = 0;
    addr.LowPart = 0xFFFF5;

    bios_date = MmMapIoSpace(addr, 0, cache);

    Работает :)
    ECk, спасибо.

    Только вот интересует второй параметр MmMapIoSpace

    NumberOfBytes
    Specifies the number of bytes to be mapped.


    Что это значит?
     
  6. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    GLEB
    Размер нужной тебе области отображения :)
     
  7. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    Xerx
    То есть, например, для даты bios нужно отобразить 8 байт? (08/22/02)

    А почему MmMapIoSpace(addr, 0, cache); срабртала и BSOD не вызвала :) ????
     
  8. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    GLEB
    Насколько помню время работы под DOS, да, 8 байт. Почему сработала - вопрос скорее к экспертам, я ни разу не вызывал ее с нулевым размером :)
     
  9. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    потому что идет выравнивание постраничное.
     
  10. Xerx

    Xerx Алексей

    Публикаций:
    0
    Регистрация:
    17 фев 2005
    Сообщения:
    528
    Адрес:
    Russia
    n0name
    Все равно странно, что выравнивание 0 дает страницу. Если выравнивать (a+(SIZE-1)) && SIZE, то все-равно получится ноль. Запомню на будущее, спасибо.
     
  11. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    page_count = (addr & (PAGE_SIZE - 1) + size + (PAGE_SIZE - 1)) >> PAGE_SHIFT
    Это определяется количество страниц для выделения. тк 0xFFFF5 ну никакк не кратно PAGE_SIZE, то и 0 вполне сгодится.
     
  12. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    То есть MmMapIoSpace как бы копирует блок памяти размером NumberOfBytes начиная с указанного физ. адреса и возвращает виртуальный адрес (указатель на этот блок), а MmUnmapIoSpace соответственно освобождает его, так?

    P. S.
    Может глупость скажу или не в тему, но все же... почему char *bios_date = (char *)0xFFFF5; работает в Win 9x?
    Винда сама чтоли различает физические и виртуальные адреса? И почему подобное не работает в NT? Или в NT обращение к физ. адресу запрещено даже из режима ядра?

    P. S. S.
    Что за функция MmGetVirtualForPhysical (в DDK есть, но не описана почему-то) bios_date = MmGetVirtualForPhysical(addr) привело к синему экрану:dntknw:
     
  13. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    можно сказать и так.
    отмаппировала винда уже.
    нет
    разная организации памяти
    это не ограничение винды.
    лучше ее не использовать
     
  14. GLEB

    GLEB New Member

    Публикаций:
    0
    Регистрация:
    12 ноя 2007
    Сообщения:
    83
    n0name, понятно.

    Всем спасибо за разъяснения.
     
  15. k3internal

    k3internal New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2007
    Сообщения:
    607
    бгг =))
     
  16. wasm_test

    wasm_test wasm test user

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

    ну все верно.. обращение по невалидному адресу меньше MmHighestUserAddress из ядра приводит к исключению STATUS_ACCESS_VIOLATION, которое у тебя, по-видимому, не обрабатывалось.