In plain C#, it looks like you have to loop through them all:
// IntPtr myHandle = ... Process myProcess = Process.GetProcesses().Single( p => p.Id != 0 && p.Handle == myHandle); The above example intentionally fails if the handle isn't found. Otherwise, you could of course use SingleOrDefault. Apparently, it doesn't like you requesting the handle of process ID 0, hence the extra condition.
Using the WINAPI, you can use GetProcessId. I couldn't find it on pinvoke.net, but this should do:
[DllImport("kernel32.dll")] static extern int GetProcessId(IntPtr handle); (signature uses a DWORD, but process IDs are represented by ints in the .NET BCL)
It seems a bit odd that you'd have a handle, but not a process ID however. Process handles are acquired by calling OpenProcess, which takes a process ID.