[TRANSLATION][CLIPBRD] Italian translation implemented (#344)
[reactos.git] / base / system / winlogon / screensaver.c
index ba3e8d0..a613928 100644 (file)
 
 #include "winlogon.h"
 
-#include <wine/debug.h>
-
-WINE_DEFAULT_DEBUG_CHANNEL(winlogon);
-
 /* FUNCTIONS ****************************************************************/
 
 #ifndef USE_GETLASTINPUTINFO
-static LRESULT CALLBACK
+static
+LRESULT
+CALLBACK
 KeyboardActivityProc(
-       IN INT nCode,
-       IN WPARAM wParam,
-       IN LPARAM lParam)
+    IN INT nCode,
+    IN WPARAM wParam,
+    IN LPARAM lParam)
 {
-       InterlockedExchange((LONG*)&WLSession->LastActivity, ((PKBDLLHOOKSTRUCT)lParam)->time);
-       return CallNextHookEx(NULL, nCode, wParam, lParam);
+    InterlockedExchange((LONG*)&WLSession->LastActivity, ((PKBDLLHOOKSTRUCT)lParam)->time);
+    return CallNextHookEx(NULL, nCode, wParam, lParam);
 }
 
-static LRESULT CALLBACK
+
+static
+LRESULT
+CALLBACK
 MouseActivityProc(
-       IN INT nCode,
-       IN WPARAM wParam,
-       IN LPARAM lParam)
+    IN INT nCode,
+    IN WPARAM wParam,
+    IN LPARAM lParam)
 {
-       InterlockedExchange((LONG*)&WLSession->LastActivity, ((PMSLLHOOKSTRUCT)lParam)->time);
-       return CallNextHookEx(NULL, nCode, wParam, lParam);
+    InterlockedExchange((LONG*)&WLSession->LastActivity, ((PMSLLHOOKSTRUCT)lParam)->time);
+    return CallNextHookEx(NULL, nCode, wParam, lParam);
 }
 #endif
 
-static VOID
+
+static
+VOID
 LoadScreenSaverParameters(
-       OUT LPDWORD Timeout)
+    OUT LPDWORD Timeout)
 {
-       BOOL Enabled;
-
-       if (!SystemParametersInfoW(SPI_GETSCREENSAVETIMEOUT, 0, Timeout, 0))
-       {
-               WARN("WL: Unable to get screen saver timeout (error %lu). Disabling it\n", GetLastError());
-               *Timeout = INFINITE;
-       }
-       else if (!SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &Enabled, 0))
-       {
-               WARN("WL: Unable to check if screen saver is enabled (error %lu). Disabling it\n", GetLastError());
-               *Timeout = INFINITE;
-       }
-       else if (!Enabled)
-       {
-               TRACE("WL: Screen saver is disabled\n");
-               *Timeout = INFINITE;
-       }
-       else
-       {
-               TRACE("WL: Screen saver timeout: %lu seconds\n", *Timeout);
-               *Timeout *= 1000;
-       }
+    BOOL Enabled;
+
+    if (!SystemParametersInfoW(SPI_GETSCREENSAVETIMEOUT, 0, Timeout, 0))
+    {
+        WARN("WL: Unable to get screen saver timeout (error %lu). Disabling it\n", GetLastError());
+        *Timeout = INFINITE;
+    }
+    else if (!SystemParametersInfoW(SPI_GETSCREENSAVEACTIVE, 0, &Enabled, 0))
+    {
+        WARN("WL: Unable to check if screen saver is enabled (error %lu). Disabling it\n", GetLastError());
+        *Timeout = INFINITE;
+    }
+    else if (!Enabled)
+    {
+        TRACE("WL: Screen saver is disabled\n");
+        *Timeout = INFINITE;
+    }
+    else
+    {
+        TRACE("WL: Screen saver timeout: %lu seconds\n", *Timeout);
+        *Timeout *= 1000;
+    }
 }
 
-static DWORD WINAPI
+
+static
+DWORD
+WINAPI
 ScreenSaverThreadMain(
-       IN LPVOID lpParameter)
+    IN LPVOID lpParameter)
 {
-       PWLSESSION Session = (PWLSESSION)lpParameter;
-       HANDLE HandleArray[3];
+    PWLSESSION Session = (PWLSESSION)lpParameter;
+    HANDLE HandleArray[3];
 #ifdef USE_GETLASTINPUTINFO
-       LASTINPUTINFO lastInputInfo;
+    LASTINPUTINFO lastInputInfo;
 #else
-       DWORD LastActivity;
+    DWORD LastActivity;
 #endif
-       DWORD TimeToWait;
-       DWORD Timeout; /* Timeout before screen saver starts, in milliseconds */
-       DWORD ret;
-
-       if (!ImpersonateLoggedOnUser(Session->UserToken))
-       {
-               ERR("ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
-               return 0;
-       }
-
-       Session->hUserActivity = CreateEventW(NULL, FALSE, FALSE, NULL);
-       if (!Session->hUserActivity)
-       {
-               ERR("WL: Unable to create event (error %lu)\n", GetLastError());
-               goto cleanup;
-       }
-
-       Session->hEndOfScreenSaver = CreateEventW(NULL, FALSE, FALSE, NULL);
-       if (!Session->hEndOfScreenSaver)
-       {
-               ERR("WL: Unable to create event (error %lu)\n", GetLastError());
-               goto cleanup;
-       }
-
-       HandleArray[0] = Session->hEndOfScreenSaverThread;
-       HandleArray[1] = Session->hScreenSaverParametersChanged;
-       HandleArray[2] = Session->hEndOfScreenSaver;
-
-       LoadScreenSaverParameters(&Timeout);
+    DWORD TimeToWait;
+    DWORD Timeout; /* Timeout before screen saver starts, in milliseconds */
+    DWORD ret;
+
+    if (!ImpersonateLoggedOnUser(Session->UserToken))
+    {
+        ERR("ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
+        return 0;
+    }
+
+    Session->hUserActivity = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if (!Session->hUserActivity)
+    {
+        ERR("WL: Unable to create event (error %lu)\n", GetLastError());
+        goto cleanup;
+    }
+
+    Session->hEndOfScreenSaver = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if (!Session->hEndOfScreenSaver)
+    {
+        ERR("WL: Unable to create event (error %lu)\n", GetLastError());
+        goto cleanup;
+    }
+
+    HandleArray[0] = Session->hEndOfScreenSaverThread;
+    HandleArray[1] = Session->hScreenSaverParametersChanged;
+    HandleArray[2] = Session->hEndOfScreenSaver;
+
+    LoadScreenSaverParameters(&Timeout);
 
 #ifndef USE_GETLASTINPUTINFO
-       InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());
+    InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());
 #else
-       lastInputInfo.cbSize = sizeof(LASTINPUTINFO);
+    lastInputInfo.cbSize = sizeof(LASTINPUTINFO);
 #endif
-       for (;;)
-       {
-               /* See the time of last activity and calculate a timeout */
+    for (;;)
+    {
+        /* See the time of last activity and calculate a timeout */
 #ifndef USE_GETLASTINPUTINFO
-               LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);
-               TimeToWait = Timeout - (GetTickCount() - LastActivity);
+        LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);
+        TimeToWait = Timeout - (GetTickCount() - LastActivity);
 #else
-               if (GetLastInputInfo(&lastInputInfo))
-                       TimeToWait = Timeout - (GetTickCount() - lastInputInfo.dwTime);
-               else
-               {
-                       WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());
-                       TimeToWait = 10; /* Try again in 10 ms */
-               }
+        if (GetLastInputInfo(&lastInputInfo))
+            TimeToWait = Timeout - (GetTickCount() - lastInputInfo.dwTime);
+        else
+        {
+            WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());
+            TimeToWait = 10; /* Try again in 10 ms */
+        }
 #endif
-               if (TimeToWait > Timeout)
-               {
-                       /* GetTickCount() got back to 0 */
-                       TimeToWait = Timeout;
-               }
-
-               /* Wait for the timeout, or the end of this thread */
-               ret = WaitForMultipleObjects(2, HandleArray, FALSE, TimeToWait);
-               if (ret == WAIT_OBJECT_0)
-                       break;
-               else if (ret == WAIT_OBJECT_0 + 1)
-                       LoadScreenSaverParameters(&Timeout);
-
-               /* Check if we didn't had recent activity */
+
+        if (TimeToWait > Timeout)
+        {
+            /* GetTickCount() got back to 0 */
+            TimeToWait = Timeout;
+        }
+
+        /* Wait for the timeout, or the end of this thread */
+        ret = WaitForMultipleObjects(2, HandleArray, FALSE, TimeToWait);
+        if (ret == WAIT_OBJECT_0)
+            break;
+        else if (ret == WAIT_OBJECT_0 + 1)
+            LoadScreenSaverParameters(&Timeout);
+
+        /* Check if we didn't had recent activity */
 #ifndef USE_GETLASTINPUTINFO
-               LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);
-               if (LastActivity + Timeout > GetTickCount())
-                       continue;
+        LastActivity = InterlockedCompareExchange((LONG*)&Session->LastActivity, 0, 0);
+        if (LastActivity + Timeout > GetTickCount())
+            continue;
 #else
-               if (!GetLastInputInfo(&lastInputInfo))
-               {
-                       WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());
-                       continue;
-               }
-               if (lastInputInfo.dwTime + Timeout > GetTickCount())
-                       continue;
+        if (!GetLastInputInfo(&lastInputInfo))
+        {
+            WARN("GetLastInputInfo() failed with error %lu\n", GetLastError());
+            continue;
+        }
+
+        if (lastInputInfo.dwTime + Timeout > GetTickCount())
+            continue;
 #endif
 
-               /* Run screen saver */
-               PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_TIMEOUT, 0);
+        /* Run screen saver */
+        PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_TIMEOUT, 0);
 
-               /* Wait for the end of this thread or of the screen saver */
-               ret = WaitForMultipleObjects(3, HandleArray, FALSE, INFINITE);
-               if (ret == WAIT_OBJECT_0)
-                       break;
-               else if (ret == WAIT_OBJECT_0 + 1)
-                       LoadScreenSaverParameters(&Timeout);
-               else if (ret == WAIT_OBJECT_0 + 2)
-                       SystemParametersInfoW(SPI_SETSCREENSAVERRUNNING, FALSE, NULL, 0);
-       }
+        /* Wait for the end of this thread or of the screen saver */
+        ret = WaitForMultipleObjects(3, HandleArray, FALSE, INFINITE);
+        if (ret == WAIT_OBJECT_0)
+            break;
+        else if (ret == WAIT_OBJECT_0 + 1)
+            LoadScreenSaverParameters(&Timeout);
+        else if (ret == WAIT_OBJECT_0 + 2)
+            SystemParametersInfoW(SPI_SETSCREENSAVERRUNNING, FALSE, NULL, 0);
+    }
 
 cleanup:
-       RevertToSelf();
-       if (Session->hUserActivity)
-               CloseHandle(Session->hUserActivity);
-       if (Session->hEndOfScreenSaver)
-               CloseHandle(Session->hEndOfScreenSaver);
+    if (Session->hUserActivity)
+        CloseHandle(Session->hUserActivity);
+
+    if (Session->hEndOfScreenSaver)
+        CloseHandle(Session->hEndOfScreenSaver);
+
+    RevertToSelf();
+
 #ifndef USE_GETLASTINPUTINFO
-       if (Session->KeyboardHook)
-               UnhookWindowsHookEx(Session->KeyboardHook);
-       if (Session->MouseHook)
-               UnhookWindowsHookEx(Session->MouseHook);
+    if (Session->KeyboardHook)
+        UnhookWindowsHookEx(Session->KeyboardHook);
+
+    if (Session->MouseHook)
+        UnhookWindowsHookEx(Session->MouseHook);
 #endif
-       CloseHandle(Session->hEndOfScreenSaverThread);
-       CloseHandle(Session->hScreenSaverParametersChanged);
-       return 0;
+
+    CloseHandle(Session->hEndOfScreenSaverThread);
+    CloseHandle(Session->hScreenSaverParametersChanged);
+
+    return 0;
 }
 
+
 BOOL
 InitializeScreenSaver(
-       IN OUT PWLSESSION Session)
+    IN OUT PWLSESSION Session)
 {
-       HANDLE ScreenSaverThread;
+    HANDLE ScreenSaverThread;
 
 #ifndef USE_GETLASTINPUTINFO
-       /* Register hooks to detect keyboard and mouse activity */
-       Session->KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardActivityProc, hAppInstance, 0);
-       if (!Session->KeyboardHook)
-       {
-               ERR("WL: Unable to register keyboard hook\n");
-               return FALSE;
-       }
-       Session->MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseActivityProc, hAppInstance, 0);
-       if (!Session->MouseHook)
-       {
-               ERR("WL: Unable to register mouse hook\n");
-               return FALSE;
-       }
+    /* Register hooks to detect keyboard and mouse activity */
+    Session->KeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyboardActivityProc, hAppInstance, 0);
+    if (!Session->KeyboardHook)
+    {
+        ERR("WL: Unable to register keyboard hook\n");
+        return FALSE;
+    }
+
+    Session->MouseHook = SetWindowsHookEx(WH_MOUSE_LL, MouseActivityProc, hAppInstance, 0);
+    if (!Session->MouseHook)
+    {
+        ERR("WL: Unable to register mouse hook\n");
+        return FALSE;
+    }
 #endif
 
-       Session->hScreenSaverParametersChanged = CreateEventW(NULL, FALSE, FALSE, NULL);
-       if (!Session->hScreenSaverParametersChanged)
-       {
-               WARN("WL: Unable to create screen saver event (error %lu)\n", GetLastError());
-               return TRUE;
-       }
-       Session->hEndOfScreenSaverThread = CreateEventW(NULL, FALSE, FALSE, NULL);
-       if (!Session->hEndOfScreenSaverThread)
-       {
-               WARN("WL: Unable to create screen saver event (error %lu)\n", GetLastError());
-               CloseHandle(Session->hScreenSaverParametersChanged);
-               return TRUE;
-       }
-
-       ScreenSaverThread = CreateThread(
-               NULL,
-               0,
-               ScreenSaverThreadMain,
-               Session,
-               0,
-               NULL);
-       if (ScreenSaverThread)
-               CloseHandle(ScreenSaverThread);
-       else
-               ERR("WL: Unable to start screen saver thread\n");
-
-       return TRUE;
+    Session->hScreenSaverParametersChanged = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if (!Session->hScreenSaverParametersChanged)
+    {
+        WARN("WL: Unable to create screen saver event (error %lu)\n", GetLastError());
+        return TRUE;
+    }
+
+    Session->hEndOfScreenSaverThread = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if (!Session->hEndOfScreenSaverThread)
+    {
+        WARN("WL: Unable to create screen saver event (error %lu)\n", GetLastError());
+        CloseHandle(Session->hScreenSaverParametersChanged);
+        return TRUE;
+    }
+
+    ScreenSaverThread = CreateThread(NULL,
+                                     0,
+                                     ScreenSaverThreadMain,
+                                     Session,
+                                     0,
+                                     NULL);
+    if (ScreenSaverThread)
+        CloseHandle(ScreenSaverThread);
+    else
+        ERR("WL: Unable to start screen saver thread\n");
+
+    return TRUE;
 }
 
+
 VOID
 StartScreenSaver(
-       IN PWLSESSION Session)
+    IN PWLSESSION Session)
 {
-       HKEY hKey = NULL, hCurrentUser = NULL;
-       WCHAR szApplicationName[MAX_PATH];
-       WCHAR szCommandLine[MAX_PATH + 3];
-       DWORD bufferSize = sizeof(szApplicationName) - sizeof(WCHAR);
-       DWORD dwType;
-       STARTUPINFOW StartupInfo;
-       PROCESS_INFORMATION ProcessInformation;
-       HANDLE HandleArray[2];
-       LONG rc;
-       DWORD Status;
-       BOOL ret = FALSE;
-
-       if (!ImpersonateLoggedOnUser(Session->UserToken))
-       {
-               ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
-               goto cleanup;
-       }
-
-       rc = RegOpenCurrentUser(
-               KEY_READ,
-               &hCurrentUser);
-       if (rc != ERROR_SUCCESS)
-       {
-               ERR("WL: RegOpenCurrentUser Error!\n");
-               goto cleanup;
-       }
-
-       rc = RegOpenKeyExW(
-               hCurrentUser,
-               L"Control Panel\\Desktop",
-               0,
-               KEY_QUERY_VALUE,
-               &hKey);
-       if (rc != ERROR_SUCCESS)
-       {
-               ERR("WL: RegOpenKeyEx Error!\n");
-               goto cleanup;
-       }
-
-       rc = RegQueryValueExW(
-               hKey,
-               L"SCRNSAVE.EXE",
-               0,
-               &dwType,
-               (LPBYTE)szApplicationName,
-               &bufferSize);
-       if (rc != ERROR_SUCCESS || dwType != REG_SZ)
-       {
-               ERR("WL: RegQueryValueEx Error!\n");
-               goto cleanup;
-       }
-
-       if (bufferSize == 0)
-       {
-               ERR("WL: Buffer size is NULL!\n");
-               goto cleanup;
-       }
-
-       szApplicationName[bufferSize / sizeof(WCHAR)] = 0; /* Terminate the string */
-
-       if (wcslen(szApplicationName) == 0)
-       {
-               ERR("WL: Application Name length is zero!\n");
-               goto cleanup;
-       }
-
-       wsprintfW(szCommandLine, L"%s /s", szApplicationName);
-       TRACE("WL: Executing %S\n", szCommandLine);
-
-       ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
-       ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
-       StartupInfo.cb = sizeof(STARTUPINFOW);
-       StartupInfo.dwFlags = STARTF_SCRNSAVER;
-       /* FIXME: run the screen saver on the screen saver desktop */
-       ret = CreateProcessW(
-               szApplicationName,
-               szCommandLine,
-               NULL,
-               NULL,
-               FALSE,
-               0,
-               NULL,
-               NULL,
-               &StartupInfo,
-               &ProcessInformation);
-       if (!ret)
-       {
-               ERR("WL: Unable to start %S, error %lu\n", szApplicationName, GetLastError());
-               goto cleanup;
-       }
-       CloseHandle(ProcessInformation.hThread);
-
-       SystemParametersInfoW(SPI_SETSCREENSAVERRUNNING, TRUE, NULL, 0);
-
-       /* Wait the end of the process or some other activity */
-       ResetEvent(Session->hUserActivity);
-       HandleArray[0] = ProcessInformation.hProcess;
-       HandleArray[1] = Session->hUserActivity;
-       Status = WaitForMultipleObjects(2, HandleArray, FALSE, INFINITE);
-       if (Status == WAIT_OBJECT_0 + 1)
-       {
-               /* Kill the screen saver */
-               TerminateProcess(ProcessInformation.hProcess, 0);
-       }
-       SetEvent(Session->hEndOfScreenSaver);
-
-       CloseHandle(ProcessInformation.hProcess);
+    HKEY hKey = NULL, hCurrentUser = NULL;
+    WCHAR szApplicationName[MAX_PATH];
+    WCHAR szCommandLine[MAX_PATH + 3];
+    DWORD bufferSize = sizeof(szApplicationName) - sizeof(WCHAR);
+    DWORD dwType;
+    STARTUPINFOW StartupInfo;
+    PROCESS_INFORMATION ProcessInformation;
+    HANDLE HandleArray[2];
+    LONG rc;
+    DWORD Status;
+    BOOL ret = FALSE;
+
+    if (!ImpersonateLoggedOnUser(Session->UserToken))
+    {
+        ERR("WL: ImpersonateLoggedOnUser() failed with error %lu\n", GetLastError());
+        goto cleanup;
+    }
+
+    rc = RegOpenCurrentUser(KEY_READ,
+                            &hCurrentUser);
+    if (rc != ERROR_SUCCESS)
+    {
+        ERR("WL: RegOpenCurrentUser error %lu\n", rc);
+        goto cleanup;
+    }
+
+    rc = RegOpenKeyExW(hCurrentUser,
+                       L"Control Panel\\Desktop",
+                       0,
+                       KEY_QUERY_VALUE,
+                       &hKey);
+    if (rc != ERROR_SUCCESS)
+    {
+        ERR("WL: RegOpenKeyEx error %lu\n", rc);
+        goto cleanup;
+    }
+
+    rc = RegQueryValueExW(hKey,
+                          L"SCRNSAVE.EXE",
+                          0,
+                          &dwType,
+                          (LPBYTE)szApplicationName,
+                          &bufferSize);
+    if (rc != ERROR_SUCCESS || dwType != REG_SZ)
+    {
+        if (rc != ERROR_FILE_NOT_FOUND)
+            ERR("WL: RegQueryValueEx error %lu\n", rc);
+        goto cleanup;
+    }
+
+    if (bufferSize == 0)
+    {
+        ERR("WL: Buffer size is NULL!\n");
+        goto cleanup;
+    }
+
+    szApplicationName[bufferSize / sizeof(WCHAR)] = 0; /* Terminate the string */
+
+    if (wcslen(szApplicationName) == 0)
+    {
+        ERR("WL: Application Name length is zero!\n");
+        goto cleanup;
+    }
+
+    wsprintfW(szCommandLine, L"%s /s", szApplicationName);
+    TRACE("WL: Executing %S\n", szCommandLine);
+
+    ZeroMemory(&StartupInfo, sizeof(STARTUPINFOW));
+    ZeroMemory(&ProcessInformation, sizeof(PROCESS_INFORMATION));
+    StartupInfo.cb = sizeof(STARTUPINFOW);
+    StartupInfo.dwFlags = STARTF_SCRNSAVER;
+
+    /* FIXME: run the screen saver on the screen saver desktop */
+    ret = CreateProcessW(szApplicationName,
+                         szCommandLine,
+                         NULL,
+                         NULL,
+                         FALSE,
+                         0,
+                         NULL,
+                         NULL,
+                         &StartupInfo,
+                         &ProcessInformation);
+    if (!ret)
+    {
+        ERR("WL: Unable to start %S, error %lu\n", szApplicationName, GetLastError());
+        goto cleanup;
+    }
+
+    CloseHandle(ProcessInformation.hThread);
+
+    SystemParametersInfoW(SPI_SETSCREENSAVERRUNNING, TRUE, NULL, 0);
+
+    CallNotificationDlls(Session, StartScreenSaverHandler);
+
+    /* Wait the end of the process or some other activity */
+    ResetEvent(Session->hUserActivity);
+    HandleArray[0] = ProcessInformation.hProcess;
+    HandleArray[1] = Session->hUserActivity;
+    Status = WaitForMultipleObjects(2, HandleArray, FALSE, INFINITE);
+    if (Status == WAIT_OBJECT_0 + 1)
+    {
+        /* Kill the screen saver */
+        TerminateProcess(ProcessInformation.hProcess, 0);
+    }
+
+    SetEvent(Session->hEndOfScreenSaver);
+
+    CloseHandle(ProcessInformation.hProcess);
+
+    CallNotificationDlls(Session, StopScreenSaverHandler);
 
 cleanup:
-       RevertToSelf();
-       if (hKey)
-               RegCloseKey(hKey);
-       if (hCurrentUser)
-               RegCloseKey(hCurrentUser);
-       if (!ret)
-       {
-               PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_ACTIVITY, 0);
+    if (hKey)
+        RegCloseKey(hKey);
+
+    if (hCurrentUser)
+        RegCloseKey(hCurrentUser);
+
+    RevertToSelf();
+
+    if (!ret)
+    {
+        PostMessageW(Session->SASWindow, WLX_WM_SAS, WLX_SAS_TYPE_SCRNSVR_ACTIVITY, 0);
 #ifndef USE_GETLASTINPUTINFO
-               InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());
+        InterlockedExchange((LONG*)&Session->LastActivity, GetTickCount());
 #endif
-       }
+    }
 }