257 lines
7.7 KiB
C++
257 lines
7.7 KiB
C++
//
|
|
// 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);
|
|
}
|