[Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]

Использование функции resload_Protect *?

Теория

Есть различные ситуации, при которых  было бы очень полезно получать информацию о том, что установленная программа обращается к определенным участкам памяти. С помощью функции resload_Protect *?  можно защищать участки памяти от чтения и/или записи процессором. Защита подразумевает, что каждый доступ к такой защищенной области инициирует исключительное событие "Ошибка Доступа", которое создаст соответствующее окно с сообщением от WHDLoad. Если вы объявляете область памяти защищенной, используя функцию resload_Protect *?, то WHDLoad изменит затронутые дескрипторы страниц в списке перевода диспетчера памяти (MMU). Теперь при каждом доступе к защищенной странице центральный процессор будет инициировать исключительное событие "Ошибка Доступа". Обработчик исключительных событий внутри WHDLoad проверит его причину. Если причиной был доступ к защищенной странице, но доступ не тронул защищенную область, то этот доступ будет эмулироваться, и продолжится нормальное выполнение программы. Иначе WHDLoad закончит работу и выдаст соответствующее окно с сообщением. Если происходит доступ к инструкции (т.е. центральный процессор пытается загрузить код), то это всегда будет эмулироваться, или иначе говоря, функция resload_Protect *? затрагивает только чтение и запись данных. Факт тот, что каждый доступ к защищенной странице (в настоящее время размер страницы равен 4096 байт), создаст ошибку доступа, даже если защищенная область имеет длину всего 1 байт, в результате скорость выполнения программы очень сильно упадёт. Особенно, если части кода расположены на одной и той же странице. Если программа зависит от скорости выполнения, то возможна разница в выполнении. Таким образом, возможен вариант, что некоторые программы не будут работать с resload_Protect.

Пример: контрольные суммы по коду

Если вы устанавливаете игру, используя WHDLoad, вы должны исправить в игре процедуры оригинальных загрузчиков таким образом, чтобы они использовали WHDLoad, для загрузки данных игры. Некоторые игры выполняют подсчет контрольных сумм в некоторых областях кода, чтобы определить, не изменялся ли оригинальный код. Эти подпрограммы проверки иногда очень трудно найти. Но использование функции resload_Protect *?  в WHDLoad делает этот процесс очень легким. Все, что вы должны сделать, это защитить от чтения те байты, которые вы изменили в коде игры. Теперь каждая подпрограмма, которая попробует подсчитать контрольную сумму и прочитать ваш исправленный код, создаст ошибку доступа. И вы узнаете где расположена эта подпрограмма.

Ограничения

Вы не в коем случае не должны защищать участок памяти, куда указывает SSP. Если вы всё же это сделали, то произойдет Исключение, что приведёт к двойной ошибке шины (Double Bus Fault), потому что центральный процессор не сможет записать stackframe исключения. После двойной ошибки шины должна быть произведена перезагрузка для продолжения работы. WHDLoad проверяет конфликт защищенной области с SSP и если обнаруживает это, то завершает приложение. Но это не поможет, если SSP изменится позже. Более подробную информацию и про ограничения различных функций resload_Protect можно узнать из разделов Autodoc:

  • resload_ProtectRead
  • resload_ProtectReadWrite
  • resload_ProtectRemove
  • resload_ProtectSMC
  • resload_ProtectWrite
    [Main] [Docs] [Installs] [Search] [Team] [Guestbook] [Links]