//+--------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1997. // // File: F O L D R E G . C P P // // Contents: Register the folder class // // Notes: // // Author: jeffspr 30 Sep 1997 // //---------------------------------------------------------------------------- #include "pch.h" #pragma hdrstop #include "foldinc.h" // Standard shell\folder includes extern const WCHAR c_szNetShellDll[]; //---[ Constants ]------------------------------------------------------------ static const WCHAR* c_szShellFoldDefaultIconVal = c_szNetShellDll; static const WCHAR c_szShellFolderAttributeVal[] = L"Attributes"; static const WCHAR c_szShellFolderLocalizedString[] = L"LocalizedString"; static const WCHAR c_szShellFolderInfoTip[] = L"InfoTip"; static const WCHAR c_szShellFolderClsID[] = L"CLSID\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}"; static const WCHAR c_szShellFolder98ClsID[] = L"CLSID\\{992CFFA0-F557-101A-88EC-00DD010CCC48}"; static const WCHAR c_szShellFoldDefaultIcon[] = L"CLSID\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}\\DefaultIcon"; static const WCHAR c_szShellFoldDefaultIcon98[] = L"CLSID\\{992CFFA0-F557-101A-88EC-00DD010CCC48}\\DefaultIcon"; static const WCHAR c_szShellFolderKey[] = L"CLSID\\{7007ACC7-3202-11D1-AAD2-00805FC1270E}\\ShellFolder"; static const WCHAR c_szShellFolderKey98[] = L"CLSID\\{992CFFA0-F557-101A-88EC-00DD010CCC48}\\ShellFolder"; static const WCHAR c_szDotDun[] = L".dun"; static const WCHAR c_szDunFile[] = L"dunfile"; static const WCHAR c_szDunFileFriendlyName[] = L"Dialup Networking File"; static const WCHAR c_szDefaultIcon[] = L"DefaultIcon"; static const WCHAR c_szDunIconPath[] = L"%SystemRoot%\\system32\\netshell.dll,1"; static const WCHAR c_szShellOpenCommand[] = L"shell\\open\\command"; static const WCHAR c_szNetShellEntry[] = L"%SystemRoot%\\system32\\RUNDLL32.EXE NETSHELL.DLL,InvokeDunFile %1"; static const WCHAR c_szApplicationsNetShell[] = L"Applications\\netshell.dll"; static const WCHAR c_szNoOpenWith[] = L"NoOpenWith"; //+--------------------------------------------------------------------------- // // Function: HrRegisterFolderClass // // Purpose: Fix the registry values for the Shell entries under HKCR, // CLSID\{CLSID}. The code generated from the RGS script doesn't // support our replaceable params by default, so we'll fix // it up after the fact. // // Arguments: // (none) // // Returns: // // Author: jeffspr 23 Sep 1997 // // Notes: // HRESULT HrRegisterFolderClass() { HRESULT hr = S_OK; LONG lResult = 0; WCHAR szRegValue[MAX_PATH+1]; WCHAR szWinDir[MAX_PATH+1]; // Adjust the AppID for Local Server or Service CRegKey keyShellDefaultIcon; CRegKey keyShellFolder; if (GetSystemWindowsDirectory(szWinDir, MAX_PATH+1)) { lResult = keyShellDefaultIcon.Open(HKEY_CLASSES_ROOT, c_szShellFoldDefaultIcon); if (lResult == ERROR_SUCCESS) { wsprintfW(szRegValue, L"%s\\system32\\%s", szWinDir, c_szShellFoldDefaultIconVal); keyShellDefaultIcon.SetValue(szRegValue); keyShellDefaultIcon.Close(); lResult = keyShellFolder.Open(HKEY_CLASSES_ROOT, c_szShellFolderKey); if (lResult == ERROR_SUCCESS) { DWORD dwFlags = SFGAO_FOLDER; hr = HrRegSetValueEx(keyShellFolder, c_szShellFolderAttributeVal, REG_BINARY, (LPBYTE) &dwFlags, sizeof (dwFlags)); keyShellFolder.Close(); } // Write the MUI versions of LocalizedString & InfoTip out to the registry lResult = keyShellFolder.Open(HKEY_CLASSES_ROOT, c_szShellFolderClsID); if (lResult == ERROR_SUCCESS) { TCHAR szLocalizedString[MAX_PATH]; TCHAR szInfoTip[MAX_PATH]; wsprintf(szLocalizedString, _T("@%s\\system32\\%s,-%d"), szWinDir, c_szNetShellDll, IDS_CONFOLD_NAME); wsprintf(szInfoTip, _T("@%s\\system32\\%s,-%d"), szWinDir, c_szNetShellDll, IDS_CONFOLD_INFOTIP); hr = HrRegSetValueEx(keyShellFolder, c_szShellFolderLocalizedString, REG_SZ, (LPBYTE) &szLocalizedString, (lstrlen(szLocalizedString) + 1) * sizeof(TCHAR)); hr = HrRegSetValueEx(keyShellFolder, c_szShellFolderInfoTip, REG_SZ, (LPBYTE) &szInfoTip, (lstrlen(szInfoTip) + 1) * sizeof(TCHAR)); keyShellFolder.Close(); } lResult = keyShellFolder.Open(HKEY_CLASSES_ROOT, c_szShellFolder98ClsID); if (lResult == ERROR_SUCCESS) { TCHAR szLocalizedString[MAX_PATH]; TCHAR szInfoTip[MAX_PATH]; wsprintf(szLocalizedString, _T("@%s\\system32\\%s,-%d"), szWinDir, c_szNetShellDll, IDS_CONFOLD_NAME); wsprintf(szInfoTip, _T("@%s\\system32\\%s,-%d"), szWinDir, c_szNetShellDll, IDS_CONFOLD_INFOTIP); hr = HrRegSetValueEx(keyShellFolder, c_szShellFolderLocalizedString, REG_SZ, (LPBYTE) &szLocalizedString, (lstrlen(szLocalizedString) + 1) * sizeof(TCHAR)); hr = HrRegSetValueEx(keyShellFolder, c_szShellFolderInfoTip, REG_SZ, (LPBYTE) &szInfoTip, (lstrlen(szInfoTip) + 1) * sizeof(TCHAR)); keyShellFolder.Close(); } // added for #413840 CRegKey keyShellDefaultIcon98; CRegKey keyShellFolder98; lResult = keyShellDefaultIcon98.Open(HKEY_CLASSES_ROOT, c_szShellFoldDefaultIcon98); if (lResult == ERROR_SUCCESS) { wsprintfW(szRegValue, L"%s\\system32\\%s", szWinDir, c_szShellFoldDefaultIconVal); keyShellDefaultIcon98.SetValue(szRegValue); keyShellDefaultIcon98.Close(); } lResult = keyShellFolder98.Open(HKEY_CLASSES_ROOT, c_szShellFolderKey98); if (lResult == ERROR_SUCCESS) { DWORD dwFlags = SFGAO_FOLDER; hr = HrRegSetValueEx(keyShellFolder98, c_szShellFolderAttributeVal, REG_BINARY, (LPBYTE) &dwFlags, sizeof (dwFlags)); keyShellFolder98.Close(); } } else { // Translate LRESULT to HR // hr = HRESULT_FROM_WIN32(lResult); } } else // GetWindowsDirectory failed { hr = HrFromLastWin32Error(); } return hr; } //+--------------------------------------------------------------------------- // // Function: HrRegisterDUNFileAssociation // // Purpose: Add or upgrade the registry associate for .DUN fles // // Arguments: // (none) // // Returns: // // Author: tongl 2 Feb, 1999 // // Notes: // HRESULT HrRegisterDUNFileAssociation() { HRESULT hr = S_OK; HKEY hkeyRootDun = NULL; HKEY hkeyRootDunFile = NULL; HKEY hkeyCommand = NULL; HKEY hkeyIcon = NULL; DWORD dwDisposition; WCHAR szFriendlyTypeName[MAX_PATH+1]; // Create or open HKEY_CLASSES_ROOT\.dun hr = HrRegCreateKeyEx(HKEY_CLASSES_ROOT, c_szDotDun, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyRootDun, &dwDisposition); if (SUCCEEDED(hr)) { if (REG_CREATED_NEW_KEY == dwDisposition) { hr = HrRegSetSz(hkeyRootDun, c_szEmpty, c_szDunFile); TraceError("Error creating file association for .dun files", hr); } RegSafeCloseKey(hkeyRootDun); if (SUCCEEDED(hr)) { // create or open HKEY_CLASSES_ROOT\dunfile hr = HrRegCreateKeyEx(HKEY_CLASSES_ROOT, c_szDunFile, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyRootDunFile, &dwDisposition); if (SUCCEEDED(hr)) { // Set friendly type name hr = HrRegSetValueEx(hkeyRootDunFile, c_szEmpty, REG_SZ, (LPBYTE) c_szDunFileFriendlyName, CbOfSzAndTermSafe(c_szDunFileFriendlyName)); // trace the error TraceError("Error creating friendly name for .DUN files", hr); // Now, write MUI compliant friendly type name. wsprintf(szFriendlyTypeName, L"@%%SystemRoot%%\\system32\\%s,-%d", c_szNetShellDll, IDS_DUN_FRIENDLY_NAME); hr = HrRegSetValueEx(hkeyRootDunFile, L"FriendlyTypeName", REG_EXPAND_SZ, (LPBYTE)szFriendlyTypeName, CbOfSzAndTermSafe(szFriendlyTypeName)); // trace the error TraceError("Error creating MUI friendly name for .DUN files", hr); hr = S_OK; // Set DefaultIcon // HKEY_CLASSES_ROOT\dunfile\DefaultIcon = "%SystemRoot%\System32\netshell.dll,1" hr = HrRegCreateKeyEx(hkeyRootDunFile, c_szDefaultIcon, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyIcon, &dwDisposition); if (SUCCEEDED(hr)) { hr = HrRegSetValueEx (hkeyIcon, c_szEmpty, REG_EXPAND_SZ, (LPBYTE) c_szDunIconPath, CbOfSzAndTermSafe(c_szDunIconPath)); RegSafeCloseKey(hkeyIcon); } // trace the error TraceError("Error creating DefaultIcon for .DUN files", hr); hr = S_OK; // Set or update Command to invoke // HKEY_CLASSES_ROOT\dunfile\shell\open\command = // "%%SystemRoot%%\system32\RUNDLL32.EXE NETSHELL.DLL,RunDunImport %1" hr = HrRegCreateKeyEx(hkeyRootDunFile, c_szShellOpenCommand, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyCommand, &dwDisposition); if (SUCCEEDED(hr)) { hr = HrRegSetValueEx(hkeyCommand, c_szEmpty, REG_EXPAND_SZ, (LPBYTE) c_szNetShellEntry, CbOfSzAndTermSafe(c_szNetShellEntry)); if(SUCCEEDED(hr)) { HKEY hkeyNetShell = NULL; HRESULT hr2 = HrRegCreateKeyEx(HKEY_CLASSES_ROOT, c_szApplicationsNetShell, REG_OPTION_NON_VOLATILE, KEY_WRITE, NULL, &hkeyNetShell, &dwDisposition); if(SUCCEEDED(hr2) && (REG_CREATED_NEW_KEY == dwDisposition)) { hr2 = HrRegSetValueEx(hkeyNetShell, c_szNoOpenWith, REG_SZ, (LPBYTE) c_szEmpty, CbOfSzAndTermSafe(c_szEmpty)); } // trace the error TraceError("Error creating NoOpenWith value for .DUN files", hr2); RegSafeCloseKey(hkeyNetShell); } // trace the error TraceError("Error creating ShellCommand for .DUN files", hr); hr = S_OK; RegSafeCloseKey(hkeyCommand); } RegSafeCloseKey(hkeyRootDunFile); } } } return hr; }