type
TScalarPrefetch = record
Minimum: Word;
Maximum: Word;
MaximumBlocks: Word;
end;
TBlockPrefetch = record
Minimum: Word;
Maximum: Word;
end;
DISK_CACHE_RETENTION_PRIORITY = (EqualPriority, KeepPrefetchedData, KeepReadData);
TDiskCacheRetentionPriority = DISK_CACHE_RETENTION_PRIORITY;
_DISK_CACHE_INFORMATION = record
ParametersSavable: Boolean;
ReadCacheEnabled: Boolean;
WriteCacheEnabled: Boolean;
ReadRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
WriteRetentionPriority: DISK_CACHE_RETENTION_PRIORITY;
DisablePrefetchTransferLength: Word;
PrefetchScalar: Bool;
ScalarPrefetch: TScalarPrefetch;
BlockPrefetch: TBlockPrefetch;
end;
DISK_CACHE_INFORMATION = _DISK_CACHE_INFORMATION;
TDiskCacheInformation = DISK_CACHE_INFORMATION;
const
IOCTL_DISK_GET_CACHE_INFORMATION = {text}0740D4;
IOCTL_DISK_SET_CACHE_INFORMATION = {text}07C0D8;
IOCTL_DISK_SET_CACHE_SETTING = {text}07c0e4;
IOCTL_DISK_GET_LENGTH_INFO = {text}07405C;
procedure TForm1.Button2Click(Sender: TObject);
var
h: THandle;
info: TDiskCacheInformation;
response: DWord;
E: Integer;
begin
h := CreateFile(PChar('\.\D:'), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_SYSTEM, 0);
if h = INVALID_HANDLE_VALUE then begin
ShowMessage('Can''t access disk.');
Exit;
end;
info.WriteCacheEnabled := True;
info.ReadCacheEnabled:= false;
info.DisablePrefetchTransferLength := 1;
if not DeviceIoControl(h, IOCTL_DISK_SET_CACHE_INFORMATION, nil, 0, @info, SizeOf(info), response, nil) then begin
E:=GetLastError;
Showmessage(Format('Error: %d', [E])); //ERROR 24
Exit;
end;
CloseHandle(h);
end;