Операционные системы. Марапулец Ю.В. - 21 стр.

UptoLike

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

CommitMemFilter пытается закрепить страницу и, если ее старания приводят к
успеху, продолжает выполнение команды lstrcopy. Если функция
CommitMemFilter не справляется с задачей, поиск соответствующего
обработчика исключения продолжается.
LONG CommitMemFilter (
DWORD dwExceptCode, // код, идентифицирующий исключение
int iIndex ) // элемент массива, в котором произошла ошибка
{
LPVOID lpvResult;
// Если исключение не является страничной ошибкой,
// отказаться обрабатывать его и поручить системе
// поиск соответствующего обработчика исключений.
if( dwExceptCode != EXCEPTION_ACCESS_VIOLATION )
{
return( EXCEPTION_CONTINUE_SEARCH ) ;
}
// Попытка закрепить страницу.
lpvResult = VirtualAlloc(
&( pBase(iIndex * ITEM_SIZE] ), // нижняя граница закрепляемой области
ITEM_SIZE, // размер закрепляемой области
MEM_COMMIT, // новый флаг состояния
PAGE_READWRITE ); // уровень защиты
if( ! lpvResult ) // произошла ли ошибка выделения памяти?
{
// Если мы не можем закрепить страницу, то не сможем обработать
исключение
return( EXCEPTION_CONTINUE_SEARCH );
}
// Недостающая страница теперь находится на своем месте.
// Система должна вернуться назад и повторить попытку.
return( EXCEPTION_CONTINUE_EXECUTION ) ;
}
4. Удалить элемент списка.
Функция DeleteItem удаляет элемент из
виртуального массива, она проверяет, не осталось ли других элементов в этой
странице памяти. Если все четыре элемента, которые находятся на странице,
пусты, функция отменяет закрепление страницы, передавая дополнительные 4
Кб памяти в распоряжение системы. Виртуальные адреса страницы остаются
зарезервированными. Независимо от того, освобождает команда DeleteItem
страницу или нет, она удаляет строку из списка и обновляет глобальные
переменные состояния.
21
CommitMemFilter пытается закрепить страницу и, если ее старания приводят к
успеху, продолжает выполнение команды lstrcopy. Если функция
CommitMemFilter не справляется с задачей, поиск соответствующего
обработчика исключения продолжается.

LONG CommitMemFilter (
    DWORD dwExceptCode, // код, идентифицирующий исключение
    int iIndex )      // элемент массива, в котором произошла ошибка
{
    LPVOID lpvResult;
           // Если исключение не является страничной ошибкой,
           // отказаться обрабатывать его и поручить системе
           // поиск соответствующего обработчика исключений.
     if( dwExceptCode != EXCEPTION_ACCESS_VIOLATION )
     {
           return( EXCEPTION_CONTINUE_SEARCH ) ;
     }
              // Попытка закрепить страницу.
      lpvResult = VirtualAlloc(
      &( pBase(iIndex * ITEM_SIZE] ), // нижняя граница закрепляемой области
              ITEM_SIZE,               // размер закрепляемой области
              MEM_COMMIT,                   // новый флаг состояния
              PAGE_READWRITE );                 // уровень защиты
      if( ! lpvResult )         // произошла ли ошибка выделения памяти?
      {
         // Если мы не можем закрепить страницу, то не сможем обработать
         исключение
              return( EXCEPTION_CONTINUE_SEARCH );
      }
// Недостающая страница теперь находится на своем месте.
// Система должна вернуться назад и повторить попытку.
      return( EXCEPTION_CONTINUE_EXECUTION ) ;
}

      4. Удалить элемент списка. Функция DeleteItem удаляет элемент из
виртуального массива, она проверяет, не осталось ли других элементов в этой
странице памяти. Если все четыре элемента, которые находятся на странице,
пусты, функция отменяет закрепление страницы, передавая дополнительные 4
Кб памяти в распоряжение системы. Виртуальные адреса страницы остаются
зарезервированными. Независимо от того, освобождает команда DeleteItem
страницу или нет, она удаляет строку из списка и обновляет глобальные
переменные состояния.

                                     21