windows-nt/Source/XPSP1/NT/com/oleutest/act/tstsvc/reg.cxx
2020-09-26 16:20:57 +08:00

860 lines
23 KiB
C++

//
// reg.cxx
//
#include "client.hxx"
BOOL SetPassword(WCHAR * szCID, WCHAR * szPw);
WCHAR * ServiceName = L"ActTestService";
WCHAR * ServiceDisplayName = L"ActTestService";
WCHAR * UserName = L"redmond\\oleuser";
WCHAR * Password = L"stocksplit";
long InitializeRegistryForLocal()
{
SYSTEM_INFO SystemInfo;
long RegStatus;
ulong Disposition;
HKEY hInterface;
HKEY hClsidKey;
HKEY hActKey;
HKEY hActValueKey;
WCHAR Path[256];
//
// Get CLASSES_ROOT.
//
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"CLSID",
0,
KEY_ALL_ACCESS,
&hClsidKey );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// Local CLSID entries.
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActLocalString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hActKey,
L"LocalServer32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActValueKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"actsrv.exe 2" );
RegStatus = RegSetValueEx(
hActValueKey,
L"",
0,
REG_SZ,
(const BYTE *)Path,
(wcslen(Path) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActLocalString,
(wcslen(ClsidActLocalString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActLocalString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
return ERROR_SUCCESS;
}
long InitializeRegistryForInproc()
{
SYSTEM_INFO SystemInfo;
long RegStatus;
ulong Disposition;
HKEY hInterface;
HKEY hClsidKey;
HKEY hActKey;
HKEY hActValueKey;
WCHAR Path[256];
//
// Get CLASSES_ROOT.
//
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"CLSID",
0,
KEY_ALL_ACCESS,
&hClsidKey );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// Local CLSID entries.
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActInprocString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
// if ( Disposition == REG_OPENED_EXISTING_KEY )
// return TRUE;
RegStatus = RegCreateKeyEx(
hActKey,
L"InprocServer32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActValueKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"actsrvd.dll" );
RegStatus = RegSetValueEx(
hActValueKey,
L"",
0,
REG_SZ,
(const BYTE *)Path,
(wcslen(Path) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActValueKey,
L"ThreadingModel",
0,
REG_SZ,
(const BYTE *)L"Both",
(wcslen(L"Both") + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
return ERROR_SUCCESS;
}
WCHAR * StringIidIGoober = L"{ffffffff-0000-0000-0000-000000000000}";
long InitializeRegistryForCustom()
{
SYSTEM_INFO SystemInfo;
long RegStatus;
ulong Disposition;
HKEY hInterface;
HKEY hClsidKey;
HKEY hActKey;
HKEY hActValueKey;
WCHAR Path[256];
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"Interface",
0,
KEY_ALL_ACCESS,
&hInterface );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hInterface,
StringIidIGoober,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hInterface,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hInterface,
L"",
0,
REG_SZ,
(const BYTE *)L"IGoober",
(wcslen(L"IGoober") + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hInterface,
L"ProxyStubClsid32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hInterface,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hInterface,
L"",
0,
REG_SZ,
(const BYTE *)ClsidGoober32String,
(wcslen(ClsidGoober32String) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"CLSID",
0,
KEY_ALL_ACCESS,
&hClsidKey );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidGoober32String,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
// if ( Disposition == REG_OPENED_EXISTING_KEY )
// return TRUE;
RegStatus = RegCreateKeyEx(
hActKey,
L"InProcServer32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActValueKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"goober.dll" );
RegStatus = RegSetValueEx(
hActValueKey,
L"",
0,
REG_SZ,
(const BYTE *)Path,
(wcslen(Path) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
return ERROR_SUCCESS;
}
long InitializeRegistryForRemote()
{
long RegStatus;
ulong Disposition;
HKEY hClsidKey;
HKEY hAppIDKey;
HKEY hThisClsidKey;
HKEY hActKey;
HKEY hActValueKey;
WCHAR Path[256];
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"CLSID",
0,
KEY_ALL_ACCESS,
&hClsidKey );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// CLSID_ActRemote
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActRemoteString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hThisClsidKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hThisClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActRemoteString,
(wcslen(ClsidActRemoteString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActRemoteString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
HKEY_CLASSES_ROOT,
L"AppID",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hAppIDKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hAppIDKey,
ClsidActRemoteString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActKey,
L"RemoteServerName",
0,
REG_SZ,
(const BYTE *)ServerName,
(wcslen(ServerName) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// CLSID_ActAtStorage
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActAtStorageString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hThisClsidKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hThisClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActAtStorageString,
(wcslen(ClsidActAtStorageString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActAtStorageString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hAppIDKey,
ClsidActAtStorageString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActKey,
L"ActivateAtStorage",
0,
REG_SZ,
(const BYTE *)L"Y",
(wcslen(L"Y") + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// CLSID_ActRunAsLoggedOnUser
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActRunAsLoggedOnString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hThisClsidKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActRunAsLoggedOnString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hThisClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActRunAsLoggedOnString,
(wcslen(ClsidActRunAsLoggedOnString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hAppIDKey,
ClsidActRunAsLoggedOnString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActKey,
L"RemoteServerName",
0,
REG_SZ,
(const BYTE *)ServerName,
(wcslen(ServerName) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hThisClsidKey,
L"LocalServer32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActValueKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"actsrv.exe 7" );
RegStatus = RegSetValueEx(
hActValueKey,
L"",
0,
REG_SZ,
(const BYTE *)Path,
(wcslen(Path) + 1) * sizeof(WCHAR) );
RegStatus = RegSetValueEx(
hActKey,
L"RunAs",
0,
REG_SZ,
(const BYTE *)L"Interactive User",
(wcslen(L"Interactive User") + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// RunAs CLSID entries.
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActPreConfigString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hThisClsidKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hThisClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActPreConfigString,
(wcslen(ClsidActPreConfigString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActPreConfigString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hAppIDKey,
ClsidActPreConfigString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActKey,
L"RemoteServerName",
0,
REG_SZ,
(const BYTE *)ServerName,
(wcslen(ServerName) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
hThisClsidKey,
L"LocalServer32",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActValueKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"actsrv.exe 6" );
RegStatus = RegSetValueEx(
hActValueKey,
L"",
0,
REG_SZ,
(const BYTE *)Path,
(wcslen(Path) + 1) * sizeof(WCHAR) );
RegStatus = RegSetValueEx(
hActKey,
L"RunAs",
0,
REG_SZ,
(const BYTE *)UserName,
(wcslen(UserName) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if (!SetPassword(ClsidActPreConfigString, Password))
return(FALSE);
return ERROR_SUCCESS;
}
long InitializeRegistryForService()
{
long RegStatus;
ulong Disposition;
HKEY hClsidKey;
HKEY hAppIDKey;
HKEY hThisClsidKey;
HKEY hActKey;
HKEY hActValueKey;
HKEY hServices;
WCHAR Path[256];
//
// Get CLASSES_ROOT.
//
RegStatus = RegOpenKeyEx( HKEY_CLASSES_ROOT,
L"CLSID",
0,
KEY_ALL_ACCESS,
&hClsidKey );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegCreateKeyEx(
HKEY_CLASSES_ROOT,
L"AppID",
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hAppIDKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
//
// Local CLSID entries.
//
RegStatus = RegCreateKeyEx(
hClsidKey,
ClsidActServiceString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hThisClsidKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = SetAppIDSecurity( ClsidActServiceString );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hThisClsidKey,
L"AppID",
0,
REG_SZ,
(const BYTE *) ClsidActServiceString,
(wcslen(ClsidActServiceString)+1)*sizeof(WCHAR));
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
// if ( Disposition == REG_OPENED_EXISTING_KEY )
// return TRUE;
RegStatus = RegCreateKeyEx(
hAppIDKey,
ClsidActServiceString,
0,
L"REG_SZ",
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hActKey,
&Disposition );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
if ( ! GetModuleFileName( 0, Path, sizeof(Path) ) )
return RegStatus;
_wcslwr( Path );
wcscpy( wcsstr( Path, L"actclt" ), L"actsrv.exe 8" );
RegStatus = RegSetValueEx(
hActKey,
L"LocalService",
0,
REG_SZ,
(const BYTE *)ServiceName,
(wcslen(ServiceName) + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegSetValueEx(
hActKey,
L"ActivateAtStorage",
0,
REG_SZ,
(const BYTE *)L"Y",
(wcslen(L"Y") + 1) * sizeof(WCHAR) );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
RegStatus = RegOpenKeyEx( HKEY_LOCAL_MACHINE,
L"SYSTEM\\CurrentControlSet\\Services",
0,
KEY_READ,
&hServices );
if ( RegStatus != ERROR_SUCCESS )
return RegStatus;
return InstallService(Path);
}
DWORD InstallService( WCHAR * Path )
{
SC_HANDLE hManager;
SC_HANDLE hService;
hManager = OpenSCManager( NULL,
NULL,
SC_MANAGER_ALL_ACCESS );
if ( ! hManager )
{
printf( "OpenSCManager returned %d\n", GetLastError() );
return GetLastError();
}
hService = OpenService( hManager,
ServiceName,
SERVICE_ALL_ACCESS );
if ( ! hService )
{
hService = CreateService(
hManager,
ServiceName,
ServiceDisplayName,
SERVICE_ALL_ACCESS,
SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
Path,
NULL,
NULL,
NULL,
NULL,
NULL);
}
if ( ! hService )
{
printf( "CreateService returned %d\n", GetLastError() );
CloseServiceHandle(hManager);
return GetLastError();
}
CloseServiceHandle(hService);
CloseServiceHandle(hManager);
return ERROR_SUCCESS;
}