The question is mostly in the title. I am trying to write an example using this method however when I run it with the ALL flag and the handle for a process I get a -1 returned instead of a valid handle to a snapshot and when calling GetLastError I get 2 (The system cannot find the file specified.)
My question is does the th32ProcessID referenced in the MSDN link refer to a normal process handle or is there a different way to get this process ID?
I don't have a great deal of code for this at the moment but what I do have is below:
[DllImport("kernel32", SetLastError = true, CharSet = System.Runtime.InteropServices.CharSet.Auto)]
internal static extern IntPtr CreateToolhelp32Snapshot([In] SnapshotFlags dwFlags, [In] IntPtr th32ProcessID);
IntPtr Handle = CreateToolhelp32Snapshot(SnapshotFlags.All, ProcessHandle);
Console.WriteLine("ProcessHandle = {0}", ProcessHandle.ToString("X"));
uint flags = 0;
bool result = GetHandleInformation(ProcessHandle, out flags);
Console.WriteLine("Last error = {0} and handle is valid = {1}", WinErrors.GetLastWin32Error(), result);
Console.WriteLine((int)Handle);
CodePudding user response:
A process HANDLE is not the same thing as a process ID. They are not interchangeable.
CreateToolhelp32Snapshot() takes a process ID. And that parameter is a DWORD, so you should be using (u)int (aka (U)Int32), not IntPtr.
GetHandleInformation() takes a process HANDLE.
Since you are passing the wrong type of parameter value to CreateToolhelp32Snapshot(), it is failing, returning INVALID_HANDLE_VALUE, and then GetLastError() is telling you that the specified process ID was not found.
You can get a process HANDLE from a process ID by using OpenProcess().
You can get a process ID from a process HANDLE by using GetProcessId().
