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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值