mirror of
https://github.com/reactos/reactos.git
synced 2025-08-06 19:24:04 +00:00
Commit initiate work of implement of autostart of screen saver.
svn path=/trunk/; revision=22879
This commit is contained in:
parent
0f2c6e474b
commit
393a276f68
5 changed files with 99 additions and 0 deletions
|
@ -410,6 +410,12 @@ typedef struct
|
||||||
HANDLE InputWaitHandle;
|
HANDLE InputWaitHandle;
|
||||||
} CSRSS_GET_INPUT_WAIT_HANDLE, *PCSRSS_GET_INPUT_WAIT_HANDLE;
|
} 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 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 (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))
|
#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 SET_CONSOLE_OUTPUT_CP (0x34)
|
||||||
#define GET_INPUT_WAIT_HANDLE (0x35)
|
#define GET_INPUT_WAIT_HANDLE (0x35)
|
||||||
#define GET_PROCESS_LIST (0x36)
|
#define GET_PROCESS_LIST (0x36)
|
||||||
|
#define START_SCREEN_SAVER (0x37)
|
||||||
|
|
||||||
/* Keep in sync with definition below. */
|
/* Keep in sync with definition below. */
|
||||||
#define CSRSS_HEADER_SIZE (sizeof(PORT_MESSAGE) + sizeof(ULONG) + sizeof(NTSTATUS))
|
#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_SET_CONSOLE_OUTPUT_CP SetConsoleOutputCodePage;
|
||||||
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
|
CSRSS_GET_INPUT_WAIT_HANDLE GetConsoleInputWaitHandle;
|
||||||
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
|
CSRSS_GET_PROCESS_LIST GetProcessListRequest;
|
||||||
|
CSRSS_START_SCREEN_SAVER StartScreenSaver;
|
||||||
} Data;
|
} Data;
|
||||||
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
|
} CSR_API_MESSAGE, *PCSR_API_MESSAGE;
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ CSR_API(CsrCreateDesktop);
|
||||||
CSR_API(CsrShowDesktop);
|
CSR_API(CsrShowDesktop);
|
||||||
CSR_API(CsrHideDesktop);
|
CSR_API(CsrHideDesktop);
|
||||||
CSR_API(CsrRegisterSystemClasses);
|
CSR_API(CsrRegisterSystemClasses);
|
||||||
|
CSR_API(CsrStartScreenSaver);
|
||||||
|
|
||||||
BOOL FASTCALL DtbgIsDesktopVisible(VOID);
|
BOOL FASTCALL DtbgIsDesktopVisible(VOID);
|
||||||
|
|
||||||
|
|
|
@ -3301,4 +3301,52 @@ CSR_API(CsrGetProcessList)
|
||||||
return Request->Status = STATUS_SUCCESS;
|
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 */
|
/* EOF */
|
||||||
|
|
|
@ -68,6 +68,7 @@ static CSRSS_API_DEFINITION Win32CsrApiDefinitions[] =
|
||||||
CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
|
CSRSS_DEFINE_API(GET_CONSOLE_OUTPUT_CP, CsrGetConsoleOutputCodePage),
|
||||||
CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
|
CSRSS_DEFINE_API(SET_CONSOLE_OUTPUT_CP, CsrSetConsoleOutputCodePage),
|
||||||
CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
|
CSRSS_DEFINE_API(GET_PROCESS_LIST, CsrGetProcessList),
|
||||||
|
CSRSS_DEFINE_API(START_SCREEN_SAVER, CsrStartScreenSaver),
|
||||||
{ 0, 0, NULL }
|
{ 0, 0, NULL }
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -85,6 +85,47 @@ co_CsrNotify(PCSR_API_MESSAGE Request)
|
||||||
return Status;
|
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
|
NTSTATUS
|
||||||
STDCALL
|
STDCALL
|
||||||
CsrInsertObject(HANDLE ObjectHandle,
|
CsrInsertObject(HANDLE ObjectHandle,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue