Программирование драйверов Windows



              

Вызовы для выделения и освобождения областей виртуальной памяти


Для манипуляций с областями памяти (выделение и освобождение) в режиме ядра используются специальные системные вызовы, отличающиеся от API вызовов режима ядра: ExAllocatePool, ExAllocatePoolWithTag, ExFreePool. В режиме ядра возможно выделение и освобождение области физически непрерывной памяти, что выполняется при помощи вызовов MmAllocateContiguousMemory

и, соответственно, MmFreeContiguousMemory. Эти вызовы рассмотрены ниже.

Таблица 7.2. Прототип вызова ExAllocatePool

PVOID ExAllocatePool IRQL &#60 DISPATCH_LEVEL
Параметры

Выполняет выделение области памяти

IN POOL_TYPE PoolType

Тип виртуальной памяти, в которой следует выделять область. Наиболее употребительны значения:

PagedPool &#8212 страничная

NonPagedPool

&#8212 нестраничная, тогда данную функцию можно вызывать при любом уровне IRQL

IN ULONG NumberOfBytes Размер запрашиваемой области
Возвращаемое значение Указатель на выделенную область либо NULL (в случае, если память выделить невозможно). Выделенная область всегда выравнивается на 8 байт. В случае, если запрашиваемый размер превышает PAGE_SIZE, то выделяемая область выравнивается на размер страницы.

Таблица 7.3. Прототип вызова ExAllocatePoolWithTag

PVOID ExAllocatePoolWithTag IRQL &#60 DISPATCH_LEVEL
Параметры Выполняет выделение области памяти
IN POOL_TYPE PoolType См. описание ExAllocatePool

выше.

IN ULONG NumberOfBytes Размер запрашиваемой области
IN ULONG Tag Метка (тег) для данной области, можно задавать как 4 символа, например, 'ABCD'. Удобно для отладки.
Возвращаемое значение См. описание ExAllocatePool

выше.

Таблица 7.4. Прототип вызова ExFreePool

VOID ExFreePool IRQL &#60 DISPATCH_LEVEL
Параметры Выполняет освобождение области памяти
IN PVOID pBuffer Указатель на освобождаемую область памяти, выделенную вызовами ExAllocatePool или ExAllocatePoolWithTag. Если освобождается нестраничная память, вызов может быть сделан из кода на уровне DISPATCH_LEVEL IRQL
Возвращаемое значение void
<


Содержание  Назад  Вперед