Как юзать MmMapIoSpace?

Тема в разделе "WASM.NT.KERNEL", создана пользователем Sheff, 3 май 2007.

  1. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    Есть физический адрес памяти. Как его прочитать?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    MmMapoIoSpace() и читай его.
    Смотри DDK.
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    DDK:

    MmMapIoSpace
    The MmMapIoSpace routine maps the given physical address range to nonpaged system space.

    PVOID
    MmMapIoSpace(
    IN PHYSICAL_ADDRESS
    PhysicalAddress,
    IN ULONG NumberOfBytes,
    IN MEMORY_CACHING_TYPE CacheType
    );

    Parameters
    PhysicalAddress
    Specifies the starting physical address of the I/O range to be mapped.
    NumberOfBytes
    Specifies a value greater than zero, indicating the number of bytes to be mapped.
    CacheType
    Specifies a MEMORY_CACHING_TYPE value, which indicates the permitted caching behavior when mapping the physical address range.
    Include
    wdm.h or ntddk.h

    Return Value
    MmMapIoSpace returns the base virtual address that maps the base physical address for the range. If space for mapping the range is insufficient, it returns NULL.

    Comments
    A driver must call this routine during device start-up if it receives translated resources of type CmResourceTypeMemory. MmMapIoSpace maps the physical address returned in the resource list to a logical address through which the driver can access device registers.

    For example, drivers of PIO devices that allocate long-term I/O buffers can call this routine to make such a buffer accessible or to make device memory accessible.

    Callers of MmMapIoSpace must be running at IRQL = PASSIVE_LEVEL.

    See Also
    HalAllocateCommonBuffer, HalTranslateBusAddress, MmAllocateContiguousMemory, MmAllocateNonCachedMemory, MmMapLockedPages, MmUnmapIoSpace
     
  4. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    Спасибо. Пробовал юзать MmMapIoSpace.
    Задаю PhisycalAddress = 8003F000h
    NumberOfBytes = 3FFh (кажется) Ну т.е. значение GDTR (получаю с помощью SGDT)
    MEMORY_CACHING_TYPE = 0

    По идее должен получиться виртуальный адрес? В eax выходит чтото типа F7CF6000h
    Причем каждый раз новое значение.
    Пытаюсь обратиться из режима ядра: mov ebx,[eax] - и все.... перезагрузка!
    В чем проблема?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    gdtr.Base это уже линейный адрес.
     
  6. Sheff

    Sheff New Member

    Публикаций:
    0
    Регистрация:
    1 мар 2007
    Сообщения:
    6
    MmMapIoSpace returns the base virtual address that maps the base physical address for the range. If space for mapping the range is insufficient, it returns NULL.

    Насколько я понял это она ж возвращает виртуальный адрес? И потому можно к нему обращаться [addr] (не уверен что так). Подсобите сорсиком плиз :)
     
  7. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    Sheff
    в GDTR храниться линейный (читать виртуальный (во flat модели)) адрес, преобразовывать ничего не надо
     
  8. n0name

    n0name New Member

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