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.
 
 
 
 
 
 

313 lines
10 KiB

/*
* REG.c Registry functions
*
*/
#include <windows.h>
#include <cryptdlg.h>
#include <wab.h>
#include "demand.h"
#include "data.h"
#include "reg.h"
#include "smimetst.h"
#include "receipt.h"
// Options
TCHAR szSenderEmail[CCH_OPTION_STRING] = "";
TCHAR szSenderName[CCH_OPTION_STRING] = "";
SBinary SenderEntryID = {0};
TCHAR szRecipientEmail[CCH_OPTION_STRING] = "";
TCHAR szRecipientName[CCH_OPTION_STRING] = "";
SBinary RecipientEntryID = {0};
TCHAR szOutputFile[CCH_OPTION_STRING] = "c:\\SMimeTst.eml";
TCHAR szInputFile[CCH_OPTION_STRING] = "";
CRYPT_HASH_BLOB SignHash = {0, NULL};
DWORD CMyNames = 0;
PCERT_NAME_BLOB RgMyNames = {0};
const TCHAR szRegKey[] = "Software\\Microsoft\\SMimeTest";
DWORD SaveMailListKeys(HKEY);
DWORD GetMailListKeys(HKEY);
DWORD RegSaveLong(HKEY hKey, LPTSTR szName, ULONG lData) {
DWORD dwErr;
dwErr = RegSetValueEx(hKey, szName, 0, REG_DWORD, (LPBYTE)&lData, sizeof(lData));
return(dwErr);
}
DWORD RegSaveShort(HKEY hKey, LPTSTR szName, USHORT sData) {
return(RegSaveLong(hKey, szName, (ULONG)sData));
}
DWORD RegSaveBinary(HKEY hKey, LPTSTR szName, LPBYTE pData, ULONG cbData) {
DWORD dwErr;
dwErr = RegSetValueEx(hKey, szName, 0, REG_BINARY, pData, cbData);
return(dwErr);
}
DWORD RegSaveString(HKEY hKey, LPTSTR szName, LPTSTR pszData) {
DWORD dwErr;
dwErr = RegSetValueEx(hKey, szName, 0, REG_SZ, (LPBYTE)pszData, lstrlen(pszData) + 1);
return(dwErr);
}
DWORD RegGetShort(HKEY hKey, LPTSTR szName, USHORT * psData) {
DWORD dwData = 0;
DWORD cbData = sizeof(dwData);
DWORD dwErr;
DWORD dwType = 0;
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)&dwData, &cbData);
*psData = (USHORT)dwData;
return(dwErr);
}
DWORD RegGetLong(HKEY hKey, LPTSTR szName, ULONG * plData) {
DWORD dwErr;
DWORD cbData = sizeof(*plData);
DWORD dwType = 0;
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)plData, &cbData);
return(dwErr);
}
DWORD RegGetBinary(HKEY hKey, LPTSTR szName, LPBYTE * ppData, ULONG * lpcbData) {
DWORD dwErr;
DWORD dwType = 0;
DWORD cbData = 0;
LPBYTE pData = NULL;
if (*ppData) {
LocalFree(*ppData);
*ppData = NULL;
*lpcbData = 0;
}
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, pData, &cbData);
if ((dwErr == ERROR_SUCCESS) && (cbData > 0)) {
pData = (LPBYTE)LocalAlloc(LPTR, cbData);
*lpcbData = cbData;
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, pData, lpcbData);
*ppData = pData;
}
return(dwErr);
}
DWORD RegGetString(HKEY hKey, LPTSTR szName, LPTSTR pszData) {
DWORD dwErr;
DWORD dwType = 0;
DWORD cbData = CCH_OPTION_STRING;
TCHAR szExpanded[CCH_OPTION_STRING];
dwErr = RegQueryValueEx(hKey, szName, 0, &dwType, (LPBYTE)pszData, &cbData);
if ((REG_EXPAND_SZ == dwType) && (cbData > 0)) {
ExpandEnvironmentStrings(pszData, szExpanded, cbData);
lstrcpy(pszData, szExpanded);
}
return(dwErr);
}
void SaveOptions(void) {
HKEY hKey = NULL;
DWORD dwErr;
DWORD dwDisposition;
if (! (dwErr = RegCreateKeyEx(HKEY_CURRENT_USER, szRegKey, 0, NULL, 0, KEY_WRITE, NULL, &hKey, &dwDisposition))) {
RegSaveString(hKey, "Sender Email", szSenderEmail);
RegSaveString(hKey, "Sender Name", szSenderName);
if (SenderEntryID.lpb) {
RegSaveBinary(hKey, "Sender EntryID", (LPBYTE)SenderEntryID.lpb, SenderEntryID.cb);
} else {
RegDeleteValue(hKey, "Sender EntryID");
}
RegSaveString(hKey, "Recipient Email", szRecipientEmail);
RegSaveString(hKey, "Recipient Name", szRecipientName);
if (RecipientEntryID.lpb) {
RegSaveBinary(hKey, "Recipient EntryID", (LPBYTE)RecipientEntryID.lpb, RecipientEntryID.cb);
} else {
RegDeleteValue(hKey, "Recipient EntryID");
}
RegSaveString(hKey, "Output File", szOutputFile);
RegSaveString(hKey, "Input File", szInputFile);
RegSaveBinary(hKey, "Signing Hash", SignHash.pbData, SignHash.cbData);
if (CMyNames > 0) {
CRYPT_SEQUENCE_OF_ANY any = {CMyNames, RgMyNames};
DWORD cb;
BOOL f;
LPBYTE pb;
f = CryptEncodeObjectEx(X509_ASN_ENCODING, X509_SEQUENCE_OF_ANY,
&any, CRYPT_ENCODE_ALLOC_FLAG, NULL,
&pb, &cb);
RegSaveBinary(hKey, "My Names", pb, cb);
LocalFree(pb);
}
else {
RegDeleteValue(hKey, "My Names");
}
SaveMailListKeys(hKey);
RegCloseKey(hKey);
}
}
void GetOptions(void) {
HKEY hKey = NULL;
DWORD dwErr;
if (! (dwErr = RegOpenKeyEx(HKEY_CURRENT_USER, szRegKey, 0, KEY_READ, &hKey))) {
RegGetString(hKey, "Sender Email", szSenderEmail);
RegGetString(hKey, "Sender Name", szSenderName);
RegGetBinary(hKey, "Sender EntryID", &SenderEntryID.lpb, &SenderEntryID.cb);
RegGetString(hKey, "Recipient Email", szRecipientEmail);
RegGetString(hKey, "Recipient Name", szRecipientName);
RegGetBinary(hKey, "Recipient EntryID", &RecipientEntryID.lpb, &RecipientEntryID.cb);
RegGetString(hKey, "Output File", szOutputFile);
RegGetString(hKey, "Input File", szInputFile);
RegGetBinary(hKey, "Signing Hash", &SignHash.pbData, &SignHash.cbData);
{
DWORD cb = 0;
PCRYPT_SEQUENCE_OF_ANY pany;
LPBYTE pb = NULL;
RegGetBinary(hKey, "My Names", &pb, &cb);
if (cb > 0) {
CryptDecodeObjectEx(X509_ASN_ENCODING, X509_SEQUENCE_OF_ANY,
pb, cb, CRYPT_ENCODE_ALLOC_FLAG, NULL,
&pany, &cb);
RgMyNames = (PCERT_NAME_BLOB) LocalAlloc(0, cb);
memcpy(RgMyNames, pany->rgValue, cb);
CMyNames = pany->cValue;
LocalFree(pany);
}
if (pb != NULL) LocalFree(pb);
}
GetMailListKeys(hKey);
RegCloseKey(hKey);
}
}
void CleanupOptions(void) {
if (SenderEntryID.lpb) {
LocalFree(SenderEntryID.lpb);
SenderEntryID.lpb = NULL;
}
if (RecipientEntryID.lpb) {
LocalFree(RecipientEntryID.lpb);
RecipientEntryID.lpb = NULL;
}
if (RgMyNames != NULL) {
LocalFree(RgMyNames);
RgMyNames = 0;
}
}
//// OptionsDlgProc
//
// Description: This is the dialog proc function which controls the preset
// options for a user. These options are stored in the registry code and
// are on a per-user basis.
//
BOOL OptionsDlgProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
PCCERT_CONTEXT pccert;
char rgch[256];
switch (message) {
case WM_INITDIALOG:
// Fill in the fields from the options
SetDlgItemText(hwnd, IDC_SENDER_EMAIL, szSenderEmail);
// SetDlgItemText(hwnd, IDC_SENDER_NAME, szSenderName);
SetDlgItemText(hwnd, IDC_RECIPIENT_EMAIL, szRecipientEmail);
// SetDlgItemText(hwnd, IDC_RECIPIENT_NAME, szRecipientName);
if (HCertStoreMy == NULL) {
HCertStoreMy = CertOpenStore(CERT_STORE_PROV_SYSTEM, X509_ASN_ENCODING,
NULL, CERT_SYSTEM_STORE_CURRENT_USER,
L"MY");
if (HCertStoreMy == NULL) {
break;
}
}
if (SignHash.cbData != 0) {
pccert = CertFindCertificateInStore(HCertStoreMy,
X509_ASN_ENCODING, 0,
CERT_FIND_SHA1_HASH,
&SignHash, NULL);
GetFriendlyNameOfCertA(pccert, rgch, sizeof(rgch));
SetDlgItemText(hwnd, IDC_O_CERT_NAME, rgch);
CertFreeCertificateContext(pccert);
}
if (CMyNames > 0) {
FormatNames(CMyNames, RgMyNames, hwnd, IDC_O_MY_NAMES);
}
break;
case WM_COMMAND :
switch (wParam) {
case IDOK:
GetDlgItemText(hwnd, IDC_SENDER_EMAIL, szSenderEmail, CCH_OPTION_STRING);
// GetDlgItemText(hwnd, IDC_SENDER_NAME, szSenderName, CCH_OPTION_STRING);
GetDlgItemText(hwnd, IDC_RECIPIENT_EMAIL, szRecipientEmail, CCH_OPTION_STRING);
// GetDlgItemText(hwnd, IDC_RECIPIENT_NAME, szRecipientName, CCH_OPTION_STRING);
if (!ParseNames(&CMyNames, &RgMyNames, hwnd, IDC_O_MY_NAMES)) {
return FALSE;
}
EndDialog(hwnd, 0);
break;
case IDC_O_CERT_CHOOSE:
pccert = NULL;
if (SignHash.cbData != 0) {
pccert = CertFindCertificateInStore(HCertStoreMy,
X509_ASN_ENCODING, 0,
CERT_FIND_SHA1_HASH,
&SignHash, NULL);
}
if (DoCertDialog(hwnd, "Choose Signature Certificate",
HCertStoreMy, &pccert, FILTER_NONE)) {
SignHash.pbData = RgbSignHash;
SignHash.cbData = sizeof(RgbSignHash);
CertGetCertificateContextProperty(pccert, CERT_SHA1_HASH_PROP_ID,
SignHash.pbData,
&SignHash.cbData);
GetFriendlyNameOfCertA(pccert, rgch, sizeof(rgch));
SetDlgItemText(hwnd, IDC_O_CERT_NAME, rgch);
}
CertFreeCertificateContext(pccert);
break;
default:
return(FALSE);
}
break ;
default:
return(FALSE);
}
return(TRUE);
}