Windows 8.1: Sektoren einer SD-Card lesen

Gast #5596127
Lesenswert?

Ingo W. schrieb:

> Mit Admin-Rechten kannst du die Dateien "\\.\physicaldriveX" (X für die
> laufende Nummer des Gerätes, in der Datenträgerverwaltung) mit den
> üblichen Funktionen öffnen, positionieren, lesen.

Was bedeutet übliche Funktionen und wo finde ich sie? Kann ich mit ihnen 
auch einzelne Sektoren lesen?
Persönliche Seite #5596394
Lesenswert?

Bernd schrieb:
> Was bedeutet übliche Funktionen und wo finde ich sie?

Die Dokumentation der Win32-API-Funktionen CreateFile und ReadFile ist 
hier für Dich interessant.

https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-createfilea

(Abschnitt "Physical Disks and Volumes")

https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-readfile
#5596774
Lesenswert?

Bernd schrieb:
> Ist es möglich unter Windows 8.1 mit VS C# einzelne Sektoren einer
> SD-Card (2 GBytes) zu lesen?
>
> Microsofts Beschreibung von System Calls/Low-Level I/O geht nicht tief
> genug:
>
> https://msdn.microsoft.com/en-us/library/40bbyw78.aspx

Da es nur um Sektoren einer SD-Karte geht, reichen die höheren 
Funktionen, wie schon geschrieben wurde, aus:
https://stackoverflow.com/questions/38190/how-do-i-read-a-disk-directly-with-net
Allerdings kann es nötig sein die Sektorgrößen zu kennen. Siehe 
https://support.microsoft.com/en-us/help/100027/info-direct-drive-access-under-win32
https://www.pinvoke.net/default.aspx/kernel32.deviceiocontrol
Bei der Frage wie man an den Gerätenamen kommt, wenn man nur den 
Laufwerksbuchstaben hat, könnte
https://support.microsoft.com/en-ca/help/235128/info-understanding-device-names-and-symbolic-links 
helfen.
Gast #5596821
Lesenswert?

Arc N. schrieb:

> Da es nur um Sektoren einer SD-Karte geht, reichen die höheren
> Funktionen, wie schon geschrieben wurde, aus:
> https://stackoverflow.com/questions/38190/how-do-i-read-a-disk-directly-with-net

Das Programm von Stackoverflow habe ich versucht zu compilieren (siehe 
Anhang).

Im ersten Teil (using ..., namespace ReadFromDevice) sind keine Fehler. 
Im zweiten Teil (Main) sind 10.

1
Fehler  1  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  194  8  ConsoleApplication1
2
Fehler  2  Bezeichner erwartet    Program.cs  194  24  ConsoleApplication1
3
Fehler  3  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  194  26  ConsoleApplication1
4
Fehler  4  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  196  22  ConsoleApplication1
5
Fehler  5  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  196  39  ConsoleApplication1
6
Fehler  6  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  197  22  ConsoleApplication1
7
Fehler  7  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  197  39  ConsoleApplication1
8
Fehler  8  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  198  22  ConsoleApplication1
9
Fehler  9  Klasse, Delegat, Enumeration, Schnittstelle oder Struktur erwartet.    Program.cs  198  30  ConsoleApplication1
10
Fehler  10  Typ- oder Namespacedefinition oder Dateiende erwartet.    Program.cs  223  1  ConsoleApplication1


Kann dieses Programm überhaupt unter C# compiliert werden?
Angehängte Dateien:
Gast #5599926
Lesenswert?

Das Programm wird ohne Fehler übersetzt. Allerdings gibt es ein Problem 
mit dem Handle (siehe Bild).

Das Laufwerk und die Sektorlänge habe ich mir mit WMIC heraussuchen 
lassen (\\.\PHYSICALDRIVE6 bzw. 512 Bytes).

Wie kann das Problem behoben werden?
Angehängte Dateien:
Gast #5599969
Lesenswert?

Jim M. schrieb:
> Teste vorher mal das Handle auf INVALID_HANDLE_VALUE.

Nach der Ausführung dieser Zeile hat ptr den Wert -1.
1
  IntPtr ptr = CreateFile(Path, GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
------------------------------------------------------------
Vor der Ausführung der Zeile hat handleValue den Wert "null" danach den 
Wert
{Microsoft.Win32.SafeHandles.SafeFileHandle}
1
handleValue = new SafeFileHandle(ptr, true);
#5600256
Lesenswert?

Rufus Τ. F. schrieb:
> Bernd schrieb:
>> Nach der Ausführung dieser Zeile hat ptr den Wert -1.
>
> Und was sagt die Dokumentation von CreateFile dazu?

-1 = INVALID_HANDLE_VALUE, winbase.h, genaueres gibt's wie üblich mit 
GetLastError bzw. in .NET mit Marshal.GetLastWin32Error
https://docs.microsoft.com/en-us/dotnet/api/system.runtime.interopservices.marshal.getlastwin32error?view=netframework-4.7.2
Die Textmeldungen zum Fehlercode kann man sich wie hier
https://blogs.msdn.microsoft.com/shawnfa/2004/09/10/formatmessage-shortcut-for-win32-error-codes/
besorgen. Relativ wahrscheinlich: Programm läuft nicht mit ausreichenden 
Berechtigungen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren