想让你的某个文件不被删除不被移动不被重命名吗?很简单,see it!!!

#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;
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值