Comment prévenir une page de la mémoire à partir de la mise en cache hors
Comment faire une page de mémoire pas de mise en cache
Dans l'article précédent, j'ai montré comment les pages de liste.
de Modifier les attributs n'est pas un gros travail, mais il semble seulement de travailler sur la mémoire des pages avec des accès en écriture. Je n'ai pas encore découvert comment activer l'écriture sur une page de la mémoire qui est marqué en lecture seule.
Ce code en boucle toutes les pages de mémoire, si elle trouve un exécutable page avec accès en écriture, il va mettre le NOCACHE attribut, forçant windows ne fait jamais de swap sur cette page de mémoire.
Attention: l'écriture des valeurs erronées peuvent provoquer un processus d'subitement. Assurez-vous que vous n'êtes pas occupé avec des documents importants sur votre ordinateur lors de l'exécution de ce code.
Nous utilisons le VirtualProtectEx api pour modifier l'attribut.
procedure TForm1.Button1Click(Sender: TObject)
var i,l:integer
& ! & ! & ! & nbsp pid:THandle
& ! & ! & ! & nbsp meminfo:MEMORY_BASIC_INFORMATION
& ! & ! & ! & nbsp memstart:pointeur
& ! & ! & ! & nbsp memsize:Integer
& ! & ! & ! & nbsp newprotect, oldprotect: DWORD
& ! & ! & ! & nbsp var s:String
var lpMsgBuf : PCHAR
begin
& nbsp & nbsp button1.enabled := false
& nbsp & nbsp for i:=0 à 2000 n' //
& ! & ! & ! & nbsp begin //PROCESS_QUERY_INFORMATION
& ! & ! & ! & ! & ! & nbsp pid:=OpenProcess (PROCESS_ALL_ACCESS{PROCESS_VM_OPERATION ou PROCESS_QUERY_INFORMATION ou PROCESS_VM_WRITE}, false, i*4)
& ! & ! & ! & ! & ! & nbsp si pid<>0 then
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart := 0
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp l:=VirtualQueryEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp MemInfo,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SizeOf(MEMORY_BASIC_INFORMATION))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp while (l=SizeOf(MEMORY_BASIC_INFORMATION)) ne
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Application.ProcessMessages
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Application.Résilié
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si meminfo.Protéger = PAGE_EXECUTE_READ puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp //faire readwrite:
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect := PAGE_EXECUTE_READWRITE
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si 0<>(memInfo.Protéger et (PAGE_EXECUTE ou PAGE_EXECUTE_READ ou PAGE_EXECUTE_READWRITE))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect := meminfo.Protéger ou PAGE_NOCACHE
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newProtect := meminfo.Protéger
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart := meminfo.BaseAddress
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize := meminfo.regionsize
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (meminfo.etat=MEM_COMMIT) et
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((meminfo.protéger<>newprotect)) et
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((meminfo.protéger et PAGE_GUARD)=0)// et
// ((meminfo.Type_9 et (mem_private ou mem_mapped))=0)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp puis //allouée
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp & ! & ! & ! & ! & ! & nbsp si pas VirtualProtectEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp @oldprotect) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER ou FORMAT_MESSAGE_FROM_SYSTEM ou FORMAT_MESSAGE_IGNORE_INSERTS, Néant, GetLastError, $00000400, (*LANG_NEUTRAL, SUBLANG_DEFAULT*) @lpMsgBuf, 0, Nil )
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si lpMsgBuf <> Nil then
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp // showmessage (lpMsgBuf)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp LocalFree(Entier(lpMsgBuf))
& nbs & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // // showmessage ('ok')
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize := memsize 0
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sommeil(2)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp entier(memstart):=integer(memstart) memsize
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp l:=VirtualQueryEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp MemInfo,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SizeOf(MEMORY_BASIC_INFORMATION))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp closehandle (pid)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Application.Résilié
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp fin
& nbsp & nbsp button1.enabled := true
fin
Comment prevenir une page de la memoire a partir de la mise en cache hors
Comment prevenir une page de la memoire a partir de la mise en cache hors : Plusieurs milliers de conseils pour vous faciliter la vie.
Comment faire une page de memoire pas de mise en cache
Dans l'article precedent, j'ai montre comment les pages de liste.
de Modifier les attributs n'est pas un gros travail, mais il semble seulement de travailler sur la memoire des pages avec des acces en ecriture. Je n'ai pas encore decouvert comment activer l'ecriture sur une page de la memoire qui est marque en lecture seule.
Ce code en boucle toutes les pages de memoire, si elle trouve un executable page avec acces en ecriture, il va mettre le NOCACHE attribut, forçant windows ne fait jamais de swap sur cette page de memoire.
Attention: l'ecriture des valeurs erronees peuvent provoquer un processus d'subitement. Assurez-vous que vous n'etes pas occupe avec des documents importants sur votre ordinateur lors de l'execution de ce code.
Nous utilisons le VirtualProtectEx api pour modifier l'attribut.
procedure TForm1.Button1Click(Sender: TObject)
var i,l:integer
& ! & ! & ! & nbsp pid:THandle
& ! & ! & ! & nbsp meminfo:MEMORY_BASIC_INFORMATION
& ! & ! & ! & nbsp memstart:pointeur
& ! & ! & ! & nbsp memsize:Integer
& ! & ! & ! & nbsp newprotect, oldprotect: DWORD
& ! & ! & ! & nbsp var s:String
var lpMsgBuf : PCHAR
begin
& nbsp & nbsp button1.enabled := false
& nbsp & nbsp for i:=0 a 2000 n' //
& ! & ! & ! & nbsp begin //PROCESS_QUERY_INFORMATION
& ! & ! & ! & ! & ! & nbsp pid:=OpenProcess (PROCESS_ALL_ACCESS{PROCESS_VM_OPERATION ou PROCESS_QUERY_INFORMATION ou PROCESS_VM_WRITE}, false, i*4)
& ! & ! & ! & ! & ! & nbsp si pid<>0 then
& ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart := 0
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp l:=VirtualQueryEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp MemInfo,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SizeOf(MEMORY_BASIC_INFORMATION))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp while (l=SizeOf(MEMORY_BASIC_INFORMATION)) ne
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp Application.ProcessMessages
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Application.Resilie
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si meminfo.Proteger = PAGE_EXECUTE_READ puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp //faire readwrite:
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect := PAGE_EXECUTE_READWRITE
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si 0<>(memInfo.Proteger et (PAGE_EXECUTE ou PAGE_EXECUTE_READ ou PAGE_EXECUTE_READWRITE))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect := meminfo.Proteger ou PAGE_NOCACHE
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newProtect := meminfo.Proteger
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart := meminfo.BaseAddress
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize := meminfo.regionsize
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si (meminfo.etat=MEM_COMMIT) et
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((meminfo.proteger<>newprotect)) et
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp ((meminfo.proteger et PAGE_GUARD)=0)// et
// ((meminfo.Type_9 et (mem_private ou mem_mapped))=0)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp puis //allouee
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp & ! & ! & ! & ! & ! & nbsp si pas VirtualProtectEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp newprotect,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp @oldprotect) puis
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER ou FORMAT_MESSAGE_FROM_SYSTEM ou FORMAT_MESSAGE_IGNORE_INSERTS, Neant, GetLastError, $00000400, (*LANG_NEUTRAL, SUBLANG_DEFAULT*) @lpMsgBuf, 0, Nil )
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si lpMsgBuf <> Nil then
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp commencer
& ! & ! & ! & ! & ! & nbsp // showmessage (lpMsgBuf)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp LocalFree(Entier(lpMsgBuf))
& nbs & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & nbsp & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp else
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp // // showmessage ('ok')
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memsize := memsize 0
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp sommeil(2)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp entier(memstart):=integer(memstart) memsize
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp l:=VirtualQueryEx (pid,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp memstart,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp MemInfo,
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp SizeOf(MEMORY_BASIC_INFORMATION))
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp fin
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp closehandle (pid)
& ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp si l'Application.Resilie
& ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & ! & nbsp pause
& ! & ! & ! & ! & ! & ! & ! & nbsp fin
& nbsp & nbsp fin
& nbsp & nbsp button1.enabled := true
fin
Comment prévenir une page de la mémoire à partir de la mise en cache hors
By commentfaire
Comment prévenir une page de la mémoire à partir de la mise en cache hors : Plusieurs milliers de conseils pour vous faciliter la vie.