使用WriteFile在Win7下写硬盘扇区,如何实现?

zhgwbzhd 2013-12-26 04:03:35
VC2010,在XP下
1、CreateFileA("\\\\.\\PhysicalDrive0",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL);
来打开硬盘。
2、SetFilePointerEx(hDevice,EPOffsetByte,NULL,FILE_BEGIN);定位要读或写的扇区。
3、ReadFile(hDevice,Buffer,sizeof(Buffer),&junk,NULL);读扇区
4、WriteFile(hDevice,Buffer,sizeof(Buffer),&junk,NULL);写扇区。
5、CloseHandle(hDevice);关闭

但是同样在Win7下就写失败。
经过几天的查询,只要是win7下没有权限,也试过了网上说的一些方法,始终没有解决。
但愿哪位高手指点一下。
谢谢。
...全文
641 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
「已注销」 2014-06-12
  • 打赏
  • 举报
回复
引用 11 楼 myjisgreat 的回复:
我记得win7主硬盘的扇区不给改的,否则MBR不是很容易就被修改么?然后各种引导区病毒满天飞了么? 我只试过可以修改U盘的扇区 毕竟win7安全性比XP大幅提高了
MBR位于0扇区Vista或xp都可以改,但Vista逻辑数据块不能改,xp都可以改 要改Vista逻辑块数据得卸载逻辑盘,http://support.microsoft.com/kb/942448
「已注销」 2014-06-12
  • 打赏
  • 举报
回复
看看这个微软官方给的解释: http://support.microsoft.com/kb/942448 然后看看我写的一篇针对win7 write disk的博文 http://blog.sina.com.cn/s/blog_e423f1370101dhpp.html

/////////////////////////
 HANDLE HDevice=CreateFile(
"\\\\.\\D:",//(注:这里名称不能为\\\\.\\PHYSICALDRIVEn(n为0-256),即物理磁盘,只能对逻辑分区锁定与DISMOUNT操作)
GENERIC_READ|GENERIC_WRITE,      //对资源的读写操作权限
FILE_SHARE_READ|FILE_SHARE_WRITE,//共享模式
0,                               //指向安全属性的指针
OPEN_EXISTING,                   // 如何操作,这里是打开存在的资源
FILE_ATTRIBUTE_NORMAL,           // 文件属性
NULL                             //如果不为零,则指定一个文件句柄,新文件将从这个文件中复制扩展属性
);
if (HDevice==INVALID_HANDLE_VALUE)
{
MessageBox("打开磁盘句柄失败");
break;
}

//
DWORD dwByteReturned;
BOOL bLOCK=DeviceIoControl(
HDevice,           
FSCTL_LOCK_VOLUME,        
NULL,                       
0,                          
NULL, 
0,
&dwByteReturned,
NULL
);
if (!bLOCK)
MessageBox(csPartition+" FSCTL_LOCK_VOLUME 失败","提示",MB_ICONINFORMATION);
WriteFile(...操作)//这里可以是\\\\.\\PHYSICALDRIVEn得到的句柄,但只限锁定的逻辑盘区写入
BOOL bUNLOCK=DeviceIoControl(
HDevice,           
FSCTL_UNLOCK_VOLUME, //锁定后要解锁       
NULL,                       
0,                          
NULL, 
0,
&dwByteReturned,
NULL
);
if (!bUNLOCK)
MessageBox(csPartition+" FSCTL_UNLOCK_VOLUME 失败","提示",MB_ICONINFORMATION);

CloseHandle(HDevice);
方案二:

/////////////////////////
HANDLE HDevice=CreateFile(
"\\\\.\\D:",//(注:这里名称不能为\\\\.\\PHYSICALDRIVEn(n为0-256),即物理磁盘,只能对逻辑分区锁定与DISMOUNT操作)
GENERIC_READ|GENERIC_WRITE,      //对资源的读写操作权限
FILE_SHARE_READ|FILE_SHARE_WRITE,//共享模式
0,                               //指向安全属性的指针
OPEN_EXISTING,                   // 如何操作,这里是打开存在的资源
FILE_ATTRIBUTE_NORMAL,           // 文件属性
NULL                             //如果不为零,则指定一个文件句柄,新文件将从这个文件中复制扩展属性
);
if (HDevice==INVALID_HANDLE_VALUE)
{
MessageBox("打开磁盘句柄失败");
break;
}

BOOL bDISMOUT=DeviceIoControl(
HDevice,           
FSCTL_DISMOUNT_VOLUME,        
NULL,                       
0,                          
NULL, 
0,
&dwByteReturned,
NULL
);
if (!bDISMOUT)
MessageBox(csPartition+" FSCTL_DISMOUNT_VOLUME 失败","提示",MB_ICONINFORMATION);
WriteFile(...操作)//这里可以是\\\\.\\PHYSICALDRIVEn得到的句柄,但只限锁定的逻辑盘区写入
CloseHandle(HDevice);
这是vista系统升级了安全权限的原因,按这个绝对可以解决
myjisgreat 2014-03-14
  • 打赏
  • 举报
回复
我记得win7主硬盘的扇区不给改的,否则MBR不是很容易就被修改么?然后各种引导区病毒满天飞了么? 我只试过可以修改U盘的扇区 毕竟win7安全性比XP大幅提高了
schlafenhamster 2014-01-02
  • 打赏
  • 举报
回复
看看哪个 API 返回错误值
zhgwbzhd 2014-01-02
  • 打赏
  • 举报
回复
高手、高手,看过来。 帮一下忙,谢谢啦。
zhgwbzhd 2013-12-29
  • 打赏
  • 举报
回复
不会吧,不用驱动还不行?
oyljerry 2013-12-27
  • 打赏
  • 举报
回复
引用 6 楼 zhgwbzhd 的回复:
右键,以管理员身份运行也不行啊。
那估计要用到驱动等了
zhgwbzhd 2013-12-27
  • 打赏
  • 举报
回复
右键,以管理员身份运行也不行啊。
5t4rk 2013-12-26
  • 打赏
  • 举报
回复
权限不行。 右键以管理员运行。试试。
zhgwbzhd 2013-12-26
  • 打赏
  • 举报
回复
首先谢谢 zhuyf87 我按照这个方法提升了权限,但是还是不能执行WriteFile 并且除了 SE_DEBUG_NAME TEXT("SeDebugPrivilege") 我还试了很多其他的值,也不行啊。
zhuyf87 2013-12-26
  • 打赏
  • 举报
回复

//设置当前进程优先级为最高(实时)
BOOL CEnablePrivileges::SetRealTimePriority()
{
    // Sets the priority class for the specified process. 
    return SetPriorityClass( GetCurrentProcess(), REALTIME_PRIORITY_CLASS );
}

// 提升当前进程权限为"SeDebugPrivilege"读、写控制权限
BOOL CEnablePrivileges::EnableDebugPriv()
{
    return EnablePrivileges(SE_DEBUG_NAME);
}

BOOL CEnablePrivileges::EnablePrivileges(LPCTSTR lpName)
{
    HANDLE hToken;
    LUID sedebugnameValue;
    TOKEN_PRIVILEGES tkp;

    if ( !OpenProcessToken( GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken ) )
        return FALSE;

    if ( !LookupPrivilegeValue( NULL, lpName, &sedebugnameValue ) )
    {
        CloseHandle( hToken );
        return FALSE;
    }

    tkp.PrivilegeCount = 1;
    tkp.Privileges[0].Luid = sedebugnameValue;
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if ( !AdjustTokenPrivileges( hToken, FALSE, &tkp, sizeof tkp, NULL, NULL ) )
    {
        CloseHandle( hToken );
        return FALSE;
    }

    CloseHandle( hToken );
    return TRUE;
}
oyljerry 2013-12-26
  • 打赏
  • 举报
回复
用Administrator方式运行exe
worldy 2013-12-26
  • 打赏
  • 举报
回复
应该要提升操作权限吧

2,640

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 硬件/系统
社区管理员
  • 硬件/系统社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧