1. fixed prototypes of NtQueryPerformanceCounter() and
NtDelayExecution() and made them safely access buffers
2. moved the implementation of Sleep(Ex)() into more a appropriate file
Modified: trunk/reactos/drivers/net/afd/afd/main.c
Modified: trunk/reactos/include/ntos/zw.h
Modified: trunk/reactos/lib/kernel32/process/proc.c
Modified: trunk/reactos/lib/kernel32/thread/thread.c
Modified: trunk/reactos/ntoskrnl/ke/timer.c
_____
Modified: trunk/reactos/drivers/net/afd/afd/main.c
--- trunk/reactos/drivers/net/afd/afd/main.c 2005-01-27 08:16:42 UTC
(rev 13336)
+++ trunk/reactos/drivers/net/afd/afd/main.c 2005-01-27 14:11:19 UTC
(rev 13337)
@@ -19,8 +19,6 @@
#ifdef DBG
-extern NTSTATUS DDKAPI MmCopyFromCaller( PVOID Dst, PVOID Src, UINT
Size );
-
/* See debug.h for debug/trace constants */
//DWORD DebugTraceLevel = DEBUG_ULTRA;
DWORD DebugTraceLevel = 0;
_____
Modified: trunk/reactos/include/ntos/zw.h
--- trunk/reactos/include/ntos/zw.h 2005-01-27 08:16:42 UTC (rev
13336)
+++ trunk/reactos/include/ntos/zw.h 2005-01-27 14:11:19 UTC (rev
13337)
@@ -3014,8 +3014,8 @@
/*
* FUNCTION: Queries the system ( high-resolution ) performance
counter.
* ARGUMENTS:
- * Counter = Performance counter
- * Frequency = Performance frequency
+ * PerformanceCounter = Performance counter
+ * PerformanceFrequency = Performance frequency
* REMARKS:
This procedure queries a tick count faster than 10ms ( The
resolution for Intel«-based CPUs is about 0.8 microseconds.)
This procedure maps to the win32 QueryPerformanceCounter,
QueryPerformanceFrequency
@@ -3025,15 +3025,15 @@
NTSTATUS
STDCALL
NtQueryPerformanceCounter(
- IN PLARGE_INTEGER Counter,
- IN PLARGE_INTEGER Frequency
+ OUT PLARGE_INTEGER PerformanceCounter,
+ OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
NTSTATUS
STDCALL
ZwQueryPerformanceCounter(
- IN PLARGE_INTEGER Counter,
- IN PLARGE_INTEGER Frequency
+ OUT PLARGE_INTEGER PerformanceCounter,
+ OUT PLARGE_INTEGER PerformanceFrequency OPTIONAL
);
/*
@@ -5240,8 +5240,8 @@
NTSTATUS
STDCALL
NtDelayExecution(
- IN ULONG Alertable,
- IN LARGE_INTEGER *Interval
+ IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER DelayInterval
);
/*
@@ -6439,7 +6439,7 @@
STDCALL
ZwDelayExecution(
IN BOOLEAN Alertable,
- IN TIME *Interval
+ IN PLARGE_INTEGER DelayInterval
);
/*
_____
Modified: trunk/reactos/lib/kernel32/process/proc.c
--- trunk/reactos/lib/kernel32/process/proc.c 2005-01-27 08:16:42 UTC
(rev 13336)
+++ trunk/reactos/lib/kernel32/process/proc.c 2005-01-27 14:11:19 UTC
(rev 13337)
@@ -442,51 +442,6 @@
* @implemented
*/
VOID STDCALL
-Sleep(DWORD dwMilliseconds)
-{
- SleepEx(dwMilliseconds, FALSE);
- return;
-}
-
-
-/*
- * @implemented
- */
-DWORD STDCALL
-SleepEx(DWORD dwMilliseconds,
- BOOL bAlertable)
-{
- LARGE_INTEGER Interval;
- NTSTATUS errCode;
-
- if (dwMilliseconds != INFINITE)
- {
- /*
- * System time units are 100 nanoseconds (a nanosecond is a
billionth of
- * a second).
- */
- Interval.QuadPart = -((ULONGLONG)dwMilliseconds * 10000);
- }
- else
- {
- /* Approximately 292000 years hence */
- Interval.QuadPart = -0x7FFFFFFFFFFFFFFFLL;
- }
-
- errCode = NtDelayExecution (bAlertable, &Interval);
- if (!NT_SUCCESS(errCode))
- {
- SetLastErrorByStatus (errCode);
- return -1;
- }
- return 0;
-}
-
-
-/*
- * @implemented
- */
-VOID STDCALL
GetStartupInfoW(LPSTARTUPINFOW lpStartupInfo)
{
PRTL_USER_PROCESS_PARAMETERS Params;
_____
Modified: trunk/reactos/lib/kernel32/thread/thread.c
--- trunk/reactos/lib/kernel32/thread/thread.c 2005-01-27 08:16:42 UTC
(rev 13336)
+++ trunk/reactos/lib/kernel32/thread/thread.c 2005-01-27 14:11:19 UTC
(rev 13337)
@@ -852,4 +852,49 @@
return FALSE;
}
+
+/*
+ * @implemented
+ */
+VOID STDCALL
+Sleep(DWORD dwMilliseconds)
+{
+ SleepEx(dwMilliseconds, FALSE);
+ return;
+}
+
+
+/*
+ * @implemented
+ */
+DWORD STDCALL
+SleepEx(DWORD dwMilliseconds,
+ BOOL bAlertable)
+{
+ LARGE_INTEGER Interval;
+ NTSTATUS errCode;
+
+ if (dwMilliseconds != INFINITE)
+ {
+ /*
+ * System time units are 100 nanoseconds (a nanosecond is a
billionth of
+ * a second).
+ */
+ Interval.QuadPart = -((ULONGLONG)dwMilliseconds * 10000);
+ }
+ else
+ {
+ /* Approximately 292000 years hence */
+ Interval.QuadPart = -0x7FFFFFFFFFFFFFFFLL;
+ }
+
+ errCode = NtDelayExecution ((bAlertable ? TRUE : FALSE), &Interval);
+ if (!NT_SUCCESS(errCode))
+ {
+ SetLastErrorByStatus (errCode);
+ return -1;
+ }
+ return 0;
+}
+
/* EOF */
_____
Modified: trunk/reactos/ntoskrnl/ke/timer.c
--- trunk/reactos/ntoskrnl/ke/timer.c 2005-01-27 08:16:42 UTC (rev
13336)
+++ trunk/reactos/ntoskrnl/ke/timer.c 2005-01-27 14:11:19 UTC (rev
13337)
@@ -71,8 +71,6 @@
/* must raise IRQL to PROFILE_LEVEL and grab spin lock there, to sync
with ISR */
-extern HANDLE PsIdleThreadHandle;
-
#define MICROSECONDS_PER_TICK (10000)
#define TICKS_TO_CALIBRATE (1)
#define CALIBRATE_PERIOD (MICROSECONDS_PER_TICK * TICKS_TO_CALIBRATE)
@@ -104,58 +102,100 @@
NTSTATUS STDCALL
-NtQueryPerformanceCounter(IN PLARGE_INTEGER Counter,
- IN PLARGE_INTEGER Frequency)
+NtQueryPerformanceCounter(OUT PLARGE_INTEGER PerformanceCounter,
+ OUT PLARGE_INTEGER PerformanceFrequency
OPTIONAL)
{
LARGE_INTEGER PerfCounter;
LARGE_INTEGER PerfFrequency;
- NTSTATUS Status;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousMode != KernelMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(PerformanceCounter,
+ sizeof(LARGE_INTEGER),
+ sizeof(ULONG));
+ if(PerformanceFrequency != NULL)
+ {
+ ProbeForWrite(PerformanceFrequency,
+ sizeof(LARGE_INTEGER),
+ sizeof(ULONG));
+ }
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+
+ if(!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ }
PerfCounter = KeQueryPerformanceCounter(&PerfFrequency);
-
- if (Counter != NULL)
+
+ _SEH_TRY
+ {
+ *PerformanceCounter = PerfCounter;
+ if(PerformanceFrequency != NULL)
{
- Status = MmCopyToCaller(&Counter->QuadPart,
&PerfCounter.QuadPart, sizeof(PerfCounter.QuadPart));
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
+ *PerformanceFrequency = PerfFrequency;
}
-
- if (Frequency != NULL)
+ }
+ _SEH_HANDLE
{
- Status = MmCopyToCaller(&Frequency->QuadPart,
&PerfFrequency.QuadPart, sizeof(PerfFrequency.QuadPart));
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
+ Status = _SEH_GetExceptionCode();
}
+ _SEH_END;
- return(STATUS_SUCCESS);
+ return Status;
}
NTSTATUS STDCALL
-NtDelayExecution(IN ULONG Alertable,
- IN LARGE_INTEGER* Interval)
+NtDelayExecution(IN BOOLEAN Alertable,
+ IN PLARGE_INTEGER DelayInterval)
{
- NTSTATUS Status;
- LARGE_INTEGER Timeout;
-
- Status = MmCopyFromCaller(&Timeout, Interval, sizeof(Timeout));
- if (!NT_SUCCESS(Status))
+ KPROCESSOR_MODE PreviousMode;
+ LARGE_INTEGER SafeInterval;
+
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousMode != KernelMode)
+ {
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ _SEH_TRY
{
- return(Status);
+ ProbeForRead(DelayInterval,
+ sizeof(LARGE_INTEGER),
+ sizeof(ULONG));
+ /* make a copy on the kernel stack and let DelayInterval point
to it so
+ we don't need to wrap KeDelayExecutionThread in SEH! */
+ SafeInterval = *DelayInterval;
+ DelayInterval = &SafeInterval;
}
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+
+ if(!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ }
- Timeout = *((PLARGE_INTEGER)Interval);
- DPRINT("NtDelayExecution(Alertable %d, Internal %x) IntervalP %x\n",
- Alertable, Internal, Timeout);
-
- DPRINT("Execution delay is %d/%d\n",
- Timeout.u.HighPart, Timeout.u.LowPart);
- Status = KeDelayExecutionThread(UserMode, (BOOLEAN)Alertable,
&Timeout);
- return(Status);
+ return KeDelayExecutionThread(PreviousMode,
+ Alertable,
+ DelayInterval);
}