-
-
Save xHeaven/a307d29d732e02da0151ad5aa9bc87ae to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
using System.Diagnostics; | |
using System.Runtime.InteropServices; | |
static class AntiRemove | |
{ | |
const uint GENERIC_READ = 0x80000000; | |
const uint DUPLICATE_SAME_ACCESS = 0x00000002; | |
const uint FILE_SHARE_READ = 1; | |
const uint OPEN_EXISTING = 3; | |
public static bool LockFile(string filePath, params string[] processes) | |
{ | |
IntPtr hCurrentProcess; | |
using (Process current = Process.GetCurrentProcess()) | |
{ | |
hCurrentProcess = current.Handle; | |
} | |
IntPtr hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, IntPtr.Zero, OPEN_EXISTING, 0, IntPtr.Zero); | |
if (hFile == IntPtr.Zero) | |
return false; | |
int count = 0; | |
foreach (Process p in Process.GetProcesses()) | |
{ | |
using (p) | |
{ | |
try | |
{ | |
if (processes.Length == 0 || Array.IndexOf(processes, p.ProcessName.ToLowerInvariant()) != -1) | |
{ | |
Console.WriteLine("Locking with " + p); | |
IntPtr hFileClone; | |
IntPtr hProcess = p.Handle; | |
if (!DuplicateHandle(((IntPtr)(-1)), hFile, hProcess, out hFileClone, GENERIC_READ, false, DUPLICATE_SAME_ACCESS)) | |
{ | |
Marshal.ThrowExceptionForHR(Marshal.GetLastWin32Error()); | |
} | |
count++; | |
} | |
} | |
catch | |
{ | |
Console.WriteLine("Failed locking with " + p); | |
} | |
} | |
} | |
CloseHandle(hFile); | |
return count > 0; | |
} | |
[DllImport("kernel32", SetLastError = true)] | |
static extern bool CloseHandle(IntPtr hObject); | |
[DllImport("kernel32", SetLastError = true)] | |
static extern bool DuplicateHandle(IntPtr hSourceProcessHandle, IntPtr hSourceHandle, IntPtr hTargetProcessHandle, out IntPtr lpTargetHandle, uint dwDesiredAccess, bool bInheritHandle, uint dwOptions); | |
[DllImport("kernel32", SetLastError = true)] | |
static extern IntPtr CreateFile(string lpFileName, uint dwDesiredAccess, | |
uint dwShareMode, IntPtr lpSecurityAttributes, uint dwCreationDisposition, | |
uint dwFlagsAndAttributes, IntPtr hTemplateFile); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment