program usb_stick_tester; {$mode objfpc}{$H+} uses sysUtils; var f: file; i,j,k,block_len: int64; a: array[0..1023] of int64; fehler: boolean; begin if paramcount<>1 then begin writeln('usage: usb_stick_tester /dev/sdX'); halt(1); end; assignFile(f,paramstr(1)); try reset(f,1); except writeln('error: could not open "' + paramstr(1) + '"'); halt(1); end; block_len:=length(a) * sizeof(a[0]); j:=0; while true do begin for i:=0 to length(a)-1 do a[i]:=j * block_len + i; seek(f,j * block_len); try blockwrite(f,a[0],block_len); except writeln('write failed at position ' + intToStr(j*block_len) + ' .. ' + intToStr((j+1)*block_len-1)); break; end; if j>1 then begin k:=random(j); seek(f,k * block_len); blockread(f,a[0],block_len); fehler:=false; for i:=0 to length(a)-1 do if a[i] <> k * block_len + i then begin if (a[i]-i) mod block_len = 0 then writeln('Block ' + intToHex((a[i]-i) div block_len,2*sizeof(a[0])) + ' an Stelle ' + intToHex(k,2*sizeof(a[0]))) else writeln('Byte ' + intToHex(a[i],2*sizeof(a[0])) + ' an Stelle ' + intToHex(k * block_len + i,2*sizeof(a[0]))); fehler:=true; break; end; if fehler then break; end; inc(j); if j mod 1024 = 0 then write('.'); end; closeFile(f); end.