summaryrefslogtreecommitdiffstats
path: root/private/oleutest/act/tstsvc/reg.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'private/oleutest/act/tstsvc/reg.cxx')
-rw-r--r--private/oleutest/act/tstsvc/reg.cxx859
1 files changed, 859 insertions, 0 deletions
diff --git a/private/oleutest/act/tstsvc/reg.cxx b/private/oleutest/act/tstsvc/reg.cxx
new file mode 100644
index 000000000..74cc6e4a1
--- /dev/null
+++ b/private/oleutest/act/tstsvc/reg.cxx
@@ -0,0 +1,859 @@
+//
+// 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;
+}
+