提供对createfile,readfile,writefile的基本封装
using Microsoft.Win32.SafeHandles;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;
namespace WindowsAPI
{
/// <summary>
/// 在对文件的读写seek时用到的参数
/// </summary>
public enum MoveMethod : uint
{
Begin = 0,
Current = 1,
End = 2
}
/// <summary>
/// 硬盘的信息
/// </summary>
[Serializable]
public struct HardDiskInfo
{
/// <summary>
/// 型号厂商
/// </summary>
public string ModuleNumber;
/// <summary>
/// 固件版本
/// </summary>
public string Firmware;
/// <summary>
/// 物理序列号
/// </summary>
public string SerialNumber;
/// <summary>
/// 容量,以M为单位
/// </summary>
public uint Capacity;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct GetVersionOutParam
{
public byte bVersion;
public byte bRevision;
public byte bReserved;
public byte bIDEDeviceMap;
public uint fCapabilities;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] dwReserved; // For future use.
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct IdeReg
{
public byte bFeaturesReg;
public byte bSectorCountReg;
public byte bSectorNumberReg;
public byte bCylLowReg;
public byte bCylHighReg;
public byte bDriveHeadReg;
public byte bCommandReg;
public byte bReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SendCmdInParam
{
public uint cBufferSize;
public IdeRegs irDriveRegs;
public byte bDriveNumber;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public byte[] bReserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 4)]
public uint[] dwReserved;
public byte bBuffer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct DriverStatu
{
public byte bDriverError;
public byte bIDEStatus;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public byte[] bReserved;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)]
public uint[] dwReserved;
}
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SendCmdOutParam
{
public uint cBufferSize;
public DriverStatus DriverStatus;
public IdSector bBuffer;
}
[StructLayout(LayoutKind.Sequential, Pack = 1, Size = 512)]
public struct IdSector
{
public ushort wGenConfig;
public ushort wNumCyls;
public ushort wReserved;
public ushort wNumHeads;
public ushort wBytesPerTrack;
public ushort wBytesPerSector;
public ushort wSectorsPerTrack;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)]
public ushort[] wVendorUnique;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 20)]
public byte[] sSerialNumber;
public ushort wBufferType;
public ushort wBufferSize;
public ushort wECCSize;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 8)]
public byte[] sFirmwareRev;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 40)]
public byte[] sModelNumber;
public ushort wMoreVendorUnique;
public ushort wDoubleWordIO;
public ushort wCapabilities;
public ushort wReserved1;
public ushort wPIOTiming;
public ushort wDMATiming;
public ushort wBS;
public ushort wNumCurrentCyls;
public ushort wNumCurrentHeads;
public ushort wNumCurrentSectorsPerTrack;
public uint ulCurrentSectorCapacity;
public ushort wMultSectorStuff;
public uint ulTotalAddressableSectors;
public ushort wSingleWordDMA;
public ushort wMultiWordDMA;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 128)]
public byte[] bReserved;
}
/// <summary>
/// 文件共享标记
/// </summary>
public enum ShareMode
{
FILE_SHARE_READ = 0x00000001,
FILE_SHARE_WRITE = 0x00000002
}
/// <summary>
/// Type of access to the object.
/// </summary>
public enum DesiredAccess
{
GENERIC_READ = 0x80000000,
GENERIC_WRITE = 0x40000000,
GENERIC_EXECUTE = 0x20000000,
GENERIC_ALL = 0x10000000
}
/// <summary>
/// 设备的控制命令
/// </summary>
public enum IoControlCode
{
DFP_GET_VERSION = 0x00074080,
DFP_SEND_DRIVE_COMMAND = 0x0007c084,
DFP_RECEIVE_DRIVE_DATA = 0x0007c088
}
/// <summary>
/// Action to take on files that exist, and which action to take when files do not exist.
/// </summary>
public enum CreationDisposition
{
CREATE_NEW = 1,
CREATE_ALWAYS = 2,
OPEN_EXISTING = 3,
OPEN_ALWAYS = 4,
TRUNCATE_EXISTING = 5
}
/// <summary>
/// File attributes and flags for the file.
/// </summary>
public enum FlagsAndAttributes
{
FILE_FLAG_WRITE_THROUGH = 0x80000000,
FILE_FLAG_OVERLAPPED = 0x40000000,
FILE_FLAG_NO_BUFFERING = 0x20000000,
FILE_FLAG_RANDOM_ACCESS = 0x10000000,
FILE_FLAG_SEQUENTIAL_SCAN = 0x08000000,
FILE_FLAG_DELETE_ON_CLOSE = 0x04000000,
FILE_FLAG_BACKUP_SEMANTICS = 0x02000000,
FILE_FLAG_POSIX_SEMANTICS = 0x01000000,
FILE_FLAG_OPEN_REPARSE_POINT = 0x00200000,
FILE_FLAG_OPEN_NO_RECALL = 0x00100000,
FILE_FLAG_FIRST_PIPE_INSTANCE = 0x00080000
}
/// <summary>
/// 提供对createfile,readfile,writefile的基本封装
/// </summary>
public class Kernel32
{
/// <summary>
/// 句柄无效标记
/// </summary>
public const uint INVALID_SET_FILE_POINTER = 0xffffffff;
/// <summary>
/// 用于物理设备控制
/// </summary>
/// <param name="hFile"></param>
/// <param name="dwIoControlCode"></param>
/// <param name="lpInBuffer"></param>
/// <param name="nInBufferSize"></param>
/// <param name="lpOutBuffer"></param>
/// <param name="nOutBufferSize"></param>
/// <param name="lpBytesReturned"></param>
/// <param name="lpOverlapped"></param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern int DeviceIoControl([In] SafeFileHandle hFile, IoControlCode dwIoControlCode, IntPtr lpInBuffer, uint nInBufferSize, ref GetVersionOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped);
/// <summary>
/// 访问物理设备
/// </summary>
/// <param name="hFile"></param>
/// <param name="dwIoControlCode"></param>
/// <param name="lpInBuffer"></param>
/// <param name="nInBufferSize"></param>
/// <param name="lpOutBuffer"></param>
/// <param name="nOutBufferSize"></param>
/// <param name="lpBytesReturned"></param>
/// <param name="lpOverlapped"></param>
/// <returns></returns>
[DllImport("kernel32.dll")]
public static extern int DeviceIoControl([In] SafeFileHandle hFile, IoControlCode dwIoControlCode, ref SendCmdInParams lpInBuffer, uint nInBufferSize, ref SendCmdOutParams lpOutBuffer, uint nOutBufferSize, ref uint lpBytesReturned, [Out] IntPtr lpOverlapped);
/// <summary>
/// 设置读写位置
/// </summary>
/// <param name="hFile"></param>
/// <param name="lDistanceToMove"></param>
/// <param name="lpDistanceToMoveHigh"></param>
/// <param name="dwMoveMethod"></param>
/// <returns></returns>
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto, EntryPoint = "SetFilePointer")]
public static extern uint SetFilePointer([In] SafeFileHandle hFile, [In] long lDistanceToMove, [In, Out] ref IntPtr lpDistanceToMoveHigh, [In] EMoveMethod dwMoveMethod);
/// <summary>
/// 读取文件
/// </summary>
/// <param name="hFile"></param>
/// <param name="lpBuffer"></param>
/// <param name="nNumberOfBytesToRead"></param>
/// <param name="lpNumberOfBytesRead"></param>
/// <param name="lpOverlapped"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool ReadFile([In] SafeFileHandle hFile, [Out] byte[] lpBuffer, uint nNumberOfBytesToRead, out uint lpNumberOfBytesRead, IntPtr lpOverlapped);
/// <summary>
/// 写入文件
/// </summary>
/// <param name="hFile"></param>
/// <param name="lpBuffer"></param>
/// <param name="nNumberOfBytesToWrite"></param>
/// <param name="lpNumberOfBytesWritten"></param>
/// <param name="lpOverlapped"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool WriteFile([In] SafeFileHandle hFile, byte[] lpBuffer, uint nNumberOfBytesToWrite, out uint lpNumberOfBytesWritten, IntPtr lpOverlapped);
/// <summary>
/// 创建读写文件的句柄
/// </summary>
/// <param name="lpFileName"></param>
/// <param name="dwDesiredAccess"></param>
/// <param name="dwShareMode"></param>
/// <param name="lpSecurityAttributes"></param>
/// <param name="dwCreationDisposition"></param>
/// <param name="dwFlagsAndAttributes"></param>
/// <param name="hTemplateFile"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern SafeFileHandle CreateFile(string lpFileName, DesiredAccess dwDesiredAccess, ShareMode dwShareMode, IntPtr lpSecurityAttributes, CreationDisposition dwCreationDisposition, FlagsAndAttributes dwFlagsAndAttributes, IntPtr hTemplateFile);
/// <summary>
/// 获取系统错误编号
/// </summary>
/// <returns></returns>
[DllImport("kernel32.dll", CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
public static extern long GetLastError();
/// <summary>
/// 关闭文件句柄
/// </summary>
/// <param name="hObject"></param>
/// <returns></returns>
[DllImport("kernel32.dll", SetLastError = true)]
public static extern int CloseHandle(IntPtr hObject);
/// <summary>
/// 创建可操作文件
/// </summary>
/// <param name="lpFileName"></param>
/// <param name="dwDesiredAccess"></param>
/// <param name="dwShareMode"></param>
/// <param name="lpSecurityAttributes"></param>
/// <param name="dwCreationDisposition"></param>
/// <param name="dwFlagsAndAttributes"></param>
/// <param name="hTemplateFile"></param>
/// <returns></returns>
//[DllImport("kernel32.dll", SetLastError = true)]
//private static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, IntPtr hTemplateFile);
/// <summary>
/// 读写方式打开文件
/// </summary>
/// <param name="fname"></param>
/// <returns></returns>
public static SafeFileHandle OpenWriteRead(string fname) => CreateFile(fname, DesiredAccess.GENERIC_READ | DesiredAccess.GENERIC_WRITE, ShareMode.FILE_SHARE_READ | ShareMode.FILE_SHARE_WRITE, IntPtr.Zero, CreationDisposition.OPEN_EXISTING, 0, IntPtr.Zero);
}
}