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
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.
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?
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.
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
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.
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?
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 | }
|
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?
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); |
Bernd schrieb: > Nach der Ausführung dieser Zeile hat ptr den Wert -1. Und was sagt die Dokumentation von CreateFile dazu?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.