怎样让文件不被移动,删除,复制

来源:互联网 发布:windows10共享设置软件 编辑:程序博客网 时间:2024/04/26 12:41
01#include<windows.h>
02#include<stdio.h>
03BOOL OccupyFile( LPCTSTR lpFileName );//锁定文件
04BOOL ReleaseFile(LPCTSTR lpFileName);//释放文件
05HANDLE hTargetHandle;
06int main()
07{
08OccupyFile("c:\\111.txt");
09printf("此时文件不能被删除、移动、重命名等\n");
10system("pause");
11ReleaseFile("c:\\111.txt");
12printf("此时文件可以被删除、移动、重命名等\n");
13return 0;
14}
15void RaiseToDebugP()
16{
17HANDLE hToken;
18HANDLE hProcess = GetCurrentProcess();
19if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
20{
21TOKEN_PRIVILEGES tkp;
22if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
23{
24tkp.PrivilegeCount = 1;
25tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
26BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
27}
28CloseHandle(hToken);
29}
30}
31BOOL OccupyFile( LPCTSTR lpFileName )
32{
33BOOL     bRet;
34RaiseToDebugP();
35HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);    // 4为system进程号
36if ( hProcess == NULL )
37{
38hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);         // 2K下是 8??
39if ( hProcess == NULL )
40return FALSE;
41}
42HANDLE hFile;
43hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
44if ( hFile == INVALID_HANDLE_VALUE )
45{
46CloseHandle( hProcess );
47return FALSE;
48}
49bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
500, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
51CloseHandle( hProcess );
52return bRet;
53}
54BOOL ReleaseFile(LPCTSTR lpFileName)
55{
56BOOL     bRet;
57RaiseToDebugP();
58HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);
59if ( hProcess == NULL )
60{
61hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);
62if ( hProcess == NULL )
63return FALSE;
64}
65bRet=DuplicateHandle(hProcess,hTargetHandle,GetCurrentProcess(),NULL,0
,FALSE,DUPLICATE_CLOSE_SOURCE);
66CloseHandle(hProcess);
67return bRet;
68}