//设置当前进程优先级为最高(实时)
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;
}
我按照这个方法提升了权限,但是还是不能执行WriteFile
并且除了
SE_DEBUG_NAME
TEXT("SeDebugPrivilege")
我还试了很多其他的值,也不行啊。
我只试过可以修改U盘的扇区
毕竟win7安全性比XP大幅提高了
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系统升级了安全权限的原因,按这个绝对可以解决
要改Vista逻辑块数据得卸载逻辑盘,http://support.microsoft.com/kb/942448