Bonsoir,

Soit une fonction de test cryptant/décryptant un buffer
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;
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
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 !