![]() |
Floppy schreibschutz an oder aus?
wie lässt sich das am einfachsten rausfinden?
|
Re: Floppy schreibschutz an oder aus?
Hi,
da es auf dem Datenträger steht und (AFAIK) sich nicht einlesen lässt, würde ich vorschlagen einfach versuchen eine Datei zu erstellen und wenn das fehlt schlägt einfach vermuten dass der Schreibschutz aktiv ist. ;) Chris |
Re: Floppy schreibschutz an oder aus?
Früher, in alten TurboPASCAL-Zeiten, habe ich versucht, temporär eine Datei auf der Disk anzulegen.
Wenn das ging, gab´s keinen Schreibschutz. ;) Edit: Hm, da war der Chakotay schneller. |
Re: Floppy schreibschutz an oder aus?
wenn die floppy noch nicht formatiert wurde, dann nützt dieses verfahren recht wenig.
was anderes fällt mir aber auch nicht ein :(
Delphi-Quellcode:
function WriteProtected: Boolean;
var H: DWord; begin Result := False; H := CreateFile(PChar('A:\1_dd_fg_666_4423_4.dojwq'), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0); Result := (H = INVALID_HANDLE_VALUE); CloseHandle(H); end; |
Re: Floppy schreibschutz an oder aus?
mit DeviceIoControl() und IOCTL_DISK_IS_WRITABLE sollte das gehen.
|
Re: Floppy schreibschutz an oder aus?
Aber vorsicht, da gibt es wieder unterschiedliche Implementierungen bei NT ff. und Consumer Windows.
|
Re: Floppy schreibschutz an oder aus?
Ich erkenne das "Consumer Windows" nicht als Betriebssystem an :P :lol:
ich gehe davon aus, dass der Code nur auf NT-Systemen funktionieren soll ;-) |
Re: Floppy schreibschutz an oder aus?
Delphi-Quellcode:
ungetestet! hab leider kein Floppylaufwerk hier.
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; Drive 0 = A:, 1 = B:, 2 = C:, etc... |
Re: Floppy schreibschutz an oder aus?
vielen dank. werds mal ein bisschen durchtesten!
|
Re: Floppy schreibschutz an oder aus?
@Alle
Zum obigen Code: Funktioniert nicht! Ich habe mit der Zeile Zitat:
Delphi-Quellcode:
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.
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;
Delphi-Quellcode:
Vorerst habe ich es mit IsDriveWritable gelöst. Besser ist es natürlich zu wissen, was für einen Datenträger man hat:
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; ![]() Wer hat was zusammengestoppselt, was funktioniert? Beste Grüße Go2EITS |
Re: Floppy schreibschutz an oder aus?
WAS für eine Fehlermeldung kommt?
|
Re: Floppy schreibschutz an oder aus?
Liste der Anhänge anzeigen (Anzahl: 1)
Das Übliche, wenn Du schreibend auf die schreibgeschütze Diskette zugreifst:
Delphi-Quellcode:
function ReadOnly:Boolean;
var H: DWord; k:string; begin Result := False; k:=paramstr(0); H := CreateFile(PChar('A:\_XXX.bak'), //Zum Test so zerpflückt // H := CreateFile(PChar(k[1]+':\_XXX.bak'), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, 0, 0); Result := (H = INVALID_HANDLE_VALUE); CloseHandle(H); end; |
Re: Floppy schreibschutz an oder aus?
Versuch mal
![]() |
Re: Floppy schreibschutz an oder aus?
Zitat:
|
Re: Floppy schreibschutz an oder aus?
Zitat:
|
Re: Floppy schreibschutz an oder aus?
Kleine Anmerkung zum Code: Format() generiert einen String, CreateFile erwartet PAnsiChar, also einen nullterminierten String. Also besser dem Formatstring noch ein Nullbyte mitgeben, damits nicht unerwartete Probleme gibt. Kleine Ursache, grosse Wirkung!
|
Re: Floppy schreibschutz an oder aus?
Die Meldung ist ja nicht so schlimm, ich könnte ja prüfen, ob ich auf einem A Laufwerk bin.
SetErrorMode? Hab es mir angesehen. Wenn ich das Umssetzen könnte, hätte ich bestimmt Arbeit als Programmierer. :zwinker: Roter Kasten: Ja ich auch. Aber bei mir geht es nicht. Du hast einen Bug drin, wie ich sehe, das zum Thema generalisieren, (wie ich erst das hasse: :zwinker: )
Delphi-Quellcode:
Na, dann bleibt nur noch am Schluss diese Threads den richtigen Code zu veröffentlichen, damit niemand so rumstoppselt wie ich. Ich habe den Code mal getestet und hier geschrieben. Das ist doch wohl ok?
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! Da muss wohl die +65 raus Device := Format('\\.\%s:', ['A']); //Zum Testen von Laufwerk A. Geht! //Geht sogar, wenn ich den Schreibschutz beim Prüfen ändere. 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; Beste Grüße! Go2EITS |
Re: Floppy schreibschutz an oder aus?
Zitat:
Zitat:
Außerdem wäre ich mit der Bezeichnung "Fehler" vorsichtig - bei mir funktioniert der Code ja wunderbar ;) Zitat:
Delphi-Quellcode:
function IDW(Drive: TChar): 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:', [Drive]); 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; Result := IDW('A'); |
Re: Floppy schreibschutz an oder aus?
Wo ist das Problem? Einfach die Funktion mit der entsprechenden Konstante aufrufen und fertig.
|
Re: Floppy schreibschutz an oder aus?
Zitat:
|
Re: Floppy schreibschutz an oder aus?
Ich meinte Go2EITS. ;)
|
Re: Floppy schreibschutz an oder aus?
Die ursprünglichen Übergabeparameter sind wohl das Laufwerk 0 oder 1 und die 65 transformiert die Eingabe:
0 + 65 = A (Laufwerk!) 1 + 65 = B (Laufwerk!) Und ich habe den Code auf D etc. geprüft. Sagt doch gleich, dass der Code nur auf Diskettenlaufwerken geht. (OT Und ich probiere und probiere und blamiere mich hier. OT) Ich habe versucht, den Code sorgfältig zu prüfen und habe übersehen, dass er ausschließlich auf einem Disketten Laufwerks funktioniert. Ich suche schon seid Stunden ein IsLaufwerkReadOnlyWhereMyPrgrammIsRunningFrom für mein Programm. Jetzt musst Du Dich leider mit einem Anfänger rumärgern. Na, dann kann Dein Tag ja nur noch besser werden. :zwinker: Beste Grüße Go2EITS |
Re: Floppy schreibschutz an oder aus?
Moin Go2EITS,
Zitat:
|
Re: Floppy schreibschutz an oder aus?
Zitat:
Bei mir ist dat IDE-Plättchen auch schreibgeschützt, obwohl darauf Windows läuft, die S-ATAs stimmen aber :? Und wie bei meinem ersten datarescue-Fenster angemerkt wurde, ist es bei einigen Anderen ebenfalls so :stupid: |
Re: Floppy schreibschutz an oder aus?
@Seehase
Du sieht ja, irgendwie schaffe ich es, was Neues zu finden. :-D Und wenn es ein falscher Fehler ist. @Himitzu Meine Rehabilitation! (Zumindestens Teilweise. Puh!) Grüße Go2EITS |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:43 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz