Autor Beitrag
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Di 19.04.11 08:56 
Hallo,

Mein Ziel ist es, gewisse Bereiche von Festplatten (Partitionen) , USB Devices usw. zu dumpen. D.h ich benötigen lediglich einen READ Zugriff auf physikalische Partitionen. Das geht IMHO nur unmanaged über die WinAPI + unsafe Code. Ehrlich gesagt war ich bis vor kurzem sogar sicher, dass es nur mit einem Kernelmode driver möglich ist (unter den aktuellen Windowsversionen).

Wie dem auch sei, über CreateFile("\\.\PhysicalDrive0") komme ich zwar an einen Rawzugriff auf der Platte, aber das bezieht sich ja nicht auf eine explizite Partition.

Um die Frage mal ganz allgemein zu stellen:
Wie kann ich einen RAW Read auf eine Partition machen?

Wenn dies nicht möglich ist, kann man ausgehend von \\.\PhysicalDrive0 die Partitionstabelle auslesen und so einen Offset berechnen wo die Partitionen liegen?

Grüsse
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 19.04.11 10:31 
Das geht nur per P/Invoke.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
[DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError=true)]
internal static extern SafeFileHandle CreateFile(string lpFileName, int dwDesiredAccess, int dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, SafeFileHandle hTemplateFile);

internal const int GENERIC_READ = unchecked((int)0x80000000);
internal const int OPEN_EXISTING = 3;
internal const int FILE_ATTRIBUTE_NORMAL = 0x80;

const int blockSize = 512;

FileStream ReadRAW()
{
   //Alternativen für logische LW/Part: http://support.microsoft.com/kb/q100027/
   var h = CreateFile("\\\\.\\PhysicalDrive0", GENERIC_READ, 0, IntPtr.Zero, OPEN_EXISTING,    FILE_ATTRIBUTE_NORMAL, new SafeFileHandle(IntPtr.Zero, true));
   
   if (! h.IsInvalid ) 
   {
      return new FileStream(h, FileAccess.Read);
   }
   else
   {
      throw new Exception(Marshal.GetLastWin32Error().ToString());
   }
}

Für diesen Beitrag haben gedankt: IsNull
IsNull Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Di 19.04.11 13:01 
Danke für deine Antwort. Das beantwortet allerdings meine Frage noch nicht, denn der Zugriff mittels "\\\\.\\PhysicalDrive0" habe ich bereits funktionsfähig implementiert.

Ich kann so bereits einen beliebigen Buffer von dem Drive auslesen. \\.\PhysicalDrive0 bezieht sich aber auf den gesammten Drive. Was ich aber möchte:

Von dem Drive "\\\\.\\PhysicalDrive0"
Die ersten 512Bytes der 1. Partition
Die ersten 512Bytes der 2. Partition
usw.

Ich hoffe es ist jetzt klarer.


Edit:
Wenn ich deinem Link das richtig entnehme, kann ich einfach mit "\\.\X:" auf die Partitionen zugreifen? Wäre ja wieder viel einfacher als ich dachte. Ich muss das mal versuchen :)
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Di 19.04.11 13:36 
Jop, so ist es:)