2,640
社区成员
发帖
与我相关
我的任务
分享
/////////////////////////
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系统升级了安全权限的原因,按这个绝对可以解决
//设置当前进程优先级为最高(实时)
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;
}