Implemented GetLastInputInfo.

diff --git a/dlls/user/input.c b/dlls/user/input.c
index da4efb7..ff6401e 100644
--- a/dlls/user/input.c
+++ b/dlls/user/input.c
@@ -264,6 +264,32 @@
 }
 
 
+/******************************************************************
+ *              GetLastInputInfo (USER32.@)
+ */
+BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii)
+{
+    BOOL ret;
+
+    TRACE("%p\n", plii);
+
+    if (plii->cbSize != sizeof (*plii) )
+    {
+        SetLastError(ERROR_INVALID_PARAMETER);
+        return FALSE;
+    }
+
+    SERVER_START_REQ( get_last_input_time )
+    {
+        ret = !wine_server_call_err( req );
+        if (ret)
+            plii->dwTime = reply->time;
+    }
+    SERVER_END_REQ;
+    return ret;
+}
+
+
 /**********************************************************************
  *		AttachThreadInput (USER32.@)
  *
diff --git a/dlls/user/message.c b/dlls/user/message.c
index 1c69523..86103dd 100644
--- a/dlls/user/message.c
+++ b/dlls/user/message.c
@@ -3441,12 +3441,3 @@
     DWORD dwResult; 
     return !SendMessageTimeoutA(hWnd, WM_NULL, 0, 0, SMTO_ABORTIFHUNG, 5000, &dwResult);	
 }
-
-/******************************************************************
- *		GetLastInputInfo (USER32.@)
- */
-BOOL WINAPI GetLastInputInfo(PLASTINPUTINFO plii)
-{
-    FIXME("%p\n", plii);
-    return FALSE;
-}
diff --git a/include/wine/server_protocol.h b/include/wine/server_protocol.h
index fd3f640..93eb749 100644
--- a/include/wine/server_protocol.h
+++ b/include/wine/server_protocol.h
@@ -2862,6 +2862,19 @@
 };
 
 
+
+struct get_last_input_time_request
+{
+    struct request_header __header;
+};
+struct get_last_input_time_reply
+{
+    struct reply_header __header;
+    unsigned int time;
+};
+
+
+
 struct get_key_state_request
 {
     struct request_header __header;
@@ -3485,6 +3498,7 @@
     REQ_get_window_properties,
     REQ_attach_thread_input,
     REQ_get_thread_input,
+    REQ_get_last_input_time,
     REQ_get_key_state,
     REQ_set_key_state,
     REQ_set_foreground_window,
@@ -3681,6 +3695,7 @@
     struct get_window_properties_request get_window_properties_request;
     struct attach_thread_input_request attach_thread_input_request;
     struct get_thread_input_request get_thread_input_request;
+    struct get_last_input_time_request get_last_input_time_request;
     struct get_key_state_request get_key_state_request;
     struct set_key_state_request set_key_state_request;
     struct set_foreground_window_request set_foreground_window_request;
@@ -3875,6 +3890,7 @@
     struct get_window_properties_reply get_window_properties_reply;
     struct attach_thread_input_reply attach_thread_input_reply;
     struct get_thread_input_reply get_thread_input_reply;
+    struct get_last_input_time_reply get_last_input_time_reply;
     struct get_key_state_reply get_key_state_reply;
     struct set_key_state_reply set_key_state_reply;
     struct set_foreground_window_reply set_foreground_window_reply;
@@ -3903,6 +3919,6 @@
     struct set_mailslot_info_reply set_mailslot_info_reply;
 };
 
-#define SERVER_PROTOCOL_VERSION 171
+#define SERVER_PROTOCOL_VERSION 172
 
 #endif /* __WINE_WINE_SERVER_PROTOCOL_H */
diff --git a/server/protocol.def b/server/protocol.def
index fe89218..97b51bf 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -2008,6 +2008,14 @@
     rectangle_t    rect;          /* caret rectangle */
 @END
 
+
+/* Get the time of the last input event */
+@REQ(get_last_input_time)
+@REPLY
+    unsigned int time;
+@END
+
+
 /* Retrieve queue keyboard state for a given thread */
 @REQ(get_key_state)
     thread_id_t    tid;           /* id of thread */
diff --git a/server/queue.c b/server/queue.c
index 83f908e..a0617a1 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -167,6 +167,7 @@
 
 /* pointer to input structure of foreground thread */
 static struct thread_input *foreground_input;
+static unsigned int last_input_time;
 
 
 /* set the caret window in a given thread input */
@@ -1154,6 +1155,8 @@
     struct thread_input *input;
     unsigned int msg_code;
 
+    last_input_time = get_tick_count();
+
     win = find_hardware_message_window( queue ? queue->input : foreground_input, msg, &msg_code );
     if (!win || !(thread = get_window_thread(win)))
     {
@@ -2006,3 +2009,10 @@
         else input->caret_state = !!req->state;
     }
 }
+
+
+/* get the time of the last input event */
+DECL_HANDLER(get_last_input_time)
+{
+    reply->time = last_input_time;
+}
diff --git a/server/request.h b/server/request.h
index 49228dc..8a6ac16 100644
--- a/server/request.h
+++ b/server/request.h
@@ -266,6 +266,7 @@
 DECL_HANDLER(get_window_properties);
 DECL_HANDLER(attach_thread_input);
 DECL_HANDLER(get_thread_input);
+DECL_HANDLER(get_last_input_time);
 DECL_HANDLER(get_key_state);
 DECL_HANDLER(set_key_state);
 DECL_HANDLER(set_foreground_window);
@@ -461,6 +462,7 @@
     (req_handler)req_get_window_properties,
     (req_handler)req_attach_thread_input,
     (req_handler)req_get_thread_input,
+    (req_handler)req_get_last_input_time,
     (req_handler)req_get_key_state,
     (req_handler)req_set_key_state,
     (req_handler)req_set_foreground_window,
diff --git a/server/trace.c b/server/trace.c
index 2de4ddf..f79e8e3 100644
--- a/server/trace.c
+++ b/server/trace.c
@@ -2397,6 +2397,15 @@
     dump_rectangle( &req->rect );
 }
 
+static void dump_get_last_input_time_request( const struct get_last_input_time_request *req )
+{
+}
+
+static void dump_get_last_input_time_reply( const struct get_last_input_time_reply *req )
+{
+    fprintf( stderr, " time=%08x", req->time );
+}
+
 static void dump_get_key_state_request( const struct get_key_state_request *req )
 {
     fprintf( stderr, " tid=%04x,", req->tid );
@@ -2926,6 +2935,7 @@
     (dump_func)dump_get_window_properties_request,
     (dump_func)dump_attach_thread_input_request,
     (dump_func)dump_get_thread_input_request,
+    (dump_func)dump_get_last_input_time_request,
     (dump_func)dump_get_key_state_request,
     (dump_func)dump_set_key_state_request,
     (dump_func)dump_set_foreground_window_request,
@@ -3118,6 +3128,7 @@
     (dump_func)dump_get_window_properties_reply,
     (dump_func)0,
     (dump_func)dump_get_thread_input_reply,
+    (dump_func)dump_get_last_input_time_reply,
     (dump_func)dump_get_key_state_reply,
     (dump_func)0,
     (dump_func)dump_set_foreground_window_reply,
@@ -3310,6 +3321,7 @@
     "get_window_properties",
     "attach_thread_input",
     "get_thread_input",
+    "get_last_input_time",
     "get_key_state",
     "set_key_state",
     "set_foreground_window",