Leaked source code of windows server 2003
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.
 
 
 
 
 
 

426 lines
10 KiB

//+--------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1996 - 1999
//
// File: module.cpp
//
// Contents: Cert Server Exit Module implementation
//
//---------------------------------------------------------------------------
#include "pch.cpp"
#pragma hdrstop
#include <assert.h>
#include "celib.h"
#include "module.h"
#include "exit.h"
extern HINSTANCE g_hInstance;
INT_PTR CALLBACK ExitSQLDlgProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam);
HRESULT
GetMachineFromConfig(
IN WCHAR const *pwszConfig,
OUT WCHAR **ppwszMachine)
{
HRESULT hr;
WCHAR *pwszMachine = NULL;
WCHAR const *pwsz;
DWORD cwc;
if (NULL != ppwszMachine)
{
*ppwszMachine = NULL;
}
while (L'\\' == *pwszConfig)
{
pwszConfig++;
}
pwsz = wcschr(pwszConfig, L'\\');
if (NULL != pwsz)
{
cwc = SAFE_SUBTRACT_POINTERS(pwsz, pwszConfig);
}
else
{
cwc = wcslen(pwszConfig);
}
pwszMachine = (WCHAR *) LocalAlloc(LMEM_FIXED, (cwc + 1) * sizeof(WCHAR));
if (NULL == pwszMachine)
{
hr = E_OUTOFMEMORY;
_JumpError(hr, error, "LocalAlloc");
}
CopyMemory(pwszMachine, pwszConfig, cwc * sizeof(WCHAR));
pwszMachine[cwc] = L'\0';
if (NULL != ppwszMachine)
{
*ppwszMachine = pwszMachine;
pwszMachine = NULL;
}
hr = S_OK;
error:
if (NULL != pwszMachine)
{
LocalFree(pwszMachine);
}
return(hr);
}
STDMETHODIMP
CCertManageExitModuleSQLSample::GetProperty(
/* [in] */ const BSTR strConfig,
/* [in] */ BSTR strStorageLocation,
/* [in] */ BSTR strPropertyName,
/* [in] */ LONG Flags,
/* [retval][out] */ VARIANT __RPC_FAR *pvarProperty)
{
LPWSTR szStr = NULL;
if (pvarProperty == NULL)
return E_POINTER;
VariantInit(pvarProperty);
if (strPropertyName == NULL)
return S_FALSE;
if (0 == _wcsicmp(strPropertyName, wszCMM_PROP_NAME))
szStr = wsz_SAMPLE_NAME;
else if (0 == _wcsicmp(strPropertyName, wszCMM_PROP_DESCRIPTION))
szStr = wsz_SAMPLE_DESCRIPTION;
else if (0 == _wcsicmp(strPropertyName, wszCMM_PROP_COPYRIGHT))
szStr = wsz_SAMPLE_COPYRIGHT;
else if (0 == _wcsicmp(strPropertyName, wszCMM_PROP_FILEVER))
szStr = wsz_SAMPLE_FILEVER;
else if (0 == _wcsicmp(strPropertyName, wszCMM_PROP_PRODUCTVER))
szStr = wsz_SAMPLE_PRODUCTVER;
else
return S_FALSE;
pvarProperty->bstrVal = SysAllocString(szStr);
if (NULL == pvarProperty->bstrVal)
return E_OUTOFMEMORY;
pvarProperty->vt = VT_BSTR;
return S_OK;
}
STDMETHODIMP
CCertManageExitModuleSQLSample::SetProperty(
/* [in] */ const BSTR strConfig,
/* [in] */ BSTR strStorageLocation,
/* [in] */ BSTR strPropertyName,
/* [in] */ LONG Flags,
/* [in] */ VARIANT const __RPC_FAR *pvarProperty)
{
if (0 == lstrcmpi(strPropertyName, wszCMM_PROP_DISPLAY_HWND))
{
if (pvarProperty->vt != VT_BSTR)
return E_INVALIDARG;
if (SysStringByteLen(pvarProperty->bstrVal) != sizeof(HWND))
return E_INVALIDARG;
// the value is stored as bytes in the bstr itself, not the bstr ptr
m_hWnd = *(HWND*)pvarProperty->bstrVal;
return S_OK;
}
return S_FALSE;
}
typedef struct _EXITSQL_CONFIGSTRUCT
{
HKEY hkeyStorageLocation;
LONG Flags;
BOOL fPageModified;
} EXITSQL_CONFIGSTRUCT, *PEXITSQL_CONFIGSTRUCT;
STDMETHODIMP
CCertManageExitModuleSQLSample::Configure(
/* [in] */ const BSTR strConfig,
/* [in] */ BSTR strStorageLocation,
/* [in] */ LONG Flags)
{
HRESULT hr;
LPWSTR szMachine = NULL;
HKEY hkeyHKLM = NULL;
DWORD dwDisposition;
EXITSQL_CONFIGSTRUCT sConfig;
ZeroMemory(&sConfig, sizeof(EXITSQL_CONFIGSTRUCT));
hr = GetMachineFromConfig(strConfig, &szMachine);
_JumpIfError(hr, Ret, "GetMachineFromConfig");
// UNDONE: only do this if remote
hr = RegConnectRegistry(
szMachine,
HKEY_LOCAL_MACHINE,
&hkeyHKLM);
_JumpIfError(hr, Ret, "RegConnectRegistry");
// open storage location: write perms if possible
hr = RegCreateKeyEx(
hkeyHKLM,
strStorageLocation,
0,
NULL,
0,
KEY_READ | KEY_WRITE,
NULL,
&sConfig.hkeyStorageLocation,
&dwDisposition);
if (hr != S_OK)
{
hr = RegOpenKeyEx(
hkeyHKLM,
strStorageLocation,
0,
KEY_READ, // fallback: read-only
&sConfig.hkeyStorageLocation);
if (hr != ERROR_SUCCESS)
goto Ret;
}
sConfig.Flags = Flags;
PROPSHEETPAGE page;
ZeroMemory(&page, sizeof(PROPSHEETPAGE));
page.dwSize = sizeof(PROPSHEETPAGE);
page.dwFlags = PSP_DEFAULT;
page.hInstance = g_hInstance;
page.lParam = (LPARAM)&sConfig;
page.pszTemplate = MAKEINTRESOURCE(IDD_EXITSQL_PROPERTIES);
page.pfnDlgProc = ExitSQLDlgProc;
PROPSHEETHEADER sSheet;
ZeroMemory(&sSheet, sizeof(PROPSHEETHEADER));
sSheet.dwSize = sizeof(PROPSHEETHEADER);
sSheet.dwFlags = PSH_PROPSHEETPAGE | PSH_PROPTITLE;
sSheet.hwndParent = m_hWnd;
sSheet.hInstance = g_hInstance;
sSheet.pszCaption = L"";
sSheet.nPages = 1;
sSheet.ppsp = &page;
// finally, invoke the modal sheet
INT_PTR iRet;
iRet = ::PropertySheet(&sSheet);
if ((iRet > 0) && (sConfig.fPageModified)) // successful modification
{
MessageBoxW(NULL, L"This action requires the Certificate Service to be restarted before taking effect.", L"Applying ExitSQL Settings", MB_OK|MB_ICONINFORMATION);
}
Ret:
if (sConfig.hkeyStorageLocation)
RegCloseKey(sConfig.hkeyStorageLocation);
if (szMachine)
LocalFree(szMachine);
if (hkeyHKLM)
RegCloseKey(hkeyHKLM);
return S_OK;
}
INT_PTR CALLBACK ExitSQLDlgProc(
HWND hwndDlg,
UINT uMsg,
WPARAM wParam,
LPARAM lParam)
{
EXITSQL_CONFIGSTRUCT* psConfig;
BOOL fReturn = FALSE;
HRESULT hr;
switch(uMsg)
{
case WM_INITDIALOG:
{
PROPSHEETPAGE* ps = (PROPSHEETPAGE *) lParam;
psConfig = (EXITSQL_CONFIGSTRUCT*)ps->lParam;
SetWindowLongPtr(hwndDlg, GWLP_USERDATA, (LPARAM)psConfig);
BYTE pbTmp[MAX_PATH*sizeof(WCHAR)];
DWORD cbTmp = MAX_PATH*sizeof(WCHAR);
DWORD dwType;
// dsn
hr = RegQueryValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_DSN,
0,
&dwType,
pbTmp,
&cbTmp);
if ((hr != ERROR_SUCCESS) || (dwType != REG_SZ))
break;
SetDlgItemText(hwndDlg, IDC_EDIT_DSN, (LPWSTR)pbTmp);
((WCHAR*)pbTmp)[0] = L'\0';
cbTmp = MAX_PATH*sizeof(WCHAR);
// username
hr = RegQueryValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_USER,
0,
&dwType,
pbTmp,
&cbTmp);
if ((hr != ERROR_SUCCESS) || (dwType != REG_SZ))
break;
SetDlgItemText(hwndDlg, IDC_EDIT_USER, (LPWSTR)pbTmp);
((WCHAR*)pbTmp)[0] = L'\0';
cbTmp = MAX_PATH*sizeof(WCHAR);
// password
hr = RegQueryValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_PASSWORD,
0,
&dwType,
pbTmp,
&cbTmp);
if ((hr != ERROR_SUCCESS) || (dwType != REG_SZ))
break;
SetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD, (LPWSTR)pbTmp);
((WCHAR*)pbTmp)[0] = L'\0';
cbTmp = MAX_PATH*sizeof(WCHAR);
psConfig->fPageModified = FALSE;
// no other work to be done
fReturn = TRUE;
break;
}
case WM_COMMAND:
switch (LOWORD(wParam))
{
case IDC_EDIT_DSN:
case IDC_EDIT_USER:
case IDC_EDIT_PASSWORD:
if (HIWORD(wParam) == EN_CHANGE)
{
// grab our LParam
psConfig = (EXITSQL_CONFIGSTRUCT*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
if (psConfig == NULL)
break;
psConfig->fPageModified = TRUE;
}
break;
default:
break;
}
break;
case WM_NOTIFY:
switch( ((LPNMHDR)lParam) -> code)
{
case PSN_APPLY:
{
hr = S_OK;
// grab our LParam
psConfig = (EXITSQL_CONFIGSTRUCT*)GetWindowLongPtr(hwndDlg, GWLP_USERDATA);
if (psConfig == NULL)
break;
WCHAR szTmp[MAX_PATH];
GetDlgItemText(hwndDlg, IDC_EDIT_DSN, szTmp, sizeof(szTmp));
hr = RegSetValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_DSN,
0,
REG_SZ,
(PBYTE)&szTmp,
(wcslen(szTmp)+1) * sizeof(WCHAR) );
if (hr != ERROR_SUCCESS)
goto savefailure;
GetDlgItemText(hwndDlg, IDC_EDIT_USER, szTmp, sizeof(szTmp));
hr = RegSetValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_USER,
0,
REG_SZ,
(PBYTE)&szTmp,
(wcslen(szTmp)+1) * sizeof(WCHAR) );
if (hr != ERROR_SUCCESS)
goto savefailure;
GetDlgItemText(hwndDlg, IDC_EDIT_PASSWORD, szTmp, sizeof(szTmp));
hr = RegSetValueEx(
psConfig->hkeyStorageLocation,
wszREG_EXITSQL_PASSWORD,
0,
REG_SZ,
(PBYTE)&szTmp,
(wcslen(szTmp)+1) * sizeof(WCHAR) );
if (hr != ERROR_SUCCESS)
goto savefailure;
savefailure:
if (hr != ERROR_SUCCESS)
{
MessageBoxW(NULL, L"The settings could not be saved.", L"Applying ExitSQL Settings", MB_OK|MB_ICONINFORMATION);
psConfig->fPageModified = FALSE;
}
}
break;
default:
break;
}
break;
default:
break;
}
return fReturn;
}