From 393a276f683515462cb24c8cb3e5c0907e440267 Mon Sep 17 00:00:00 2001 From: Magnus Olsen Date: Thu, 6 Jul 2006 01:44:01 +0000 Subject: [PATCH] Commit initiate work of implement of autostart of screen saver. svn path=/trunk/; revision=22879 --- reactos/include/reactos/subsys/csrss/csrss.h | 8 ++++ .../win32/csrss/include/desktopbg.h | 1 + .../subsystems/win32/csrss/win32csr/conio.c | 48 +++++++++++++++++++ .../subsystems/win32/csrss/win32csr/dllmain.c | 1 + reactos/subsystems/win32/win32k/ntuser/csr.c | 41 ++++++++++++++++ 5 files changed, 99 insertions(+) diff --git a/reactos/include/reactos/subsys/csrss/csrss.h b/reactos/include/reactos/subsys/csrss/csrss.h index 0ce204446db..20ff51d7fba 100644 --- a/reactos/include/reactos/subsys/csrss/csrss.h +++ b/reactos/include/reactos/subsys/csrss/csrss.h @@ -410,6 +410,12 @@ typedef struct HANDLE InputWaitHandle; } CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE; +typedef struct +{ + BOOL Start; +} CSRSS_START_SCREEN_SAVER, *PCSRSS_START_SCREEN_SAVER; + + #define CSR_API_MESSAGE_HEADER_SIZE(Type) (FIELD_OFFSET(CSR_API_MESSAGE, Data) + sizeof(Type)) #define CSRSS_MAX_WRITE_CONSOLE (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE)) #define CSRSS_MAX_WRITE_CONSOLE_OUTPUT_CHAR (LPC_MAX_DATA_LENGTH - CSR_API_MESSAGE_HEADER_SIZE(CSRSS_WRITE_CONSOLE_OUTPUT_CHAR)) @@ -477,6 +483,7 @@ typedef struct #define SET_CONSOLE_OUTPUT_CP (0x34) #define GET_INPUT_WAIT_HANDLE (0x35) #define GET_PROCESS_LIST (0x36) +#define START_SCREEN_SAVER (0x37) /* Keep in sync with definition below. */ #define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS)) @@ -542,6 +549,7 @@ typedef struct _CSR_API_MESSAGE CSRSS_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage; CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle; CSRSS_GET_PROCESS_LIST GetProcessListRequest; + CSRSS_START_SCREEN_SAVER StartScreenSaver; } Data; } CSR_API_MESSAGE, *PCSR_API_MESSAGE; diff --git a/reactos/subsystems/win32/csrss/include/desktopbg.h b/reactos/subsystems/win32/csrss/include/desktopbg.h index b06a16c95f3..4bac760014b 100644 --- a/reactos/subsystems/win32/csrss/include/desktopbg.h +++ b/reactos/subsystems/win32/csrss/include/desktopbg.h @@ -16,6 +16,7 @@ CSR_API(CsrCreateDesktop); CSR_API(CsrShowDesktop); CSR_API(CsrHideDesktop); CSR_API(CsrRegisterSystemClasses); +CSR_API(CsrStartScreenSaver); BOOL FASTCALL DtbgIsDesktopVisible(VOID); diff --git a/reactos/subsystems/win32/csrss/win32csr/conio.c b/reactos/subsystems/win32/csrss/win32csr/conio.c index 6997ff83cbd..8310f754550 100644 --- a/reactos/subsystems/win32/csrss/win32csr/conio.c +++ b/reactos/subsystems/win32/csrss/win32csr/conio.c @@ -3301,4 +3301,52 @@ CSR_API(CsrGetProcessList) return Request->Status = STATUS_SUCCESS; } + +CSR_API(CsrStartScreenSaver) +{ + + DPRINT1("CsrStartScreenSaver : Start Screen Saver \n"); + + if (Request->Data.StartScreenSaver.Start == TRUE) + { + STARTUPINFOW si; + PROCESS_INFORMATION pi; + WCHAR szCmdline[MAX_PATH]; + + HKEY hKey; + WCHAR szBuffer[MAX_PATH]; + DWORD bufferSize = sizeof(szBuffer); + DWORD varType = REG_SZ; + LONG result; + + + + // FIXME read the register key for the screen saver + //swprintf(szCmdline, L"c:\\reactos\\system32\\matrix.scr /s"); + + RegOpenKeyExW(HKEY_CURRENT_USER, L"Control Panel\\Desktop", 0, KEY_ALL_ACCESS, &hKey); + result = RegQueryValueExW(hKey, L"SCRNSAVE.EXE", 0, &varType, (LPBYTE)szBuffer, &bufferSize); + if(result == ERROR_SUCCESS) + { + swprintf(szCmdline, L"%s /s",szBuffer); + DPRINT1("CsrStartScreenSaver : OK %S\n",szCmdline); + ZeroMemory( &si, sizeof(si) ); + si.cb = sizeof(si); + ZeroMemory( &pi, sizeof(pi) ); + if(CreateProcessW( NULL, szCmdline, NULL, NULL, FALSE, 0, NULL,NULL,&si, &pi )) + { + CloseHandle( pi.hProcess ); + CloseHandle( pi.hThread ); + } + } + else + { + DPRINT1("CsrStartScreenSaver : FAIL %S\n",szBuffer); + } + + RegCloseKey(hKey); + } + return Request->Status = STATUS_SUCCESS; +} + /* EOF */ diff --git a/reactos/subsystems/win32/csrss/win32csr/dllmain.c b/reactos/subsystems/win32/csrss/win32csr/dllmain.c index 5fd8e1635ec..5a8399c1aa8 100644 --- a/reactos/subsystems/win32/csrss/win32csr/dllmain.c +++ b/reactos/subsystems/win32/csrss/win32csr/dllmain.c @@ -68,6 +68,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] = CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage), CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage), CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList), + CSRSS_DEFINE_API(START_SCREEN_SAVER, CsrStartScreenSaver), { 0, 0, NULL } }; diff --git a/reactos/subsystems/win32/win32k/ntuser/csr.c b/reactos/subsystems/win32/win32k/ntuser/csr.c index b7b0eb90ad8..83745d47b0d 100644 --- a/reactos/subsystems/win32/win32k/ntuser/csr.c +++ b/reactos/subsystems/win32/win32k/ntuser/csr.c @@ -85,6 +85,47 @@ co_CsrNotify(PCSR_API_MESSAGE Request) return Status; } + +NTSTATUS FASTCALL +co_CsrNotifyScreenSaver(PCSR_API_MESSAGE Request) +{ + NTSTATUS Status; + PEPROCESS OldProcess; + + if (NULL == CsrProcess) + { + return STATUS_INVALID_PORT_HANDLE; + } + + Request->Header.u1.s1.DataLength = sizeof(CSR_API_MESSAGE) - sizeof(PORT_MESSAGE); + Request->Header.u1.s1.TotalLength = sizeof(CSR_API_MESSAGE); + + /* Switch to the process in which the WindowsApiPort handle is valid */ + OldProcess = PsGetCurrentProcess(); + if (CsrProcess != OldProcess) + { + KeAttachProcess(&CsrProcess->Pcb); + } + + Status = ZwRequestWaitReplyPort(WindowsApiPort, + &Request->Header, + &Request->Header); + + + if (CsrProcess != OldProcess) + { + KeDetachProcess(); + } + + if (NT_SUCCESS(Status)) + { + Status = Request->Status; + } + + return Status; +} + + NTSTATUS STDCALL CsrInsertObject(HANDLE ObjectHandle,