我正在尝试直接写入磁盘
我可以阅读,但是我不会写。
是否有某些特定功能可写入文件?
如何启用书写?
pinvoke
的签名:
[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);
阅读效果很好:
SafeFileHandle h = CreateFile(
"\\.\PhysicalDrive1",
unchecked((int)(0x80000000)),
0,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
new SafeFileHandle(IntPtr.Zero, true));
FileStream stream = new FileStream(h, FileAccess.Read);
var @byte = stream.ReadByte();
stream.Close();
h.Close();
但不写:
SafeFileHandle h = CreateFile(
"\\.\PhysicalDrive1", // Be careful to not damage your HDD
unchecked((int)(0x40000000)),
0,
IntPtr.Zero,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
new SafeFileHandle(IntPtr.Zero, true));
FileStream stream = new FileStream(h, FileAccess.Write);
stream.WriteByte((byte)0xFF);
h.Close();
我做错什么了?
该代码重写了打印最后的错误代码:
using Microsoft.Win32.SafeHandles;
using System;
using System.IO;
using System.Runtime.InteropServices;
namespace RawHD
{
static class Program
{
[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 SHARE_NONE = 0;
internal const int GENERIC_READ = unchecked((int)0x80000000);
internal const int GENERIC_WRITE = unchecked((int)0x40000000);
internal const int OPEN_EXISTING = 3;
internal const int FILE_ATTRIBUTE_NORMAL = 0x80;
[STAThread]
static void Main()
{
SafeFileHandle fileHandle = CreateFile(
"\\\\.\\PhysicalDrive4",
GENERIC_WRITE,
SHARE_NONE,
IntPtr.Zero, // optional parameter
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
new SafeFileHandle(IntPtr.Zero, true));
Console.WriteLine("After opening first file: " + Marshal.GetLastWin32Error());
FileStream stream = new FileStream(fileHandle, FileAccess.Write);
stream.WriteByte((byte)'C');
Console.WriteLine("After writing: " + Marshal.GetLastWin32Error());
Console.WriteLine("Char Written: C");
fileHandle.Close();
Console.WriteLine("After closing first file: " + Marshal.GetLastWin32Error());
fileHandle = CreateFile(
"\\\\.\\PhysicalDrive4",
GENERIC_READ,
SHARE_NONE,
IntPtr.Zero, // optional parameter
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
new SafeFileHandle(IntPtr.Zero, true));
Console.WriteLine("After opening second file: " + Marshal.GetLastWin32Error());
stream = new FileStream(fileHandle, FileAccess.Read);
var @byte = stream.ReadByte();
Console.WriteLine("After reading: " + Marshal.GetLastWin32Error());
Console.WriteLine("Char Read: " + (char)@byte);
stream.Close();
fileHandle.Close();
Console.WriteLine("After closing second file: " + Marshal.GetLastWin32Error());
Console.ReadKey();
}
}
}
这给了我这个输出:
打开第一个文件后:0
写入后:0
字符写成:C
关闭第一个文件后:0
打开第二个文件后:0
阅读后:0
字符阅读:3
关闭第二个文件后:0
也尝试使用WriteFile
中的kernel32.dll
功能:
using Microsoft.Win32.SafeHandles;
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
namespace RawHD
{
static class Program
{
[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);
[DllImport("kernel32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool WriteFile(
SafeFileHandle hFile,
byte[] lpBuffer,
uint nNumberOfBytesToWrite,
out uint lpNumberOfBytesWritten,
[In] ref NativeOverlapped lpOverlapped);
internal const int SHARE_NONE = 0;
internal const int GENERIC_READ = unchecked((int)0x80000000);
internal const int GENERIC_WRITE = unchecked((int)0x40000000);
internal const int OPEN_EXISTING = 3;
internal const int FILE_ATTRIBUTE_NORMAL = 0x80;
[STAThread]
static void Main()
{
SafeFileHandle fileHandle = CreateFile(
"\\\\.\\PhysicalDrive4",
GENERIC_WRITE,
SHARE_NONE,
IntPtr.Zero, // optional parameter
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
new SafeFileHandle(IntPtr.Zero, true));
Console.WriteLine("After opening first file: " + Marshal.GetLastWin32Error());
NativeOverlapped over = new NativeOverlapped();
over.OffsetLow = 0;
over.OffsetHigh = 0;
uint written;
WriteFile(fileHandle, Encoding.ASCII.GetBytes("Test"), 4, out written, ref over);
Console.WriteLine("After using WriteFile: " + Marshal.GetLastWin32Error());
fileHandle.Close();
Console.WriteLine("After closing first file: " + Marshal.GetLastWin32Error());
Console.ReadKey();
}
}
}
但是这给我错误87
:
打开第一个文件后:0
使用WriteFile后:0
关闭第一个文件后:87
代码上没有例外,您需要使用WriteAsync和ReadAsync,因为这些功能不支持同步操作。