Laden...

Fehler bei der Ausgabe eines Binär-IMG auf USB-PhysicalDrive

Letzter Beitrag vor einem Jahr 6 Posts 644 Views
Fehler bei der Ausgabe eines Binär-IMG auf USB-PhysicalDrive

Wenn ich eine byte[] Array auf ein USB-PhysicalDrive ausgeben will, dann bekomme ich von WIndows 10 den Fehler "Der Zugriff auf den Pfad wurde verweigert.". Unter Windows 11 auf dem gleichen PC funktioniert es ohne diesen Fehler. Bei Win10 klappt es auch im abgesicherten Modus.

Ich muss das USB-Gerät (USB-Stick oder SD-Card im CardReader) zuvor mit DiskPart-CLEAN löschen

und mein Programm bzw. VS2022 mit "Als Administrator ausführen" starten.

So sieht das Ergebnis bei WIndows 10 aus:

<CreateFile> des USB-Laufwerkes "\\.\PhysicalDrive6" = OK
<DeviceIoControl FSCTL_LOCK_VOLUME> OK
<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK
<FileStream(h, FileAccess.Write> OK
<outPutFile.Write> bei Offset 0x0000000000 von Ges = 0x0000F50000

Fehler bei <write>
~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~
System.UnauthorizedAccessException: Der Zugriff auf den Pfad wurde verweigert.
   bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   bei System.IO.FileStream.WriteCore(Byte[] buffer, Int32 offset, Int32 count)
   bei System.IO.FileStream.Write(Byte[] array, Int32 offset, Int32 count)
   bei HkDiskette.Form1.WriteUsb2() in V:\#PgmHK\VC20xx\HKcs\HkDiskette\Form1.cs:Zeile 2380.
~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~

Und so bei Windows 11

<CreateFile> des USB-Laufwerkes "\\.\PhysicalDrive6" = OK
<DeviceIoControl FSCTL_LOCK_VOLUME> OK
<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK
<FileStream(h, FileAccess.Write> OK
<outPutFile.Write> bei Offset 0x0000000000 von Ges = 0x0000F50000
DeviceIoControl FSCTL_UNLOCK_VOLUME = OK
"\\.\PhysicalDrive6" 0x80070000: handle closed.
Ausgabe fertig

Hier etwas Code

        //#####################################
        // USB ausgeben TEST (2)
        //#####################################
        private void WriteUsb2()
        {
            string deviceId = @"\\.\PhysicalDrive6";
            string DsnEing = @"G:\Test\USB\CF16MB-CARDupd.vhd";
            int intOut = 0;

            int MaxLenPu = 0x7FFFFE00;

            FileInfo f = new FileInfo(DsnEing);
            if (!f.Exists)
            {
                PutLst("Datei " + DsnEing + " existiert nicht\n=> Abbruch");
                return;
            }
            long LenEing = f.Length;
            if (DsnEing.ToLower().EndsWith(".vhd"))
            {
                LenEing -= 512; // Ohne den Fuss-Sektor
            }

            int LenPu = (int)Math.Min(LenEing, MaxLenPu);

            long RestLen = LenEing;

            SafeFileHandle h = CreateFile(deviceId, GENERIC_READ | GENERIC_WRITE, 0,
                                          IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);

            if (h.IsInvalid)
            {
                PutLst("Fehler <IsInvalid == true> bei <CreateFile> des USB-Laufwerkes \"" + deviceId + "\"");
                return;
            }
            PutLst("<CreateFile> des USB-Laufwerkes \""+ deviceId + "\" = OK");

            if (!DeviceIoControl(h, FSCTL_LOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
            {
                PutLst("Fehler DeviceIoControl FSCTL_LOCK_VOLUME");
                CloseHandle(h);
                return;
            }
            PutLst("<DeviceIoControl FSCTL_LOCK_VOLUME> OK");

            if (!DeviceIoControl(h, FSCTL_DISMOUNT_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
            {
                PutLst("Fehler DeviceIoControl FSCTL_DISMOUNT_VOLUME");
                CloseHandle(h);
                return;
            }
            PutLst("<DeviceIoControl FSCTL_DISMOUNT_VOLUME> OK");

            Stream outPutFile = new FileStream(h, FileAccess.Write);
            PutLst("<FileStream(h, FileAccess.Write> OK");

            byte[] ByPu = null;
            int Gelesen = 0;
            long LenAusg = 0;

            using (FileStream ReadVHD = new FileStream(DsnEing, FileMode.Open, FileAccess.Read,
                                FileShare.Read, 4096, FileOptions.SequentialScan))

            {
                while (RestLen > 0)
                {
                    long LeseLen = Math.Min(RestLen, LenPu);
                    ByPu = new byte[LeseLen];

                    try
                    {
                        Gelesen = ReadVHD.Read(ByPu, 0, (int)LeseLen);
                    }
                    catch (Exception ex)
                    {
                        PutLst("Fehler beim Lesen der Datei \"" + DsnEing + "\"");
                        PutLst("~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~");
                        PutLst(ex.ToString());
                        PutLst("~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~");
                        return;
                    }
                    if (Gelesen != LeseLen) break; // => EOF erreicht

                    try
                    {
                        PutLst("<outPutFile.Write> bei Offset 0x" + LenAusg.ToString("X10")+
                            " von Ges = 0x"+LenEing.ToString("X10"));
                        outPutFile.Write(ByPu, 0, (int)LeseLen);
                        LenAusg += LeseLen;
                        laDiskLw.Text = EdLong(LenAusg, 14) + " / " + EdLong(LenEing, 14) +
                                        " Bytes ausgegeben.";
                        RestLen -= LeseLen;
                        Application.DoEvents();
                    }
                    catch (Exception ex)
                    {
                        PutLst("");
                        PutLst("Fehler bei <write>");
                        PutLst("~~~~~~~~~~~~~~~~<Exception-Anfang>~~~~~~~~~~~~~~~~~~~~~~");
                        PutLst(ex.ToString());
                        PutLst("~~~~~~~~~~~~~~~~~<Exception-Ende>~~~~~~~~~~~~~~~~~~~~~~~");
                        return;
                    }

                } //  while(RestLen > 0) 

            } // using (FileStream ReadVHD 


            if (!DeviceIoControl(h, FSCTL_UNLOCK_VOLUME, null, 0, null, 0, out intOut, IntPtr.Zero))
            { PutLst("Fehler DeviceIoControl FSCTL_UNLOCK_VOLUME"); return; }
            PutLst("DeviceIoControl FSCTL_UNLOCK_VOLUME = OK");

            if (!CloseHandle(h))
            {
                PutLst("\"" + deviceId + "\" 0x" + Marshal.GetHRForLastWin32Error().ToString("X8") + ": close handle error: " +
                       Marshal.GetHRForLastWin32Error().ToString("X8"));
                return;
            }
            PutLst("\"" + deviceId + "\" 0x" + Marshal.GetHRForLastWin32Error().ToString("X8") + ": handle closed."); 
            PutLst("Ausgabe fertig");
            
            
            

        } //   private void WriteUsb2()

hk

Kannst du mal mit DISKPART die Attribute des Laufwerks prüfen?

DISKPART
SELCT DISK 6
ATTRIBUTES DISK

Dann sollte er so etwas anzeigen

Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt  : Nein
Startdatenträger  : Nein
Auslagerungsdatei-Datenträger  : Nein
Ruhezustandsdatei-Datenträger  : Nein
Absturzabbild-Datenträger  : Nein
Clusterdatenträger : Nein

Eventuell ist bei Windows 10 dort der Schreibschutz drin.

Hat die Blume einen Knick, war der Schmetterling zu dick.

So sieht es bei Windows 11 aus:


Microsoft DiskPart-Version 10.0.22621.1

Copyright (C) Microsoft Corporation.
Auf Computer: R980

DISKPART> list disk

  Datenträger ###  Status         Größe    Frei     Dyn  GPT
  ---------------  -------------  -------  -------  ---  ---
  Datenträger 0    Online         2794 GB  1024 KB        *
  Datenträger 1    Online         1863 GB  1024 KB        *
  Datenträger 2    Online         5589 GB      0 B        *
  Datenträger 3    Online          931 GB  1024 KB        *
  Datenträger 4    Online          931 GB  1024 KB        *
  Datenträger 5    Online          931 GB  1024 KB        *
  Datenträger 6    Online          960 MB   944 MB

DISKPART> select disk 6

Datenträger 6 ist jetzt der gewählte Datenträger.

DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt  : Nein
Startdatenträger  : Nein
Auslagerungsdatei-Datenträger  : Nein
Ruhezustandsdatei-Datenträger  : Nein
Absturzabbild-Datenträger  : Nein
Clusterdatenträger : Nein

DISKPART> clean

Fehler in DiskPart: Zugriff verweigert
Weitere Informationen finden Sie im Systemereignisprotokoll.

DISKPART> clean

Der Datenträger wurde bereinigt.

DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt  : Nein
Startdatenträger  : Nein
Auslagerungsdatei-Datenträger  : Nein
Ruhezustandsdatei-Datenträger  : Nein
Absturzabbild-Datenträger  : Nein
Clusterdatenträger : Nein

DISKPART>

hk

Ich vermute, dass der Defender der Blockierer ist.

Bei Win10 und 11 benutze ich jeweils nur den Defender als Virenschutz.

Offenbar arbeiten diese Programme bei Win10 und 11 nicht gleich.

Im abgesicherten Modus ist der Defender nicht aktiv.

Und das passiert bei Windows 10:


Microsoft DiskPart-Version 10.0.19041.964

Copyright (C) Microsoft Corporation.
Auf Computer: R980

DISKPART> list disk

  Datenträger ###  Status         Größe    Frei     Dyn  GPT
  ---------------  -------------  -------  -------  ---  ---
  Datenträger 0    Online         2794 GB  1024 KB        *
  Datenträger 1    Online         1863 GB  1024 KB        *
  Datenträger 2    Online         5589 GB      0 B        *
  Datenträger 3    Online          931 GB  1024 KB        *
  Datenträger 4    Online          931 GB  1024 KB        *
  Datenträger 5    Online          931 GB  1024 KB        *
  Datenträger 6    Online          960 MB      0 B

DISKPART> select disk 6

Datenträger 6 ist jetzt der gewählte Datenträger.

DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt  : Nein
Startdatenträger  : Nein
Auslagerungsdatei-Datenträger  : Nein
Ruhezustandsdatei-Datenträger  : Nein
Absturzabbild-Datenträger  : Nein
Clusterdatenträger : Nein

DISKPART> clean

Der Datenträger wurde bereinigt.

DISKPART> attributes disk
Aktueller schreibgeschützter Zustand: Nein
Schreibgeschützt  : Nein
Startdatenträger  : Nein
Auslagerungsdatei-Datenträger  : Nein
Ruhezustandsdatei-Datenträger  : Nein
Absturzabbild-Datenträger  : Nein
Clusterdatenträger : Nein

DISKPART>

hk

Fehler in DiskPart: Zugriff verweigert
Weitere Informationen finden Sie im Systemereignisprotokoll.

Hast du schon mal dort nachgeschaut (Windows-Ereignisanzeige)?

Zugriff verweigert kommt nur manchmal, beim zweiten CLEAN klappt es.

hk