You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
259 lines
6.6 KiB
259 lines
6.6 KiB
//
|
|
// Copyright (C) 2000 Microsoft Corporation. All Rights Reserved.
|
|
//
|
|
//
|
|
//
|
|
//==============================================================;
|
|
#include <windows.h>
|
|
#include <objbase.h>
|
|
#include <olectl.h>
|
|
|
|
extern GUID CLSID_CTSRemotePage;
|
|
|
|
LPCWSTR g_szExtKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Controls Folder\\"
|
|
L"System\\shellex\\PropertySheetHandlers\\Remote Sessions CPL Extension";
|
|
LPCWSTR g_szApprovedKey = L"Software\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved";
|
|
const WCHAR g_szExtName[] = L"Remote Sessions CPL Extension";
|
|
|
|
//*************************************************************
|
|
//
|
|
// RegisterServer()
|
|
//
|
|
// Purpose: Register the component in the registry
|
|
//
|
|
// Parameters: hModule - handle to this dll module
|
|
//
|
|
//
|
|
// Return: S_OK if success, error code otherwise
|
|
//
|
|
// Comments:
|
|
//
|
|
// History: Date Author Comment
|
|
// 5/26/00 a-skuzin Created
|
|
// 10/27/00 skuzin Added registration of the
|
|
// component as "Approved" CPL
|
|
// extension
|
|
//
|
|
//
|
|
//*************************************************************
|
|
HRESULT
|
|
RegisterServer(HMODULE hModule)
|
|
{
|
|
// Get server location.
|
|
WCHAR szModule[MAX_PATH+1] ;
|
|
|
|
if(!GetModuleFileName(hModule, szModule, MAX_PATH))
|
|
{
|
|
return E_UNEXPECTED;
|
|
}
|
|
|
|
// Get CLSID
|
|
LPOLESTR szCLSID = NULL ;
|
|
HRESULT hr = StringFromCLSID(CLSID_CTSRemotePage, &szCLSID) ;
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
// Build the key CLSID\\{...}
|
|
LPWSTR szKey = new WCHAR[wcslen(L"CLSID\\")+wcslen(szCLSID)+1];
|
|
|
|
if(!szKey)
|
|
{
|
|
CoTaskMemFree(szCLSID);
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
wcscpy(szKey, L"CLSID\\") ;
|
|
wcscat(szKey, szCLSID) ;
|
|
|
|
HKEY hKey1,hKey2;
|
|
LONG Err, TotalErr = 0;
|
|
|
|
// Create "CLSID\{...}" key
|
|
Err = RegCreateKeyExW(HKEY_CLASSES_ROOT, szKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL);
|
|
|
|
delete szKey;
|
|
|
|
TotalErr |= Err;
|
|
|
|
if(Err == ERROR_SUCCESS )
|
|
{
|
|
Err = RegSetValueExW(hKey1, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)g_szExtName,
|
|
sizeof(g_szExtName));
|
|
|
|
TotalErr |= Err;
|
|
|
|
// Create "CLSID\{...}\InprocServer32" key
|
|
Err = RegCreateKeyExW(hKey1, L"InprocServer32", 0, NULL, 0, KEY_WRITE, NULL, &hKey2, NULL);
|
|
|
|
TotalErr |= Err;
|
|
|
|
RegCloseKey(hKey1);
|
|
|
|
if(Err == ERROR_SUCCESS)
|
|
{
|
|
Err = RegSetValueExW(hKey2, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)szModule,
|
|
(wcslen(szModule)+1)*sizeof(WCHAR));
|
|
|
|
TotalErr |= Err;
|
|
|
|
Err = RegSetValueExW(hKey2, L"ThreadingModel", 0, REG_SZ,
|
|
(CONST BYTE *)L"Apartment",
|
|
(wcslen(L"Apartment")+1)*sizeof(WCHAR));
|
|
|
|
TotalErr |= Err;
|
|
|
|
RegCloseKey(hKey2);
|
|
}
|
|
|
|
}
|
|
|
|
//Register the component as System property sheet extension
|
|
Err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, g_szExtKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL);
|
|
|
|
TotalErr |= Err;
|
|
|
|
if(Err == ERROR_SUCCESS )
|
|
{
|
|
Err = RegSetValueExW(hKey1, NULL, 0, REG_SZ,
|
|
(CONST BYTE *)szCLSID,
|
|
(wcslen(szCLSID)+1)*sizeof(WCHAR));
|
|
|
|
TotalErr |= Err;
|
|
|
|
RegCloseKey(hKey1);
|
|
}
|
|
|
|
//Make this property sheet extension "Approved"
|
|
Err = RegCreateKeyExW(HKEY_LOCAL_MACHINE, g_szApprovedKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey1, NULL);
|
|
|
|
TotalErr |= Err;
|
|
|
|
if(Err == ERROR_SUCCESS )
|
|
{
|
|
Err = RegSetValueExW(hKey1, szCLSID, 0, REG_SZ,
|
|
(CONST BYTE *)g_szExtName,
|
|
sizeof(g_szExtName));
|
|
|
|
TotalErr |= Err;
|
|
|
|
RegCloseKey(hKey1);
|
|
}
|
|
|
|
// Free memory.
|
|
CoTaskMemFree(szCLSID) ;
|
|
|
|
if( TotalErr == ERROR_SUCCESS )
|
|
{
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
}
|
|
|
|
//*************************************************************
|
|
//
|
|
// UnregisterServer()
|
|
//
|
|
// Purpose: Deletes the component registration values
|
|
// from the registry
|
|
//
|
|
// Parameters: NONE
|
|
//
|
|
//
|
|
// Return: S_OK if success, error code otherwise
|
|
//
|
|
// Comments:
|
|
//
|
|
// History: Date Author Comment
|
|
// 5/26/00 a-skuzin Created
|
|
// 10/27/00 skuzin Modifyed to reflect
|
|
// changes in RegisterServer()
|
|
//
|
|
//*************************************************************
|
|
HRESULT
|
|
UnregisterServer()
|
|
{
|
|
// Get CLSID
|
|
LPOLESTR szCLSID = NULL ;
|
|
HRESULT hr = StringFromCLSID(CLSID_CTSRemotePage, &szCLSID) ;
|
|
|
|
if(FAILED(hr))
|
|
{
|
|
return hr;
|
|
}
|
|
|
|
// Build the key CLSID\\{...}\\InprocServer32
|
|
LPWSTR szKey = new WCHAR[wcslen(L"CLSID\\")+wcslen(szCLSID)+wcslen(L"\\InprocServer32")+1];
|
|
|
|
if(!szKey)
|
|
{
|
|
CoTaskMemFree(szCLSID);
|
|
return E_OUTOFMEMORY;
|
|
}
|
|
|
|
wcscpy(szKey, L"CLSID\\");
|
|
wcscat(szKey, szCLSID);
|
|
wcscat(szKey, L"\\InprocServer32");
|
|
|
|
LONG Wrn, Err, TotalErr = ERROR_SUCCESS;
|
|
|
|
// Delete "CLSID\{...}\InprocServer32" key
|
|
Err = RegDeleteKey(HKEY_CLASSES_ROOT, szKey) ;
|
|
|
|
TotalErr |= Err;
|
|
|
|
//Try to delete "CLSID\{...}" key
|
|
//It is not an error if we cannot do this.
|
|
if(Err == ERROR_SUCCESS )
|
|
{
|
|
szKey[wcslen(szKey)-wcslen(L"\\InprocServer32")] = 0;
|
|
Wrn = RegDeleteKey(HKEY_CLASSES_ROOT, szKey);
|
|
}
|
|
|
|
delete szKey;
|
|
|
|
//Delete Property Sheet Handler registration
|
|
TotalErr |= RegDeleteKey(HKEY_LOCAL_MACHINE, g_szExtKey);
|
|
|
|
//Remove component from list of "Approved" extensions
|
|
HKEY hKey;
|
|
Err = RegOpenKeyEx(HKEY_LOCAL_MACHINE,g_szApprovedKey,0,KEY_WRITE,&hKey);
|
|
|
|
TotalErr |= Err;
|
|
|
|
if( Err == ERROR_SUCCESS )
|
|
{
|
|
TotalErr|= RegDeleteValue(hKey,szCLSID);
|
|
|
|
RegCloseKey(hKey);
|
|
}
|
|
|
|
// Free memory.
|
|
CoTaskMemFree(szCLSID);
|
|
|
|
if( TotalErr == ERROR_SUCCESS )
|
|
{
|
|
if(Wrn == ERROR_SUCCESS)
|
|
{
|
|
return S_OK;
|
|
}
|
|
else
|
|
{
|
|
//we could not delete "CLSID\{...}" key
|
|
//probably it has subkeys created by a user.
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
return SELFREG_E_CLASS;
|
|
}
|
|
}
|
|
|