/*
 * shpolicy.c - Data for shell/system policies.
 *
 * Copyright 1999 Ian Schmidt <ischmidt@cfl.rr.com>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
 *
 * NOTES:
 *
 * 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 v5.00 (W2K)
 */

#include <stdarg.h>
#include <stdlib.h>
#include <string.h>

#include "windef.h"
#include "winbase.h"
#include "winerror.h"
#include "winreg.h"

#include "shell32_main.h"
#include "shlobj.h"

#include "wine/debug.h"

WINE_DEFAULT_DEBUG_CHANNEL(shell);

#define SHELL_NO_POLICY 0xffffffff

typedef struct tagPOLICYDAT
{
  DWORD policy;          /* policy value passed to SHRestricted */
  LPCSTR appstr;         /* application str such as "Explorer" */
  LPCSTR keystr;         /* name of the actual registry key / policy */
  DWORD cache;           /* cached value or 0xffffffff for invalid */
} POLICYDATA, *LPPOLICYDATA;

/* registry strings */
static const CHAR strRegistryPolicyA[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Policies";
static const WCHAR strRegistryPolicyW[] = {'S','o','f','t','w','a','r','e','\\','M','i','c','r','o',
                                           's','o','f','t','\\','W','i','n','d','o','w','s','\\',
                                           'C','u','r','r','e','n','t','V','e','r','s','i','o','n',
                                           '\\','P','o','l','i','c','i','e','s',0};
static const CHAR strPolicyA[] = "Policy";
static const WCHAR strPolicyW[] = {'P','o','l','i','c','y',0};

/* application strings */

static const char strExplorer[] = {"Explorer"};
static const char strActiveDesk[] = {"ActiveDesktop"};
static const char strWinOldApp[] = {"WinOldApp"};
static const char strAddRemoveProgs[] = {"AddRemoveProgs"};

/* key strings */

static const char strNoFileURL[] = {"NoFileUrl"};
static const char strNoFolderOptions[] = {"NoFolderOptions"};
static const char strNoChangeStartMenu[] = {"NoChangeStartMenu"};
static const char strNoWindowsUpdate[] = {"NoWindowsUpdate"};
static const char strNoSetActiveDesktop[] = {"NoSetActiveDesktop"};
static const char strNoForgetSoftwareUpdate[] = {"NoForgetSoftwareUpdate"};
static const char strNoMSAppLogo[] = {"NoMSAppLogo5ChannelNotify"};
static const char strForceCopyACLW[] = {"ForceCopyACLWithFile"};
static const char strNoResolveTrk[] = {"NoResolveTrack"};
static const char strNoResolveSearch[] = {"NoResolveSearch"};
static const char strNoEditComponent[] = {"NoEditingComponents"};
static const char strNoMovingBand[] = {"NoMovingBands"};
static const char strNoCloseDragDrop[] = {"NoCloseDragDropBands"};
static const char strNoCloseComponent[] = {"NoClosingComponents"};
static const char strNoDelComponent[] = {"NoDeletingComponents"};
static const char strNoAddComponent[] = {"NoAddingComponents"};
static const char strNoComponent[] = {"NoComponents"};
static const char strNoChangeWallpaper[] = {"NoChangingWallpaper"};
static const char strNoHTMLWallpaper[] = {"NoHTMLWallpaper"};
static const char strNoCustomWebView[] = {"NoCustomizeWebView"};
static const char strClassicShell[] = {"ClassicShell"};
static const char strClearRecentDocs[] = {"ClearRecentDocsOnExit"};
static const char strNoFavoritesMenu[] = {"NoFavoritesMenu"};
static const char strNoActiveDesktopChanges[] = {"NoActiveDesktopChanges"};
static const char strNoActiveDesktop[] = {"NoActiveDesktop"};
static const char strNoRecentDocMenu[] = {"NoRecentDocsMenu"};
static const char strNoRecentDocHistory[] = {"NoRecentDocsHistory"};
static const char strNoInetIcon[] = {"NoInternetIcon"};
static const char strNoSettingsWizard[] = {"NoSettingsWizards"};
static const char strNoLogoff[] = {"NoLogoff"};
static const char strNoNetConDis[] = {"NoNetConnectDisconnect"};
static const char strNoViewContextMenu[] = {"NoViewContextMenu"};
static const char strNoTrayContextMenu[] = {"NoTrayContextMenu"};
static const char strNoWebMenu[] = {"NoWebMenu"};
static const char strLnkResolveIgnoreLnkInfo[] = {"LinkResolveIgnoreLinkInfo"};
static const char strNoCommonGroups[] = {"NoCommonGroups"};
static const char strEnforceShlExtSecurity[] = {"EnforceShellExtensionSecurity"};
static const char strNoRealMode[] = {"NoRealMode"};
static const char strMyDocsOnNet[] = {"MyDocsOnNet"};
static const char strNoStartMenuSubfolder[] = {"NoStartMenuSubFolders"};
static const char strNoAddPrinters[] = {"NoAddPrinter"};
static const char strNoDeletePrinters[] = {"NoDeletePrinter"};
static const char strNoPrintTab[] = {"NoPrinterTabs"};
static const char strRestrictRun[] = {"RestrictRun"};
static const char strNoStartBanner[] = {"NoStartBanner"};
static const char strNoNetworkNeighborhood[] = {"NoNetHood"};
static const char strNoDriveTypeAtRun[] = {"NoDriveTypeAutoRun"};
static const char strNoDrivesAutoRun[] = {"NoDriveAutoRun"};
static const char strSeparateProcess[] = {"SeparateProcess"};
static const char strNoDrives[] = {"NoDrives"};
static const char strNoFind[] = {"NoFind"};
static const char strNoDesktop[] = {"NoDesktop"};
static const char strNoSetTaskBar[] = {"NoSetTaskbar"};
static const char strNoSetFld[] = {"NoSetFolders"};
static const char strNoFileMenu[] = {"NoFileMenu"};
static const char strNoSaveSetting[] = {"NoSaveSettings"};
static const char strNoClose[] = {"NoClose"};
static const char strNoRun[] = {"NoRun"};

/* policy data array */
static POLICYDATA sh32_policy_table[] =
{
  {
    REST_NORUN,
    strExplorer,
    strNoRun,
    SHELL_NO_POLICY
  },
  {
    REST_NOCLOSE,
    strExplorer,
    strNoClose,
    SHELL_NO_POLICY
  },
  {
    REST_NOSAVESET,
    strExplorer,
    strNoSaveSetting,
    SHELL_NO_POLICY
  },
  {
    REST_NOFILEMENU,
    strExplorer,
    strNoFileMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NOSETFOLDERS,
    strExplorer,
    strNoSetFld,
    SHELL_NO_POLICY
  },
  {
    REST_NOSETTASKBAR,
    strExplorer,
    strNoSetTaskBar,
    SHELL_NO_POLICY
  },
  {
    REST_NODESKTOP,
    strExplorer,
    strNoDesktop,
    SHELL_NO_POLICY
  },
  {
    REST_NOFIND,
    strExplorer,
    strNoFind,
    SHELL_NO_POLICY
  },
  {
    REST_NODRIVES,
    strExplorer,
    strNoDrives,
    SHELL_NO_POLICY
  },
  {
    REST_NODRIVEAUTORUN,
    strExplorer,
    strNoDrivesAutoRun,
    SHELL_NO_POLICY
  },
  {
    REST_NODRIVETYPEAUTORUN,
    strExplorer,
    strNoDriveTypeAtRun,
    SHELL_NO_POLICY
  },
  {
    REST_NONETHOOD,
    strExplorer,
    strNoNetworkNeighborhood,
    SHELL_NO_POLICY
  },
  {
    REST_STARTBANNER,
    strExplorer,
    strNoStartBanner,
    SHELL_NO_POLICY
  },
  {
    REST_RESTRICTRUN,
    strExplorer,
    strRestrictRun,
    SHELL_NO_POLICY
  },
  {
    REST_NOPRINTERTABS,
    strExplorer,
    strNoPrintTab,
    SHELL_NO_POLICY
  },
  {
    REST_NOPRINTERDELETE,
    strExplorer,
    strNoDeletePrinters,
    SHELL_NO_POLICY
  },
  {
    REST_NOPRINTERADD,
    strExplorer,
    strNoAddPrinters,
    SHELL_NO_POLICY
  },
  {
    REST_NOSTARTMENUSUBFOLDERS,
    strExplorer,
    strNoStartMenuSubfolder,
    SHELL_NO_POLICY
  },
  {
    REST_MYDOCSONNET,
    strExplorer,
    strMyDocsOnNet,
    SHELL_NO_POLICY
  },
  {
    REST_NOEXITTODOS,
    strWinOldApp,
    strNoRealMode,
    SHELL_NO_POLICY
  },
  {
    REST_ENFORCESHELLEXTSECURITY,
    strExplorer,
    strEnforceShlExtSecurity,
    SHELL_NO_POLICY
  },
  {
    REST_LINKRESOLVEIGNORELINKINFO,
    strExplorer,
    strLnkResolveIgnoreLnkInfo,
    SHELL_NO_POLICY
  },
  {
    REST_NOCOMMONGROUPS,
    strExplorer,
    strNoCommonGroups,
    SHELL_NO_POLICY
  },
  {
    REST_SEPARATEDESKTOPPROCESS,
    strExplorer,
    strSeparateProcess,
    SHELL_NO_POLICY
  },
  {
    REST_NOWEB,
    strExplorer,
    strNoWebMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NOTRAYCONTEXTMENU,
    strExplorer,
    strNoTrayContextMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NOVIEWCONTEXTMENU,
    strExplorer,
    strNoViewContextMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NONETCONNECTDISCONNECT,
    strExplorer,
    strNoNetConDis,
    SHELL_NO_POLICY
  },
  {
    REST_STARTMENULOGOFF,
    strExplorer,
    strNoLogoff,
    SHELL_NO_POLICY
  },
  {
    REST_NOSETTINGSASSIST,
    strExplorer,
    strNoSettingsWizard,
    SHELL_NO_POLICY
  },
  {
    REST_NOINTERNETICON,
    strExplorer,
    strNoInetIcon,
    SHELL_NO_POLICY
  },
  {
    REST_NORECENTDOCSHISTORY,
    strExplorer,
    strNoRecentDocHistory,
    SHELL_NO_POLICY
  },
  {
    REST_NORECENTDOCSMENU,
    strExplorer,
    strNoRecentDocMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NOACTIVEDESKTOP,
    strExplorer,
    strNoActiveDesktop,
    SHELL_NO_POLICY
  },
  {
    REST_NOACTIVEDESKTOPCHANGES,
    strExplorer,
    strNoActiveDesktopChanges,
    SHELL_NO_POLICY
  },
  {
    REST_NOFAVORITESMENU,
    strExplorer,
    strNoFavoritesMenu,
    SHELL_NO_POLICY
  },
  {
    REST_CLEARRECENTDOCSONEXIT,
    strExplorer,
    strClearRecentDocs,
    SHELL_NO_POLICY
  },
  {
    REST_CLASSICSHELL,
    strExplorer,
    strClassicShell,
    SHELL_NO_POLICY
  },
  {
    REST_NOCUSTOMIZEWEBVIEW,
    strExplorer,
    strNoCustomWebView,
    SHELL_NO_POLICY
  },
  {
    REST_NOHTMLWALLPAPER,
    strActiveDesk,
    strNoHTMLWallpaper,
    SHELL_NO_POLICY
  },
  {
    REST_NOCHANGINGWALLPAPER,
    strActiveDesk,
    strNoChangeWallpaper,
    SHELL_NO_POLICY
  },
  {
    REST_NODESKCOMP,
    strActiveDesk,
    strNoComponent,
    SHELL_NO_POLICY
  },
  {
    REST_NOADDDESKCOMP,
    strActiveDesk,
    strNoAddComponent,
    SHELL_NO_POLICY
  },
  {
    REST_NODELDESKCOMP,
    strActiveDesk,
    strNoDelComponent,
    SHELL_NO_POLICY
  },
  {
    REST_NOCLOSEDESKCOMP,
    strActiveDesk,
    strNoCloseComponent,
    SHELL_NO_POLICY
  },
  {
    REST_NOCLOSE_DRAGDROPBAND,
    strActiveDesk,
    strNoCloseDragDrop,
    SHELL_NO_POLICY
  },
  {
    REST_NOMOVINGBAND,
    strActiveDesk,
    strNoMovingBand,
    SHELL_NO_POLICY
  },
  {
    REST_NOEDITDESKCOMP,
    strActiveDesk,
    strNoEditComponent,
    SHELL_NO_POLICY
  },
  {
    REST_NORESOLVESEARCH,
    strExplorer,
    strNoResolveSearch,
    SHELL_NO_POLICY
  },
  {
    REST_NORESOLVETRACK,
    strExplorer,
    strNoResolveTrk,
    SHELL_NO_POLICY
  },
  {
    REST_FORCECOPYACLWITHFILE,
    strExplorer,
    strForceCopyACLW,
    SHELL_NO_POLICY
  },
  {
    REST_NOLOGO3CHANNELNOTIFY,
    strExplorer,
    strNoMSAppLogo,
    SHELL_NO_POLICY
  },
  {
    REST_NOFORGETSOFTWAREUPDATE,
    strExplorer,
    strNoForgetSoftwareUpdate,
    SHELL_NO_POLICY
  },
  {
    REST_NOSETACTIVEDESKTOP,
    strExplorer,
    strNoSetActiveDesktop,
    SHELL_NO_POLICY
  },
  {
    REST_NOUPDATEWINDOWS,
    strExplorer,
    strNoWindowsUpdate,
    SHELL_NO_POLICY
  },
  {
    REST_NOCHANGESTARMENU,
    strExplorer,
    strNoChangeStartMenu,
    SHELL_NO_POLICY
  },
  {
    REST_NOFOLDEROPTIONS,
    strExplorer,
    strNoFolderOptions,
    SHELL_NO_POLICY
  },
  {
    REST_HASFINDCOMPUTERS,
    strExplorer,
    "FindComputers",
    SHELL_NO_POLICY
  },
  {
    REST_INTELLIMENUS,
    strExplorer,
    "IntelliMenus",
    SHELL_NO_POLICY
  },
  {
    REST_RUNDLGMEMCHECKBOX,
    strExplorer,
    "MemCheckBoxInRunDlg",
    SHELL_NO_POLICY
  },
  {
    REST_ARP_ShowPostSetup,
    strAddRemoveProgs,
    "ShowPostSetup",
    SHELL_NO_POLICY
  },
  {
    REST_NOCSC,
    strExplorer,
    "NoSyncAll",
    SHELL_NO_POLICY
  },
  {
    REST_NOCONTROLPANEL,
    strExplorer,
    "NoControlPanel",
    SHELL_NO_POLICY
  },
  {
    REST_ENUMWORKGROUP,
    strExplorer,
    "EnumWorkgroup",
    SHELL_NO_POLICY
  },
  {
    REST_ARP_NOARP,
    strAddRemoveProgs,
    "NoAddRemovePrograms",
    SHELL_NO_POLICY
  },
  {
    REST_ARP_NOREMOVEPAGE,
    strAddRemoveProgs,
    "NoRemovePage",
    SHELL_NO_POLICY
  },
  {
    REST_ARP_NOADDPAGE,
    strAddRemoveProgs,
    "NoAddPage",
    SHELL_NO_POLICY
  },
  {
    REST_ARP_NOWINSETUPPAGE,
    strAddRemoveProgs,
    "NoWindowsSetupPage",
    SHELL_NO_POLICY
  },
  {
    REST_GREYMSIADS,
    strExplorer,
    "",
    SHELL_NO_POLICY
  },
  {
    REST_NOCHANGEMAPPEDDRIVELABEL,
    strExplorer,
    "NoChangeMappedDriveLabel",
    SHELL_NO_POLICY
  },
  {
    REST_NOCHANGEMAPPEDDRIVECOMMENT,
    strExplorer,
    "NoChangeMappedDriveComment",
    SHELL_NO_POLICY
  },
  {
    REST_MaxRecentDocs,
    strExplorer,
    "MaxRecentDocs",
    SHELL_NO_POLICY
  },
  {
    REST_NONETWORKCONNECTIONS,
    strExplorer,
    "NoNetworkConnections",
    SHELL_NO_POLICY
  },
  {
    REST_FORCESTARTMENULOGOFF,
    strExplorer,
    "ForceStartMenuLogoff",
    SHELL_NO_POLICY
  },
  {
    REST_NOWEBVIEW,
    strExplorer,
     "NoWebView",
    SHELL_NO_POLICY
  },
  {
    REST_NOCUSTOMIZETHISFOLDER,
    strExplorer,
    "NoCustomizeThisFolder",
    SHELL_NO_POLICY
  },
  {
    REST_NOENCRYPTION,
    strExplorer,
    "NoEncryption",
    SHELL_NO_POLICY
  },
  {
    REST_ALLOWFRENCHENCRYPTION,
    strExplorer,
    "AllowFrenchEncryption",
    SHELL_NO_POLICY
  },
  {
    REST_DONTSHOWSUPERHIDDEN,
    strExplorer,
    "DontShowSuperHidden",
    SHELL_NO_POLICY
  },
  {
    REST_NOSHELLSEARCHBUTTON,
    strExplorer,
    "NoShellSearchButton",
    SHELL_NO_POLICY
  },
  {
    REST_NOHARDWARETAB,
    strExplorer,
    "NoHardwareTab",
    SHELL_NO_POLICY
  },
  {
    REST_NORUNASINSTALLPROMPT,
    strExplorer,
    "NoRunasInstallPrompt",
    SHELL_NO_POLICY
  },
  {
    REST_PROMPTRUNASINSTALLNETPATH,
    strExplorer,
    "PromptRunasInstallNetPath",
    SHELL_NO_POLICY
  },
  {
    REST_NOMANAGEMYCOMPUTERVERB,
    strExplorer,
    "NoManageMyComputerVerb",
    SHELL_NO_POLICY
  },
  {
    REST_NORECENTDOCSNETHOOD,
    strExplorer,
    "NoRecentDocsNetHood",
    SHELL_NO_POLICY
  },
  {
    REST_DISALLOWRUN,
    strExplorer,
    "DisallowRun",
    SHELL_NO_POLICY
  },
  {
    REST_NOWELCOMESCREEN,
    strExplorer,
    "NoWelcomeScreen",
    SHELL_NO_POLICY
  },
  {
    REST_RESTRICTCPL,
    strExplorer,
    "RestrictCpl",
    SHELL_NO_POLICY
  },
  {
    REST_DISALLOWCPL,
    strExplorer,
    "DisallowCpl",
    SHELL_NO_POLICY
  },
  {
    REST_NOSMBALLOONTIP,
    strExplorer,
    "NoSMBalloonTip",
    SHELL_NO_POLICY
  },
  {
    REST_NOSMHELP,
    strExplorer,
    "NoSMHelp",
    SHELL_NO_POLICY
  },
  {
    REST_NOWINKEYS,
    strExplorer,
    "NoWinKeys",
    SHELL_NO_POLICY
  },
  {
    REST_NOENCRYPTONMOVE,
    strExplorer,
    "NoEncryptOnMove",
    SHELL_NO_POLICY
  },
  {
    REST_NOLOCALMACHINERUN,
    strExplorer,
    "DisableLocalMachineRun",
    SHELL_NO_POLICY
  },
  {
    REST_NOCURRENTUSERRUN,
    strExplorer,
    "DisableCurrentUserRun",
    SHELL_NO_POLICY
  },
  {
    REST_NOLOCALMACHINERUNONCE,
    strExplorer,
    "DisableLocalMachineRunOnce",
    SHELL_NO_POLICY
  },
  {
    REST_NOCURRENTUSERRUNONCE,
    strExplorer,
    "DisableCurrentUserRunOnce",
    SHELL_NO_POLICY
  },
  {
    REST_FORCEACTIVEDESKTOPON,
    strExplorer,
    "ForceActiveDesktopOn",
    SHELL_NO_POLICY
  },
  {
    REST_NOCOMPUTERSNEARME,
    strExplorer,
    "NoComputersNearMe",
    SHELL_NO_POLICY
  },
  {
    REST_NOVIEWONDRIVE,
    strExplorer,
    "NoViewOnDrive",
    SHELL_NO_POLICY
  },
  {
    REST_NONETCRAWL,
    strExplorer,
    "NoNetCrawl",
    SHELL_NO_POLICY
  },
  {
    REST_NOSHAREDDOCUMENTS,
    strExplorer,
    "NoSharedDocs",
    SHELL_NO_POLICY
  },
  {
    REST_NOSMMYDOCS,
    strExplorer,
    "NoSMMyDocs",
    SHELL_NO_POLICY
  },
/* 0x4000050 - 0x4000060 */
  {
    REST_NONLEGACYSHELLMODE,
    strExplorer,
    "NoneLegacyShellMode",
    SHELL_NO_POLICY
  },
  {
    REST_STARTRUNNOHOMEPATH,
    strExplorer,
    "StartRunNoHOMEPATH",
    SHELL_NO_POLICY
  },
/* 0x4000061 - 0x4000086 */
  {
    REST_NODISCONNECT,
    strExplorer,
    "NoDisconnect",
    SHELL_NO_POLICY
  },
  {
    REST_NOSECURITY,
    strExplorer,
    "NoNTSecurity",
    SHELL_NO_POLICY
  },
  {
    REST_NOFILEASSOCIATE,
    strExplorer,
    "NoFileAssociate",
    SHELL_NO_POLICY
  },
  {
    0x50000024,
    strExplorer,
    strNoFileURL,
    SHELL_NO_POLICY
  },
  {
    0,
    0,
    0,
    SHELL_NO_POLICY
  }
};

/*************************************************************************
 * SHRestricted				 [SHELL32.100]
 *
 * Get the value associated with a policy Id.
 *
 * PARAMS
 *     pol [I] Policy Id
 *
 * RETURNS
 *     The queried value for the policy.
 *
 * NOTES
 *     Exported by ordinal.
 *     This function caches the retrieved values to prevent unnecessary registry access,
 *     if SHInitRestricted() was previously called.
 *
 * REFERENCES
 *     a: MS System Policy Editor.
 *     b: 98Lite 2.0 (which uses many of these policy keys) http://www.98lite.net/
 *     c: 'The Windows 95 Registry', by John Woram, 1996 MIS: Press
 */
DWORD WINAPI SHRestricted (RESTRICTIONS policy)
{
	char regstr[256];
	HKEY    xhkey;
	DWORD   retval, datsize = 4;
	LPPOLICYDATA p;

	TRACE("(%08x)\n", policy);

	/* scan to see if we know this policy ID */
	for (p = sh32_policy_table; p->policy; p++)
	{
	  if (policy == p->policy)
	  {
	    break;
	  }
	}

	if (p->policy == 0)
	{
	    /* we don't know this policy, return 0 */
	    TRACE("unknown policy: (%08x)\n", policy);
		return 0;
	}

	/* we have a known policy */

	/* first check if this policy has been cached, return it if so */
	if (p->cache != SHELL_NO_POLICY)
	{
	    return p->cache;
	}

	lstrcpyA(regstr, strRegistryPolicyA);
	lstrcatA(regstr, "\\");
	lstrcatA(regstr, p->appstr);

	/* 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, p->keystr, NULL, NULL, (LPBYTE)&retval, &datsize) == ERROR_SUCCESS)
	  {
	    p->cache = retval;
	  }
	  RegCloseKey(xhkey);
	}
	return retval;
}

/*************************************************************************
 * SHInitRestricted          [SHELL32.244]
 *
 * Initialise the policy cache to speed up calls to SHRestricted().
 *
 * PARAMS
 *  unused    [I] Reserved.
 *  inpRegKey [I] Registry key to scan.
 *
 * RETURNS
 *  Success: -1. The policy cache is initialised.
 *  Failure: 0, if inpRegKey is any value other than NULL, "Policy", or
 *           "Software\Microsoft\Windows\CurrentVersion\Policies".
 *
 * NOTES
 *  Exported by ordinal. Introduced in Win98.
 */
BOOL WINAPI SHInitRestricted(LPCVOID unused, LPCVOID inpRegKey)
{
	TRACE("(%p, %p)\n", unused, inpRegKey);

	/* first check - if input is non-NULL and points to the secret
	   key string, then pass. Otherwise return 0.
	 */
	if (inpRegKey != NULL)
	{
	  if (SHELL_OsIsUnicode())
	  {
            if (lstrcmpiW(inpRegKey, strRegistryPolicyW) &&
                lstrcmpiW(inpRegKey, strPolicyW))
	      /* doesn't match, fail */
	      return FALSE;
	  }
	  else
	  {
            if (lstrcmpiA(inpRegKey, strRegistryPolicyA) &&
                lstrcmpiA(inpRegKey, strPolicyA))
	      /* doesn't match, fail */
	      return FALSE;
	  }
	}

	return TRUE;
}
