Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

MapUserPhysicalPages

01.01.2007

Функция MapUserPhysicalPages проецирует выделенную ранее область физической памяти в указанное адрусное пространство AWE-региона виртуальной памяти. Для того, чтобы произвести "групповое" проецирование или разпроецирование для нескольких регионов, вы должны воспользоваться функцией MapUserPhysicalPagesScatter.

{ Вариант 1 }
function MapUserPhysicalPages(
  lpAddress: Pointer      // начальный адрес области памяти 
  NumberOfPages: UINT;    // размер физической памяти в страницах 
  var UserPfnArray: UINT  // первый элемент массива фреймов страниц 
): Boolean; overload;
 
{ Вариант 2 }
function MapUserPhysicalPages(
  lpAddress: Pointer      // начальный адрес области памяти 
  NumberOfPages: UINT;    // размер физической памяти в страницах 
  UserPfnArray: Pointer   // указатель на массив фреймов страниц 
): Boolean; overload;

Параметры

lpAddress

Указатель на начальный адрес области памяти, на который будет спроецирована физическая память. Это значение должно находиться внутри диапазона виртуального адресного пространства приложения, выделенного при помощи функции VirtualAlloc с атрубутом, указывающим принадлежность выделяемого фрагмента памяти к AWE-региону.

NumberOfPages

Задает размер в страницах физической памяти (и виртуального адресного пространства). Виртуальное адресное пространство непрерывно и начинается с адреса, указанного в параметре lpAddress. Кадры физической памяти задаются параметром UserPfnArray. Общее число страниц не может превышть то количество страниц, которое было выделено при вызове AllocateUserPhysicalPages.

UserPfnArray

Задает начальный элемент массива фреймов страниц (вариант 1). Эти фрейймы должны быть спроецированы в область памяти, на которую указывает параметр lpAddress. Указанный массив должен содержать по меньшей мере NumberOfPages элементов типа UINT.

Важно! Не пытайтесь модифицировать содержимое этого буфера. Он содержит данные, принадлежащие операционной системе, повреждение которых можт повлечь за собой катастрофические последствия. В этом буфере не содержиться никакой информации, необходимой вашему приложению.

Указание значение nil этому параметру (вариант 2), позволяет провести распроецирование указанного диапазона адресов. При этом указанные страницы не освобождаются в физической памяти, для этого нужно выполнять специальный вызов FreeUserPhysicalPages.

Возвращаемое значение

В случае удачного завершения фкнция возвращает True.

В случае ошибки (когда не было выпоолнено ни частичного, ни полного проецирования) функция вернет False. Для получения расширенной информации об ошибке следует сделать вызов GetLastError.

Описание

Любое количество страниц в физической памяти никак не затрагивает память, выделенную при помощи функции VirtualAlloc. Новая проекция физической памяти на виртуальное адресное пространство процесса автоматически перезаписывает все старые проекции.

Вы не можете спроецровать на виртуальное адресное пространство процесса страницы, которые не были выделены при помощи метода AllocateUserPhysicalPages.

Если со страницы физической памяти было снято проецирование на виртуальное адресно пространство процесса, то это не приводит к освобождению страницы физической памяти. Чтобы освободить страницу в физической памяти, необходимо выполнить вызов FreeUserPhysicalPages.

Страницы физической памяти могут располагаться где угодно. Вы не можете делать каких либо предположений относительно расположения страниц в оперативной памяти. Если со страницы физической памяти было снято проецирование на виртуальное адресно пространство процесса, то это не приводит к освобождению страницы физической памяти. Чтобы освободить страницу в физической памяти, необходимо выполнить вызов FreeUserPhysicalPages.

Для того, чтобы только разпроецировать страницы в физической памяти, необходимо передать в параметре UserPfnArray значение nil.

В многопроцессорных системах данная функция сохраняет согласованность буферов на аппаратном уровне. По выходе из функции гарантируется, что все потоки и процессы будут видеть корректное проецирование страниц.

Требования

Windows NT/2000: Требуется Windows 2000 или более поздняя версия

Windows 95/98: Не поддерживается

Бибиотека: Kernel32.dll

Подключаемый модуль: Windows

© Mystic, 2002