Загрузка...

Kill handle C#

Thread in C# created by darknether Nov 13, 2021. 482 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 (4)
    2. darknether Topic starter
      r3xq1, бляха, мне надо чтоб он автоматически определил хендл, я знаю только имя хендла
    3. r3xq1
      darknether, у тебя есть type, у тебя есть name, у тебя есть свойства файла процесса и расширение .tmp. Смотри по этим параметрам, находи хендл и закрывай.
Top
Loading...