Загрузка...

Kill handle C#

Thread in C# created by darknether Nov 13, 2021. 477 views

  1. darknether
    darknether Topic starter Nov 13, 2021 6 Mar 21, 2021
    Добрый день, необходимо чтоб ехе искал в процессе хендл, и убивал его.
    Знаю только название хендла у процесса.
    Подскажите, как можно сделать?
     
  2. leniawar
  3. wDude
    wDude Nov 13, 2021 Боюсь быть не там и не тем. 3666 Aug 14, 2017
    ?
    C#
    int processHandle = Хендл процесса;
    foreach (Process process in Process.GetProcesses())
    {
    if (process.Handle.ToInt32() == processHandle)
    process.Kill();
    }
     
    1. View previous comments (2)
    2. darknether Topic starter
      wDude, понял, щас попробую, если сработает, кину монетку
    3. darknether Topic starter
      wDude, я знаю только название хендла, сам же хендл я не знаю
    4. darknether Topic starter
      wDude, [IMG] если даже так, я указал хендл, но что то пошло не так
  4. darknether
    darknether Topic starter Nov 13, 2021 6 Mar 21, 2021
    вы наверное не поняли про какой хендл я имею ввиду, вот пример
    The post was merged to previous Nov 13, 2021
    [IMG]
     
  5. r3xq1
    r3xq1 Nov 13, 2021 53 Jul 27, 2018
    Убить процесс можно не только по имени (даже если имя меняется постоянно) или хендлу, но и так же по свойствам его характеристики и даже по пути.
     
    1. darknether Topic starter
      r3xq1, да мне не нужно убивать его, мне надо убить хендл в процессе, чтоб я мог переименовать этот файл, потому что без этого, пишет, что файл занят другим процессом, но убивать мне его нельзя
  6. r3xq1
    r3xq1 Nov 14, 2021 53 Jul 27, 2018
    https://www.pinvoke.net/default.aspx/Kernel32/CloseHandle.html

    C#
    namespace KillHandle
    {
    using System;
    using System.Runtime.ConstrainedExecution;
    using System.Runtime.InteropServices;
    using System.Security;

    internal static class NativeMethods
    {
    [DllImport("kernel32.dll", SetLastError = true)]
    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
    [SuppressUnmanagedCodeSecurity]
    [return: MarshalAs(UnmanagedType.Bool)]
    internal static extern bool CloseHandle(IntPtr hObject);
    }
    }
    В коде где тебе нужно прописываешь:
    C#
    namespace KillHandle
    {
    using System;
    using System.IO;

    public static class Program
    {
    [STAThread]
    public static void Main()
    {
    Console.Title = "Kill Handle Process";
    Console.Write("Введите Handle процесса: ");
    IntPtr name = ConvertStringToIntPtr(Console.ReadLine());
    if (NativeMethods.CloseHandle(name))
    {
    Console.WriteLine("Успешно!");
    File.Move(@"D:\KillHandle\bin\Release\Test.txt", @"D:\KillHandle\bin\Release\Test2.txt");
    }
    else
    {
    Console.WriteLine("Не смогли завершить!");
    }
    Console.Read();
    Console.Clear();
    Main();
    }

    public static IntPtr ConvertStringToIntPtr(string hexString)
    {
    // удаляем 0х для конвертации
    hexString = hexString.Replace("0x", "");
    // конвертируем в 10-ую систему счисления, это необходимо для вызова конструктора структуры
    long decAgain = long.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
    return new IntPtr(decAgain);
    }
    }
    }
    У меня был занят текстовый файл другим процессом, после завершения хендла, смог переименовать.
     
    1. View previous comments (2)
    2. r3xq1
      darknether, ну прогоняй процессы, смотреть можешь хендл процесса как по имени, так и по пути и даже по свойствам файла, как угодно.
    3. r3xq1
      darknether, хендл не обязан быть одинаковый, при открытие через OpenProcess он всегда меняется.
    4. darknether Topic starter
      r3xq1, бляха, мне надо чтоб он автоматически определил хендл, я знаю только имя хендла
    5. View the next comments (1)
Top
Loading...