From 9b5a87cdac4870fa3a40d48a420a247a25bdb033 Mon Sep 17 00:00:00 2001 From: Alex Ionescu Date: Sun, 23 Jul 2006 21:38:31 +0000 Subject: [PATCH] - Fix trace macro to print line number in decimal, not hex. - Implement PspSetCrossThreadFlag and PspClearCrossThreadFlag and use them. Thanks to Thomas for the idea. - Fix a bug in Fast Referencing, thanks to Thomas. svn path=/trunk/; revision=23260 --- reactos/ntoskrnl/include/internal/ps.h | 2 +- reactos/ntoskrnl/include/internal/ps_x.h | 8 ++++++++ reactos/ntoskrnl/ob/obref.c | 2 +- reactos/ntoskrnl/ps/kill.c | 2 +- reactos/ntoskrnl/ps/query.c | 2 +- reactos/ntoskrnl/ps/security.c | 19 +++++++------------ reactos/ntoskrnl/ps/thread.c | 10 +++++----- 7 files changed, 24 insertions(+), 21 deletions(-) diff --git a/reactos/ntoskrnl/include/internal/ps.h b/reactos/ntoskrnl/include/internal/ps.h index 93bd1f6f23b..b408911f523 100644 --- a/reactos/ntoskrnl/include/internal/ps.h +++ b/reactos/ntoskrnl/include/internal/ps.h @@ -49,7 +49,7 @@ #endif #define PSREFTRACE(x) \ PSTRACE(PS_REF_DEBUG, \ - "Pointer Count [%p] @%lx: %lx\n", \ + "Pointer Count [%p] @%d: %lx\n", \ x, \ __LINE__, \ OBJECT_TO_OBJECT_HEADER(x)->PointerCount); diff --git a/reactos/ntoskrnl/include/internal/ps_x.h b/reactos/ntoskrnl/include/internal/ps_x.h index 8317ef671a0..ec6ed9cddb1 100644 --- a/reactos/ntoskrnl/include/internal/ps_x.h +++ b/reactos/ntoskrnl/include/internal/ps_x.h @@ -19,6 +19,14 @@ #define PspQuantumLengthFromMask(Mask) \ ((Mask) & 48) +// +// Cross Thread Flag routines +// +#define PspSetCrossThreadFlag(Thread, Flag) \ + InterlockedOr((PLONG)&Thread->CrossThreadFlags, Flag) +#define PspClearCrossThreadFlag(Thread, Flag) \ + InterlockedAnd((PLONG)&Thread->CrossThreadFlags, ~Flag) + VOID FORCEINLINE PspRunCreateThreadNotifyRoutines(IN PETHREAD CurrentThread, diff --git a/reactos/ntoskrnl/ob/obref.c b/reactos/ntoskrnl/ob/obref.c index 21d024c5c8a..064305be0b3 100644 --- a/reactos/ntoskrnl/ob/obref.c +++ b/reactos/ntoskrnl/ob/obref.c @@ -150,7 +150,7 @@ ObFastReferenceObject(IN PEX_FAST_REF FastRef) { /* Get the current count */ Value = FastRef->Value; - if (!Value & MAX_FAST_REFS) break; + if (!(Value & MAX_FAST_REFS)) break; /* Increase the reference count */ NewValue = Value - 1; diff --git a/reactos/ntoskrnl/ps/kill.c b/reactos/ntoskrnl/ps/kill.c index a9ea4468127..b44396071d9 100644 --- a/reactos/ntoskrnl/ps/kill.c +++ b/reactos/ntoskrnl/ps/kill.c @@ -905,7 +905,7 @@ PspTerminateThreadByPointer(IN PETHREAD Thread, ASSERT_IRQL(PASSIVE_LEVEL); /* Mark it as terminated */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_TERMINATED_BIT); + PspSetCrossThreadFlag(Thread, CT_TERMINATED_BIT); /* Directly terminate the thread */ PspExitThread(ExitStatus); diff --git a/reactos/ntoskrnl/ps/query.c b/reactos/ntoskrnl/ps/query.c index b689bb49d62..0dbd2dc1120 100644 --- a/reactos/ntoskrnl/ps/query.c +++ b/reactos/ntoskrnl/ps/query.c @@ -17,7 +17,7 @@ #include "internal/ps_i.h" /* Debugging Level */ -ULONG PspTraceLevel = 0; //PS_KILL_DEBUG | PS_REF_DEBUG; +ULONG PspTraceLevel = PS_KILL_DEBUG | PS_REF_DEBUG; /* PRIVATE FUNCTIONS *********************************************************/ diff --git a/reactos/ntoskrnl/ps/security.c b/reactos/ntoskrnl/ps/security.c index ed0dfe04110..899905b144b 100644 --- a/reactos/ntoskrnl/ps/security.c +++ b/reactos/ntoskrnl/ps/security.c @@ -51,8 +51,7 @@ PspDeleteThreadSecurity(IN PETHREAD Thread) { /* Free it */ ExFreePool(Thread->ImpersonationInfo); - InterlockedAnd((PLONG)&Thread->CrossThreadFlags, - ~CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspClearCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT); Thread->ImpersonationInfo = NULL; } } @@ -537,8 +536,7 @@ PsRevertThreadToSelf(IN PETHREAD Thread) if (Thread->ActiveImpersonationInfo) { /* Disable impersonation */ - InterlockedAnd((PLONG)&Thread->CrossThreadFlags, - ~CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspClearCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT); /* Get the token */ Token = Thread->ImpersonationInfo->Token; @@ -584,8 +582,8 @@ PsImpersonateClient(IN PETHREAD Thread, if (Thread->ActiveImpersonationInfo) { /* Disable impersonation */ - InterlockedAnd((PLONG)&Thread->CrossThreadFlags, - ~CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspClearCrossThreadFlag(Thread, + CT_ACTIVE_IMPERSONATION_INFO_BIT); /* Get the token */ OldToken = Thread->ImpersonationInfo->Token; @@ -632,8 +630,7 @@ PsImpersonateClient(IN PETHREAD Thread, else { /* Otherwise, enable impersonation */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, - CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspSetCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT); } /* Now fill it out */ @@ -880,14 +877,12 @@ PsRestoreImpersonation(IN PETHREAD Thread, Impersonation->Token = ImpersonationState->Token; /* Enable impersonation */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, - CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspSetCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT); } else { /* Disable impersonation */ - InterlockedAnd((PLONG)&Thread->CrossThreadFlags, - ~CT_ACTIVE_IMPERSONATION_INFO_BIT); + PspClearCrossThreadFlag(Thread, CT_ACTIVE_IMPERSONATION_INFO_BIT); } /* Unlock the thread */ diff --git a/reactos/ntoskrnl/ps/thread.c b/reactos/ntoskrnl/ps/thread.c index 4ea7757c010..0f52f19e29b 100644 --- a/reactos/ntoskrnl/ps/thread.c +++ b/reactos/ntoskrnl/ps/thread.c @@ -293,7 +293,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle, { /* System Thread */ Thread->StartAddress = StartRoutine; - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_SYSTEM_THREAD_BIT); + PspSetCrossThreadFlag(Thread, CT_SYSTEM_THREAD_BIT); /* Let the kernel intialize the Thread */ Status = KeInitThread(&Thread->Tcb, @@ -380,7 +380,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle, if (!NT_SUCCESS(Status)) { /* Access state failed, thread is dead */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_DEAD_THREAD_BIT); + PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT); /* If we were suspended, wake it up */ if (CreateSuspended) KeResumeThread(&Thread->Tcb); @@ -422,7 +422,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle, Status = _SEH_GetExceptionCode(); /* Thread insertion failed, thread is dead */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_DEAD_THREAD_BIT); + PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT); /* If we were suspended, wake it up */ if (CreateSuspended) KeResumeThread(&Thread->Tcb); @@ -444,7 +444,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle, else { /* Thread insertion failed, thread is dead */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_DEAD_THREAD_BIT); + PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT); /* If we were suspended, wake it up */ if (CreateSuspended) KeResumeThread(&Thread->Tcb); @@ -465,7 +465,7 @@ PspCreateThread(OUT PHANDLE ThreadHandle, if (!NT_SUCCESS(Status)) { /* Thread insertion failed, thread is dead */ - InterlockedOr((PLONG)&Thread->CrossThreadFlags, CT_DEAD_THREAD_BIT); + PspSetCrossThreadFlag(Thread, CT_DEAD_THREAD_BIT); /* If we were suspended, wake it up */ if (CreateSuspended) KeResumeThread(&Thread->Tcb);