// // Copyright (C) 1997 Microsoft Corporation. All Rights Reserved. // // MODULE: w3ext.cpp // // Purpose: main file for the w3 shell extension #include "priv.h" #include // guids and com stuff #include //#include #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); }