Составители:
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
Страницы
- « первая
- ‹ предыдущая
- …
- 19
- 20
- 21
- 22
- 23
- …
- следующая ›
- последняя »