NULL,
&LpcPortObjectType);
+ /* Create the Waitable Port Object Type */
RtlInitUnicodeString(&Name, L"WaitablePort");
ObjectTypeInitializer.PoolType = NonPagedPool;
ObjectTypeInitializer.DefaultNonPagedPoolCharge += sizeof(LPCP_PORT_OBJECT);
NtImpersonateClientOfPort(IN HANDLE PortHandle,
IN PPORT_MESSAGE ClientMessage)
{
- KPROCESSOR_MODE PreviousMode;
+ NTSTATUS Status;
+ KPROCESSOR_MODE PreviousMode = KeGetPreviousMode();
CLIENT_ID ClientId;
ULONG MessageId;
PLPCP_PORT_OBJECT Port = NULL, ConnectedPort = NULL;
PETHREAD ClientThread = NULL;
SECURITY_CLIENT_CONTEXT ClientContext;
- NTSTATUS Status;
+
PAGED_CODE();
- /* Check the previous mode */
- PreviousMode = ExGetPreviousMode();
- if (PreviousMode == KernelMode)
- {
- ClientId = ClientMessage->ClientId;
- MessageId = ClientMessage->MessageId;
- }
- else
+ /* Check if the call comes from user mode */
+ if (PreviousMode != KernelMode)
{
_SEH2_TRY
{
ProbeForRead(ClientMessage, sizeof(*ClientMessage), sizeof(PVOID));
- ClientId = ClientMessage->ClientId;
- MessageId = ClientMessage->MessageId;
+ ClientId = ((volatile PORT_MESSAGE*)ClientMessage)->ClientId;
+ MessageId = ((volatile PORT_MESSAGE*)ClientMessage)->MessageId;
}
_SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
{
- DPRINT1("Got exception!\n");
- return _SEH2_GetExceptionCode();
+ _SEH2_YIELD(return _SEH2_GetExceptionCode());
}
_SEH2_END;
}
+ else
+ {
+ ClientId = ClientMessage->ClientId;
+ MessageId = ClientMessage->MessageId;
+ }
/* Reference the port handle */
Status = ObReferenceObjectByHandle(PortHandle,
/* Get the connected port and try to reference it */
ConnectedPort = Port->ConnectedPort;
- if ((ConnectedPort == NULL) ||
- !ObReferenceObjectSafe(ConnectedPort))
+ if ((ConnectedPort == NULL) || !ObReferenceObjectSafe(ConnectedPort))
{
DPRINT1("Failed to reference the connected port\n");
ConnectedPort = NULL;
/* Get rid of the security context */
SeDeleteClientSecurity(&ClientContext);
- goto Cleanup;
-
-CleanupWithLock:
-
- /* Release the lock */
- KeReleaseGuardedMutex(&LpcpLock);
-
Cleanup:
if (ConnectedPort != NULL)
ObDereferenceObject(Port);
return Status;
+
+CleanupWithLock:
+
+ /* Release the lock */
+ KeReleaseGuardedMutex(&LpcpLock);
+ goto Cleanup;
}
NTSTATUS