Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

397 lines
11 KiB

#include "stdafx.h"
#include "DXSvr.h"
#include <regstr.h>
//***************************************************************************************
// Globals
HINSTANCE g_hMainInstance; // Main instance handle
BOOL g_bIsTest; // Is in test mode?
BOOL g_bIsPreview; // Is in preview mode?
HWND g_hWnd; // Handle of the rendering window
HWND g_hRefWindow; // Reference window (for preview mode)
LPSTR g_szCommandLine; // Command line
BOOL g_bCheckingPassword;
BOOL g_bShuttingDown;
ID3DXContext* g_pXContext; // X-Library context
IDirect3DDevice7* g_pDevice; // D3D Device
//***************************************************************************************
BOOL g_bIsWin9x;
BOOL g_bWait;
DWORD g_dwMouseMoveCount;
BOOL InitD3D(HWND hWnd);
void KillD3D();
//***************************************************************************************
// Password stuff
const TCHAR szScreenSaverKey[] = REGSTR_PATH_SCREENSAVE;
TCHAR szPasswordActiveValue[] = REGSTR_VALUE_USESCRPASSWORD;
const TCHAR szPasswordValue[] = REGSTR_VALUE_SCRPASSWORD;
TCHAR szPwdDLL[] = TEXT("PASSWORD.CPL");
char szFnName[] = "VerifyScreenSavePwd";
typedef BOOL (FAR PASCAL * VERIFYPWDPROC) (HWND);
VERIFYPWDPROC VerifyPassword = NULL;
HINSTANCE hInstPwdDLL = NULL;
static LPTSTR szMprDll = TEXT("MPR.DLL");
static LPTSTR szProviderName = TEXT("SCRSAVE");
static const char szPwdChangePW[] = "PwdChangePasswordA";
typedef DWORD (FAR PASCAL *PWCHGPROC)(LPCTSTR, HWND, DWORD, LPVOID);
//***************************************************************************************
void ScreenSaverChangePassword(HWND hParent)
{
HINSTANCE mpr = LoadLibrary(szMprDll);
if (mpr)
{
PWCHGPROC pwd = (PWCHGPROC)GetProcAddress(mpr, szPwdChangePW);
if (pwd)
pwd(szProviderName, hParent, 0, NULL);
FreeLibrary(mpr);
}
}
//***************************************************************************************
void LoadPwdDLL()
{
// Don't bother unless we're on 9x
if (!g_bIsWin9x)
return;
// look in registry to see if password turned on, otherwise don't
// bother to load password handler DLL
HKEY hKey;
if (RegOpenKey(HKEY_CURRENT_USER,szScreenSaverKey,&hKey) ==
ERROR_SUCCESS)
{
DWORD dwVal,dwSize=sizeof(dwVal);
if ((RegQueryValueEx(hKey,szPasswordActiveValue,
NULL,NULL,(BYTE *) &dwVal,&dwSize) == ERROR_SUCCESS)
&& dwVal)
{
// try to load the DLL that contains password proc.
hInstPwdDLL = LoadLibrary(szPwdDLL);
if (hInstPwdDLL)
{
VerifyPassword = (VERIFYPWDPROC) GetProcAddress(hInstPwdDLL, szFnName);
}
}
RegCloseKey(hKey);
}
}
//***************************************************************************************
int DXSvrMain(HINSTANCE hInstance, HINSTANCE hInstPrev, LPSTR pszCmdLine, int)
{
// Store our instance handle for later use
g_hMainInstance = hInstance;
// Figure out if we're on 9x or NT (password stuff is different)
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof(osvi);
GetVersionEx(&osvi);
g_bIsWin9x = (osvi.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS);
// Load the password DLL
LoadPwdDLL();
// Parse the command line
g_szCommandLine = pszCmdLine;
LPCSTR pszSwitch = StrChrA(pszCmdLine, '/');
if (pszSwitch == NULL)
{
return ScreenSaverDoConfig();
}
else
{
pszSwitch++; // Skip past the '/'.
switch (*pszSwitch)
{
case 't':
case 'T':
g_bIsTest = TRUE;
break;
case 'p':
case 'P':
while (*pszSwitch && !isdigit(*pszSwitch))
pszSwitch++;
if (isdigit(*pszSwitch))
{
LONGLONG llSize;
if (StrToInt64ExA(pszSwitch, 0, &llSize))
{
g_hRefWindow = HWND(llSize);
}
if (g_hRefWindow != NULL)
g_bIsPreview = TRUE;
}
break;
case 'a':
case 'A':
while (*pszSwitch && !isdigit(*pszSwitch))
pszSwitch++;
if (isdigit(*pszSwitch))
{
LONGLONG llSize;
if (StrToInt64ExA(pszSwitch, 0, &llSize))
{
g_hRefWindow = HWND(llSize);
}
}
ScreenSaverChangePassword(g_hRefWindow);
return 0;
case 'c':
case 'C':
return ScreenSaverDoConfig();
}
}
// Register the window class
WNDCLASS cls;
cls.hCursor = NULL;
cls.hIcon = NULL;
cls.lpszMenuName = NULL;
cls.lpszClassName = TEXT("DXSvrWindow");
cls.hbrBackground = (HBRUSH) GetStockObject(BLACK_BRUSH);
cls.hInstance = g_hMainInstance;
cls.style = CS_VREDRAW|CS_HREDRAW|CS_SAVEBITS|CS_DBLCLKS;
cls.lpfnWndProc = ScreenSaverProc;
cls.cbWndExtra = 0;
cls.cbClsExtra = 0;
RegisterClass(&cls);
g_bWait = TRUE;
// Create the window
RECT rect;
if (g_bIsTest)
{
rect.left = rect.top = 40;
rect.right = rect.left+640;
rect.bottom = rect.top+480;
AdjustWindowRect(&rect , WS_VISIBLE|WS_OVERLAPPED|WS_CAPTION|WS_POPUP , FALSE);
g_hWnd = CreateWindow(TEXT("DXSvrWindow"), TEXT("ScreenSaverTest"),
WS_VISIBLE|WS_OVERLAPPED|WS_CAPTION|WS_POPUP , rect.left , rect.top ,
rect.right-rect.left , rect.bottom-rect.top , NULL ,
NULL , g_hMainInstance , NULL);
}
else if (g_bIsPreview)
{
GetClientRect(g_hRefWindow , &rect);
ClientToScreen(g_hRefWindow , (POINT*)(&rect));
rect.right += rect.left; rect.bottom += rect.top;
AdjustWindowRect(&rect , WS_VISIBLE|WS_CHILD , FALSE);
g_hWnd = CreateWindow(TEXT("DXSvrWindow"), TEXT("ScreenSaverPreview"),
WS_VISIBLE|WS_CHILD , rect.left , rect.top ,
rect.right-rect.left , rect.bottom-rect.top , g_hRefWindow ,
NULL , g_hMainInstance , NULL);
}
else
{
g_hWnd = CreateWindowEx(WS_EX_TOPMOST , TEXT("DXSvrWindow"), TEXT("ScreenSaver"),
WS_MAXIMIZE|WS_VISIBLE|WS_POPUP , 0 , 0 , 640 , 480 , NULL ,
NULL , g_hMainInstance , NULL);
}
if (g_hWnd == NULL)
return 0;
// Prevent task switching if we're on 9x
BOOL dummy;
if (!g_bIsTest && !g_bIsPreview && g_bIsWin9x)
SystemParametersInfo(SPI_SCREENSAVERRUNNING, TRUE, &dummy, 0);
// Pump messages
MSG msg;
msg.message = 0;
while (msg.message != WM_QUIT)
{
if (g_bWait)
{
GetMessage(&msg , NULL , 0 , 0);
TranslateMessage(&msg);
DispatchMessage(&msg);
g_bWait = FALSE;
}
else
{
if (PeekMessage(&msg , NULL , 0 , 0 , PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
ScreenSaverDrawFrame();
}
}
// Allow task switching if we disabled it
if (!g_bIsTest && !g_bIsPreview && g_bIsWin9x)
SystemParametersInfo(SPI_SCREENSAVERRUNNING, FALSE, &dummy, 0);
// Unload the password DLL
if (hInstPwdDLL)
FreeLibrary(hInstPwdDLL);
// Done
return 0;
}
void _stdcall ModuleEntry(void)
{
CHAR szCmdLine[MAX_PATH];
LPCTSTR pszCmdLine = GetCommandLine();
SHTCharToAnsi(pszCmdLine, szCmdLine, ARRAYSIZE(szCmdLine));
int nReturn = DXSvrMain(GetModuleHandle(NULL), NULL, szCmdLine, SW_SHOWDEFAULT);
ExitProcess(nReturn);
}
//***************************************************************************************
BOOL DoPasswordCheck(HWND hWnd)
{
// Don't check if we're already checking or being shut down
if (g_bCheckingPassword || g_bShuttingDown)
return FALSE;
// If no VerifyPassword function, then no password is set or we're on NT. Either way just
// say the password was okay.
if (VerifyPassword == NULL)
return TRUE;
g_bCheckingPassword = TRUE;
if (g_pXContext != NULL)
{
IDirectDraw7* dd = g_pXContext->GetDD();
if (dd != NULL)
{
dd->FlipToGDISurface();
dd->Release();
}
}
BOOL password_okay = VerifyPassword(hWnd);
g_bCheckingPassword = FALSE;
if (!password_okay)
SetCursor(NULL);
g_dwMouseMoveCount = 0;
return password_okay;
}
//***************************************************************************************
LONG DefDXScreenSaverProc(HWND hWnd , UINT message , WPARAM wParam , LPARAM lParam)
{
switch (message)
{
case WM_CREATE:
if (!InitD3D(hWnd))
return -1;
if (!ScreenSaverInit())
return -1;
g_bWait = FALSE;
break;
case WM_DESTROY:
ScreenSaverShutdown();
KillD3D();
PostQuitMessage(0);
g_bWait = TRUE;
break;
case WM_SETCURSOR:
SetCursor(NULL);
return TRUE;
case WM_CHAR:
if (g_bIsTest)
DestroyWindow(hWnd);
else if (!g_bIsPreview)
PostMessage(hWnd , WM_CLOSE , 0 , 0);
break;
case WM_PAINT:
{
PAINTSTRUCT ps;
BeginPaint(hWnd , &ps);
EndPaint(hWnd , &ps);
return 0;
}
case WM_ERASEBKGND:
return TRUE;
case WM_MOUSEMOVE:
if (!g_bIsTest && !g_bIsPreview)
{
g_dwMouseMoveCount++;
if (g_dwMouseMoveCount >= 3)
PostMessage(hWnd , WM_CLOSE , 0 , 0);
}
break;
case WM_LBUTTONDOWN:
case WM_RBUTTONDOWN:
case WM_MBUTTONDOWN:
if (!g_bIsTest && !g_bIsPreview)
PostMessage(hWnd , WM_CLOSE , 0 , 0);
break;
case WM_CLOSE:
if (g_bIsWin9x && !g_bIsPreview)
{
if (!DoPasswordCheck(hWnd))
return FALSE;
}
break;
case WM_SYSCOMMAND:
if (!g_bIsPreview && !g_bIsTest)
{
switch (wParam)
{
case SC_NEXTWINDOW:
case SC_PREVWINDOW:
case SC_SCREENSAVE:
return FALSE;
};
}
break;
}
return DefWindowProc(hWnd , message , wParam , lParam);
}