Einzelnen Beitrag anzeigen

Go2EITS

Registriert seit: 25. Jun 2006
519 Beiträge
 
Delphi 7 Personal
 
#10

Re: Floppy schreibschutz an oder aus?

  Alt 5. Okt 2006, 13:54
@Alle
Zum obigen Code: Funktioniert nicht!

Ich habe mit der Zeile
Zitat:
Device := Format('\\.\%s:', ['D']);
mein CD Laufwerk angesprochen. Prima: Meldet schreibgeschützt. Aber meine beschreibare Festplatte leider auch.

Delphi-Quellcode:
function IDW(Drive: Integer): Boolean;
const
  IOCTL_DISK_IS_WRITABLE = (
    ($00000007 shl 16) or (0 shl 14) or
    ($0009 shl 2) or 0);
var
  Device: String;
  hFile: THandle;
  BytesReturned: Cardinal;
begin
  Result := false;
  //Device := Format('\\.\%s:', [Char(Drive + 65)]); //Original!
  Device := Format('\\.\%s:', ['D']); //Zum Testen von Laufwerk D etc.
  hFile := CreateFile(@Device[1], GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile <> 0 then
  begin
    Result := DeviceIoControl(hFile, IOCTL_DISK_IS_WRITABLE, nil, 0, nil, 0,
                              BytesReturned, nil);
    CloseHandle(hFile);
  end;
end;
Mit dem nachfolgendem Beispiel funktioniert es zumindestens auf CD ROMS und Festplatten: Aber auf eine Diskette, die schreibgeschützt ist, kommt eine dicke Fehlermeldung, wie immer, wenn auf Laufwerk A: geschreiben werden soll.

Delphi-Quellcode:
function IsDriveWritable(Drive: Integer): Boolean;
const
  IOCTL_DISK_IS_WRITABLE = (
    ($00000007 shl 16) or (0 shl 14) or
    ($0009 shl 2) or 0);
var
  Device: String;
  hFile: THandle;
  BytesReturned: Cardinal;
begin
  Result := false;
  Device := Format('\\.\%s:', [Char(Drive + 65)]);
  hFile := CreateFile(@Device[1], GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil,
                      OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  if hFile <> 0 then
  begin
    Result := DeviceIoControl(hFile, IOCTL_DISK_IS_WRITABLE, nil, 0, nil, 0,
                              BytesReturned, nil);
    CloseHandle(hFile);
  end;
end;
Vorerst habe ich es mit IsDriveWritable gelöst. Besser ist es natürlich zu wissen, was für einen Datenträger man hat:ListDrives Torry und dann IsDriveWritable aufruft.

Wer hat was zusammengestoppselt, was funktioniert?
Beste Grüße Go2EITS
  Mit Zitat antworten Zitat