如何使用kernel32.dll中的CreateFile写入原始磁盘文件

问题描述 投票:-1回答:1

我正在尝试直接写入磁盘

我可以阅读,但是我不会写。

是否有某些特定功能可写入文件?

如何启用书写?

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

c# io pinvoke
1个回答
0
投票

代码上没有例外,您需要使用WriteAsync和ReadAsync,因为这些功能不支持同步操作。

© www.soinside.com 2019 - 2024. All rights reserved.