118 lines
2.9 KiB
C++
118 lines
2.9 KiB
C++
//+---------------------------------------------------------------------------
|
|
//
|
|
// Microsoft Windows
|
|
// Copyright (C) Microsoft Corporation, 1993 - 2000.
|
|
//
|
|
// File: cpl.cpp
|
|
//
|
|
// Contents: Control Panel entry point (CPlApplet)
|
|
//
|
|
//----------------------------------------------------------------------------
|
|
|
|
#include "stdafx.h"
|
|
|
|
#include <regstr.h> // REGSTR_PATH_POLICIES
|
|
#include <lm.h> // NetGetJoinInformation
|
|
#include <cpl.h>
|
|
#include "resource.h"
|
|
|
|
|
|
const struct
|
|
{
|
|
LPCTSTR pszApp;
|
|
LPCTSTR pszCommand;
|
|
}
|
|
s_rgCommands[] =
|
|
{
|
|
{ TEXT("%SystemRoot%\\system32\\rundll32.exe"), TEXT("rundll32.exe \"%SystemRoot%\\system32\\netplwiz.dll\",UsersRunDll") },
|
|
{ TEXT("%SystemRoot%\\system32\\mshta.exe"), TEXT("mshta.exe \"res://%SystemRoot%\\system32\\nusrmgr.cpl/nusrmgr.hta\"") },
|
|
};
|
|
|
|
TCHAR const c_szPolicyKey[] = REGSTR_PATH_POLICIES TEXT("\\Explorer");
|
|
TCHAR const c_szPolicyVal[] = TEXT("UserPasswordsVer");
|
|
|
|
|
|
HRESULT StartUserManager(LPCTSTR pszParams)
|
|
{
|
|
TCHAR szApp[MAX_PATH];
|
|
TCHAR szCommand[MAX_PATH];
|
|
int iCommandIndex;
|
|
STARTUPINFO rgStartup = {0};
|
|
PROCESS_INFORMATION rgProcess = {0};
|
|
|
|
// Default is to use the old UI
|
|
iCommandIndex = 0;
|
|
|
|
#ifndef _WIN64
|
|
if (IsOS(OS_PERSONAL) || (IsOS(OS_PROFESSIONAL) && !IsOS(OS_DOMAINMEMBER)))
|
|
{
|
|
// Switch to the friendly UI.
|
|
iCommandIndex = 1;
|
|
}
|
|
#endif
|
|
|
|
ExpandEnvironmentStrings(s_rgCommands[iCommandIndex].pszApp, szApp, MAX_PATH);
|
|
ExpandEnvironmentStrings(s_rgCommands[iCommandIndex].pszCommand, szCommand, MAX_PATH);
|
|
|
|
if (pszParams && *pszParams != TEXT('\0'))
|
|
{
|
|
StrCatBuff(szCommand, TEXT(" "), MAX_PATH);
|
|
StrCatBuff(szCommand, pszParams, MAX_PATH);
|
|
}
|
|
|
|
rgStartup.cb = sizeof(rgStartup);
|
|
rgStartup.wShowWindow = SW_SHOWNORMAL;
|
|
|
|
if (CreateProcess(szApp,
|
|
szCommand,
|
|
NULL,
|
|
NULL,
|
|
FALSE,
|
|
0,
|
|
NULL,
|
|
NULL,
|
|
&rgStartup,
|
|
&rgProcess))
|
|
{
|
|
WaitForInputIdle( rgProcess.hProcess, 10000 );
|
|
CloseHandle( rgProcess.hProcess );
|
|
CloseHandle( rgProcess.hThread );
|
|
return S_OK;
|
|
}
|
|
|
|
return E_FAIL;
|
|
}
|
|
|
|
|
|
LONG APIENTRY CPlApplet(HWND hwnd, UINT Msg, LPARAM lParam1, LPARAM lParam2)
|
|
{
|
|
LPCPLINFO lpCplInfo;
|
|
|
|
switch (Msg)
|
|
{
|
|
case CPL_INIT:
|
|
return TRUE;
|
|
|
|
case CPL_GETCOUNT:
|
|
return 1;
|
|
|
|
case CPL_INQUIRE:
|
|
lpCplInfo = (LPCPLINFO)lParam2;
|
|
lpCplInfo->idIcon = IDI_CPLICON;
|
|
lpCplInfo->idName = IDS_NAME;
|
|
lpCplInfo->idInfo = IDS_INFO;
|
|
lpCplInfo->lData = 0;
|
|
break;
|
|
|
|
case CPL_DBLCLK:
|
|
StartUserManager(NULL);
|
|
return TRUE;
|
|
|
|
case CPL_STARTWPARMS:
|
|
StartUserManager((LPCTSTR)lParam2);
|
|
return TRUE;
|
|
}
|
|
|
|
return 0;
|
|
}
|