//设置当前进程优先级为最高(实时)
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;
}

解决方案 »

  1.   

    首先谢谢 zhuyf87
    我按照这个方法提升了权限,但是还是不能执行WriteFile
    并且除了
    SE_DEBUG_NAME
    TEXT("SeDebugPrivilege")
    我还试了很多其他的值,也不行啊。
      

  2.   

    看看哪个 API 返回错误值
      

  3.   

    我记得win7主硬盘的扇区不给改的,否则MBR不是很容易就被修改么?然后各种引导区病毒满天飞了么?
    我只试过可以修改U盘的扇区
    毕竟win7安全性比XP大幅提高了
      

  4.   

    看看这个微软官方给的解释:
    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系统升级了安全权限的原因,按这个绝对可以解决
      

  5.   

    MBR位于0扇区Vista或xp都可以改,但Vista逻辑数据块不能改,xp都可以改
    要改Vista逻辑块数据得卸载逻辑盘,http://support.microsoft.com/kb/942448