Windows内核对象(3) -- DuplicateHandle实现文件占用
【摘要】 DuplicateHandle的用法参考:http://blog.csdn.net/china_jeffery/article/details/79171307实现的原理大致就是,通过DuplicateHandle拷贝文件句柄给另外一个进程(一般是系统进程),因为系统进程不会被关闭,所以达到了占用某个文件,不让其他进程删除、读取、写入等。因为需要拷贝文件句柄给系统进程,所以涉及到打开系统进程...
DuplicateHandle
的用法参考:http://blog.csdn.net/china_jeffery/article/details/79171307
实现的原理大致就是,通过DuplicateHandle
拷贝文件句柄给另外一个进程(一般是系统进程),因为系统进程不会被关闭,所以达到了占用某个文件,不让其他进程删除、读取、写入等。
因为需要拷贝文件句柄给系统进程,所以涉及到打开系统进程,可能需要提权操作,提权的实现请参考:Windows环境下提升进程的权限,一般授权给进程SE_DEBUG_NAME
权限即可。
实现一个用于锁住文件的函数LockFile
,将文件句柄复制给系统csrss.exe
进程,函数实现如下:
bool LockFile(LPCTSTR lpFilePath) {
if (lpFilePath == NULL)
return false;
// 查找进程csrss.exe
//
DWORD dwCsrssProcessID = 0;
PROCESSENTRY32 pe;
pe.dwSize = sizeof(PROCESSENTRY32);
HANDLE hSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
while (Process32Next(hSnapShot, &pe)) {
if (lstrcmpi(pe.szExeFile, TEXT("csrss.exe")) == 0) {
dwCsrssProcessID = pe.th32ProcessID;
break;
}
}
CloseHandle(hSnapShot);
// 未找到
if (dwCsrssProcessID == 0) {
return false;
}
HANDLE hProcess = OpenProcess(PROCESS_DUP_HANDLE, FALSE, dwCsrssProcessID);
// 打开失败,可能需要提权
// See: http://blog.csdn.net/china_jeffery/article/details/79173417
if (hProcess == NULL) {
return false;
}
HANDLE hFile = CreateFile(lpFilePath,
GENERIC_READ | GENERIC_EXECUTE | GENERIC_WRITE,
0,
NULL,
OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (hFile == INVALID_HANDLE_VALUE) {
CloseHandle(hProcess);
return false;
}
HANDLE hTargetHandle = INVALID_HANDLE_VALUE;
BOOL bRet = DuplicateHandle(GetCurrentProcess(),
hFile,
hProcess,
&hTargetHandle,
0,
FALSE,
DUPLICATE_SAME_ACCESS | DUPLICATE_CLOSE_SOURCE
);
CloseHandle(hProcess);
return (bRet == TRUE);
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)