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.
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)?