美文网首页
利用Win32 api 读写硬盘扇区

利用Win32 api 读写硬盘扇区

作者: Misaka14375 | 来源:发表于2017-07-16 00:17 被阅读0次

调用API函数即可完成对扇区的读写操作


[DllImport("Kernel32.dll")]
extern static IntPtr CreateFile(string fileName, uint accessFlag, uint shareMode, IntPtr security, uint createFlag, uint attributeFlag, IntPtr tempfile);

首先要创建文件

[DllImport("Kernel32.dll", SetLastError = true)]
extern static uint SetFilePointer(IntPtr handle, uint offset, [In, Out] ref uint lpDistanceToMoveHigh, uint flag);

设置文件指针
如果不设置第三个参数(null),系统会把第二个参数offset当作一个有符号整数(32位),最多偏移2GB。
设置后会把第三个参数当作64有符号数的高32位,第二个参数当作低32位。
(要注意的是第三个参数是引用类型)

[DllImport("Kernel32.dll")]
extern static bool WriteFile(IntPtr handle, [In] byte[] buffer, uint bufferLength, ref uint length, IntPtr overLapped);
[DllImport("Kernel32.dll")]
extern static bool ReadFile(IntPtr handle, [Out] byte[] buffer, uint bufferLength, ref uint length, IntPtr overLapped);

然后开始你的操作。
Win32 api中返回值为为零写入成功,不为零错误。对应到这里就是返回false和true
第三个参数保存的是写入了多少字节。

[DllImport("Kernel32.dll")]
extern static bool CloseHandle(IntPtr handle);

最后要记得关闭句柄


参数设置,具体含义见MSDN: CreateFile

public const uint FILE_ATTRIBUTE_NORMAL = 0x80;
public const short INVALID_HANDLE_VALUE = -1;
public const uint GENERIC_READ = 0x80000000;
public const uint GENERIC_WRITE = 0x40000000;
public const uint CREATE_NEW = 1;
public const uint CREATE_ALWAYS = 2;
public const uint OPEN_EXISTING = 3;
public const uint FILE_BEGIN = 0;
public const uint FILE_CURRENT = 1;
public const uint FILE_END = 2;

例子:

        /// <summary>
        /// 写入内容 需为扇区整数倍,不然写不进去
        /// </summary>
        /// <param name="drivename">驱动器名</param>
        /// <param name="sector">扇区</param>
        /// <param name="buffer">写入内容</param>
        /// <returns></returns>
        static public bool write(string drivename, UInt32 sector, byte[] buffer)
        {
            IntPtr DiskHandle = CreateFile(drivename, GENERIC_WRITE, 0, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero);
            uint length = 0;
            UInt64 distance = sector ;//偏移量
            distance = distance << 9;
            UInt32 distancehigh = (UInt32)(distancehigh>> 32);
            var i=SetFilePointer(DiskHandle, (uint)distance, ref distancehigh, FILE_BEGIN);
            if (i == 0xffffffff)//返回值是低32位地址,返回-1时getlastwin32error查看错误
            {
                var errCode=Marshal.GetLastWin32Error();
                IntPtr tempptr = IntPtr.Zero;
                string msg = null;
                FormatMessage(0x1300, ref tempptr, errCode, 0, ref msg, 255, ref tempptr);
            }
            var res=WriteFile(DiskHandle, buffer, (uint)buffer.Length, ref length, IntPtr.Zero);
            CloseHandle(DiskHandle);
            return res;
        }

相关文章

  • 利用Win32 api 读写硬盘扇区

    调用API函数即可完成对扇区的读写操作 首先要创建文件 设置文件指针如果不设置第三个参数(null),系统会把第二...

  • 访问硬盘

    硬盘读写的基本单位是扇区。 从硬盘读取数据的模式 CHS 模式,向硬盘控制器分别发送磁头号、柱面号和扇区号(扇区在...

  • 文件系统

    文件组织结构 硬盘的读写单位是扇区,为了避免频繁访问硬盘,操作系统会等到数据积累到一定大小,才进行硬盘读写操作。这...

  • 簇和扇区

    文件系统管理的最小磁盘空间单位是簇 扇区:硬盘一次读写一个扇区,一个扇区是512字节 簇:系统读写文件的基本单位,...

  • 主分区、扩展分区、逻辑分区(逻辑卷)

    0.主引导扇区 每块硬盘,对,每块硬盘不是每个分区,都只有一个主引导扇区,即该硬盘0号柱面,0号磁头的第一个扇区,...

  • MBR与分区表

    MBR分区表: 在传统硬盘分区模式中,引导扇区是每个分区(Partition)的第一扇区,而主引导扇区是硬盘的第一...

  • 转载分享:有关分区、主引导扇区、主分区表的相关知识

    硬盘分区被破坏,硬盘无法启动,分区丢失,那是因为硬盘的主引导扇区中的信息被破坏。主引导扇区又是什么呢?我们先来了解...

  • 【验证硬盘扇区号从1开始】

    硬盘扇区号从1开始(不是从0开始) 程序起始扇区号程序大小(扇区数)bootsec.asm11loader.asm...

  • 操作系统的写文件操作

    硬盘的存储结构 硬盘的基本单位为扇区,每个扇区一般为512字节 一个硬盘有多个盘片,每个盘片有两个盘面 每个盘面按...

  • Python调用Win32 API实现截图

    0x01 Win32 API简介 Win32 API即为Microsoft 32位平台(包括:Windows 9x...

网友评论

      本文标题:利用Win32 api 读写硬盘扇区

      本文链接:https://www.haomeiwen.com/subject/bahzcxtx.html