Thema: Delphi writefile

Einzelnen Beitrag anzeigen

alpenrose

Registriert seit: 31. Mai 2017
9 Beiträge
 
#1

writefile

  Alt 10. Aug 2019, 09:25
Ich möchte in WIN7 auf einer FAT32-Partition beliebige Sektoren mit writefile schreiben. readfile funktioniert problemlos, writefile liefert Error 5 (access denied).

Code:

...
...
c:='\\.\PhysicalDrive'+dtnr+chr(0);
a:=createfile(pchar(c),GENERIC_READ+GENERIC_WRITE, FILE_SHARE_READ+FILE_SHARE_WRITE,nil,OPEN_EXISTING ,FILE_FLAG_WRITE_THROUGH+FILE_FLAG_NO_BUFFERING,0) ;
x:=DeviceIoControl(a,$90020,NIL,0,NIL,0,br,NIL); //FSCTL_DISMOUNT_VOLUME=$90020
x:=DeviceIoControl(a,$90018,NIL,0,NIL,0,br,NIL); //FSCTL_LOCK_VOLUME=$90018
...
...
procedure sektorlesenuv(var bufferuv:array of byte);
var ps,psh,psl,pslh,psll:comp;
vsh,vsl,b:long;
x:boolean;
br,bp:dword;
begin
bp:=512*spc;
ps:=sektorakt*512;
psh:=int(ps/zweih32);
psl:=ps-psh*zweih32;
vsh.highword:=0;
vsh.lowword:=trunc(psh);
pslh:=int(psl/zweih16);
psll:=psl-pslh*zweih16;
vsl.highword:=trunc(pslh);
vsl.lowword:=trunc(psll);
b:=setfilepointer(a,vsl,@vsh,FILE_BEGIN);
x:=readfile(a,bufferuv[0],bp,br,nil);
end;
...
...
procedure sektorschreibenuv(bufferuv:array of byte);
var ps,psh,psl,pslh,psll:comp;
vsh,vsl,b:long;
x:boolean;
le:word;
br,bp:dword;
begin
bp:=512*spc;
ps:=sektorakt*512;
psh:=int(ps/zweih32);
psl:=ps-psh*zweih32;
vsh.highword:=0;
vsh.lowword:=trunc(psh);
pslh:=int(psl/zweih16);
psll:=psl-pslh*zweih16;
vsl.highword:=trunc(pslh);
vsl.lowword:=trunc(psll);
b:=setfilepointer(a,vsl,@vsh,FILE_BEGIN);
x:=writefile(a,bufferuv[0],bp,br,nil);
end;
...
...
closehandle(a)
...
...


Erklärungen:dtnr ist ein Integerwert
spc sind die Sektoren pro Cluster
sektorakt ist ein beliebiger physischer Sektor
Prozedur sektorlesenuv funktioniert einwandfrei
Prozedur sektorschreibenuv liefert für x den Wert false und für br den Wert 0
getlasterror liefert für writefile den Wert 5
  Mit Zitat antworten Zitat