725 lines
19 KiB
C++
725 lines
19 KiB
C++
|
//
|
||
|
// Microsoft Corporation 1998
|
||
|
//
|
||
|
// SNAPIN.CPP - CSnapin rountines
|
||
|
//
|
||
|
#include "main.h"
|
||
|
#include <shlwapi.h>
|
||
|
|
||
|
#define MAX_INI_SECTION_SIZE 10
|
||
|
#define MAX_OPTION_SIZE 256
|
||
|
|
||
|
#define RIGPSNAP_HELP_TOPIC L"RISconcepts.chm::/sag_RIS_CIW_Policy_and_ACLs.htm"
|
||
|
|
||
|
unsigned int CSnapIn::m_cfNodeType = RegisterClipboardFormat(CCF_NODETYPE);
|
||
|
TCHAR CSnapIn::m_szDefaultIcon[] = TEXT("mydocs.dll,0");
|
||
|
|
||
|
|
||
|
struct {
|
||
|
DWORD dwCtlIdAllow; // dialog control IDs
|
||
|
DWORD dwCtlIdDontCare; // dialog control IDs
|
||
|
DWORD dwCtlIdDeny; // dialog control IDs
|
||
|
DWORD dwValId; // string resouce ID for the option's name
|
||
|
} g_ChoiceOptions[] = {
|
||
|
{ IDC_R_AUTO_ALLOW, IDC_R_AUTO_DONTCARE, IDC_R_AUTO_DENY, IDS_AUTO },
|
||
|
{ IDC_R_CUST_ALLOW, IDC_R_CUST_DONTCARE, IDC_R_CUST_DENY, IDS_CUSTOM },
|
||
|
{ IDC_R_RESTART_ALLOW, IDC_R_RESTART_DONTCARE, IDC_R_RESTART_DENY, IDS_RESTART },
|
||
|
{ IDC_R_TOOLS_ALLOW, IDC_R_TOOLS_DONTCARE, IDC_R_TOOLS_DENY, IDS_TOOLS }
|
||
|
};
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CSnapIn object implementation
|
||
|
//
|
||
|
CSnapIn::CSnapIn(CComponentData *pComponent)
|
||
|
{
|
||
|
m_cRef = 1;
|
||
|
InterlockedIncrement(&g_cRefThisDll);
|
||
|
|
||
|
m_pcd = pComponent;
|
||
|
|
||
|
m_pConsole = NULL;
|
||
|
m_pResult = NULL;
|
||
|
m_pHeader = NULL;
|
||
|
m_pImageResult = NULL;
|
||
|
m_pConsoleVerb = NULL;
|
||
|
m_nColumnSize = 180;
|
||
|
m_lViewMode = LVS_ICON;
|
||
|
|
||
|
LoadString(g_hInstance, IDS_NAME, m_column1, sizeof(m_column1));
|
||
|
}
|
||
|
|
||
|
CSnapIn::~CSnapIn()
|
||
|
{
|
||
|
InterlockedDecrement(&g_cRefThisDll);
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CSnapIn object implementation (IUnknown)
|
||
|
//
|
||
|
|
||
|
HRESULT CSnapIn::QueryInterface (REFIID riid, void **ppv)
|
||
|
{
|
||
|
if (IsEqualIID(riid, IID_IComponent) || IsEqualIID(riid, IID_IUnknown))
|
||
|
{
|
||
|
*ppv = (LPCOMPONENT)this;
|
||
|
m_cRef++;
|
||
|
return S_OK;
|
||
|
}
|
||
|
else if (IsEqualIID(riid, IID_IExtendPropertySheet))
|
||
|
{
|
||
|
*ppv = (LPEXTENDPROPERTYSHEET)this;
|
||
|
m_cRef++;
|
||
|
return S_OK;
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
*ppv = NULL;
|
||
|
return E_NOINTERFACE;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
ULONG CSnapIn::AddRef (void)
|
||
|
{
|
||
|
return ++m_cRef;
|
||
|
}
|
||
|
|
||
|
ULONG CSnapIn::Release (void)
|
||
|
{
|
||
|
if (--m_cRef == 0) {
|
||
|
delete this;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
return m_cRef;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CSnapIn object implementation (IComponent)
|
||
|
//
|
||
|
STDMETHODIMP CSnapIn::Initialize(LPCONSOLE lpConsole)
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
|
||
|
// Save the IConsole pointer
|
||
|
m_pConsole = lpConsole;
|
||
|
m_pConsole->AddRef();
|
||
|
|
||
|
hr = m_pConsole->QueryInterface(IID_IHeaderCtrl,
|
||
|
reinterpret_cast<void**>(&m_pHeader));
|
||
|
|
||
|
// Give the console the header control interface pointer
|
||
|
if (SUCCEEDED(hr))
|
||
|
m_pConsole->SetHeader(m_pHeader);
|
||
|
|
||
|
m_pConsole->QueryInterface(IID_IResultData,
|
||
|
reinterpret_cast<void**>(&m_pResult));
|
||
|
|
||
|
hr = m_pConsole->QueryResultImageList(&m_pImageResult);
|
||
|
|
||
|
hr = m_pConsole->QueryConsoleVerb(&m_pConsoleVerb);
|
||
|
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::Destroy(MMC_COOKIE cookie)
|
||
|
{
|
||
|
|
||
|
if (m_pConsole != NULL)
|
||
|
{
|
||
|
m_pConsole->SetHeader(NULL);
|
||
|
m_pConsole->Release();
|
||
|
m_pConsole = NULL;
|
||
|
}
|
||
|
|
||
|
if (m_pHeader != NULL)
|
||
|
{
|
||
|
m_pHeader->Release();
|
||
|
m_pHeader = NULL;
|
||
|
}
|
||
|
if (m_pResult != NULL)
|
||
|
{
|
||
|
m_pResult->Release();
|
||
|
m_pResult = NULL;
|
||
|
}
|
||
|
if (m_pImageResult != NULL)
|
||
|
{
|
||
|
m_pImageResult->Release();
|
||
|
m_pImageResult = NULL;
|
||
|
}
|
||
|
|
||
|
if (m_pConsoleVerb != NULL)
|
||
|
{
|
||
|
m_pConsoleVerb->Release();
|
||
|
m_pConsoleVerb = NULL;
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::Notify(LPDATAOBJECT lpDataObject, MMC_NOTIFY_TYPE event, LPARAM arg, LPARAM param)
|
||
|
{
|
||
|
HRESULT hr = S_OK;
|
||
|
|
||
|
switch(event)
|
||
|
{
|
||
|
case MMCN_CONTEXTHELP:
|
||
|
{
|
||
|
IDisplayHelp * phelp = NULL;
|
||
|
hr = m_pConsole->QueryInterface( IID_IDisplayHelp,
|
||
|
(void **)&phelp );
|
||
|
if (SUCCEEDED( hr ))
|
||
|
{
|
||
|
phelp->ShowTopic ( RIGPSNAP_HELP_TOPIC );
|
||
|
}
|
||
|
if ( phelp != NULL )
|
||
|
{
|
||
|
phelp->Release();
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MMCN_DBLCLICK:
|
||
|
hr = S_FALSE;
|
||
|
break;
|
||
|
|
||
|
case MMCN_ADD_IMAGES:
|
||
|
HBITMAP hbmp16x16;
|
||
|
HBITMAP hbmp32x32;
|
||
|
|
||
|
hbmp16x16 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_16x16));
|
||
|
hbmp32x32 = LoadBitmap(g_hInstance, MAKEINTRESOURCE(IDB_32x32));
|
||
|
|
||
|
if (hbmp16x16 && hbmp32x32) {
|
||
|
// Set the images
|
||
|
m_pImageResult->ImageListSetStrip(reinterpret_cast<PLONG_PTR>(hbmp16x16),
|
||
|
reinterpret_cast<PLONG_PTR>(hbmp32x32),
|
||
|
0, RGB(255, 0, 255));
|
||
|
}
|
||
|
|
||
|
if (hbmp16x16) {
|
||
|
DeleteObject(hbmp16x16);
|
||
|
}
|
||
|
|
||
|
if (hbmp32x32) {
|
||
|
DeleteObject(hbmp32x32);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case MMCN_SHOW:
|
||
|
if (arg == TRUE)
|
||
|
{
|
||
|
RESULTDATAITEM resultItem;
|
||
|
LPGPTDATAOBJECT pGPTDataObject;
|
||
|
MMC_COOKIE cookie;
|
||
|
INT i;
|
||
|
|
||
|
//
|
||
|
// Get the cookie of the scope pane item
|
||
|
//
|
||
|
|
||
|
hr = lpDataObject->QueryInterface(IID_IGPTDataObject, (LPVOID *)&pGPTDataObject);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
return S_OK;
|
||
|
|
||
|
hr = pGPTDataObject->GetCookie(&cookie);
|
||
|
|
||
|
pGPTDataObject->Release(); // release initial ref
|
||
|
if (FAILED(hr))
|
||
|
return S_OK;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Prepare the view
|
||
|
//
|
||
|
|
||
|
m_pHeader->InsertColumn(0, m_column1, LVCFMT_LEFT, m_nColumnSize);
|
||
|
m_pResult->SetViewMode(m_lViewMode);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Add result pane items for this node
|
||
|
//
|
||
|
|
||
|
for (i = 0; i < g_NameSpace[cookie].cResultItems; i++)
|
||
|
{
|
||
|
resultItem.mask = RDI_STR | RDI_IMAGE | RDI_PARAM;
|
||
|
resultItem.str = MMC_CALLBACK;
|
||
|
resultItem.nImage = g_NameSpace[cookie].pResultItems[i].iImage;
|
||
|
resultItem.lParam = (LPARAM) &g_NameSpace[cookie].pResultItems[i];
|
||
|
m_pResult->InsertItem(&resultItem);
|
||
|
}
|
||
|
|
||
|
//m_pResult->Sort(0, 0, -1);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
m_pHeader->GetColumnWidth(0, &m_nColumnSize);
|
||
|
m_pResult->GetViewMode(&m_lViewMode);
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
|
||
|
case MMCN_SELECT:
|
||
|
|
||
|
if (m_pConsoleVerb)
|
||
|
{
|
||
|
LPRESULTITEM pItem;
|
||
|
LPGPTDATAOBJECT pGPTDataObject;
|
||
|
DATA_OBJECT_TYPES type;
|
||
|
MMC_COOKIE cookie;
|
||
|
|
||
|
//
|
||
|
// Set the default verb to open
|
||
|
//
|
||
|
|
||
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_OPEN);
|
||
|
|
||
|
|
||
|
//
|
||
|
// See if this is one of our items.
|
||
|
//
|
||
|
|
||
|
hr = lpDataObject->QueryInterface(IID_IGPTDataObject, (LPVOID *)&pGPTDataObject);
|
||
|
|
||
|
if (FAILED(hr))
|
||
|
break;
|
||
|
|
||
|
pGPTDataObject->GetType(&type);
|
||
|
pGPTDataObject->GetCookie(&cookie);
|
||
|
|
||
|
pGPTDataObject->Release();
|
||
|
|
||
|
|
||
|
//
|
||
|
// If this is a result pane item or the root of the namespace
|
||
|
// nodes, enable the Properties menu item
|
||
|
//
|
||
|
|
||
|
if ((type == CCT_RESULT) || ((type == CCT_SCOPE) && (cookie == 0)))
|
||
|
{
|
||
|
m_pConsoleVerb->SetVerbState(MMC_VERB_PROPERTIES, ENABLED, TRUE);
|
||
|
|
||
|
|
||
|
//
|
||
|
// If this is a result pane item, then change the default
|
||
|
// verb to Properties.
|
||
|
//
|
||
|
|
||
|
if (type == CCT_RESULT)
|
||
|
m_pConsoleVerb->SetDefaultVerb(MMC_VERB_PROPERTIES);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
default:
|
||
|
hr = E_UNEXPECTED;
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::GetDisplayInfo(LPRESULTDATAITEM pResult)
|
||
|
{
|
||
|
if (pResult)
|
||
|
{
|
||
|
if (pResult->bScopeItem == TRUE)
|
||
|
{
|
||
|
if (pResult->mask & RDI_STR)
|
||
|
{
|
||
|
if (pResult->nCol == 0)
|
||
|
pResult->str = g_NameSpace[pResult->lParam].szDisplayName;
|
||
|
else
|
||
|
pResult->str = L"";
|
||
|
}
|
||
|
|
||
|
if (pResult->mask & RDI_IMAGE)
|
||
|
{
|
||
|
pResult->nImage = 0;
|
||
|
}
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
if (pResult->mask & RDI_STR)
|
||
|
{
|
||
|
if (pResult->nCol == 0)
|
||
|
{
|
||
|
LPRESULTITEM lpResultItem = (LPRESULTITEM)pResult->lParam;
|
||
|
|
||
|
if (lpResultItem->szDisplayName[0] == TEXT('\0'))
|
||
|
{
|
||
|
LoadString (g_hInstance, lpResultItem->iStringID,
|
||
|
lpResultItem->szDisplayName,
|
||
|
MAX_DISPLAYNAME_SIZE);
|
||
|
}
|
||
|
|
||
|
pResult->str = lpResultItem->szDisplayName;
|
||
|
}
|
||
|
|
||
|
if (pResult->str == NULL)
|
||
|
pResult->str = (LPOLESTR)L"";
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::QueryDataObject(MMC_COOKIE cookie, DATA_OBJECT_TYPES type, LPDATAOBJECT *ppDataObject)
|
||
|
{
|
||
|
return m_pcd->QueryDataObject(cookie, type, ppDataObject);
|
||
|
}
|
||
|
|
||
|
|
||
|
STDMETHODIMP CSnapIn::GetResultViewType(MMC_COOKIE cookie, LPOLESTR *ppViewType,
|
||
|
LONG *pViewOptions)
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::CompareObjects(LPDATAOBJECT lpDataObjectA, LPDATAOBJECT lpDataObjectB)
|
||
|
{
|
||
|
HRESULT hr = S_FALSE;
|
||
|
LPGPTDATAOBJECT pGPTDataObjectA, pGPTDataObjectB;
|
||
|
MMC_COOKIE cookie1, cookie2;
|
||
|
|
||
|
|
||
|
if (lpDataObjectA == NULL || lpDataObjectB == NULL)
|
||
|
return E_POINTER;
|
||
|
|
||
|
//
|
||
|
// QI for the private GPTDataObject interface
|
||
|
//
|
||
|
|
||
|
if (FAILED(lpDataObjectA->QueryInterface(IID_IGPTDataObject,
|
||
|
(LPVOID *)&pGPTDataObjectA)))
|
||
|
{
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
|
||
|
if (FAILED(lpDataObjectB->QueryInterface(IID_IGPTDataObject,
|
||
|
(LPVOID *)&pGPTDataObjectB)))
|
||
|
{
|
||
|
pGPTDataObjectA->Release();
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
pGPTDataObjectA->GetCookie(&cookie1);
|
||
|
pGPTDataObjectB->GetCookie(&cookie2);
|
||
|
|
||
|
if (cookie1 == cookie2)
|
||
|
{
|
||
|
hr = S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
pGPTDataObjectA->Release();
|
||
|
pGPTDataObjectB->Release();
|
||
|
|
||
|
return hr;
|
||
|
}
|
||
|
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CComponentData object implementation (IExtendPropertySheet)
|
||
|
//
|
||
|
STDMETHODIMP CSnapIn::CreatePropertyPages(LPPROPERTYSHEETCALLBACK lpProvider,
|
||
|
LONG_PTR handle, LPDATAOBJECT lpDataObject)
|
||
|
|
||
|
{
|
||
|
HRESULT hr;
|
||
|
PROPSHEETPAGE psp;
|
||
|
HPROPSHEETPAGE hPage[2];
|
||
|
LPGPTDATAOBJECT pGPTDataObject;
|
||
|
LPRESULTITEM pItem;
|
||
|
MMC_COOKIE cookie;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Make sure this is one of our objects
|
||
|
//
|
||
|
|
||
|
if (FAILED(lpDataObject->QueryInterface(IID_IGPTDataObject,
|
||
|
(LPVOID *)&pGPTDataObject)))
|
||
|
{
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Get the cookie
|
||
|
//
|
||
|
|
||
|
pGPTDataObject->GetCookie(&cookie);
|
||
|
pGPTDataObject->Release();
|
||
|
|
||
|
|
||
|
pItem = (LPRESULTITEM)cookie;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Initialize the common fields in the property sheet structure
|
||
|
//
|
||
|
|
||
|
psp.dwSize = sizeof(PROPSHEETPAGE);
|
||
|
psp.dwFlags = 0;
|
||
|
psp.hInstance = g_hInstance;
|
||
|
psp.lParam = (LPARAM) this;
|
||
|
|
||
|
|
||
|
//
|
||
|
// Do the page specific stuff
|
||
|
//
|
||
|
|
||
|
switch (pItem->dwID)
|
||
|
{
|
||
|
case 2:
|
||
|
psp.pszTemplate = MAKEINTRESOURCE(IDD_SCREEN);
|
||
|
psp.pfnDlgProc = ChoiceDlgProc;
|
||
|
|
||
|
hPage[0] = CreatePropertySheetPage(&psp);
|
||
|
|
||
|
if (hPage[0])
|
||
|
{
|
||
|
hr = lpProvider->AddPage(hPage[0]);
|
||
|
}
|
||
|
else
|
||
|
{
|
||
|
DebugMsg((DM_WARNING, TEXT("CSnapIn::CreatePropertyPages: Failed to create property sheet page with %d."),
|
||
|
GetLastError()));
|
||
|
hr = E_FAIL;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
|
||
|
return (hr);
|
||
|
}
|
||
|
|
||
|
STDMETHODIMP CSnapIn::QueryPagesFor(LPDATAOBJECT lpDataObject)
|
||
|
{
|
||
|
LPGPTDATAOBJECT pGPTDataObject;
|
||
|
DATA_OBJECT_TYPES type;
|
||
|
|
||
|
if (SUCCEEDED(lpDataObject->QueryInterface(IID_IGPTDataObject,
|
||
|
(LPVOID *)&pGPTDataObject)))
|
||
|
{
|
||
|
pGPTDataObject->GetType(&type);
|
||
|
pGPTDataObject->Release();
|
||
|
|
||
|
if (type == CCT_RESULT)
|
||
|
return S_OK;
|
||
|
}
|
||
|
|
||
|
return S_FALSE;
|
||
|
}
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// CSnapIn object implementation (Internal functions)
|
||
|
//
|
||
|
|
||
|
INT_PTR CALLBACK CSnapIn::ReadmeDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
return FALSE;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK CSnapIn::_CreateDirectoryIfNeeded( LPOLESTR pszPath )
|
||
|
{
|
||
|
BOOL b = FALSE;
|
||
|
LPOLESTR psz = &pszPath[ wcslen( pszPath ) ];
|
||
|
DWORD dwErr;
|
||
|
|
||
|
while ( psz = StrRChr( pszPath, psz, L'\\' ) )
|
||
|
{
|
||
|
WCHAR tmp = *psz; // save
|
||
|
*psz = L'\0'; // terminate
|
||
|
b = CreateDirectory( pszPath, NULL );
|
||
|
*psz = tmp; // restore
|
||
|
|
||
|
if (b)
|
||
|
{ // success in creating directory
|
||
|
psz++;
|
||
|
while ( psz = StrChr( psz, L'\\' ) )
|
||
|
{
|
||
|
WCHAR tmp = *psz; // save
|
||
|
*psz = L'\0'; // terminate
|
||
|
b = CreateDirectory( pszPath, NULL );
|
||
|
*psz = tmp; // restore
|
||
|
|
||
|
if ( !b )
|
||
|
{
|
||
|
dwErr = GetLastError();
|
||
|
break;
|
||
|
}
|
||
|
psz++;
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
// else failed... keep backing up
|
||
|
dwErr = GetLastError();
|
||
|
psz--;
|
||
|
}
|
||
|
|
||
|
return b;
|
||
|
}
|
||
|
|
||
|
INT_PTR CALLBACK CSnapIn::ChoiceDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
|
||
|
{
|
||
|
CSnapIn * pCS = (CSnapIn*) GetWindowLongPtr( hDlg, DWLP_USER );
|
||
|
static BOOL bDirty;
|
||
|
BOOL fReturn = FALSE;
|
||
|
HRESULT hr;
|
||
|
LPOLESTR pszPath = NULL;
|
||
|
|
||
|
|
||
|
if ( message == WM_INITDIALOG )
|
||
|
{
|
||
|
bDirty = FALSE;
|
||
|
pCS = (CSnapIn *) (((LPPROPSHEETPAGE)lParam)->lParam);
|
||
|
SetWindowLongPtr(hDlg, DWLP_USER, (LONG_PTR) pCS);
|
||
|
if (!pCS)
|
||
|
goto Cleanup;
|
||
|
|
||
|
pszPath = SysAllocStringByteLen( NULL, MAX_PATH * sizeof(OLECHAR) );
|
||
|
if (!pszPath)
|
||
|
goto Cleanup;
|
||
|
|
||
|
hr = pCS->m_pcd->m_pGPTInformation->GetFileSysPath( GPO_SECTION_USER, pszPath, MAX_PATH );
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
wcscat( pszPath, L"\\Microsoft\\RemoteInstall\\oscfilter.ini");
|
||
|
|
||
|
for ( INT i = 0; i < ARRAYSIZE(g_ChoiceOptions); i++ )
|
||
|
{
|
||
|
WCHAR szValue[MAX_INI_SECTION_SIZE];
|
||
|
LONG lValue = -1; // don't care
|
||
|
DWORD dw;
|
||
|
WCHAR szOption[ MAX_OPTION_SIZE ];
|
||
|
|
||
|
dw = LoadString( g_hInstance, g_ChoiceOptions[i].dwValId, szOption, ARRAYSIZE( szOption ));
|
||
|
|
||
|
dw = GetPrivateProfileString( L"Choice", szOption, L"", szValue, ARRAYSIZE( szValue ), pszPath );
|
||
|
|
||
|
if ( dw != 0 )
|
||
|
{
|
||
|
lValue = wcstol( szValue, NULL, 10 );
|
||
|
}
|
||
|
|
||
|
switch (lValue)
|
||
|
{
|
||
|
case 0: // Deny
|
||
|
Button_SetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdDeny ), BST_CHECKED );
|
||
|
break;
|
||
|
|
||
|
case 1: // Allow
|
||
|
Button_SetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdAllow ), BST_CHECKED );
|
||
|
break;
|
||
|
|
||
|
default: // don't care / unknown value
|
||
|
Button_SetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdDontCare ), BST_CHECKED );
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!pCS)
|
||
|
goto Cleanup;
|
||
|
|
||
|
switch (message)
|
||
|
{
|
||
|
case WM_HELP:
|
||
|
case WM_CONTEXTMENU:
|
||
|
{
|
||
|
MMCPropertyHelp( RIGPSNAP_HELP_TOPIC );
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_COMMAND:
|
||
|
if ( ( LOWORD(wParam) >= IDC_FIRST_RADIO_BUTTON )
|
||
|
&& ( LOWORD(wParam) <= IDC_LAST_RADIO_BUTTON ) )
|
||
|
{
|
||
|
if ( !bDirty )
|
||
|
{
|
||
|
SendMessage (GetParent(hDlg), PSM_CHANGED, (WPARAM) hDlg, 0);
|
||
|
bDirty = TRUE;
|
||
|
}
|
||
|
}
|
||
|
break;
|
||
|
|
||
|
case WM_NOTIFY:
|
||
|
switch (((NMHDR FAR*)lParam)->code)
|
||
|
{
|
||
|
case PSN_APPLY:
|
||
|
{
|
||
|
if (bDirty)
|
||
|
{
|
||
|
pszPath = SysAllocStringByteLen( NULL, MAX_PATH );
|
||
|
if (!pszPath)
|
||
|
goto Cleanup;
|
||
|
|
||
|
hr = pCS->m_pcd->m_pGPTInformation->GetFileSysPath( GPO_SECTION_USER, pszPath, MAX_PATH );
|
||
|
if (SUCCEEDED(hr))
|
||
|
{
|
||
|
wcscat( pszPath, L"\\Microsoft\\RemoteInstall\\oscfilter.ini");
|
||
|
pCS->_CreateDirectoryIfNeeded( pszPath );
|
||
|
|
||
|
for ( INT i = 0; i < ARRAYSIZE(g_ChoiceOptions); i++ )
|
||
|
{
|
||
|
DWORD dw;
|
||
|
WCHAR szOption[ MAX_OPTION_SIZE ];
|
||
|
|
||
|
dw = LoadString( g_hInstance, g_ChoiceOptions[i].dwValId, szOption, ARRAYSIZE( szOption ));
|
||
|
|
||
|
if ( Button_GetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdDeny ) ) == BST_CHECKED )
|
||
|
{
|
||
|
WritePrivateProfileString( L"Choice", szOption, L"0", pszPath );
|
||
|
}
|
||
|
|
||
|
if ( Button_GetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdAllow ) ) == BST_CHECKED )
|
||
|
{
|
||
|
WritePrivateProfileString( L"Choice", szOption, L"1", pszPath );
|
||
|
}
|
||
|
|
||
|
if ( Button_GetCheck( GetDlgItem( hDlg, g_ChoiceOptions[i].dwCtlIdDontCare ) ) == BST_CHECKED )
|
||
|
{
|
||
|
WritePrivateProfileString( L"Choice", szOption, NULL, pszPath );
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Notify the GPT manager that policy has changed
|
||
|
|
||
|
pCS->m_pcd->m_pGPTInformation->PolicyChanged( FALSE, TRUE, (GUID *)&CLSID_RIClientExtension, (GUID *)&CLSID_GPTRemoteInstall );
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// fall through...
|
||
|
|
||
|
case PSN_RESET:
|
||
|
SetWindowLongPtr (hDlg, DWLP_MSGRESULT, PSNRET_NOERROR);
|
||
|
bDirty = FALSE;
|
||
|
fReturn = TRUE;
|
||
|
break;
|
||
|
|
||
|
}
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
Cleanup:
|
||
|
if ( pszPath )
|
||
|
SysFreeString( pszPath );
|
||
|
|
||
|
return fReturn;
|
||
|
}
|