[STORPORT] Fix x64 build
[reactos.git] / ntoskrnl / lpc / port.c
index c2669c3..7ca93a1 100644 (file)
@@ -60,6 +60,7 @@ LpcInitSystem(VOID)
                        NULL,
                        &LpcPortObjectType);
 
+    /* Create the Waitable Port Object Type */
     RtlInitUnicodeString(&Name, L"WaitablePort");
     ObjectTypeInitializer.PoolType = NonPagedPool;
     ObjectTypeInitializer.DefaultNonPagedPoolCharge += sizeof(LPCP_PORT_OBJECT);
@@ -125,37 +126,36 @@ NTAPI
 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,
@@ -192,8 +192,7 @@ NtImpersonateClientOfPort(IN HANDLE 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;
@@ -254,13 +253,6 @@ NtImpersonateClientOfPort(IN HANDLE PortHandle,
     /* Get rid of the security context */
     SeDeleteClientSecurity(&ClientContext);
 
-    goto Cleanup;
-
-CleanupWithLock:
-
-    /* Release the lock */
-    KeReleaseGuardedMutex(&LpcpLock);
-
 Cleanup:
 
     if (ConnectedPort != NULL)
@@ -272,6 +264,12 @@ Cleanup:
     ObDereferenceObject(Port);
 
     return Status;
+
+CleanupWithLock:
+
+    /* Release the lock */
+    KeReleaseGuardedMutex(&LpcpLock);
+    goto Cleanup;
 }
 
 NTSTATUS