Bonsoir,
Soit une fonction de test cryptant/décryptant un buffer
dont l'adresse est passée dans la variable lyCryptAlg aux fonctions de lecture/écriture de fichiers suivantes, qui encapsulent les fonctions Windows WinRead et WinWrite :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 function TestCrypt(var Buffer: TByteArray; Size: integer; Position: int64; PassWord: string; Write: Boolean): Boolean; var i, j, l: integer; begin {$o-} //Result:=True; Exit; l:=Length(PassWord); for i:=1 to Size do begin j := (Position + i) mod l ; if j=0 then j:=l; Buffer[i-1] := Buffer[i-1] xor Ord(PassWord[j]) ; end; Result:=True; {$o+} end;
L'exécution provoque une erreur, probablement de gestion de mémoire, dans la bibliothèque SQLite qui alloue le buffer et définit les fonctions WinRead et WinWrite.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 function lyCryptRead(hFile: integer; var Buffer: TByteArray; Size: integer; var Done: integer; var OLapd: OverLapped ):Boolean; stdcall; var Offset: int64; begin {$o-} Result:=WinRead(hFile, Buffer, Size, Done, OLapd); // on laisse faire WinVFS... if Result and MustCrypt then begin // on décrypte le Buffer Offset := OLapd.Offset + OLapd.OffsetHigh shl 32 ; if not lyCryptAlg(Buffer, Done, Offset, lyPassWord, False) then Done:=0; // renverra le Buffer vide et ShortRead alors que c'est un problème de décryptage... end; {$o+} end; function lyCryptWrite(hFile: integer; var Buffer: TByteArray; Size: integer; var Done: integer; var OLapd: OverLapped ): Boolean; stdcall; var Offset: int64; begin {$o-} if MustCrypt then begin // on crypte le Buffer Offset := OLapd.Offset + OLapd.OffsetHigh shl 32 ; Result:=lyCryptAlg(Buffer, Size, Offset, lyPassWord, True); end else Result:=True; if Result then Result:=WinWrite(hFile, Buffer, Size, Done, OLapd) // on laisse faire WinVFS... else Done:=-1; // indiquera une erreur d'écriture alors que c'est un problème de cryptage... {$o+} end;
Si je shunte le travail de la fonction de cryptage en décommentant la 1° ligne, plus d'erreur (mais plus de cryptage !)
Voyez-vous une explication liée au passage de paramètres ? Ou une autre : je suis preneur !
Partager