| /* |
| * shpolicy.c - Data for shell/system policies. |
| * |
| * Created 1999 by Ian Schmidt <ischmidt@cfl.rr.com> |
| * |
| * Some of these policies can be tweaked via the System Policy |
| * Editor which came with the Win95 Migration Guide, although |
| * there doesn't appear to be an updated Win98 version that |
| * would handle the many new policies introduced since then. |
| * You could easily write one with the information in |
| * this file... |
| * |
| * Up to date as of SHELL32 v4.72 (Win98, Win95 with MSIE 5) |
| */ |
| |
| #include <stdlib.h> |
| #include <string.h> |
| |
| #include "windef.h" |
| #include "wingdi.h" |
| #include "winerror.h" |
| #include "winreg.h" |
| #include "debugtools.h" |
| #include "wine/winuser16.h" |
| |
| DEFAULT_DEBUG_CHANNEL(shell); |
| |
| #define SHELL_MAX_POLICIES 57 |
| |
| #define SHELL_NO_POLICY 0xffffffff |
| |
| typedef struct tagPOLICYDAT |
| { |
| DWORD polflags; /* flags value passed to SHRestricted */ |
| LPSTR appstr; /* application str such as "Explorer" */ |
| LPSTR keystr; /* name of the actual registry key / policy */ |
| DWORD cache; /* cached value or 0xffffffff for invalid */ |
| } POLICYDATA, *LPPOLICYDATA; |
| |
| //extern POLICYDATA sh32_policy_table[SHELL_MAX_POLICIES]; |
| |
| /* application strings */ |
| |
| static char strExplorer[] = {"Explorer"}; |
| static char strActiveDesk[] = {"ActiveDesktop"}; |
| static char strWinOldApp[] = {"WinOldApp"}; |
| |
| /* key strings */ |
| |
| static char strNoFileURL[] = {"NoFileUrl"}; |
| static char strNoFolderOptions[] = {"NoFolderOptions"}; |
| static char strNoChangeStartMenu[] = {"NoChangeStartMenu"}; |
| static char strNoWindowsUpdate[] = {"NoWindowsUpdate"}; |
| static char strNoSetActiveDesktop[] = {"NoSetActiveDesktop"}; |
| static char strNoForgetSoftwareUpdate[] = {"NoForgetSoftwareUpdate"}; |
| static char strNoMSAppLogo[] = {"NoMSAppLogo5ChannelNotify"}; |
| static char strForceCopyACLW[] = {"ForceCopyACLWithFile"}; |
| static char strNoResolveTrk[] = {"NoResolveTrack"}; |
| static char strNoResolveSearch[] = {"NoResolveSearch"}; |
| static char strNoEditComponent[] = {"NoEditingComponents"}; |
| static char strNoMovingBand[] = {"NoMovingBands"}; |
| static char strNoCloseDragDrop[] = {"NoCloseDragDropBands"}; |
| static char strNoCloseComponent[] = {"NoClosingComponents"}; |
| static char strNoDelComponent[] = {"NoDeletingComponents"}; |
| static char strNoAddComponent[] = {"NoAddingComponents"}; |
| static char strNoComponent[] = {"NoComponents"}; |
| static char strNoChangeWallpaper[] = {"NoChangingWallpaper"}; |
| static char strNoHTMLWallpaper[] = {"NoHTMLWallpaper"}; |
| static char strNoCustomWebView[] = {"NoCustomizeWebView"}; |
| static char strClassicShell[] = {"ClassicShell"}; |
| static char strClearRecentDocs[] = {"ClearRecentDocsOnExit"}; |
| static char strNoFavoritesMenu[] = {"NoFavoritesMenu"}; |
| static char strNoActiveDesktopChanges[] = {"NoActiveDesktopChanges"}; |
| static char strNoActiveDesktop[] = {"NoActiveDesktop"}; |
| static char strNoRecentDocMenu[] = {"NoRecentDocsMenu"}; |
| static char strNoRecentDocHistory[] = {"NoRecentDocsHistory"}; |
| static char strNoInetIcon[] = {"NoInternetIcon"}; |
| static char strNoStngsWizard[] = {"NoSettingsWizards"}; |
| static char strNoLogoff[] = {"NoLogoff"}; |
| static char strNoNetConDis[] = {"NoNetConnectDisconnect"}; |
| static char strNoContextMenu[] = {"NoViewContextMenu"}; |
| static char strNoTryContextMenu[] = {"NoTrayContextMenu"}; |
| static char strNoWebMenu[] = {"NoWebMenu"}; |
| static char strLnkResolveIgnoreLnkInfo[] = {"LinkResolveIgnoreLinkInfo"}; |
| static char strNoCommonGroups[] = {"NoCommonGroups"}; |
| static char strEnforceShlExtSecurity[] = {"EnforceShellExtensionSecurity"}; |
| static char strNoRealMode[] = {"NoRealMode"}; |
| static char strMyDocsOnNet[] = {"MyDocsOnNet"}; |
| static char strNoStartMenuSubfolder[] = {"NoStartMenuSubFolders"}; |
| static char strNoAddPrinters[] = {"NoAddPrinter"}; |
| static char strNoDeletePrinters[] = {"NoDeletePrinter"}; |
| static char strNoPrintTab[] = {"NoPrinterTabs"}; |
| static char strRestrictRun[] = {"RestrictRun"}; |
| static char strNoStartBanner[] = {"NoStartBanner"}; |
| static char strNoNetworkNeighborhood[] = {"NoNetHood"}; |
| static char strNoDriveTypeAtRun[] = {"NoDriveTypeAutoRun"}; |
| static char strNoDrivesAutoRun[] = {"NoDriveAutoRun"}; |
| static char strNoDrives[] = {"NoDrives"}; |
| static char strNoFind[] = {"NoFind"}; |
| static char strNoDesktop[] = {"NoDesktop"}; |
| static char strNoSetTaskBar[] = {"NoSetTaskbar"}; |
| static char strNoSetFld[] = {"NoSetFolders"}; |
| static char strNoFileMenu[] = {"NoFileMenu"}; |
| static char strNoSavSetng[] = {"NoSaveSettings"}; |
| static char strNoClose[] = {"NoClose"}; |
| static char strNoRun[] = {"NoRun"}; |
| |
| /* policy data array */ |
| |
| POLICYDATA sh32_policy_table[] = |
| { |
| { |
| 0x1, |
| strExplorer, |
| strNoRun, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x2, |
| strExplorer, |
| strNoClose, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4, |
| strExplorer, |
| strNoSavSetng, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x8, |
| strExplorer, |
| strNoFileMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x10, |
| strExplorer, |
| strNoSetFld, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x20, |
| strExplorer, |
| strNoSetTaskBar, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40, |
| strExplorer, |
| strNoDesktop, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x80, |
| strExplorer, |
| strNoFind, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x100, |
| strExplorer, |
| strNoDrives, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x200, |
| strExplorer, |
| strNoDrivesAutoRun, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x400, |
| strExplorer, |
| strNoDriveTypeAtRun, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x800, |
| strExplorer, |
| strNoNetworkNeighborhood, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x1000, |
| strExplorer, |
| strNoStartBanner, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x2000, |
| strExplorer, |
| strRestrictRun, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000, |
| strExplorer, |
| strNoPrintTab, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x8000, |
| strExplorer, |
| strNoDeletePrinters, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x10000, |
| strExplorer, |
| strNoAddPrinters, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x20000, |
| strExplorer, |
| strNoStartMenuSubfolder, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000, |
| strExplorer, |
| strMyDocsOnNet, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x80000, |
| strWinOldApp, |
| strNoRealMode, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x100000, |
| strExplorer, |
| strEnforceShlExtSecurity, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x200000, |
| strExplorer, |
| strLnkResolveIgnoreLnkInfo, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x400000, |
| strExplorer, |
| strNoCommonGroups, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x1000000, |
| strExplorer, |
| strNoWebMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x2000000, |
| strExplorer, |
| strNoTryContextMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000000, |
| strExplorer, |
| strNoContextMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x8000000, |
| strExplorer, |
| strNoNetConDis, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x10000000, |
| strExplorer, |
| strNoLogoff, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x20000000, |
| strExplorer, |
| strNoStngsWizard, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000001, |
| strExplorer, |
| strNoInetIcon, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000002, |
| strExplorer, |
| strNoRecentDocHistory, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000003, |
| strExplorer, |
| strNoRecentDocMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000004, |
| strExplorer, |
| strNoActiveDesktop, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000005, |
| strExplorer, |
| strNoActiveDesktopChanges, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000006, |
| strExplorer, |
| strNoFavoritesMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000007, |
| strExplorer, |
| strClearRecentDocs, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000008, |
| strExplorer, |
| strClassicShell, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000009, |
| strExplorer, |
| strNoCustomWebView, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000010, |
| strActiveDesk, |
| strNoHTMLWallpaper, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000011, |
| strActiveDesk, |
| strNoChangeWallpaper, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000012, |
| strActiveDesk, |
| strNoComponent, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000013, |
| strActiveDesk, |
| strNoAddComponent, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000014, |
| strActiveDesk, |
| strNoDelComponent, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000015, |
| strActiveDesk, |
| strNoCloseComponent, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000016, |
| strActiveDesk, |
| strNoCloseDragDrop, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000017, |
| strActiveDesk, |
| strNoMovingBand, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000018, |
| strActiveDesk, |
| strNoEditComponent, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000019, |
| strExplorer, |
| strNoResolveSearch, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001a, |
| strExplorer, |
| strNoResolveTrk, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001b, |
| strExplorer, |
| strForceCopyACLW, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001c, |
| strExplorer, |
| strNoMSAppLogo, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001d, |
| strExplorer, |
| strNoForgetSoftwareUpdate, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001e, |
| strExplorer, |
| strNoSetActiveDesktop, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x4000001f, |
| strExplorer, |
| strNoWindowsUpdate, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000020, |
| strExplorer, |
| strNoChangeStartMenu, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x40000021, |
| strExplorer, |
| strNoFolderOptions, |
| SHELL_NO_POLICY |
| }, |
| { |
| 0x50000024, |
| strExplorer, |
| strNoFileURL, |
| SHELL_NO_POLICY |
| } |
| }; |
| |
| /************************************************************************* |
| * SHRestricted [SHELL32.100] |
| * |
| * walks through policy table, queries <app> key, <type> value, returns |
| * queried (DWORD) value, and caches it between called to SHInitRestricted |
| * to prevent unnecessary registry access. |
| * |
| * NOTES |
| * exported by ordinal |
| * |
| * REFERENCES: |
| * MS System Policy Editor |
| * 98Lite 2.0 (which uses many of these policy keys) http://www.98lite.net/ |
| * "The Windows 95 Registry", by John Woram, 1996 MIS: Press |
| */ |
| DWORD WINAPI SHRestricted (DWORD pol) { |
| char regstr[256]; |
| HKEY xhkey; |
| DWORD retval, polidx, i, datsize = 4; |
| |
| TRACE("(%08lx)\n",pol); |
| |
| polidx = -1; |
| |
| /* scan to see if we know this policy ID */ |
| for (i = 0; i < SHELL_MAX_POLICIES; i++) |
| { |
| if (pol == sh32_policy_table[i].polflags) |
| { |
| polidx = i; |
| break; |
| } |
| } |
| |
| if (polidx == -1) |
| { |
| /* we don't know this policy, return 0 */ |
| TRACE("unknown policy: (%08lx)\n", pol); |
| return 0; |
| } |
| |
| /* we have a known policy */ |
| lstrcpyA(regstr, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\"); |
| lstrcatA(regstr, sh32_policy_table[polidx].appstr); |
| |
| /* first check if this policy has been cached, return it if so */ |
| if (sh32_policy_table[polidx].cache != SHELL_NO_POLICY) |
| { |
| return sh32_policy_table[polidx].cache; |
| } |
| |
| /* return 0 and don't set the cache if any registry errors occur */ |
| retval = 0; |
| if (RegOpenKeyA(HKEY_CURRENT_USER, regstr, &xhkey) == ERROR_SUCCESS) |
| { |
| if (RegQueryValueExA(xhkey, sh32_policy_table[polidx].keystr, NULL, NULL, (LPBYTE)&retval, &datsize) == ERROR_SUCCESS) |
| { |
| sh32_policy_table[polidx].cache = retval; |
| } |
| |
| RegCloseKey(xhkey); |
| } |
| |
| return retval; |
| } |
| |
| /************************************************************************* |
| * SHInitRestricted [SHELL32.244] |
| * |
| * Win98+ by-ordinal only routine called by Explorer and MSIE 4 and 5. |
| * Inits the policy cache used by SHRestricted to avoid excess |
| * registry access. |
| * |
| * INPUTS |
| * Two inputs: one is a string or NULL. If non-NULL the pointer |
| * should point to a string containing the following exact text: |
| * "Software\Microsoft\Windows\CurrentVersion\Policies". |
| * The other input is unused. |
| * |
| * NOTES |
| * If the input is non-NULL and does not point to a string containing |
| * that exact text the routine will do nothing. |
| * |
| * If the text does match or the pointer is NULL, then the routine |
| * will init SHRestricted()'s policy cache to all 0xffffffff and |
| * returns 0xffffffff as well. |
| * |
| * I haven't yet run into anything calling this with inputs other than |
| * (NULL, NULL), so I may have the inputs reversed. |
| */ |
| |
| BOOL WINAPI SHInitRestricted(LPSTR inpRegKey, LPSTR parm2) |
| { |
| int i; |
| |
| TRACE("(%p, %p)\n", inpRegKey, parm2); |
| |
| /* first check - if input is non-NULL and points to the secret |
| key string, then pass. Otherwise return 0. |
| */ |
| |
| if (inpRegKey != (LPSTR)NULL) |
| { |
| if (lstrcmpiA(inpRegKey, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies")) |
| { |
| /* doesn't match, fail */ |
| return 0; |
| } |
| } |
| |
| /* check passed, init all policy cache entries with SHELL_NO_POLICY */ |
| for (i = 0; i < SHELL_MAX_POLICIES; i++) |
| { |
| sh32_policy_table[i].cache = SHELL_NO_POLICY; |
| } |
| |
| return SHELL_NO_POLICY; |
| } |