阿杰 发表于 2011-10-29 08:24:55

想让你的某个文件不被删除不被移动不被重命名吗?很简单,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.Luid) )
         {
             tkp.PrivilegeCount = 1;
             tkp.Privileges.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;
}
来源:http://www.cctry.com/thread-29414-1-1.html

Tesla.Angela 发表于 2011-10-29 12:59:03

这个的原理老早就有了。
我还把它弄成了A/B/C三种语言。

g2368vt 发表于 2011-10-31 14:37:34

谢谢咯。

mysmartid 发表于 2013-2-26 14:17:37

谢谢分享

hapi 发表于 2014-9-8 07:39:45

文件占坑,确实很好

upring 发表于 2015-3-20 10:11:21

厉害 学习了 Mark
页: [1]
查看完整版本: 想让你的某个文件不被删除不被移动不被重命名吗?很简单,see it!!!