//*************************************************************
//
//  Group Policy Processing
//
//  Microsoft Confidential
//  Copyright (c) Microsoft Corporation 1997-1998
//  All rights reserved
//
//  History:    28-Oct-98   SitaramR    Created
//
//*************************************************************


#ifdef __cplusplus
extern "C" {
#endif

void InitializeGPOCriticalSection();
void CloseGPOCriticalSection();
BOOL InitializePolicyProcessing(BOOL bMachine);

#define ECP_FAIL_ON_WAIT_TIMEOUT        1

HANDLE WINAPI EnterCriticalPolicySectionEx (BOOL bMachine, DWORD dwTimeOut, DWORD dwFlags );

#ifdef __cplusplus
}
#endif

//
// These keys are used in gpt.c. The per user per machine keys will
// be deleted when profile gets deleted. Changes in the following keys
// should be reflected in the prefixes as well...
//

#define GP_SHADOW_KEY         TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\Shadow\\%ws")
#define GP_HISTORY_KEY        TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\History\\%ws")
#define GP_STATE_KEY          TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\State\\%ws")
#define GP_STATE_ROOT_KEY     TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\State")

#define GP_SHADOW_SID_KEY     TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\%ws\\Shadow\\%ws")
#define GP_HISTORY_SID_KEY    TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\%ws\\History\\%ws")

#define GP_EXTENSIONS_KEY     TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\GPExtensions\\%ws")
#define GP_EXTENSIONS_SID_KEY TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\%ws\\GPExtensions\\%ws")

#define GP_HISTORY_SID_ROOT_KEY    TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\%ws\\History")
#define GP_MEMBERSHIP_KEY          TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\%ws\\GroupMembership")
#define GP_EXTENSIONS_SID_ROOT_KEY TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\%ws\\GPExtensions")

#define GP_POLICY_SID_KEY     TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy\\%ws")
#define GP_LOGON_SID_KEY      TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon\\%ws")

#define GPCORE_GUID           TEXT("{00000000-0000-0000-0000-000000000000}")


//
// Comon prefix for both history and shadow
//

#define GP_XXX_SID_PREFIX           TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Group Policy")
#define GP_EXTENSIONS_SID_PREFIX    TEXT("Software\\Microsoft\\Windows NT\\CurrentVersion\\Winlogon")



//
// Structures
//

//
// Structure used to represent GP status from the previous policy run.
//

typedef struct _GPEXTSTATUS {
   DWORD          dwSlowLink;               // Slow link when policy applied previously ?
   DWORD          dwRsopLogging;            // Rsop Logging when policy applied previously ?
   DWORD          dwStatus;                 // Status returned previously
   HRESULT        dwRsopStatus;             // Rsop Status returned previously
   DWORD          dwTime;                   // Time when the policy was applied previously
   BOOL           bStatus;                  // If we failed to read the per ext status data
   BOOL           bForceRefresh;            // force refresh in this foreground prcessing..
} GPEXTSTATUS, *LPGPEXTSTATUS;


typedef struct _GPEXT {
    LPTSTR         lpDisplayName;            // Display name
    LPTSTR         lpKeyName;                // Extension name
    LPTSTR         lpDllName;                // Dll name
    LPSTR          lpFunctionName;           // Entry point name
    LPSTR          lpRsopFunctionName;       // Rsop entry point name
    HMODULE        hInstance;                // Handle to dll
    PFNPROCESSGROUPPOLICY   pEntryPoint;     // Entry point for ProcessGPO
    PFNPROCESSGROUPPOLICYEX pEntryPointEx;   // Diagnostic mode or Ex entry point
    PFNGENERATEGROUPPOLICY pRsopEntryPoint;  // Entry point for Rsop planning mode
    BOOL           bNewInterface;            // Are we using the new Ex entry point interface ?
    DWORD          dwNoMachPolicy;           // Mach policy setting
    DWORD          dwNoUserPolicy;           // User policy setting
    DWORD          dwNoSlowLink;             // Slow link setting
    DWORD          dwNoBackgroundPolicy;     // Background policy setting
    DWORD          dwNoGPOChanges;           // GPO changes setting
    DWORD          dwUserLocalSetting;       // Per user per machine setting
    DWORD          dwRequireRegistry;        // RequireSuccReg setting
    DWORD          dwEnableAsynch;           // Enable asynchronous processing setting
    DWORD          dwLinkTransition;         // Link speed transition setting
    DWORD          dwMaxChangesInterval;     // Max interval (mins) for which NoGpoChanges is adhered to
    BOOL           bRegistryExt;             // Is this the psuedo reg extension ?
    BOOL           bSkipped;                 // Should processing be skipped for this extension ?
    BOOL           bHistoryProcessing;       // Is processing needed to clean up cached Gpos ?
    BOOL           bForcedRefreshNextFG;     // Forced refresh next time it is processed in foreground.
    BOOL           bRsopTransition;          // Rsop Transition ?
    GUID           guid;                     // Guid of extension
    LPGPEXTSTATUS  lpPrevStatus;             // Previous Status
    LPTSTR         szEventLogSources;        // "(userenv,Application)\0(print,System)\0....\0"
    struct _GPEXT *pNext;                    // Singly linked list pointer
} GPEXT, *LPGPEXT;


typedef struct _GPOPROCDATA {                // Data that is needed while processing the data
    BOOL        bProcessGPO;                 // Actually add the GPOs to the processing list
    PLDAP       pLdapHandle;                 // LDAP handle corresponding to the query
} GPOPROCDATA, *LPGPOPROCDATA;


typedef struct _EXTLIST {
    GUID             guid;                   // Extension guid
    struct _EXTLIST *pNext;                  // Singly linked list pointer
} EXTLIST, *LPEXTLIST;



typedef struct _EXTFILTERLIST {
    PGROUP_POLICY_OBJECT   lpGPO;            // GPO
    LPEXTLIST              lpExtList;        // List of extension guids that apply to lpGPO
    BOOL                   bLogged;          // Is this link logged to RSoP db ?
    struct _EXTFILTERLIST *pNext;            // Singly linked list pointer
} EXTFILTERLIST, *LPEXTFILTERLIST;


typedef struct _GPLINK {
    LPWSTR                   pwszGPO;             // DS path to Gpo
    BOOL                     bEnabled;            // Is this link disabled ?
    BOOL                     bNoOverride;         // Is Gpo enforced ?
    struct _GPLINK          *pNext;               // Gpo linked in SOM order
} GPLINK, *LPGPLINK;


typedef struct _SCOPEOFMGMT {
    LPWSTR                   pwszSOMId;            // Dn name of SOM
    DWORD                    dwType;               // Type of SOM
    BOOL                     bBlocking;            // Does SOM have policies blocked from above ?
    BOOL                     bBlocked;             // This SOM is blocked by a SOM below ?
    LPGPLINK                 pGpLinkList;          // List of GPOs linked to this SOM
    struct _SCOPEOFMGMT     *pNext;
} SCOPEOFMGMT, *LPSCOPEOFMGMT;


typedef struct _GPCONTAINER {
    LPWSTR                   pwszDSPath;           // DS path to Gpo
    LPWSTR                   pwszGPOName;          // Guid from of Gpo name
    LPWSTR                   pwszDisplayName;      // Friendly name
    LPWSTR                   pwszFileSysPath;      // Sysvol path to Gpo
    BOOL                     bFound;               // Gpo found ?
    BOOL                     bAccessDenied;        // Access denied ?
    BOOL                     bUserDisabled;        // Disabled for user policy ?
    BOOL                     bMachDisabled;        // Disabled for machine policy ?
    DWORD                    dwUserVersion;        // Version # for user policy
    DWORD                    dwMachVersion;        // Version # for machine policy
    PSECURITY_DESCRIPTOR     pSD;                  // ACL on Gpo
    DWORD                    cbSDLen;              // Length of security descriptor in bytes
    BOOL                     bFilterAllowed;       // Does Gpo pass filter check ?
    WCHAR                   *pwszFilterId;         // Filter id
    LPWSTR                   szSOM;                // SOM that this GPO is linked to
    DWORD                    dwOptions;            // GPO options
    struct _GPCONTAINER     *pNext;                // Linked list ptr
} GPCONTAINER, *LPGPCONTAINER;


typedef struct _GPOINFO {
    DWORD                    dwFlags;
    INT                      iMachineRole;
    HANDLE                   hToken;
    PRSOPTOKEN               pRsopToken;
    WCHAR *                  lpDNName;
    HANDLE                   hEvent;
    HKEY                     hKeyRoot;
    BOOL                     bXferToExtList;     // Has the ownership been transferred from lpGPOList to lpExtFilterList ?
    LPEXTFILTERLIST          lpExtFilterList;    // List of extensions to be filtered, cardinality is same as GetGPOList's list
    PGROUP_POLICY_OBJECT     lpGPOList;          // Filtered GPO List, can vary from one extension to next
    LPTSTR                   lpwszSidUser;       // Sid of user in string form
    HANDLE                   hTriggerEvent;
    HANDLE                   hForceTriggerEvent; // force trigger event
    HANDLE                   hNotifyEvent;
    HANDLE                   hNeedFGEvent;
    HANDLE                   hDoneEvent;
    HANDLE                   hCritSection;
    LPGPEXT                  lpExtensions;
    BOOL                     bMemChanged;          // Has security group membership has changed ?
    BOOL                     bUserLocalMemChanged; // Has membership changed on per user local basis ?
    BOOL                     bSidChanged;          // Has the Sid changed since the last policy run?
    PFNSTATUSMESSAGECALLBACK pStatusCallback;
    LPSCOPEOFMGMT            lpSOMList;            // LSDOU list
    LPGPCONTAINER            lpGpContainerList;    // GP container list for Rsop logging
    LPSCOPEOFMGMT            lpLoopbackSOMList;    // Loopback LSDOU list
    LPGPCONTAINER            lpLoopbackGpContainerList;    // Loopback container list for Rsop logging
    BOOL                     bFGCoInitialized;     // CoInitialize called on foreground thread ?
    BOOL                     bBGCoInitialized;     // CoInitialize called on background thread ?
    IWbemServices *          pWbemServices;        // Namespace pointer for Rsop logging
    LPTSTR                   szName;               // Full Name of the User/Computer
    LPTSTR                   szTargetName;         // Rsop TargetName
    BOOL                     bRsopLogging;         // Is Rsop Logging turned on ?
    BOOL                     bRsopCreated;         // Rsop Name Space was created now ?
    LPWSTR                   szSiteName;           // site name of the target
} GPOINFO, *LPGPOINFO;


typedef struct _ADMFILEINFO {
    WCHAR *               pwszFile;            // Adm file path
    WCHAR *               pwszGPO;             // Gpo that the adm file is in
    FILETIME              ftWrite;             // Last write time of Adm file
    struct _ADMFILEINFO * pNext;               // Singly linked list pointer
} ADMFILEINFO;


typedef struct _RSOPSESSIONDATA {
    WCHAR *               pwszTargetName;               // Target user or computer
    WCHAR *               pwszSOM;                      // New group of target
    PTOKEN_GROUPS         pSecurityGroups;              // Security IDs of the new groups for target
    BOOL                  bLogSecurityGroup;            // Log the security groups
    WCHAR *               pwszSite;                     // Site of target
    BOOL                  bMachine;                     // Machine or user policy processing ?
    BOOL                  bSlowLink;                    // policy applied over slow link?
} RSOPSESSIONDATA, *LPRSOPSESSIONDATA;


typedef struct _RSOPEXTSTATUS {
    FILETIME              ftStartTime;                  // times between which the associated
    FILETIME              ftEndTime;                    // extension was processed
    DWORD                 dwStatus;                     // Processing status
    DWORD                 dwLoggingStatus;              // Logging Status
    BOOL                  bValid;                       // this struct is valid and can be used              
} RSOPEXTSTATUS, *LPRSOPEXTSTATUS;
                          


BOOL RsopDeleteUserNameSpace(LPTSTR szComputer, LPTSTR lpSid);

DWORD SaveLoggingStatus(LPWSTR szSid, LPGPEXT lpExt, RSOPEXTSTATUS *lpRsopExtStatus);
DWORD ReadLoggingStatus(LPWSTR szSid, LPWSTR szExtId, RSOPEXTSTATUS *lpRsopExtStatus);