C# Only part of a ReadProcessMemory or WriteProcessMemory request was completed during Process.Kill()

前端 未结 3 688
谎友^
谎友^ 2020-12-05 18:45

I have been researching this issue pretty extensively and cannot seem to find an answer.

I know that the Only part of a ReadProcessMemory or WriteProcessMemory

3条回答
  •  星月不相逢
    2020-12-05 19:13

    I agree with @sprinter252 that _runningProcesses should not be used as your sync object here.

    //Somewhere that is accessible to both the thread getting the process list and the thread the 
    //code below will be running, declare your sync, lock while adjusting _runningProcesses
    public static readonly object Sync = new object();
    
    IList runningProcesses;
    lock(Sync)
    {
        runningProcesses = _runningProcesses.ToList();
    }
    Process processToRemove = null;
    foreach (Process p in _runningProcesses)
    {
        foreach (ProcessModule module in p.Modules)
        {
            string[] strs = text.Split('\\');
            if (module.ModuleName.Equals(strs[strs.Length - 1]))
            {
                processToRemove = p;
                break;
            }
        }
        if (processToRemove != null)
        {
            break;
        }
    }
    if (processToRemove != null)
    {
        //If we've got a process that needs killing, re-lock on Sync so that we may 
        //safely modify the shared collection
        lock(Sync)
        {
            processToRemove.Kill();
            _runningProcesses.Remove(processToRemove);
        }
    }
    

    If this code is wrapped in a loop to continue to check _runningProcesses for the process you wish to kill, consider changing processToRemove to processesToRemove and change it's type to a collection, iterate over that list in the bottom block after a check for a non-zero count and lock outside of that loop to decrease the overhead of obtaining and releasing locks per process to kill.

提交回复
热议问题