+ /* Check for user mode access */
+ if (PreviousMode != KernelMode)
+ {
+ _SEH2_TRY
+ {
+ /* Probe and capture the LpcRequest */
+ ProbeForRead(LpcRequest, sizeof(*LpcRequest), sizeof(ULONG));
+ CapturedLpcRequest = *(volatile PORT_MESSAGE*)LpcRequest;
+
+ /* Probe the reply message for write */
+ ProbeForWrite(LpcReply, sizeof(*LpcReply), sizeof(ULONG));
+
+ /* Make sure the data entries in the request message are valid */
+ Status = LpcpVerifyMessageDataInfo(LpcRequest, &NumberOfDataEntries);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("LpcpVerifyMessageDataInfo failed\n");
+ _SEH2_YIELD(return Status);
+ }
+ }
+ _SEH2_EXCEPT(EXCEPTION_EXECUTE_HANDLER)
+ {
+ DPRINT1("Got exception\n");
+ _SEH2_YIELD(return _SEH2_GetExceptionCode());
+ }
+ _SEH2_END;
+ }
+ else
+ {
+ CapturedLpcRequest = *LpcRequest;
+ Status = LpcpVerifyMessageDataInfo(LpcRequest, &NumberOfDataEntries);
+ if (!NT_SUCCESS(Status))
+ {
+ DPRINT1("LpcpVerifyMessageDataInfo failed\n");
+ return Status;
+ }
+ }
+
+ /* This flag is undocumented. Remove it before continuing */
+ CapturedLpcRequest.u2.s2.Type &= ~0x4000;
+