860 lines
23 KiB
C++
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;
|
|
}
|
|
|