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.
 
 
 
 
 
 

256 lines
7.7 KiB

//
// Copyright (C) 1997 Microsoft Corporation. All Rights Reserved.
//
// MODULE: w3ext.cpp
//
// Purpose: main file for the w3 shell extension
#include "priv.h"
#include <pudebug.h>
// guids and com stuff
#include <shlguid.h>
//#include <shlwapi.h>
#include "wrapmb.h"
#include "sink.h"
#include "eddir.h"
#include "shellext.h"
#include "tchar.h"
//
// Global variables
//
UINT g_cRefThisDll = 0; // Reference count of this DLL.
HINSTANCE g_hmodThisDll = NULL; // Handle to this DLL itself.
//---------------------------------------------------------------------------
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
if (dwReason == DLL_PROCESS_ATTACH)
{
ODS(TEXT("In DLLMain, DLL_PROCESS_ATTACH\r\n"));
g_hmodThisDll = hInstance;
}
else if (dwReason == DLL_PROCESS_DETACH)
{
ODS(TEXT("In DLLMain, DLL_PROCESS_DETACH\r\n"));
}
return 1; // ok
}
//---------------------------------------------------------------------------
STDAPI DllCanUnloadNow(void)
{
ODS(TEXT("In DLLCanUnloadNow\r\n"));
return (g_cRefThisDll == 0 ? S_OK : S_FALSE);
}
//---------------------------------------------------------------------------
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppvOut)
{
ODS(TEXT("In DllGetClassObject\r\n"));
*ppvOut = NULL;
if (IsEqualIID(rclsid, CLSID_ShellExtension))
{
CShellExtClassFactory *pcf = new CShellExtClassFactory;
return pcf->QueryInterface(riid, ppvOut);
}
return CLASS_E_CLASSNOTAVAILABLE;
}
//
// Registry Values Definitions
//
typedef struct tagVALUE_PAIR
{
HKEY hKeyBase;
BOOL fOwnKey;
BOOL fOwnValue;
LPCTSTR lpstrKey;
LPCTSTR lpstrValueName;
LPCTSTR lpstrValue; // Blank is replaced with module path
} VALUE_PAIR;
//
// Registry Entries
//
// NOTE: The table must be constructed so that sub keys are listed
// after their parents, because we delete keys in the same
// order in which they are declared here.
//
VALUE_PAIR g_aValues[] =
{
//
// Base Key DelKey DelVal Key Name Value Name Value
// ============================================================================================================================================================
{ HKEY_CLASSES_ROOT, TRUE, FALSE, _T("CLSID\\") STR_GUID _T("\\InProcServer32"), _T(""), _T("") },
{ HKEY_CLASSES_ROOT, FALSE, FALSE, _T("CLSID\\") STR_GUID _T("\\InProcServer32"), _T("ThreadingModel"), STR_THREAD_MODEL },
{ HKEY_CLASSES_ROOT, TRUE, FALSE, _T("CLSID\\") STR_GUID, _T(""), STR_NAME },
{ HKEY_CLASSES_ROOT, TRUE, FALSE, _T("Folder\\shellex\\PropertySheetHandlers\\PWS Sharing"), _T(""), STR_GUID },
{ HKEY_CLASSES_ROOT, FALSE, TRUE, _T("Folder\\shellex\\PropertySheetHandlers"), _T(""), _T("IISSEPage") },
{ HKEY_LOCAL_MACHINE, FALSE, TRUE, _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Shell Extensions\\Approved"),STR_GUID, STR_NAME },
};
#define NUM_ENTRIES (sizeof(g_aValues) / sizeof(g_aValues[0]))
//--------------------------------------------------------------------
// Auto-(un) registration Entry Point
//
STDAPI
DllUnregisterServer(void)
{
HKEY hKey;
DWORD dw;
DWORD err = ERROR_SUCCESS;
do
{
//
// Loop through the entries
//
for (int i = 0; i < NUM_ENTRIES; ++i)
{
//
// Do we own this key? If so delete the whole thing, including
// its values.
//
if (g_aValues[i].fOwnKey)
{
err = RegDeleteKey(g_aValues[i].hKeyBase, g_aValues[i].lpstrKey);
}
//
// Otherwise, do we own the value? Only delete it then
//
else if (g_aValues[i].fOwnValue)
{
// create / open the key
err = RegCreateKeyEx(
g_aValues[i].hKeyBase, // handle of an open key
g_aValues[i].lpstrKey, // address of subkey name
0, // reserved
_T(""), // address of class string
REG_OPTION_NON_VOLATILE,// special options flag
KEY_ALL_ACCESS, // desired security access
NULL, // address of key security structure
&hKey, // address of buffer for opened handle
&dw // address of disposition value buffer
);
// if we opened the key, delete the value
if ( err == ERROR_SUCCESS )
{
RegDeleteValue( hKey, g_aValues[i].lpstrValueName );
// close the registry key
RegCloseKey( hKey );
}
}
//
// If the key or value is already gone, that's ok
//
if (err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND)
{
err = ERROR_SUCCESS;
}
else
{
break;
}
}
}
while(FALSE);
return HRESULT_FROM_WIN32(err);
}
//--------------------------------------------------------------------
// Auto-registration Entry Point
//
STDAPI
DllRegisterServer(void)
{
DWORD err = ERROR_SUCCESS;
TCHAR strModulePath[MAX_PATH];
HKEY hKey;
DWORD dw;
do
{
//
// Build current module path
//
HINSTANCE hCurrent = g_hmodThisDll;
if (hCurrent == NULL)
{
err = ERROR_INVALID_HANDLE;
break;
}
if (GetModuleFileName(hCurrent, strModulePath, MAX_PATH) == 0)
{
err = GetLastError();
break;
}
//
// Loop through the entries.
// If the reg value is blank, use the module path
//
for (int i = 0; i < NUM_ENTRIES; ++i)
{
// create / open the key
if (ERROR_SUCCESS != (err = RegCreateKeyEx(
g_aValues[i].hKeyBase,
g_aValues[i].lpstrKey, // address of subkey name
0, // reserved
_T(""), // address of class string
REG_OPTION_NON_VOLATILE, // special options flag
KEY_ALL_ACCESS, // desired security access
NULL, // address of key security structure
&hKey, // address of buffer for opened handle
&dw // address of disposition value buffer
)))
{
break;
}
LPCTSTR pValue;
int len;
if (g_aValues[i].lpstrValue[0] != 0)
pValue = g_aValues[i].lpstrValue;
else
pValue = strModulePath;
len = _tcslen(pValue) * sizeof(TCHAR);
// set the value
if (ERROR_SUCCESS != (err = RegSetValueEx(hKey,
g_aValues[i].lpstrValueName,
0,
REG_SZ,
(const unsigned char *)pValue,
len)))
{
break;
}
// close the registry key
RegCloseKey( hKey );
}
}
while(FALSE);
return HRESULT_FROM_WIN32(err);
}