Probable problème de passage de paramètres en cascade
Bonsoir,
Soit une fonction de test cryptant/décryptant un buffer
Code:
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; |
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:
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; |
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.
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 !