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
Спасибо. Пробовал юзать MmMapIoSpace. Задаю PhisycalAddress = 8003F000h NumberOfBytes = 3FFh (кажется) Ну т.е. значение GDTR (получаю с помощью SGDT) MEMORY_CACHING_TYPE = 0 По идее должен получиться виртуальный адрес? В eax выходит чтото типа F7CF6000h Причем каждый раз новое значение. Пытаюсь обратиться из режима ядра: mov ebx,[eax] - и все.... перезагрузка! В чем проблема?
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] (не уверен что так). Подсобите сорсиком плиз
Sheff в GDTR храниться линейный (читать виртуальный (во flat модели)) адрес, преобразовывать ничего не надо