Программирование для Windows NT (том 2)



         

Выполнение отображения файла в память


Итак, мы выполнили первые два шага, необходимые для работы с файлом, отображаемым на память, - открывание файла функцией CreateFile и создание отображения функцией CreateFileMapping. Теперь, получив от функции CreateFileMapping идентификатор объекта-отображения, мы должны выполнить само отображение, вызвав для этого функцию MapViewOfFile или MapViewOfFileEx. В результате заданный фрагмент отображенного файла будет доступен в адресном пространстве процесса.

Прототип функции MapViewOfFile приведен ниже:

LPVOID MapViewOfFile(

  HANDLE hFileMappingObject,  // идентификатор отображения

  DWORD dwDesiredAccess,   // режим доступа

  DWORD dwFileOffsetHigh,  // смещение в файле (старшее слово)

  DWORD dwFileOffsetLow,   // смещение в файле (младшее слово)

  DWORD dwNumberOfBytesToMap);// количество отображаемых байт

Функция MapViewOfFile создает окно размером dwNumberOfBytesToMap байт, которое смещено относительно начала файла на количество байт, заданное параметрами dwFileOffsetHigh и dwFileOffsetLow. Если задать значение параметра dwNumberOfBytesToMap равное нулю, будет выполнено отображение всего файла.

Смещение нужно задавать таким образом, чтобы оно попадало на границу минимального пространства памяти, которое можно зарезервировать. Значение 64 Кбайта подходит в большинстве случаев.

Более точно гранулярность памяти можно определить при помощи функции GetSystemInfo. Этой функции в качестве единственного параметра необходимо передать указатель на структуру типа SYSTEM_INFO, определенную следующим образом:

typedef struct _SYSTEM_INFO

{

  union {

    DWORD  dwOemId; // зарезервировано

    struct

    {

      WORD wProcessorArchitecture; // архитектура системы

      WORD wReserved; // зарезервировано

    };

  };

  DWORD  dwPageSize;                  // размер страницы

  LPVOID lpMinimumApplicationAddress; // минимальный адрес,

    // доступный приложениям и библиотекам DLL

  LPVOID lpMaximumApplicationAddress; // максимальный адрес,

    // доступный приложениям и библиотекам DLL




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