#include<windows.h>
#include<stdio.h>
BOOL OccupyFile( LPCTSTR lpFileName );//锁定文件
BOOL ReleaseFile(LPCTSTR lpFileName);//释放文件
HANDLE hTargetHandle;
int main()
{
OccupyFile("c:\\111.txt");
printf("此时文件不能被删除、移动、重命名等\n");
system("pause");
ReleaseFile("c:\\111.txt");
printf("此时文件可以被删除、移动、重命名等\n");
return 0;
}
void RaiseToDebugP()
{
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}
}
BOOL OccupyFile( LPCTSTR lpFileName )
{
BOOL bRet;
RaiseToDebugP();
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4); // 4为system进程号
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8); // 2K下是 8??
if ( hProcess == NULL )
return FALSE;
}
HANDLE hFile;
hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
CloseHandle( hProcess );
return FALSE;
}
bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
CloseHandle( hProcess );
return bRet;
}
BOOL ReleaseFile(LPCTSTR lpFileName)
{
BOOL bRet;
RaiseToDebugP();
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);
if ( hProcess == NULL )
return FALSE;
}
bRet=DuplicateHandle(hProcess,hTargetHandle,GetCurrentProcess(),NULL,0,FALSE,DUPLICATE_CLOSE_SOURCE);
CloseHandle(hProcess);
return bRet;
}
#include<stdio.h>
BOOL OccupyFile( LPCTSTR lpFileName );//锁定文件
BOOL ReleaseFile(LPCTSTR lpFileName);//释放文件
HANDLE hTargetHandle;
int main()
{
OccupyFile("c:\\111.txt");
printf("此时文件不能被删除、移动、重命名等\n");
system("pause");
ReleaseFile("c:\\111.txt");
printf("此时文件可以被删除、移动、重命名等\n");
return 0;
}
void RaiseToDebugP()
{
HANDLE hToken;
HANDLE hProcess = GetCurrentProcess();
if ( OpenProcessToken(hProcess, TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken) )
{
TOKEN_PRIVILEGES tkp;
if ( LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tkp.Privileges[0].Luid) )
{
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
BOOL bREt = AdjustTokenPrivileges(hToken, FALSE, &tkp, 0, NULL, 0) ;
}
CloseHandle(hToken);
}
}
BOOL OccupyFile( LPCTSTR lpFileName )
{
BOOL bRet;
RaiseToDebugP();
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4); // 4为system进程号
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8); // 2K下是 8??
if ( hProcess == NULL )
return FALSE;
}
HANDLE hFile;
hFile = CreateFile( lpFileName, GENERIC_READ, 0, NULL, CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL, NULL);
if ( hFile == INVALID_HANDLE_VALUE )
{
CloseHandle( hProcess );
return FALSE;
}
bRet = DuplicateHandle( GetCurrentProcess(), hFile, hProcess, &hTargetHandle,
0, FALSE, DUPLICATE_SAME_ACCESS|DUPLICATE_CLOSE_SOURCE);
CloseHandle( hProcess );
return bRet;
}
BOOL ReleaseFile(LPCTSTR lpFileName)
{
BOOL bRet;
RaiseToDebugP();
HANDLE hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 4);
if ( hProcess == NULL )
{
hProcess = OpenProcess( PROCESS_DUP_HANDLE, FALSE, 8);
if ( hProcess == NULL )
return FALSE;
}
bRet=DuplicateHandle(hProcess,hTargetHandle,GetCurrentProcess(),NULL,0,FALSE,DUPLICATE_CLOSE_SOURCE);
CloseHandle(hProcess);
return bRet;
}