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 |
66 | CloseHandle(hProcess); |
67 | return bRet; |
68 | } |