codice:
namespace DiskReader
{
class Class1
{
[DllImport("kernel32.dll", SetLastError=true)]
public static extern IntPtr CreateFile(
string lpFileName,
EFileAccess dwDesiredAccess,
EFileShare dwShareMode,
IntPtr lpSecurityAttributes,
ECreationDisposition dwCreationDisposition,
EFileAttributes dwFlagsAndAttributes,
IntPtr hTemplateFile);
[DllImport("kernel32.dll", SetLastError=true)]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool CloseHandle(IntPtr hObject);
[Flags]
public enum EFileAccess : uint
{
GenericRead = 0x80000000,
GenericWrite = 0x40000000,
GenericExecute = 0x20000000,
GenericAll = 0x10000000,
}
[Flags]
public enum EFileShare : uint
{
None = 0x00000000,
Read = 0x00000001,
Write = 0x00000002,
Delete = 0x00000004,
}
public enum ECreationDisposition : uint
{
New = 1,
CreateAlways = 2,
OpenExisting = 3,
OpenAlways = 4,
TruncateExisting = 5,
}
[Flags]
public enum EFileAttributes : uint
{
Readonly = 0x00000001,
Hidden = 0x00000002,
System = 0x00000004,
Directory = 0x00000010,
Archive = 0x00000020,
Device = 0x00000040,
Normal = 0x00000080,
Temporary = 0x00000100,
SparseFile = 0x00000200,
ReparsePoint = 0x00000400,
Compressed = 0x00000800,
Offline= 0x00001000,
NotContentIndexed = 0x00002000,
Encrypted = 0x00004000,
Write_Through = 0x80000000,
Overlapped = 0x40000000,
NoBuffering = 0x20000000,
RandomAccess = 0x10000000,
SequentialScan = 0x08000000,
DeleteOnClose = 0x04000000,
BackupSemantics = 0x02000000,
PosixSemantics = 0x01000000,
OpenReparsePoint = 0x00200000,
OpenNoRecall = 0x00100000,
FirstPipeInstance = 0x00080000
}
/// <summary>
/// Il punto di ingresso principale dell'applicazione.
/// </summary>
[STAThread]
static void Main(string[] args)
{
// Apre il disco
IntPtr diskHandle = CreateFile(
@"\\.\PhysicalDrive0",
EFileAccess.GenericRead | EFileAccess.GenericWrite,
EFileShare.Read | EFileShare.Write,
IntPtr.Zero,
ECreationDisposition.OpenExisting,
EFileAttributes.Device | EFileAttributes.NoBuffering | EFileAttributes.Write_Through,
IntPtr.Zero);
if (diskHandle.ToInt32() == -1)
{
Console.WriteLine("Errore: " + Marshal.GetLastWin32Error().ToString());
Console.ReadLine();
Marshal.ThrowExceptionForHR(Marshal.GetHRForLastWin32Error());
return;
}
// Inizializza lo stream
FileStream fileStream = null;
try
{
fileStream = new FileStream(diskHandle, FileAccess.Read, true, 8096, false);
}
catch(IOException e)
{
Console.WriteLine(e.Message);
Console.WriteLine();
Console.WriteLine(e.StackTrace);
Console.WriteLine();
Console.WriteLine(e.Source.ToString());
Console.ReadLine();
return;
}
// Si posizione alla prima partizione
fileStream.Seek(446, SeekOrigin.Begin);
// Legge le varie entries della tabella
for (int i = 0; i < 4; i++)
{
Console.WriteLine("Partition 1:");
byte[] buffer = new byte[16];
fileStream.Read(buffer, 0, buffer.Length);
// Verifica se la partizione è avviabile
if (buffer[0] == 0)
{
Console.WriteLine("\tAvviabile: SI");
}
else
{
Console.WriteLine("\tAvviabile: NO");
}
Console.WriteLine("");
}
// Chiude lo stream
fileStream.Close();
CloseHandle(diskHandle);
Console.ReadLine();
}
}
}