Source code of Windows XP (NT5)
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.
 
 
 
 
 
 

329 lines
6.9 KiB

#include <objbase.h>
#include "SyncHndl.h"
#include "reg.h"
// file contains registration and helper reg routines for handlers
// export for how Rundll32 calls us
EXTERN_C void WINAPI RunDllRegister(HWND hwnd,
HINSTANCE hAppInstance,
LPSTR pszCmdLine,
int nCmdShow)
{
DllRegisterServer();
}
/*F+F++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function: SetRegKeyValue
Summary: Internal utility function to set a Key, Subkey, and value
in the system Registry under HKEY_CLASSES_ROOT.
Args: LPTSTR pszKey,
LPTSTR pszSubkey,
LPTSTR pszValue)
Returns: BOOL
TRUE if success; FALSE if not.
------------------------------------------------------------------------F-F*/
BOOL SetRegKeyValue(
HKEY hKeyTop,
LPTSTR pszKey,
LPTSTR pszSubkey,
LPTSTR pszValue)
{
BOOL bOk = FALSE;
LONG ec;
HKEY hKey;
TCHAR szKey[MAX_STRING_LENGTH];
lstrcpy(szKey, pszKey);
if (NULL != pszSubkey)
{
lstrcat(szKey, TEXT("\\"));
lstrcat(szKey, pszSubkey);
}
ec = RegCreateKeyEx(
hKeyTop,
szKey,
0,
NULL,
REG_OPTION_NON_VOLATILE,
KEY_ALL_ACCESS,
NULL,
&hKey,
NULL);
if (NULL != pszValue && ERROR_SUCCESS == ec)
{
ec = RegSetValueEx(
hKey,
NULL,
0,
REG_SZ,
(BYTE *)pszValue,
(lstrlen(pszValue)+1)*sizeof(TCHAR));
if (ERROR_SUCCESS == ec)
bOk = TRUE;
RegCloseKey(hKey);
}
return bOk;
}
// get the regKeyvalue,
LRESULT GetRegKeyValue(HKEY hkeyParent, PCSTR pcszSubKey,
PCSTR pcszValue, PDWORD pdwValueType,
PBYTE pbyteBuf, PDWORD pdwcbBufLen)
{
LONG lResult;
HKEY hkeySubKey;
lResult = RegOpenKeyEx(hkeyParent, pcszSubKey, 0, KEY_QUERY_VALUE,
&hkeySubKey);
if (lResult == ERROR_SUCCESS)
{
LONG lResultClose;
lResult = RegQueryValueEx(hkeySubKey, pcszValue, NULL, pdwValueType,
pbyteBuf, pdwcbBufLen);
lResultClose = RegCloseKey(hkeySubKey);
if (lResult == ERROR_SUCCESS)
lResult = lResultClose;
}
return(lResult);
}
/*F+F++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Function: AddRegNamedValue
Summary: Internal utility function to add a named data value to an
existing Key (with optional Subkey) in the system Registry
under HKEY_CLASSES_ROOT.
Args: LPTSTR pszKey,
LPTSTR pszSubkey,
LPTSTR pszValueName,
LPTSTR pszValue)
Returns: BOOL
TRUE if success; FALSE if not.
------------------------------------------------------------------------F-F*/
BOOL AddRegNamedValue(
LPTSTR pszKey,
LPTSTR pszSubkey,
LPTSTR pszValueName,
LPTSTR pszValue)
{
BOOL bOk = FALSE;
LONG ec;
HKEY hKey;
TCHAR szKey[MAX_STRING_LENGTH];
lstrcpy(szKey, pszKey);
if (NULL != pszSubkey)
{
lstrcat(szKey, TEXT("\\"));
lstrcat(szKey, pszSubkey);
}
ec = RegOpenKeyEx(
HKEY_CLASSES_ROOT,
szKey,
0,
KEY_ALL_ACCESS,
&hKey);
if (NULL != pszValue && ERROR_SUCCESS == ec)
{
ec = RegSetValueEx(
hKey,
pszValueName,
0,
REG_SZ,
(BYTE *)pszValue,
(lstrlen(pszValue)+1)*sizeof(TCHAR));
if (ERROR_SUCCESS == ec)
bOk = TRUE;
RegCloseKey(hKey);
}
return bOk;
}
#define HANDLERITEMSKEY TEXT("\\HandlerItems")
// routines for storing and retreiving an ItemID associate with a CLSID and TextString
// if the item isn't found an fCreateKey is true the key will be created for the item.
STDMETHODIMP GetItemIdForHandlerItem(CLSID CLSIDServer,WCHAR *pszItemText,SYNCMGRITEMID *ItemID,BOOL fCreateKey)
{
#ifndef _UNICODE
WCHAR wszID[GUID_SIZE+1];
TCHAR wszItemText[GUID_SIZE+1];
WCHAR wszItemdID[GUID_SIZE+1];
#endif // !_UNICODE
TCHAR szID[GUID_SIZE+1];
TCHAR *pszLocalItemText = NULL;
TCHAR szCLSID[GUID_SIZE+1];
TCHAR szItemID[GUID_SIZE+1];
DWORD dwBufLenght = GUID_SIZE+1;
HRESULT lResult;
#ifdef _UNICODE
StringFromGUID2(CLSIDServer, szID, GUID_SIZE);
StringFromGUID2(ItemID, szID, GUID_SIZE);
pszLocalItemText = pszItemText;
#else
BOOL fUsedDefaultChar;
// convert clsidServer
StringFromGUID2(CLSIDServer, wszID, GUID_SIZE);
WideCharToMultiByte(CP_ACP ,0,
wszID,-1,szID,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
// convert ItemText
WideCharToMultiByte(CP_ACP ,0,
pszItemText,-1,wszItemText,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
pszLocalItemText = wszItemText;
#endif // _UNICODE
lstrcpy(szCLSID, TEXT("CLSID\\"));
lstrcat(szCLSID, szID);
lstrcat(szCLSID,HANDLERITEMSKEY);
lstrcat(szCLSID,"\\");
lstrcat(szCLSID,pszLocalItemText);
lResult = GetRegKeyValue(HKEY_CLASSES_ROOT,szCLSID,
NULL,NULL,
(PBYTE) szItemID,&dwBufLenght);
if (lResult != ERROR_SUCCESS &&
TRUE == fCreateKey)
{
lResult = CoCreateGuid(ItemID);
SetItemIdForHandlerItem(CLSIDServer,pszItemText
,*ItemID);
}
else
{
#ifdef _UNICODE
lResult = IIDFromString(szID,ItemID);
#else
MultiByteToWideChar(CP_ACP, 0,
szItemID, -1,
wszItemdID, GUID_SIZE + 1);
lResult = IIDFromString(wszItemdID,ItemID);
#endif // _UNICODE
}
return lResult;
}
// sets the ItemID info so it can be retreived later.
STDMETHODIMP SetItemIdForHandlerItem(CLSID CLSIDServer,WCHAR *pszItemText,SYNCMGRITEMID ItemID)
{
#ifndef _UNICODE
WCHAR wszID[GUID_SIZE+1];
TCHAR wszItemText[GUID_SIZE+1];
WCHAR wszItemdID[GUID_SIZE+1];
#endif // !_UNICODE
TCHAR szID[GUID_SIZE+1];
TCHAR *pszLocalItemText = NULL;
TCHAR szCLSID[GUID_SIZE+1];
TCHAR szItemID[GUID_SIZE+1];
#ifdef _UNICODE
StringFromGUID2(CLSIDServer, szID, GUID_SIZE);
StringFromGUID2(ItemID, szID, GUID_SIZE);
pszLocalItemText = pszItemText;
#else
BOOL fUsedDefaultChar;
// convert clsidServer
StringFromGUID2(CLSIDServer, wszID, GUID_SIZE);
WideCharToMultiByte(CP_ACP ,0,
wszID,-1,szID,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
// convert ItemID
StringFromGUID2(ItemID, wszItemdID, GUID_SIZE);
WideCharToMultiByte(CP_ACP ,0,
wszItemdID,-1,szItemID,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
// convert ItemText
WideCharToMultiByte(CP_ACP ,0,
pszItemText,-1,wszItemText,GUID_SIZE + 1,
NULL,&fUsedDefaultChar);
pszLocalItemText = wszItemText;
#endif // _UNICODE
lstrcpy(szCLSID, TEXT("CLSID\\"));
lstrcat(szCLSID, szID);
lstrcat(szCLSID,HANDLERITEMSKEY);
// Create entries under CLSID.
SetRegKeyValue(HKEY_CLASSES_ROOT,
szCLSID,
NULL,
"Handler Items");
SetRegKeyValue(HKEY_CLASSES_ROOT,
szCLSID,
pszLocalItemText,
szItemID);
return NOERROR;
}