566 lines
14 KiB
C++
566 lines
14 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
//
|
|
// Microsoft
|
|
//
|
|
// AlgSetup.cpp : Implementation of CAlgSetup
|
|
//
|
|
// JPDup 2001.01.01
|
|
//
|
|
|
|
//#include "pch.h"
|
|
#pragma hdrstop
|
|
|
|
#include "resource.h"
|
|
#include "htmlhelp.h"
|
|
#include "sautil.h"
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CConfirmation
|
|
//
|
|
class CConfirmation : public CDialogImpl<CConfirmation>
|
|
{
|
|
public:
|
|
CConfirmation(
|
|
LPCTSTR pszPublisher,
|
|
LPCTSTR pszProduct,
|
|
LPCTSTR pszPorts
|
|
)
|
|
{
|
|
m_pszCompany = pszPublisher;
|
|
m_pszProduct = pszProduct;
|
|
m_pszPorts = pszPorts;
|
|
|
|
}
|
|
|
|
~CConfirmation()
|
|
{
|
|
}
|
|
|
|
enum { IDD = IDD_CONFIRMATION };
|
|
|
|
BEGIN_MSG_MAP(CConfirmation)
|
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
|
COMMAND_ID_HANDLER(IDOK, OnOK)
|
|
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
|
|
MESSAGE_HANDLER(WM_NOTIFY, OnNotify)
|
|
END_MSG_MAP()
|
|
|
|
// Handler prototypes:
|
|
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
|
|
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
|
|
|
|
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
SetDlgItemText(IDC_EDIT_COMPANY, m_pszCompany);
|
|
SetDlgItemText(IDC_EDIT_PRODUCT, m_pszProduct);
|
|
SetDlgItemText(IDC_EDIT_PORTS, m_pszPorts);
|
|
|
|
return 1; // Let the system set the focus
|
|
}
|
|
|
|
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
EndDialog(wID);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
EndDialog(wID);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
|
|
if ( CID_SA_ST_ICFLink == wParam )
|
|
{
|
|
UINT nCode = ((NMHDR* )lParam)->code;
|
|
|
|
if ( NM_CLICK == nCode || NM_RETURN == nCode )
|
|
{
|
|
|
|
// one help topic per SKU,
|
|
|
|
LPWSTR pszHelpTopic = NULL;
|
|
|
|
OSVERSIONINFOEXW verInfo = {0};
|
|
ULONGLONG ConditionMask = 0;
|
|
|
|
verInfo.dwOSVersionInfoSize = sizeof(verInfo);
|
|
verInfo.wProductType = VER_NT_WORKSTATION;
|
|
verInfo.wSuiteMask = VER_SUITE_PERSONAL;
|
|
|
|
VER_SET_CONDITION(ConditionMask, VER_PRODUCT_TYPE, VER_LESS_EQUAL);
|
|
if ( 0 != VerifyVersionInfo(&verInfo, VER_PRODUCT_TYPE, ConditionMask) )
|
|
{
|
|
VER_SET_CONDITION(ConditionMask, VER_SUITENAME, VER_OR);
|
|
if ( 0 != VerifyVersionInfo(&verInfo, VER_PRODUCT_TYPE | VER_SUITENAME, ConditionMask) )
|
|
{
|
|
// personal
|
|
pszHelpTopic = TEXT("netcfg.chm::/hnw_plugin_using.htm");
|
|
}
|
|
else
|
|
{
|
|
// pro
|
|
pszHelpTopic = TEXT("netcfg.chm::/hnw_plugin_using.htm");
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// server
|
|
pszHelpTopic = TEXT("netcfg.chm::/hnw_plugin_using.htm");
|
|
|
|
}
|
|
|
|
HtmlHelp(NULL, pszHelpTopic, HH_DISPLAY_TOPIC, 0);
|
|
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
return 1;
|
|
}
|
|
|
|
|
|
ULONG_PTR m_nSHFusion;
|
|
|
|
LPCTSTR m_pszCompany;
|
|
LPCTSTR m_pszProduct;
|
|
LPCTSTR m_pszPorts;
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
// CDlgInstallError
|
|
class CDlgInstallError : public CDialogImpl<CDlgInstallError>
|
|
{
|
|
public:
|
|
CDlgInstallError(
|
|
LONG nLastError
|
|
)
|
|
{
|
|
m_nLastError = nLastError;
|
|
//SHActivateContext(&m_nSHFusion);
|
|
}
|
|
|
|
~CDlgInstallError()
|
|
{
|
|
//SHDeactivateContext(m_nSHFusion);
|
|
}
|
|
|
|
enum { IDD = IDD_INSTALLERROR };
|
|
|
|
BEGIN_MSG_MAP(CDlgInstallError)
|
|
MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
|
|
COMMAND_ID_HANDLER(IDOK, OnOK)
|
|
COMMAND_ID_HANDLER(IDCANCEL, OnCancel)
|
|
END_MSG_MAP()
|
|
// Handler prototypes:
|
|
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
|
|
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
|
|
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
|
|
|
|
LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
|
|
{
|
|
LPVOID lpMsgBuf;
|
|
|
|
FormatMessage(
|
|
FORMAT_MESSAGE_ALLOCATE_BUFFER |
|
|
FORMAT_MESSAGE_FROM_SYSTEM |
|
|
FORMAT_MESSAGE_IGNORE_INSERTS,
|
|
NULL,
|
|
m_nLastError,
|
|
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // Default language
|
|
(LPTSTR) &lpMsgBuf,
|
|
0,
|
|
NULL
|
|
);
|
|
|
|
SetDlgItemInt(IDC_EDIT_LASTERROR_CODE, m_nLastError, false);
|
|
SetDlgItemText(IDC_EDIT_LASTERROR, (LPCTSTR)lpMsgBuf);
|
|
|
|
// Free the buffer.
|
|
LocalFree( lpMsgBuf );
|
|
|
|
return 1; // Let the system set the focus
|
|
}
|
|
|
|
LRESULT OnOK(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
EndDialog(wID);
|
|
return 0;
|
|
}
|
|
|
|
LRESULT OnCancel(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled)
|
|
{
|
|
EndDialog(wID);
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// Properties
|
|
//
|
|
private:
|
|
|
|
ULONG_PTR m_nSHFusion;
|
|
LONG m_nLastError;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
STDMETHODIMP
|
|
CAlgSetup::Add(
|
|
BSTR pszProgID,
|
|
BSTR pszPublisher,
|
|
BSTR pszProduct,
|
|
BSTR pszVersion,
|
|
short nProtocol,
|
|
BSTR pszPorts
|
|
)
|
|
{
|
|
USES_CONVERSION;
|
|
LONG lRet;
|
|
|
|
//
|
|
// Open the main ALG hive
|
|
//
|
|
CRegKey RegKeyISV;
|
|
lRet = RegKeyISV.Create(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\ALG"));
|
|
|
|
if ( ERROR_SUCCESS != lRet )
|
|
{
|
|
//
|
|
// The OS is not setup correctly
|
|
// ALG hive should have been present.
|
|
//
|
|
return HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
|
|
lRet = RegKeyISV.Create(RegKeyISV, TEXT("ISV"));
|
|
if ( ERROR_SUCCESS != lRet )
|
|
{
|
|
//
|
|
// Weird we are able to create/open the parent hive but not the ISV hive
|
|
//
|
|
return HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
// Will attempt to Open/Create the ALG hive key to see if the user has ADMINI rights
|
|
// if not then we will reject the install no need to confirm the install since he can't write to the registry
|
|
//
|
|
CRegKey KeyThisAlgModule;
|
|
lRet = KeyThisAlgModule.Create(RegKeyISV, OLE2T(pszProgID));
|
|
|
|
if ( ERROR_SUCCESS != lRet )
|
|
{
|
|
|
|
CDlgInstallError DlgInstallError(lRet);
|
|
DlgInstallError.DoModal();
|
|
return HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
|
|
|
|
//
|
|
//
|
|
// Confirm that the ALG of the company/product is wanted by the user
|
|
//
|
|
//
|
|
HANDLE hActivationContext;
|
|
ULONG_PTR ulCookie;
|
|
|
|
HRESULT hrLuna = ActivateLuna(&hActivationContext, &ulCookie);
|
|
|
|
INITCOMMONCONTROLSEX CommonControlsEx;
|
|
CommonControlsEx.dwSize = sizeof(CommonControlsEx);
|
|
CommonControlsEx.dwICC = ICC_LINK_CLASS;
|
|
|
|
if(InitCommonControlsEx(&CommonControlsEx))
|
|
{
|
|
|
|
CConfirmation DlgConfirm(
|
|
OLE2T(pszPublisher),
|
|
OLE2T(pszProduct),
|
|
OLE2T(pszPorts)
|
|
);
|
|
|
|
if ( DlgConfirm.DoModal() != IDOK )
|
|
{
|
|
RegKeyISV.DeleteSubKey(OLE2T(pszProgID)); // Roll back created/test key
|
|
return S_FALSE;
|
|
}
|
|
}
|
|
|
|
if(SUCCEEDED(hrLuna))
|
|
{
|
|
DeactivateLuna(hActivationContext, ulCookie);
|
|
}
|
|
|
|
//
|
|
// Write the news ALG plugin
|
|
//
|
|
KeyThisAlgModule.SetValue( OLE2T(pszPublisher), TEXT("Publisher") );
|
|
KeyThisAlgModule.SetValue( OLE2T(pszProduct), TEXT("Product") );
|
|
KeyThisAlgModule.SetValue( OLE2T(pszVersion), TEXT("Version") );
|
|
|
|
KeyThisAlgModule.SetValue( nProtocol, TEXT("Protocol") );
|
|
KeyThisAlgModule.SetValue( OLE2T(pszPorts), TEXT("Ports") );
|
|
|
|
|
|
// This will trigger the ALG.exe to refresh his load ALG modules
|
|
RegKeyISV.SetValue(L"Enable", OLE2T(pszProgID) );
|
|
|
|
|
|
|
|
//
|
|
// Add this ALG Module to the uninstall registry key in order to appear in the "Add/Remove Program"
|
|
//
|
|
CRegKey RegKeyUninstall;
|
|
RegKeyUninstall.Open(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"));
|
|
RegKeyUninstall.Create(RegKeyUninstall, OLE2T(pszProgID));
|
|
|
|
TCHAR szDisplayName[256];
|
|
wsprintf(
|
|
szDisplayName,
|
|
TEXT("Firewall Plugin Module from %s for %s version %s"),
|
|
OLE2T(pszPublisher),
|
|
OLE2T(pszProduct),
|
|
OLE2T(pszVersion)
|
|
);
|
|
|
|
RegKeyUninstall.SetValue( szDisplayName, TEXT("DisplayName"));
|
|
|
|
|
|
|
|
//
|
|
// Setup the Add/Remove Program registry information in order to have the ALG be removed from the system
|
|
//
|
|
TCHAR szRunCommand[256];
|
|
wsprintf(
|
|
szRunCommand,
|
|
TEXT("RunDll32 %%SystemRoot%%\\system32\\hnetcfg.dll,AlgUninstall %s"),
|
|
OLE2T(pszProgID)
|
|
);
|
|
|
|
lRet = RegSetValueEx(
|
|
RegKeyUninstall, // handle to key
|
|
TEXT("UninstallString"), // value name
|
|
0, // reserved
|
|
REG_EXPAND_SZ, // value type
|
|
(const BYTE*)szRunCommand, // value data
|
|
(lstrlen(szRunCommand)+1)*sizeof(TCHAR) // size of value data
|
|
);
|
|
|
|
//RegKeyUninstall.SetValue(szRunCommand, TEXT("UninstallString"));
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
STDMETHODIMP
|
|
CAlgSetup::Remove(
|
|
BSTR pszProgID
|
|
)
|
|
{
|
|
USES_CONVERSION;
|
|
|
|
|
|
TCHAR szRegPath[MAX_PATH];
|
|
wsprintf(szRegPath,TEXT("SOFTWARE\\Microsoft\\ALG\\ISV"), OLE2T(pszProgID));
|
|
|
|
|
|
CRegKey KeyAlgISV;
|
|
|
|
|
|
//
|
|
// Open the ISV hive
|
|
//
|
|
LONG lRet = KeyAlgISV.Open(HKEY_LOCAL_MACHINE, szRegPath);
|
|
|
|
if ( ERROR_SUCCESS != lRet )
|
|
{
|
|
|
|
CDlgInstallError DlgInstallError(lRet);
|
|
DlgInstallError.DoModal();
|
|
|
|
return HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
|
|
//
|
|
// Remove the ALG plugin key
|
|
//
|
|
lRet = KeyAlgISV.DeleteSubKey(OLE2T(pszProgID));
|
|
|
|
if ( ERROR_SUCCESS != lRet && lRet != ERROR_FILE_NOT_FOUND )
|
|
{
|
|
CDlgInstallError DlgInstallError(lRet);
|
|
DlgInstallError.DoModal();
|
|
|
|
return HRESULT_FROM_WIN32(lRet);
|
|
}
|
|
|
|
|
|
// This will trigger the ALG.exe to refresh his load ALG modules
|
|
KeyAlgISV.DeleteValue(OLE2T(pszProgID) );
|
|
|
|
|
|
//
|
|
// Remove from the Add/Remove Uninstall reg key
|
|
//
|
|
CRegKey RegKeyUninstall;
|
|
RegKeyUninstall.Open(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"));
|
|
RegKeyUninstall.DeleteSubKey(OLE2T(pszProgID));
|
|
|
|
|
|
return S_OK;
|
|
}
|
|
|
|
|
|
|
|
#define SIZE_PORTS (ALG_SETUP_PORTS_LIST_BYTE_SIZE/sizeof(TCHAR))
|
|
|
|
|
|
//
|
|
//
|
|
//
|
|
bool
|
|
IsPortAlreadyAssign(
|
|
IN LPCTSTR pszPort
|
|
)
|
|
{
|
|
|
|
CRegKey RegKeyISV;
|
|
|
|
LRESULT lRet = RegKeyISV.Open(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\ALG\\ISV"), KEY_READ);
|
|
|
|
|
|
DWORD dwIndex=0;
|
|
TCHAR szAlgModuleProgID[256];
|
|
DWORD dwKeyNameSize;
|
|
LONG nRet;
|
|
|
|
|
|
bool bPortAlreadyAssign=false;
|
|
|
|
|
|
TCHAR* szPorts = new TCHAR[SIZE_PORTS];
|
|
|
|
do
|
|
{
|
|
dwKeyNameSize = 256;
|
|
|
|
nRet = RegEnumKeyEx(
|
|
RegKeyISV.m_hKey, // handle to key to enumerate
|
|
dwIndex, // subkey index
|
|
szAlgModuleProgID, // subkey name
|
|
&dwKeyNameSize, // size of subkey buffer
|
|
NULL, // reserved
|
|
NULL, // class string buffer
|
|
NULL, // size of class string buffer
|
|
NULL // last write time
|
|
);
|
|
|
|
dwIndex++;
|
|
|
|
if ( ERROR_NO_MORE_ITEMS == nRet )
|
|
break; // All items are enumerated we are done here
|
|
|
|
|
|
if ( ERROR_SUCCESS == nRet )
|
|
{
|
|
CRegKey KeyALG;
|
|
nRet = KeyALG.Open(RegKeyISV, szAlgModuleProgID, KEY_READ);
|
|
|
|
if ( ERROR_SUCCESS == nRet )
|
|
{
|
|
//
|
|
// str search to see if the port is in the ports list string
|
|
// example is 21 is in "39, 999, 21, 45"
|
|
//
|
|
|
|
ULONG nSizeOfPortsList = SIZE_PORTS;
|
|
|
|
nRet = KeyALG.QueryValue(szPorts, TEXT("Ports"), &nSizeOfPortsList);
|
|
|
|
if ( ERROR_SUCCESS == nRet )
|
|
{
|
|
if ( wcsstr(szPorts, pszPort) != NULL )
|
|
{
|
|
bPortAlreadyAssign = true;
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
} while ( ERROR_SUCCESS == nRet && bPortAlreadyAssign==false);
|
|
|
|
delete szPorts;
|
|
|
|
return bPortAlreadyAssign;
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//
|
|
//
|
|
// This
|
|
//
|
|
void CALLBACK
|
|
AlgUninstall(HWND hwnd, HINSTANCE hinst, LPSTR lpszCmdLine, int nCmdShow)
|
|
{
|
|
CComObject<CAlgSetup>* pAlgSetup;
|
|
HRESULT hr = CComObject<CAlgSetup>::CreateInstance(&pAlgSetup);
|
|
|
|
if ( SUCCEEDED(hr) )
|
|
{
|
|
TCHAR szConfirmRemove[512];
|
|
TCHAR szTitle[512];
|
|
|
|
|
|
LoadString(_Module.GetResourceInstance(), IDS_ADD_REMOVE, szTitle, 512);
|
|
LoadString(_Module.GetResourceInstance(), IDS_REMOVE_ALG_PLUGIN, szConfirmRemove, 512);
|
|
|
|
int nRet = MessageBox(
|
|
GetFocus(),
|
|
szConfirmRemove,
|
|
szTitle,
|
|
MB_YESNO|MB_ICONQUESTION
|
|
);
|
|
|
|
if ( IDYES == nRet )
|
|
{
|
|
CComBSTR bstrAlgToRemove;
|
|
bstrAlgToRemove = lpszCmdLine;
|
|
|
|
pAlgSetup->Remove(bstrAlgToRemove);
|
|
}
|
|
|
|
delete pAlgSetup;
|
|
}
|
|
}
|