Commit my autostart code for screen saver for now it is hardcode to 15 sec timeout

svn path=/trunk/; revision=22896
This commit is contained in:
Magnus Olsen 2006-07-06 20:42:45 +00:00
parent 9135556ab7
commit 49ac5c3e0e
2 changed files with 102 additions and 30 deletions

View file

@ -3301,8 +3301,6 @@ CSR_API(CsrGetProcessList)
return Request->Status = STATUS_SUCCESS;
}
static BOOL ScreenSaverRunning = FALSE;
CSR_API(CsrStartScreenSaver)
{
@ -3337,33 +3335,27 @@ CSR_API(CsrStartScreenSaver)
add the code here as w3seek recomandete
*/
if (ScreenSaverRunning == FALSE)
{
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) );
ScreenSaverRunning = TRUE;
if(CreateProcessW( NULL, szCmdline, NULL, NULL, FALSE, 0, NULL,NULL,&si, &pi ))
{
CloseHandle( pi.hProcess );
CloseHandle( pi.hThread );
ScreenSaverRunning = FALSE;
}
}
else
{
DPRINT1("CsrStartScreenSaver : FAIL %S\n",szBuffer);
}
RegCloseKey(hKey);
}
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;
}

View file

@ -39,6 +39,9 @@ extern BYTE gQueueKeyStateTable[];
/* GLOBALS *******************************************************************/
static HANDLE ScreenSaverThreadHandle;
static CLIENT_ID ScreenSaverThreadId;
static HANDLE MouseDeviceHandle;
static HANDLE MouseThreadHandle;
static CLIENT_ID MouseThreadId;
@ -47,6 +50,7 @@ static CLIENT_ID KeyboardThreadId;
static HANDLE KeyboardDeviceHandle;
static KEVENT InputThreadsStart;
static BOOLEAN InputThreadsRunning = FALSE;
static BOOLEAN ScreenSaverRunning = FALSE;
PUSER_MESSAGE_QUEUE pmPrimitiveMessageQueue = 0;
/* FUNCTIONS *****************************************************************/
@ -148,6 +152,65 @@ ProcessMouseInputData(PMOUSE_INPUT_DATA Data, ULONG InputCount)
SendMouseEvent(mi);
}
VOID STDCALL
ScreenSaverThreadMain(PVOID StartContext)
{
KEVENT Event;
LARGE_INTEGER Timeout;
NTSTATUS Status;
KeSetPriorityThread(&PsGetCurrentThread()->Tcb,
LOW_REALTIME_PRIORITY + 3);
for(;;)
{
DPRINT("Screen Saver auto start Thread Waiting for start event\n");
Status = KeWaitForSingleObject(&InputThreadsStart,
0,
KernelMode,
TRUE,
NULL);
DPRINT("Screen Saver auto start Thread Starting...\n");
while(InputThreadsRunning)
{
NTSTATUS OldStatus;
/* FIXME
1. read timeout value from reg
2. read timeout value from spi msg
*/
OldStatus = STATUS_SUCCESS;
Timeout.QuadPart = -150000000LL; /* 15 second timeout */
KeInitializeEvent(&Event, NotificationEvent, FALSE);
Status = KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, &Timeout);
if(Status == STATUS_ALERTED && !InputThreadsRunning)
{
break;
}
if(!NT_SUCCESS(Status))
{
DPRINT1("Win32K: Failed to read from Screen Saver auto thread.\n");
return; //(Status);
}
if ((Status == STATUS_TIMEOUT) && (ScreenSaverRunning == FALSE))
{
DPRINT1("Keyboard and Mouse TimeOut Starting Screen Saver...\n");
CSR_API_MESSAGE Request;
ScreenSaverRunning = TRUE;
CsrInit();
Request.Type = MAKE_CSR_API(START_SCREEN_SAVER, CSR_GUI);
Request.Data.StartScreenSaver.Start = TRUE;
co_CsrNotifyScreenSaver(&Request );
}
}
DPRINT("Screen Saver auto start Thread Stopped...\n");
}
}
VOID STDCALL
MouseThreadMain(PVOID StartContext)
{
@ -223,6 +286,8 @@ MouseThreadMain(PVOID StartContext)
}
DPRINT("MouseEvent\n");
ScreenSaverRunning = FALSE;
UserEnterExclusive();
ProcessMouseInputData(&MouseInput, Iosb.Information / sizeof(MOUSE_INPUT_DATA));
@ -491,7 +556,7 @@ KeyboardThreadMain(PVOID StartContext)
HWND hWnd;
int id;
DPRINT("KeyInput @ %08x\n", &KeyInput);
DPRINT("KeyInput @ %08x\n", &KeyInput);
Status = NtReadFile (KeyboardDeviceHandle,
NULL,
@ -531,6 +596,8 @@ KeyboardThreadMain(PVOID StartContext)
return; //(Status);
}
ScreenSaverRunning = FALSE;
/* Update modifier state */
fsModifiers = IntKeyboardGetModifiers(&KeyInput);
@ -809,6 +876,19 @@ InitInputImpl(VOID)
DPRINT1("Win32K: Failed to create mouse thread.\n");
}
Status = PsCreateSystemThread(&ScreenSaverThreadHandle,
THREAD_ALL_ACCESS,
NULL,
NULL,
&ScreenSaverThreadId,
ScreenSaverThreadMain,
NULL);
if (!NT_SUCCESS(Status))
{
DPRINT1("Win32K: Failed to create ScreenSaver auto start thread.\n");
}
return STATUS_SUCCESS;
}