distinguish kmode and umode alertability Modified: trunk/reactos/include/ddk/types.h Modified: trunk/reactos/ntoskrnl/include/internal/ps.h Modified: trunk/reactos/ntoskrnl/ke/alert.c Modified: trunk/reactos/w32api/include/ddk/winddk.h _____
Modified: trunk/reactos/include/ddk/types.h --- trunk/reactos/include/ddk/types.h 2005-02-15 11:46:31 UTC (rev 13580) +++ trunk/reactos/include/ddk/types.h 2005-02-15 13:40:10 UTC (rev 13581) @@ -8,7 +8,7 @@
/* * Various other types (all quite pointless) */ -typedef CCHAR KPROCESSOR_MODE; +typedef UCHAR KPROCESSOR_MODE; typedef UCHAR KIRQL; typedef KIRQL* PKIRQL; typedef ULONG IO_ALLOCATION_ACTION; _____
Modified: trunk/reactos/ntoskrnl/include/internal/ps.h --- trunk/reactos/ntoskrnl/include/internal/ps.h 2005-02-15 11:46:31 UTC (rev 13580) +++ trunk/reactos/ntoskrnl/include/internal/ps.h 2005-02-15 13:40:10 UTC (rev 13581) @@ -73,7 +73,7 @@
/* Thread state (one of THREAD_STATE_xxx constants below) */ UCHAR State; /* 2D */ - UCHAR Alerted[2]; /* 2E */ + BOOLEAN Alerted[2]; /* 2E */ UCHAR Iopl; /* 30 */ UCHAR NpxState; /* 31 */ CHAR Saturation; /* 32 */ _____
Modified: trunk/reactos/ntoskrnl/ke/alert.c --- trunk/reactos/ntoskrnl/ke/alert.c 2005-02-15 11:46:31 UTC (rev 13580) +++ trunk/reactos/ntoskrnl/ke/alert.c 2005-02-15 13:40:10 UTC (rev 13581) @@ -37,14 +37,11 @@
OldIrql = KeAcquireDispatcherDatabaseLock(); KiAcquireSpinLock(&Thread->ApcQueueLock);
- /* NOTE: Albert Almeida claims Alerted[1] is never used. Two kind of - * alerts _do_ seem useless. -Gunnar - */ - OldState = Thread->Alerted[0]; + OldState = Thread->Alerted[AlertMode];
/* If the Thread is Alerted, Clear it */ if (OldState) { - Thread->Alerted[0] = FALSE; + Thread->Alerted[AlertMode] = FALSE; } else if ((AlertMode == UserMode) && (!IsListEmpty(&Thread->ApcState.ApcListHead[UserMode]))) { /* If the mode is User and the Queue isn't empty, set Pending */ Thread->ApcState.UserApcPending = TRUE; @@ -65,20 +62,19 @@ oldIrql = KeAcquireDispatcherDatabaseLock();
- /* Return if thread is already alerted. - * NOTE: Albert Almeida claims Alerted[1] is never used. Two kind of - * alerts _do_ seem useless. -Gunnar - */ - if (Thread->Alerted[0] == FALSE) + /* Return if thread is already alerted. */ + if (Thread->Alerted[AlertMode] == FALSE) { - Thread->Alerted[0] = TRUE; - if (Thread->State == THREAD_STATE_BLOCKED && - Thread->WaitMode == AlertMode && + (AlertMode == KernelMode || Thread->WaitMode == AlertMode) && Thread->Alertable) { KiAbortWaitThread(Thread, STATUS_ALERTED); } + else + { + Thread->Alerted[AlertMode] = TRUE; + } }
KeReleaseDispatcherDatabaseLock(oldIrql); @@ -124,11 +120,12 @@ return(Status); }
- /* FIXME: should we always use UserMode here, even if the ntoskrnl exported - * ZwAlertThread was called? - * -Gunnar - */ - KeAlertThread((PKTHREAD)Thread, PreviousMode); + /* do an alert depending on the processor mode. If some kmode code wants to + enforce a umode alert it should call KeAlertThread() directly. If kmode + code wants to do a kmode alert it's sufficient to call it with Zw or just + use KeAlertThread() directly */ + + KeAlertThread(&Thread->Tcb, PreviousMode);
ObDereferenceObject(Thread); return(STATUS_SUCCESS); @@ -142,11 +139,12 @@ STDCALL NtTestAlert(VOID) { + KPROCESSOR_MODE PreviousMode; + + PreviousMode = ExGetPreviousMode(); + /* Check and Alert Thread if needed */ - if (KeTestAlertThread(KeGetPreviousMode())) { - return STATUS_ALERTED; - } else { - return STATUS_SUCCESS; - } + + return KeTestAlertThread(PreviousMode) ? STATUS_ALERTED : STATUS_SUCCESS; }
_____
Modified: trunk/reactos/w32api/include/ddk/winddk.h --- trunk/reactos/w32api/include/ddk/winddk.h 2005-02-15 11:46:31 UTC (rev 13580) +++ trunk/reactos/w32api/include/ddk/winddk.h 2005-02-15 13:40:10 UTC (rev 13581) @@ -134,7 +134,7 @@
typedef UCHAR KIRQL, *PKIRQL; typedef ULONG_PTR KSPIN_LOCK, *PKSPIN_LOCK; typedef ULONG KAFFINITY, *PKAFFINITY; -typedef CCHAR KPROCESSOR_MODE; +typedef UCHAR KPROCESSOR_MODE;
typedef enum _MODE { KernelMode,