From 5fd079df218fb1470e88bef185efb3df022f593f Mon Sep 17 00:00:00 2001 From: wj32 Date: Wed, 30 Sep 2009 11:43:58 +0000 Subject: [PATCH] * fixed EnvironmentBlock.GetLength * fixed CreateExtended, CSR notification is now optional; starting simple programs works! git-svn-id: svn://svn.code.sf.net/p/processhacker/code@2010 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- trunk/ProcessHacker.Native/NativeUtils.cs | 2 +- .../Objects/EnvironmentBlock.cs | 2 +- .../Objects/ProcessHandle.cs | 97 ++++++++++--------- 3 files changed, 53 insertions(+), 48 deletions(-) diff --git a/trunk/ProcessHacker.Native/NativeUtils.cs b/trunk/ProcessHacker.Native/NativeUtils.cs index 592862dd0..0f37b4ff9 100644 --- a/trunk/ProcessHacker.Native/NativeUtils.cs +++ b/trunk/ProcessHacker.Native/NativeUtils.cs @@ -149,7 +149,7 @@ namespace ProcessHacker.Native // Modify the process parameters pointer in the PEB. processHandle.WriteMemory( peb.Increment(Peb.ProcessParametersOffset), - newProcessParameters, + &newProcessParameters, IntPtr.Size ); } diff --git a/trunk/ProcessHacker.Native/Objects/EnvironmentBlock.cs b/trunk/ProcessHacker.Native/Objects/EnvironmentBlock.cs index 776fc3442..d3a974fef 100644 --- a/trunk/ProcessHacker.Native/Objects/EnvironmentBlock.cs +++ b/trunk/ProcessHacker.Native/Objects/EnvironmentBlock.cs @@ -57,7 +57,7 @@ namespace ProcessHacker.Native.Objects public unsafe int GetLength() { - byte* ptr = (byte*)_environment; + short* ptr = (short*)_environment; while (*ptr != 0) while (*ptr++ != 0) diff --git a/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs b/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs index 3d3d81b3f..3e3985b85 100644 --- a/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs +++ b/trunk/ProcessHacker.Native/Objects/ProcessHandle.cs @@ -148,6 +148,7 @@ namespace ProcessHacker.Native.Objects fileName, parentProcess, creationFlags, + true, inheritHandles, EnvironmentBlock.GetCurrent(), currentDirectory, @@ -161,6 +162,7 @@ namespace ProcessHacker.Native.Objects string fileName, ProcessHandle parentProcess, ProcessCreationFlags creationFlags, + bool notifyCsr, bool inheritHandles, EnvironmentBlock environment, string currentDirectory, @@ -236,60 +238,63 @@ namespace ProcessHacker.Native.Objects // Notify CSR. - BaseCreateProcessMsg processMsg = new BaseCreateProcessMsg(); - - processMsg.ProcessHandle = phandle; - processMsg.ThreadHandle = thandle; - processMsg.ClientId = clientId; - processMsg.CreationFlags = creationFlags; - - if ((creationFlags & (ProcessCreationFlags.DebugProcess | - ProcessCreationFlags.DebugOnlyThisProcess)) != 0) + if (notifyCsr) { - NtStatus status; + BaseCreateProcessMsg processMsg = new BaseCreateProcessMsg(); - status = Win32.DbgUiConnectToDbg(); + processMsg.ProcessHandle = phandle; + processMsg.ThreadHandle = thandle; + processMsg.ClientId = clientId; + processMsg.CreationFlags = creationFlags; - if (status >= NtStatus.Error) + if ((creationFlags & (ProcessCreationFlags.DebugProcess | + ProcessCreationFlags.DebugOnlyThisProcess)) != 0) { - phandle.Terminate(status); - Win32.ThrowLastError(status); + NtStatus status; + + status = Win32.DbgUiConnectToDbg(); + + if (status >= NtStatus.Error) + { + phandle.Terminate(status); + Win32.ThrowLastError(status); + } + + processMsg.DebuggerClientId = ThreadHandle.GetCurrentCid(); } - processMsg.DebuggerClientId = ThreadHandle.GetCurrentCid(); - } + // If this is a GUI program, set the 1 and 2 bits to turn the + // hourglass cursor on. + if (imageInfo.ImageSubsystem == 2) + processMsg.ProcessHandle = processMsg.ProcessHandle.Or((1 | 2).ToIntPtr()); + // We still have to honor the startup info settings, though. + if ((startupInfo.Flags & StartupFlags.ForceOnFeedback) == + StartupFlags.ForceOnFeedback) + processMsg.ProcessHandle = processMsg.ProcessHandle.Or((1).ToIntPtr()); + if ((startupInfo.Flags & StartupFlags.ForceOffFeedback) == + StartupFlags.ForceOffFeedback) + processMsg.ProcessHandle = processMsg.ProcessHandle.And((1).ToIntPtr().Not()); - // If this is a GUI program, set the 1 and 2 bits to turn the - // hourglass cursor on. - if (imageInfo.ImageSubsystem == 2) - processMsg.ProcessHandle = processMsg.ProcessHandle.Or((1 | 2).ToIntPtr()); - // We still have to honor the startup info settings, though. - if ((startupInfo.Flags & StartupFlags.ForceOnFeedback) == - StartupFlags.ForceOnFeedback) - processMsg.ProcessHandle = processMsg.ProcessHandle.Or((1).ToIntPtr()); - if ((startupInfo.Flags & StartupFlags.ForceOffFeedback) == - StartupFlags.ForceOffFeedback) - processMsg.ProcessHandle = processMsg.ProcessHandle.And((1).ToIntPtr().Not()); - - using (var data = new MemoryAlloc( - CsrApiMsg.ApiMessageDataOffset + Marshal.SizeOf(typeof(BaseCreateProcessMsg)) - )) - { - data.WriteStruct(CsrApiMsg.ApiMessageDataOffset, 0, processMsg); - - Win32.CsrClientCallServer( - data, - IntPtr.Zero, - Win32.CsrMakeApiNumber(Win32.BaseSrvServerDllIndex, (int)BaseSrvApiNumber.BasepCreateProcess), - Marshal.SizeOf(typeof(BaseCreateProcessMsg)) - ); - - NtStatus status = (NtStatus)data.ReadStruct().ReturnValue; - - if (status >= NtStatus.Error) + using (var data = new MemoryAlloc( + CsrApiMsg.ApiMessageDataOffset + Marshal.SizeOf(typeof(BaseCreateProcessMsg)) + )) { - phandle.Terminate(status); - Win32.ThrowLastError(status); + data.WriteStruct(CsrApiMsg.ApiMessageDataOffset, 0, processMsg); + + Win32.CsrClientCallServer( + data, + IntPtr.Zero, + Win32.CsrMakeApiNumber(Win32.BaseSrvServerDllIndex, (int)BaseSrvApiNumber.BasepCreateProcess), + Marshal.SizeOf(typeof(BaseCreateProcessMsg)) + ); + + NtStatus status = (NtStatus)data.ReadStruct().ReturnValue; + + if (status >= NtStatus.Error) + { + phandle.Terminate(status); + Win32.ThrowLastError(status); + } } }