Основы программирования в Win32API. Марапулец Ю.В. - 47 стр.

UptoLike

Составители: 

зервировать и закрепить указанную область памяти. Часто программисты вызы-
вают функцию VirtualAlloc() сначала с флагом MEM_RESERVE
для резервиро-
вания большой области памяти, а затем несколько раз подрядс флагом
MEM_COMMIT
для поэтапного закрепления отдельных фрагментов.
Флаг fdwProtect определяет, каким образом использовать определенную стра-
ницу или диапазон страниц. Для резервируемой памяти этот флаг должен иметь
значение PAGE_NOACCESS.
При закреплении памяти устанавливается флаг
PAGE_READONLY
или PAGE_READWRITE. Другие программы не могут читать
информацию из адресного пространства вашего процесса, поэтому режим доступа
только для чтения обеспечивает защиту от ошибок в вашей программе, которые
могут привести к случайному повреждению важной информации. Уровни защиты
применимы к отдельным страницам. Различные страницы в одной области памяти
могут иметь разные значения флага защиты. Например, вы можете применить
флаг PAGE_READONLY
ко всему блоку, а затем временно изменять уровень за-
щиты отдельных страниц, разрешая доступ к ним для записи. Защитить от записи
только часть страницы невозможно, поскольку флаги устанавливаются для целых
страниц. В табл. 3.1 приведены возможные значения, которые может принимать
флаг fdwProtect.
Таблица 3.1
Значение флага Выполняемое действие
PAGE_READONLY Допускается только чтение
PAGE_READWRITE Допускается чтение и запись
PAGE_EXECUTE Допускается только исполнение
PAGE_EXECUTE_READ Допускается исполнение и чтение
PAGE_EXECUTE_READWRITE Допускается исполнение, чтение и запись
PAGE_GUARD
Дополнительный флаг защиты. При первом
обращении к странице флаг сбрасывается и возни-
кает исключение STATUS_GUARD_PAGE. Данный
флаг используется для контроля размеров стека с
возможностью его динамического расширения
PAGE_NOCACHE
Запрещает кэширование страниц. Может быть
полезен при разработке драйверовразличных
устройств (например, данные в видеобуфер долж-
ны переписываться сразу, без кэширования)
Функция VirtualAlloc() не может зарезервировать более 1 Гб памяти, по-
скольку процесс контролирует только нижнюю половину своего адресного
пространства объемом 2 Гб. В действительности объем контролируемой па-
мяти еще меньше из-за свободных областей (по 64 Кб каждая) на границах
адресного пространства процесса. Кроме того, функция VirtualAlloc() резер-
вирует память фрагментами по 64 Кб, а закрепляет ее фрагментами объемом
в одну страницу. При резервировании памяти функция VirtualAlloc() округ-
ляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При за-
креплении памяти функция VirtualAlloc осуществляет одно из двух действий.
47
зервировать и закрепить указанную область памяти. Часто программисты вызы-
вают функцию VirtualAlloc() сначала с флагом MEM_RESERVE для резервиро-
вания большой области памяти, а затем несколько раз подряд – с флагом
MEM_COMMIT для поэтапного закрепления отдельных фрагментов.
     Флаг fdwProtect определяет, каким образом использовать определенную стра-
ницу или диапазон страниц. Для резервируемой памяти этот флаг должен иметь
значение PAGE_NOACCESS. При закреплении памяти устанавливается флаг
PAGE_READONLY или PAGE_READWRITE. Другие программы не могут читать
информацию из адресного пространства вашего процесса, поэтому режим доступа
только для чтения обеспечивает защиту от ошибок в вашей программе, которые
могут привести к случайному повреждению важной информации. Уровни защиты
применимы к отдельным страницам. Различные страницы в одной области памяти
могут иметь разные значения флага защиты. Например, вы можете применить
флаг PAGE_READONLY ко всему блоку, а затем временно изменять уровень за-
щиты отдельных страниц, разрешая доступ к ним для записи. Защитить от записи
только часть страницы невозможно, поскольку флаги устанавливаются для целых
страниц. В табл. 3.1 приведены возможные значения, которые может принимать
флаг fdwProtect.

                                                                      Таблица 3.1

         Значение флага                        Выполняемое действие
  PAGE_READONLY                     Допускается только чтение
  PAGE_READWRITE                    Допускается чтение и запись
  PAGE_EXECUTE                      Допускается только исполнение
  PAGE_EXECUTE_READ                 Допускается исполнение и чтение
  PAGE_EXECUTE_READWRITE            Допускается исполнение, чтение и запись
                                    Дополнительный флаг защиты. При первом
                                  обращении к странице флаг сбрасывается и возни-
          PAGE_GUARD              кает исключение STATUS_GUARD_PAGE. Данный
                                  флаг используется для контроля размеров стека с
                                  возможностью его динамического расширения
                                    Запрещает кэширование страниц. Может быть
                                  полезен при разработке драйверов – различных
         PAGE_NOCACHE
                                  устройств (например, данные в видеобуфер долж-
                                  ны переписываться сразу, без кэширования)

    Функция VirtualAlloc() не может зарезервировать более 1 Гб памяти, по-
скольку процесс контролирует только нижнюю половину своего адресного
пространства объемом 2 Гб. В действительности объем контролируемой па-
мяти еще меньше из-за свободных областей (по 64 Кб каждая) на границах
адресного пространства процесса. Кроме того, функция VirtualAlloc() резер-
вирует память фрагментами по 64 Кб, а закрепляет ее фрагментами объемом
в одну страницу. При резервировании памяти функция VirtualAlloc() округ-
ляет аргумент lpvAddress до ближайшего значения, кратного 64 Кб. При за-
креплении памяти функция VirtualAlloc осуществляет одно из двух действий.

                                     47