CreateFile函数用GENERIC_READ访问模式打不开磁盘返回句柄无效

  Windows下对I/O设备的管理分为三部分,逻辑I/O,设备驱动程序,以及中断服务程序。设备驱动程序对硬件来说,

是各种设备提供各种各样的控制,同时对应用层提供接口,应用程序通过调用这些接口,完成对设备的操作。

  对磁盘的操作流程基本上是这样的:先使用CreateFile函数创建File内核对象打开设备,再用控制码以及CreateFile返回的

句柄调用DeviceIOControl函数,使驱动程序控制指定设备完成特定操作。一开始,我在网上查了很多关于CreateFile函数的说明,

都是用GENERIC_READ | GENERIC_WRITE读写访问模式,同时共享模式为FILE_SHARE_READ | FILE_SHARE_WRITE来打

开设备进行读写。

  CreateFile函数原型如下:

  HANDLE CreateFile(

    LPCTSTR lpFileName, //指向文件名的指针

    DWORD dwDesiredAccess, //访问模式(写/读)

    DWORD dwShareMode, //共享模式

    LPSECURITY_ATTRIBUTES lpSecurityAttributes, //指向安全属性的指针

    DWORD dwCreationDisposition, //如何创建

    DWORD dwFlagsAndAttributes, //文件属性

    HANDLE hTemplateFile //用于复制文件句柄

    );

 

  在网上查询到以写的方式打开磁盘的代码如下:

   hDevice = CreateFile(

                    sFilePath, // drive to open,要打开的磁盘
                    GENERIC_READ | GENERIC_WRITE,     // access to the drive
                    FILE_SHARE_READ | FILE_SHARE_WRITE, //share mode
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL            // do not copy file attribute
                    );
 

  然而我却怎么都是返回INVALID_HANDLE_VALUE,句柄无效,也就是不能打开设备,折腾了好久,换平台,换

编译器,都没能解决我的问题,最终用将共享模式改为独占式时,句柄返回有效了。对设备的读写,若采用共享式,

读写很容易造成混乱,发生错误。

  hDevice = CreateFile(

                    sFilePath, // drive to open,要打开的磁盘
                    GENERIC_READ | GENERIC_WRITE,     // access to the drive
                    0, //share mode
                    NULL,             // default security attributes
                    OPEN_EXISTING,    // disposition
                    0,                // file attributes
                    NULL            // do not copy file attribute
                    );

转载于:https://www.cnblogs.com/piaoxuewaiwai/p/9810839.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值