Fix remaning ROS bugs. A minor hack has been added to ObCreateObject
because it seems that gcc doesn't dword-align the stacks?!! Thanks to
w3seek for some of the ex patches.
Modified: trunk/reactos/baseaddress.cfg
Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c
Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c
Modified: trunk/reactos/lib/kernel32/file/file.c
Modified: trunk/reactos/ntoskrnl/ex/event.c
Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
Modified: trunk/reactos/ntoskrnl/ex/mutant.c
Modified: trunk/reactos/ntoskrnl/io/file.c
Modified: trunk/reactos/ntoskrnl/ob/object.c
Modified: trunk/reactos/services/eventlog/eventlog.c
_____
Modified: trunk/reactos/baseaddress.cfg
--- trunk/reactos/baseaddress.cfg 2005-01-22 02:38:07 UTC (rev
13205)
+++ trunk/reactos/baseaddress.cfg 2005-01-22 03:54:23 UTC (rev
13206)
@@ -88,9 +88,9 @@
TARGET_BASE_LIB_ADVAPI32 =0x77dc0000
TARGET_BASE_LIB_USER32 =0x77e60000
TARGET_BASE_LIB_GDI32 =0x77ed0000
-TARGET_BASE_LIB_DNSAPI =0x78000000
+TARGET_BASE_LIB_DNSAPI =0x77f00000
TARGET_BASE_LIB_MSVCRT =0x78000000
-TARGET_BASE_LIB_MSVCRT20 =0x78000000
+TARGET_BASE_LIB_MSVCRT20 =0x78500000
TARGET_BASE_LIB_EXPAT =0x79000000
TARGET_BASE_LIB_KERNEL32 =0x7C800000
TARGET_BASE_LIB_NTDLL =0x7C900000
_____
Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c
--- trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c
2005-01-22 02:38:07 UTC (rev 13205)
+++ trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_domain.c
2005-01-22 03:54:23 UTC (rev 13206)
@@ -64,7 +64,7 @@
register struct domain *dp, **dpp;
register struct protosw *pr;
- printf("domaininit starting\n");
+ //printf("domaininit starting\n");
/*
* NB - local domain is always present.
@@ -73,7 +73,7 @@
ADDDOMAIN(inet);
for (dpp = (struct domain **)domain_set.ls_items; *dpp; dpp++) {
- printf("(1) Domain %s counting\n", (**dpp).dom_name);
+ //printf("(1) Domain %s counting\n", (**dpp).dom_name);
(**dpp).dom_next = domains;
domains = *dpp;
}
@@ -84,11 +84,11 @@
#endif
*/
for (dp = domains; dp; dp = dp->dom_next) {
- printf("(1) Domain %s initializing\n", dp->dom_name);
+ //printf("(1) Domain %s initializing\n", dp->dom_name);
if (dp->dom_init)
(*dp->dom_init)();
for (pr = dp->dom_protosw; pr < dp->dom_protoswNPROTOSW;
pr++) {
- printf("Registering protocols for %s\n", dp->dom_name);
+ //printf("Registering protocols for %s\n",
dp->dom_name);
if (pr->pr_init)
(*pr->pr_init)();
}
@@ -103,7 +103,7 @@
timeout(pffasttimo, (void *)0, 1);
timeout(pfslowtimo, (void *)0, 1);
- printf("Domaininit done\n");
+ //printf("Domaininit done\n");
}
struct protosw *
_____
Modified: trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c
--- trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c
2005-01-22 02:38:07 UTC (rev 13205)
+++ trunk/reactos/drivers/lib/oskittcp/oskittcp/uipc_mbuf.c
2005-01-22 03:54:23 UTC (rev 13206)
@@ -79,11 +79,11 @@
#else
#define NCL_INIT 1
#endif
- printf("Here1\n");
+ //printf("Here1\n");
s = splimp();
if (m_clalloc(NCL_INIT, M_DONTWAIT) == 0)
goto bad;
- printf("Here2\n");
+ //printf("Here2\n");
splx(s);
return;
bad:
@@ -116,12 +116,12 @@
npg = ncl * CLSIZE;
- printf("kmem_malloc(%d)\n", npg);
+ //printf("kmem_malloc(%d)\n", npg);
p = (caddr_t)kmem_malloc(mb_map, ctob(npg),
nowait ? M_NOWAIT : M_WAITOK);
- printf("kmem_malloc done\n");
+ //printf("kmem_malloc done\n");
/*
* Either the map is now full, or this is nowait and there
@@ -133,13 +133,13 @@
ncl = ncl * CLBYTES / MCLBYTES;
for (i = 0; i < ncl; i++) {
((union mcluster *)p)->mcl_next = mclfree;
- printf( "Freeing %x onto the free list\n", p);
+ //printf( "Freeing %x onto the free list\n", p);
mclfree = (union mcluster *)p;
p += MCLBYTES;
mbstat.m_clfree++;
}
mbstat.m_clusters += ncl;
- printf( "done with m_clalloc\n");
+ //printf( "done with m_clalloc\n");
return (1);
}
#endif /* !OSKIT */
_____
Modified: trunk/reactos/lib/kernel32/file/file.c
--- trunk/reactos/lib/kernel32/file/file.c 2005-01-22 02:38:07 UTC
(rev 13205)
+++ trunk/reactos/lib/kernel32/file/file.c 2005-01-22 03:54:23 UTC
(rev 13206)
@@ -694,7 +694,7 @@
NTSTATUS Status;
WIN32_FILE_ATTRIBUTE_DATA* FileAttributeData;
- DPRINT ("GetFileAttributesExW(%S) called\n", lpFileName);
+ DPRINT("GetFileAttributesExW(%S) called\n", lpFileName);
if (fInfoLevelId != GetFileExInfoStandard || lpFileInformation ==
NULL)
@@ -709,7 +709,7 @@
NULL,
NULL))
{
- DPRINT ("Invalid path\n");
+ DPRINT1 ("Invalid path\n");
SetLastError (ERROR_BAD_PATHNAME);
return FALSE;
}
@@ -731,7 +731,7 @@
RtlFreeUnicodeString (&FileName);
if (!NT_SUCCESS (Status))
{
- DPRINT ("NtOpenFile() failed (Status %lx)\n", Status);
+ DPRINT1 ("NtOpenFile() failed %x (Status %lx)\n",
&ObjectAttributes, Status);
SetLastErrorByStatus (Status);
return FALSE;
}
@@ -746,7 +746,7 @@
if (!NT_SUCCESS (Status))
{
- DPRINT ("NtQueryInformationFile() failed (Status %lx)\n",
Status);
+ DPRINT1 ("NtQueryInformationFile() failed (Status %lx)\n",
Status);
SetLastErrorByStatus (Status);
return FALSE;
}
_____
Modified: trunk/reactos/ntoskrnl/ex/event.c
--- trunk/reactos/ntoskrnl/ex/event.c 2005-01-22 02:38:07 UTC (rev
13205)
+++ trunk/reactos/ntoskrnl/ex/event.c 2005-01-22 03:54:23 UTC (rev
13206)
@@ -41,6 +41,10 @@
STANDARD_RIGHTS_EXECUTE | SYNCHRONIZE | EVENT_QUERY_STATE,
EVENT_ALL_ACCESS};
+static const INFORMATION_CLASS_INFO ExEventInfoClass[] =
+{
+ ICI_SQ_SAME( sizeof(EVENT_BASIC_INFORMATION), sizeof(ULONG),
ICIF_QUERY ), /* EventBasicInformation */
+};
/* FUNCTIONS
*****************************************************************/
@@ -92,6 +96,9 @@
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
NtClearEvent(IN HANDLE EventHandle)
{
@@ -101,16 +108,16 @@
Status = ObReferenceObjectByHandle(EventHandle,
EVENT_MODIFY_STATE,
ExEventObjectType,
- UserMode,
+ ExGetPreviousMode(),
(PVOID*)&Event,
NULL);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
- KeClearEvent(Event);
- ObDereferenceObject(Event);
- return(STATUS_SUCCESS);
+ if(NT_SUCCESS(Status))
+ {
+ KeClearEvent(Event);
+ ObDereferenceObject(Event);
+ }
+
+ return Status;
}
@@ -188,68 +195,119 @@
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
NtOpenEvent(OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
- NTSTATUS Status;
HANDLE hEvent;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("NtOpenEvent(0x%x, 0x%x, 0x%x)\n", EventHandle,
DesiredAccess, ObjectAttributes);
- DPRINT("ObjectName '%wZ'\n", ObjectAttributes->ObjectName);
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(EventHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+
+ if(!NT_SUCCESS(Status))
+ {
+ return Status;
+ }
+ }
Status = ObOpenObjectByName(ObjectAttributes,
ExEventObjectType,
NULL,
- UserMode,
+ PreviousMode,
DesiredAccess,
NULL,
&hEvent);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
-
- Status = MmCopyToCaller(EventHandle, &hEvent, sizeof(HANDLE));
- if (!NT_SUCCESS(Status))
+ if(NT_SUCCESS(Status))
+ {
+ _SEH_TRY
{
- ZwClose(EventHandle);
- return(Status);
+ *EventHandle = hEvent;
}
-
- return(Status);
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
+ return Status;
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
NtPulseEvent(IN HANDLE EventHandle,
OUT PLONG PreviousState OPTIONAL)
{
PKEVENT Event;
- NTSTATUS Status;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
- DPRINT("NtPulseEvent(EventHandle %x PreviousState %x)\n",
+ DPRINT("NtPulseEvent(EventHandle 0%x PreviousState 0%x)\n",
EventHandle, PreviousState);
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousState != NULL && PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
Status = ObReferenceObjectByHandle(EventHandle,
EVENT_MODIFY_STATE,
ExEventObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&Event,
NULL);
- if (!NT_SUCCESS(Status))
- {
- return(Status);
- }
+ if(NT_SUCCESS(Status))
+ {
+ KePulseEvent(Event, EVENT_INCREMENT, FALSE);
+ ObDereferenceObject(Event);
+
+ /* FIXME - Return the previous state! */
+ }
- KePulseEvent(Event, EVENT_INCREMENT, FALSE);
-
- ObDereferenceObject(Event);
- return(STATUS_SUCCESS);
+ return Status;
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
NtQueryEvent(IN HANDLE EventHandle,
IN EVENT_INFORMATION_CLASS EventInformationClass,
@@ -257,78 +315,129 @@
IN ULONG EventInformationLength,
OUT PULONG ReturnLength OPTIONAL)
{
- EVENT_BASIC_INFORMATION Info;
PKEVENT Event;
- NTSTATUS Status;
- ULONG RetLen;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
- if (EventInformationClass > EventBasicInformation)
- return STATUS_INVALID_INFO_CLASS;
+ PreviousMode = ExGetPreviousMode();
+
+ DefaultQueryInfoBufferCheck(EventInformationClass,
+ ExEventInfoClass,
+ EventInformation,
+ EventInformationLength,
+ ReturnLength,
+ PreviousMode,
+ &Status);
+ if(!NT_SUCCESS(Status))
+ {
+ DPRINT1("NtQueryEvent() failed, Status: 0x%x\n", Status);
+ return Status;
+ }
- if (EventInformationLength < sizeof(EVENT_BASIC_INFORMATION))
- return STATUS_INFO_LENGTH_MISMATCH;
-
Status = ObReferenceObjectByHandle(EventHandle,
EVENT_QUERY_STATE,
ExEventObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&Event,
NULL);
- if (!NT_SUCCESS(Status))
- return Status;
-
- if (Event->Header.Type == InternalNotificationEvent)
- Info.EventType = NotificationEvent;
- else
- Info.EventType = SynchronizationEvent;
- Info.EventState = KeReadStateEvent(Event);
-
- Status = MmCopyToCaller(EventInformation, &Event,
- sizeof(EVENT_BASIC_INFORMATION));
- if (!NT_SUCCESS(Status))
+ if(NT_SUCCESS(Status))
+ {
+ switch(EventInformationClass)
{
- ObDereferenceObject(Event);
- return(Status);
- }
+ case EventBasicInformation:
+ {
+ PEVENT_BASIC_INFORMATION BasicInfo =
(PEVENT_BASIC_INFORMATION)EventInformation;
+
+ _SEH_TRY
+ {
+ if (Event->Header.Type == InternalNotificationEvent)
+ BasicInfo->EventType = NotificationEvent;
+ else
+ BasicInfo->EventType = SynchronizationEvent;
+ BasicInfo->EventState = KeReadStateEvent(Event);
- if (ReturnLength != NULL)
- {
- RetLen = sizeof(EVENT_BASIC_INFORMATION);
- Status = MmCopyToCaller(ReturnLength, &RetLen, sizeof(ULONG));
- if (!NT_SUCCESS(Status))
+ if(ReturnLength != NULL)
+ {
+ *ReturnLength = sizeof(EVENT_BASIC_INFORMATION);
+ }
+ }
+ _SEH_HANDLE
{
- ObDereferenceObject(Event);
- return(Status);
+ Status = _SEH_GetExceptionCode();
}
+ _SEH_END;
+ break;
+ }
+
+ default:
+ Status = STATUS_NOT_IMPLEMENTED;
+ break;
}
- ObDereferenceObject(Event);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(Event);
+ }
+
+ return Status;
}
+/*
+ * @implemented
+ */
NTSTATUS STDCALL
NtResetEvent(IN HANDLE EventHandle,
OUT PLONG PreviousState OPTIONAL)
{
PKEVENT Event;
- NTSTATUS Status;
-
- DPRINT("NtResetEvent(EventHandle %x)\n", EventHandle);
-
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("NtResetEvent(EventHandle 0%x PreviousState 0%x)\n",
+ EventHandle, PreviousState);
+
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousState != NULL && PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
Status = ObReferenceObjectByHandle(EventHandle,
EVENT_MODIFY_STATE,
ExEventObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&Event,
NULL);
- if (!NT_SUCCESS(Status))
+ if(NT_SUCCESS(Status))
+ {
+ LONG Prev = KeResetEvent(Event);
+ ObDereferenceObject(Event);
+
+ if(PreviousState != NULL)
{
- return(Status);
+ _SEH_TRY
+ {
+ *PreviousState = Prev;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
}
- KeResetEvent(Event);
- ObDereferenceObject(Event);
- return(STATUS_SUCCESS);
+ }
+
+ return Status;
}
@@ -340,25 +449,58 @@
OUT PLONG PreviousState OPTIONAL)
{
PKEVENT Event;
- NTSTATUS Status;
-
- DPRINT("NtSetEvent(EventHandle %x)\n", EventHandle);
-
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ DPRINT("NtSetEvent(EventHandle 0%x PreviousState 0%x)\n",
+ EventHandle, PreviousState);
+
+ PreviousMode = ExGetPreviousMode();
+
+ if(PreviousState != NULL && PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(PreviousState,
+ sizeof(LONG),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
Status = ObReferenceObjectByHandle(EventHandle,
EVENT_MODIFY_STATE,
ExEventObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&Event,
NULL);
- if (!NT_SUCCESS(Status))
+ if(NT_SUCCESS(Status))
+ {
+ LONG Prev = KeSetEvent(Event, EVENT_INCREMENT, FALSE);
+ ObDereferenceObject(Event);
+
+ if(PreviousState != NULL)
{
- return(Status);
+ _SEH_TRY
+ {
+ *PreviousState = Prev;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
}
- KeSetEvent(Event,EVENT_INCREMENT,FALSE);
- ObDereferenceObject(Event);
- return(STATUS_SUCCESS);
+ }
+
+ return Status;
}
+
/*
* @unimplemented
*/
_____
Modified: trunk/reactos/ntoskrnl/ex/evtpair.c
--- trunk/reactos/ntoskrnl/ex/evtpair.c 2005-01-22 02:38:07 UTC (rev
13205)
+++ trunk/reactos/ntoskrnl/ex/evtpair.c 2005-01-22 03:54:23 UTC (rev
13206)
@@ -95,39 +95,66 @@
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
PKEVENT_PAIR EventPair;
- NTSTATUS Status;
+ HANDLE hEventPair;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
+
+ PreviousMode = ExGetPreviousMode();
- DPRINT("NtCreateEventPair()\n");
+ if(PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(EventPairHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
Status = ObCreateObject(ExGetPreviousMode(),
ExEventPairObjectType,
ObjectAttributes,
- ExGetPreviousMode(),
+ PreviousMode,
NULL,
sizeof(KEVENT_PAIR),
0,
0,
(PVOID*)&EventPair);
- if (!NT_SUCCESS(Status))
+ if(NT_SUCCESS(Status))
+ {
+ KeInitializeEvent(&EventPair->LowEvent,
+ SynchronizationEvent,
+ FALSE);
+ KeInitializeEvent(&EventPair->HighEvent,
+ SynchronizationEvent,
+ FALSE);
+
+ Status = ObInsertObject ((PVOID)EventPair,
+ NULL,
+ DesiredAccess,
+ 0,
+ NULL,
+ &hEventPair);
+ ObDereferenceObject(EventPair);
+
+ if(NT_SUCCESS(Status))
{
- return(Status);
+ _SEH_TRY
+ {
+ *EventPairHandle = hEventPair;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
}
-
- KeInitializeEvent(&EventPair->LowEvent,
- SynchronizationEvent,
- FALSE);
- KeInitializeEvent(&EventPair->HighEvent,
- SynchronizationEvent,
- FALSE);
-
- Status = ObInsertObject ((PVOID)EventPair,
- NULL,
- DesiredAccess,
- 0,
- NULL,
- EventPairHandle);
-
- ObDereferenceObject(EventPair);
-
+ }
return Status;
}
@@ -137,18 +164,47 @@
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes)
{
- NTSTATUS Status;
+ HANDLE hEventPair;
+ KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status = STATUS_SUCCESS;
- DPRINT("NtOpenEventPair()\n");
+ PreviousMode = ExGetPreviousMode();
+ if(PreviousMode == UserMode)
+ {
+ _SEH_TRY
+ {
+ ProbeForWrite(EventPairHandle,
+ sizeof(HANDLE),
+ sizeof(ULONG));
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
Status = ObOpenObjectByName(ObjectAttributes,
ExEventPairObjectType,
NULL,
- UserMode,
+ PreviousMode,
DesiredAccess,
NULL,
- EventPairHandle);
-
+ &hEventPair);
+ if(NT_SUCCESS(Status))
+ {
+ _SEH_TRY
+ {
+ *EventPairHandle = hEventPair;
+ }
+ _SEH_HANDLE
+ {
+ Status = _SEH_GetExceptionCode();
+ }
+ _SEH_END;
+ }
+
return Status;
}
@@ -157,26 +213,30 @@
NtSetHighEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtSetHighEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeSetEvent(&EventPair->HighEvent,
+ EVENT_INCREMENT,
+ FALSE);
- KeSetEvent(&EventPair->HighEvent,
- EVENT_INCREMENT,
- FALSE);
-
- ObDereferenceObject(EventPair);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(EventPair);
+ }
+
+ return Status;
}
@@ -184,32 +244,36 @@
NtSetHighWaitLowEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtSetHighWaitLowEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeSetEvent(&EventPair->HighEvent,
+ EVENT_INCREMENT,
+ TRUE);
- KeSetEvent(&EventPair->HighEvent,
- EVENT_INCREMENT,
- TRUE);
+ KeWaitForSingleObject(&EventPair->LowEvent,
+ WrEventPair,
+ PreviousMode,
+ FALSE,
+ NULL);
- KeWaitForSingleObject(&EventPair->LowEvent,
- WrEventPair,
- UserMode,
- FALSE,
- NULL);
-
- ObDereferenceObject(EventPair);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(EventPair);
+ }
+
+ return Status;
}
@@ -217,26 +281,30 @@
NtSetLowEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtSetLowEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeSetEvent(&EventPair->LowEvent,
+ EVENT_INCREMENT,
+ FALSE);
- KeSetEvent(&EventPair->LowEvent,
- EVENT_INCREMENT,
- FALSE);
-
- ObDereferenceObject(EventPair);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(EventPair);
+ }
+
+ return Status;
}
@@ -244,32 +312,36 @@
NtSetLowWaitHighEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtSetLowWaitHighEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeSetEvent(&EventPair->LowEvent,
+ EVENT_INCREMENT,
+ TRUE);
- KeSetEvent(&EventPair->LowEvent,
- EVENT_INCREMENT,
- TRUE);
+ KeWaitForSingleObject(&EventPair->HighEvent,
+ WrEventPair,
+ PreviousMode,
+ FALSE,
+ NULL);
- KeWaitForSingleObject(&EventPair->HighEvent,
- WrEventPair,
- UserMode,
- FALSE,
- NULL);
-
- ObDereferenceObject(EventPair);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(EventPair);
+ }
+
+ return Status;
}
@@ -277,28 +349,32 @@
NtWaitLowEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtWaitLowEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeWaitForSingleObject(&EventPair->LowEvent,
+ WrEventPair,
+ PreviousMode,
+ FALSE,
+ NULL);
- KeWaitForSingleObject(&EventPair->LowEvent,
- WrEventPair,
- UserMode,
- FALSE,
- NULL);
-
- ObDereferenceObject(EventPair);
- return(STATUS_SUCCESS);
+ ObDereferenceObject(EventPair);
+ }
+
+ return Status;
}
@@ -306,28 +382,32 @@
NtWaitHighEventPair(IN HANDLE EventPairHandle)
{
PKEVENT_PAIR EventPair;
+ KPROCESSOR_MODE PreviousMode;
NTSTATUS Status;
DPRINT("NtWaitHighEventPair(EventPairHandle %x)\n",
EventPairHandle);
+ PreviousMode = ExGetPreviousMode();
+
Status = ObReferenceObjectByHandle(EventPairHandle,
- EVENT_PAIR_ALL_ACCESS,
+ SYNCHRONIZE,
ExEventPairObjectType,
- UserMode,
+ PreviousMode,
(PVOID*)&EventPair,
NULL);
- if (!NT_SUCCESS(Status))
- return(Status);
+ if(NT_SUCCESS(Status))
+ {
+ KeWaitForSingleObject(&EventPair->HighEvent,
+ WrEventPair,
+ PreviousMode,
+ FALSE,
+ NULL);
- KeWaitForSingleObject(&EventPair->HighEvent,
- WrEventPair,
- UserMode,
- FALSE,
- NULL);
+ ObDereferenceObject(EventPair);
[truncated at 1000 lines; 494 more skipped]