
/**
 * @file: cr0trick.c
 *
 * Tento soubor implementuje dve rutiny pro vypnuti a opetovne zapnuti
 * ochrany pametovych stranek proti zapisu. Tyto rutiny pouzivaji metodu
 * "CR0 trick," ktera spociva v nastaveni hodnoty bitu WP v registru CR0
 * na nulu (vypne ochranu) ci na jednicku (zapne ochranu).
 *
 * Impplementace funguje pouze na architekture IA32, ne AMD64/x64 ci IA64.
 */

#include <ntddk.h>
#include "cr0trick.h"


/** Vypne ochranu pametovych stranek proti zapisu.
 *
 * Rutina tuto operaci provede tak, ze WP bit v registru CR0 nastavi na
 * nulu. Tim R/W bity ve strankovacich tabulkach ztraci na ucinnosti,
 * procesor jejich hodnotu ignoruje.
 */
VOID CR0TrickBegin(VOID)
{
  KdPrint(("cr0trick.c: CR0TrickBegin()\n"));

  __asm {
    push eax
    mov eax, cr0
    and eax, 0xFFFEFFFF
    mov Cr0, eax
    pop eax
  }

  KdPrint(("cr0trick.c: CR0TrickBegin(-)\n"));
  return;
}


/** Zapne ochranu pametovych stranek proti zapisu.
 *
 * Rutina nastavi WP bit registru CR0 na jednicku. Procesor prestane
 * ignorovat R/W bity ve strankovacich tabulkach.
 */
VOID CR0TrickEnd(VOID)
{
  KdPrint(("cr0trick.c: CR0TrickEnd()\n"));

  __asm
  {
    push eax
    mov eax, Cr0
    or eax, NOT 0xFFFEFFFF
    mov Cr0, eax
    pop eax
  }

  KdPrint(("cr0trick.c: CR0TrickEnd(-)\n"));
  return;
}
