public static IntPtr NtOpenThread(int TID, Data.Win32.Kernel32.ThreadAccess DesiredAccess) { // Create OBJECT_ATTRIBUTES & CLIENT_ID ref's IntPtr ThreadHandle = IntPtr.Zero; Data.Native.OBJECT_ATTRIBUTES oa = new Data.Native.OBJECT_ATTRIBUTES(); Data.Native.CLIENT_ID ci = new Data.Native.CLIENT_ID(); ci.UniqueThread = (IntPtr)TID; // Craft an array for the arguments object[] funcargs = { ThreadHandle, DesiredAccess, oa, ci }; Data.Native.NTSTATUS retValue = (Data.Native.NTSTATUS)Generic.DynamicAPIInvoke(@"ntdll.dll", @"NtOpenThread", typeof(DELEGATES.NtOpenProcess), ref funcargs); if (retValue != Data.Native.NTSTATUS.Success && retValue == Data.Native.NTSTATUS.InvalidCid) { throw new InvalidOperationException("An invalid client ID was specified."); } if (retValue != Data.Native.NTSTATUS.Success) { throw new UnauthorizedAccessException("Access is denied."); } // Update the modified variables ThreadHandle = (IntPtr)funcargs[0]; return(ThreadHandle); }
public static IntPtr OpenThread(Data.Win32.Kernel32.ThreadAccess dwDesiredAccess, bool bInheritHandle, int dwThreadId) { object[] funcargs = { dwDesiredAccess, bInheritHandle, dwThreadId }; IntPtr retvalue = (IntPtr)Generic.DynamicAPIInvoke(@"kernel32.dll", @"OpenThread", typeof(Delegates.OpenThread), ref funcargs); return(retvalue); }