Forum: PC-Programmierung Windows 8.1: Sektoren einer SD-Card lesen


von Bernd (Gast)


Lesenswert?

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

von Ingo W. (uebrig) Benutzerseite


Lesenswert?

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.

von Bernd (Gast)


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?

von Ingo W. (uebrig) Benutzerseite


Lesenswert?

Bernd schrieb:
> Was bedeutet übliche Funktionen und wo finde ich sie? Kann ich mit ihnen
> auch einzelne Sektoren lesen?

Ich kenne c# nicht, in C wären dies "open", "seek" "read" und "close". 
Sicher gibt es in c# hierfür Entsprechungen.

von Rufus Τ. F. (rufus) Benutzerseite


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

von Arc N. (arc)


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.

von Bernd (Gast)


Angehängte Dateien:

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?

von Arc N. (arc)


Lesenswert?

Bernd schrieb:
> Kann dieses Programm überhaupt unter C# compiliert werden?

Ja, dass einzige was angemeckert wird, ist die nicht definierte 
Konstante MB. Ansonsten fehlt da nur das nötige Brimborium drumrum:
1
namespace Bla {
2
    static class Whatever {
3
          
4
        static void Main... { }
5
    }
6
}

von Bernd (Gast)


Lesenswert?

Vielen Dank für eure Beiträge. Es funktioniert jetzt.

von Bernd (Gast)


Angehängte Dateien:

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?

von Jim M. (turboj)


Lesenswert?

Teste vorher mal das Handle auf INVALID_HANDLE_VALUE.

von Bernd (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bernd schrieb:
> Nach der Ausführung dieser Zeile hat ptr den Wert -1.

Und was sagt die Dokumentation von CreateFile dazu?

von Arc N. (arc)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.