mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 21:53:06 +00:00
[NTDLL_WINETEST][NTOS:PS] Fix a few NtQueryInformationProcess(Process*) handling cases (#8136)
* [NTDLL_WINETEST] `test_query_process_debug_object_handle()`: one WINESYNC Cherry-pick WineTest part of:52d733b5c4
server: Implement retrieving the debug object of a process. by: Alexandre Julliard <julliard@winehq.org> * [NTOS:PS] Fix `NtQueryInformationProcess(ProcessDebugObjectHandle)` Close the retrieved `DebugPort` on failure. Addendum to commit1e172203a
(r55734). * [NTOS:PS] Optimize `NtQueryInformationProcess(ProcessWow64Information)` on 32-bit. No need to do the ExAcquire/ReleaseRundownProtection rigamarole since we aren't retrieving the `Process->Wow64Process` on 32-bit builds. Addendum to commit1e172203a
(r55734). * [NTOS:PS] Fix `NtQueryInformationProcess(ProcessExecuteFlags)` s/return/break/ on a failure case. Addendum to commit1e172203a
(r55734). * [NTOS:PS] NtQueryInformationProcess(): Optimize `*ReturnLength` assignment Enter the SEH block only if we know we'll have to set `*ReturnLength` on return. Addendum to commit2278c2914
(r23175).
This commit is contained in:
parent
b8c5e9c209
commit
9832737843
2 changed files with 37 additions and 22 deletions
|
@ -1582,12 +1582,20 @@ static void test_query_process_debug_object_handle(int argc, char **argv)
|
|||
debug_object = (HANDLE)0xdeadbeef;
|
||||
status = pNtQueryInformationProcess(pi.hProcess, ProcessDebugObjectHandle,
|
||||
&debug_object, sizeof(debug_object), NULL);
|
||||
#ifndef __REACTOS__
|
||||
todo_wine
|
||||
#endif
|
||||
ok(status == STATUS_SUCCESS,
|
||||
"Expected NtQueryInformationProcess to return STATUS_SUCCESS, got 0x%08x\n", status);
|
||||
#ifndef __REACTOS__
|
||||
todo_wine
|
||||
#endif
|
||||
ok(debug_object != NULL,
|
||||
"Expected debug object handle to be non-NULL, got %p\n", debug_object);
|
||||
#ifdef __REACTOS__
|
||||
status = NtClose( debug_object );
|
||||
ok( !status, "NtClose failed %x\n", status );
|
||||
#endif
|
||||
|
||||
for (;;)
|
||||
{
|
||||
|
|
|
@ -907,7 +907,7 @@ NtQueryInformationProcess(
|
|||
|
||||
case ProcessDebugObjectHandle:
|
||||
{
|
||||
HANDLE DebugPort = 0;
|
||||
HANDLE DebugPort = NULL;
|
||||
|
||||
if (ProcessInformationLength != sizeof(HANDLE))
|
||||
{
|
||||
|
@ -927,7 +927,7 @@ NtQueryInformationProcess(
|
|||
NULL);
|
||||
if (!NT_SUCCESS(Status)) break;
|
||||
|
||||
/* Get the debug port */
|
||||
/* Get the debug port. Continue even if this fails. */
|
||||
Status = DbgkOpenProcessDebugPort(Process, PreviousMode, &DebugPort);
|
||||
|
||||
/* Let go of the process */
|
||||
|
@ -941,7 +941,11 @@ NtQueryInformationProcess(
|
|||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
/* Get the exception code */
|
||||
if (DebugPort)
|
||||
ObCloseHandle(DebugPort, PreviousMode);
|
||||
|
||||
/* Get the exception code.
|
||||
* Note: This overwrites any previous failure status. */
|
||||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
|
@ -1040,23 +1044,24 @@ NtQueryInformationProcess(
|
|||
NULL);
|
||||
if (!NT_SUCCESS(Status)) break;
|
||||
|
||||
#ifdef _WIN64
|
||||
/* Make sure the process isn't dying */
|
||||
if (ExAcquireRundownProtection(&Process->RundownProtect))
|
||||
{
|
||||
/* Get the WOW64 process structure */
|
||||
#ifdef _WIN64
|
||||
Wow64 = (ULONG_PTR)Process->Wow64Process;
|
||||
#else
|
||||
Wow64 = 0;
|
||||
#endif
|
||||
/* Release the lock */
|
||||
ExReleaseRundownProtection(&Process->RundownProtect);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Dereference the process */
|
||||
ObDereferenceObject(Process);
|
||||
|
||||
/* Protect write with SEH */
|
||||
_SEH2_TRY
|
||||
{
|
||||
/* Return whether or not we have a debug port */
|
||||
/* Return the Wow64 process information */
|
||||
*(PULONG_PTR)ProcessInformation = Wow64;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
|
@ -1065,9 +1070,6 @@ NtQueryInformationProcess(
|
|||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
/* Dereference the process */
|
||||
ObDereferenceObject(Process);
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -1086,7 +1088,8 @@ NtQueryInformationProcess(
|
|||
|
||||
if (ProcessHandle != NtCurrentProcess())
|
||||
{
|
||||
return STATUS_INVALID_PARAMETER;
|
||||
Status = STATUS_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Get the options */
|
||||
|
@ -1130,18 +1133,22 @@ NtQueryInformationProcess(
|
|||
Status = STATUS_INVALID_INFO_CLASS;
|
||||
}
|
||||
|
||||
/* Protect write with SEH */
|
||||
_SEH2_TRY
|
||||
/* Check if caller wants the return length and if there is one */
|
||||
if (ReturnLength != NULL && Length != 0)
|
||||
{
|
||||
/* Check if caller wanted return length */
|
||||
if ((ReturnLength) && (Length)) *ReturnLength = Length;
|
||||
/* Protect write with SEH */
|
||||
_SEH2_TRY
|
||||
{
|
||||
*ReturnLength = Length;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
/* Get exception code.
|
||||
* Note: This overwrites any previous failure status. */
|
||||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
}
|
||||
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
|
||||
{
|
||||
/* Get exception code */
|
||||
Status = _SEH2_GetExceptionCode();
|
||||
}
|
||||
_SEH2_END;
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue