// // 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; }