Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Floppy schreibschutz an oder aus? (https://www.delphipraxis.net/18008-floppy-schreibschutz-oder-aus.html)

Meflin 12. Mär 2004 19:48


Floppy schreibschutz an oder aus?
 
wie lässt sich das am einfachsten rausfinden?

CalganX 12. Mär 2004 20:02

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

MathiasSimmack 12. Mär 2004 20:03

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.

Wheelie 12. Mär 2004 20:32

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;

w3seek 12. Mär 2004 21:27

Re: Floppy schreibschutz an oder aus?
 
mit DeviceIoControl() und IOCTL_DISK_IS_WRITABLE sollte das gehen.

Luckie 12. Mär 2004 21:29

Re: Floppy schreibschutz an oder aus?
 
Aber vorsicht, da gibt es wieder unterschiedliche Implementierungen bei NT ff. und Consumer Windows.

w3seek 12. Mär 2004 21:41

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 ;-)

w3seek 12. Mär 2004 22:08

Re: Floppy schreibschutz an oder aus?
 
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;
ungetestet! hab leider kein Floppylaufwerk hier.
Drive 0 = A:, 1 = B:, 2 = C:, etc...

Meflin 13. Mär 2004 10:59

Re: Floppy schreibschutz an oder aus?
 
vielen dank. werds mal ein bisschen durchtesten!

Go2EITS 5. Okt 2006 13:54

Re: Floppy schreibschutz an oder aus?
 
@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. :cry:

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

Luckie 5. Okt 2006 13:59

Re: Floppy schreibschutz an oder aus?
 
WAS für eine Fehlermeldung kommt?

Go2EITS 5. Okt 2006 14:26

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;

Luckie 5. Okt 2006 14:35

Re: Floppy schreibschutz an oder aus?
 
Versuch mal MSDN-Library durchsuchenSetErrorMode mit SEM_FAILCRITICALERRORS. Aber nicht vergessen wieder zurückzustellen.

Meflin 5. Okt 2006 14:45

Re: Floppy schreibschutz an oder aus?
 
Zitat:

Zitat von Go2EITS
Zum obigen Code: Funktioniert nicht!

Falsch. Wie ich derart generalisierende Aussagen hasse... Für Disketten funktioniert er, und nach nichts anderem war gefragt! Daher funktioniert der Code sehr wohl :roll:


Catbytes 5. Okt 2006 14:56

Re: Floppy schreibschutz an oder aus?
 
Zitat:

Zitat von Wheelie
wenn die floppy noch nicht formatiert wurde, dann nützt dieses verfahren recht wenig.

Langt ja schon, wenn die Disk voll ist...

OldGrumpy 5. Okt 2006 14:58

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!

Go2EITS 5. Okt 2006 15:06

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:
 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;
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?

Beste Grüße!
Go2EITS

Meflin 5. Okt 2006 15:15

Re: Floppy schreibschutz an oder aus?
 
Zitat:

Zitat von Go2EITS
Ja ich auch. Aber bei mir geht es nicht.

Das mag ja sein - aber dann zu behaupten der code würde nicht gehen finde ich etwas dreist ;)

Zitat:

Du hast einen Bug drin, wie ich sehe, das zum Thema generalisieren, (wie ich erst das hasse: :zwinker: )
Ich nicht... der code ist ja nicht von mir!
Außerdem wäre ich mit der Bezeichnung "Fehler" vorsichtig - bei mir funktioniert der Code ja wunderbar ;)

Zitat:

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?
Und mit der Bezeichnung "richtig" wäre ich aus obigem Grund auch vorsichtig. Man könnte sich das ganze natürlich irgendwie erleichtern indem man einen char als Parameter übergibt und nicht einen Integer - wieso das so ist leuchtet mir nämlich im Moment nicht ganz ein :gruebel:

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');

Luckie 5. Okt 2006 15:21

Re: Floppy schreibschutz an oder aus?
 
Wo ist das Problem? Einfach die Funktion mit der entsprechenden Konstante aufrufen und fertig.

Meflin 5. Okt 2006 15:23

Re: Floppy schreibschutz an oder aus?
 
Zitat:

Zitat von Luckie
Wo ist das Problem? Einfach die Funktion mit der entsprechenden Konstante aufrufen und fertig.

Äh... meinst du mich? Ich habe kein Problem geäußert sondern eine (imho) Vereinfachung der Funktion gepostet ;)


Luckie 5. Okt 2006 15:28

Re: Floppy schreibschutz an oder aus?
 
Ich meinte Go2EITS. ;)

Go2EITS 5. Okt 2006 15:47

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

Christian Seehase 5. Okt 2006 17:12

Re: Floppy schreibschutz an oder aus?
 
Moin Go2EITS,

Zitat:

Zitat von Go2EITS
Sagt doch gleich, dass der Code nur auf Diskettenlaufwerken geht.

da er bei mir auch mit Festplatten geht, ist es mir ein Rätsel, wie Du es hinbekommen hast, dass es bei Dir nicht funktioniert ;-)

himitsu 5. Okt 2006 19:21

Re: Floppy schreibschutz an oder aus?
 
Zitat:

Zitat von Christian Seehase
da er bei mir auch mit Festplatten geht, ist es mir ein Rätsel, wie Du es hinbekommen hast, dass es bei Dir nicht funktioniert ;-)

Das scheint wohl am IDE-Treiber/Chip zu liegen.

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:

Go2EITS 6. Okt 2006 12:24

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