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

MapUserPhysicalPagesScatter

01.01.2007

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

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

Параметры

lpAddresses [in]

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

NumberOfPages [in]

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

UserPfnArray [in]

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

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

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

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

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

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

Описание

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

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

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

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

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

Требования

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

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

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

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

© Mystic, 2002