/*
 * Copyright (C) 2002 Alexandre Julliard
 *
 * 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
 */

#ifndef __WINE_ACCCTRL_H
#define __WINE_ACCCTRL_H

#include <wtypes.h>

#ifdef __cplusplus
extern "C" {
#endif

typedef enum _SE_OBJECT_TYPE
{
    SE_UNKNOWN_OBJECT_TYPE = 0,
    SE_FILE_OBJECT,
    SE_SERVICE,
    SE_PRINTER,
    SE_REGISTRY_KEY,
    SE_LMSHARE,
    SE_KERNEL_OBJECT,
    SE_WINDOW_OBJECT,
    SE_DS_OBJECT,
    SE_DS_OBJECT_ALL,
    SE_PROVIDER_DEFINED_OBJECT,
    SE_WMIGUID_OBJECT,
    SE_REGISTRY_WOW64_32KEY
} SE_OBJECT_TYPE;

typedef enum _TRUSTEE_TYPE
{
    TRUSTEE_IS_UNKNOWN,
    TRUSTEE_IS_USER,
    TRUSTEE_IS_GROUP,
    TRUSTEE_IS_DOMAIN,
    TRUSTEE_IS_ALIAS,
    TRUSTEE_IS_WELL_KNOWN_GROUP,
    TRUSTEE_IS_DELETED,
    TRUSTEE_IS_INVALID,
    TRUSTEE_IS_COMPUTER
} TRUSTEE_TYPE;

typedef enum _TRUSTEE_FORM
{
    TRUSTEE_IS_SID,
    TRUSTEE_IS_NAME,
    TRUSTEE_BAD_FORM,
    TRUSTEE_IS_OBJECTS_AND_SID,
    TRUSTEE_IS_OBJECTS_AND_NAME
} TRUSTEE_FORM;

typedef enum _MULTIPLE_TRUSTEE_OPERATION
{
    NO_MULTIPLE_TRUSTEE,
    TRUSTEE_IS_IMPERSONATE,
} MULTIPLE_TRUSTEE_OPERATION;

typedef struct  _OBJECTS_AND_SID
{
    DWORD   ObjectsPresent;
    GUID    ObjectTypeGuid;
    GUID    InheritedObjectTypeGuid;
    SID    *pSid;
} OBJECTS_AND_SID, *POBJECTS_AND_SID;

typedef struct  _OBJECTS_AND_NAME_A
{
    DWORD          ObjectsPresent;
    SE_OBJECT_TYPE ObjectType;
    LPSTR          ObjectTypeName;
    LPSTR          InheritedObjectTypeName;
    LPSTR          ptstrName;
} OBJECTS_AND_NAME_A, *POBJECTS_AND_NAME_A;

typedef struct  _OBJECTS_AND_NAME_W
{
    DWORD          ObjectsPresent;
    SE_OBJECT_TYPE ObjectType;
    LPWSTR         ObjectTypeName;
    LPWSTR         InheritedObjectTypeName;
    LPWSTR         ptstrName;
} OBJECTS_AND_NAME_W, *POBJECTS_AND_NAME_W;

DECL_WINELIB_TYPE_AW(OBJECTS_AND_NAME_)
DECL_WINELIB_TYPE_AW(POBJECTS_AND_NAME_)

typedef struct _TRUSTEE_A
{
    struct _TRUSTEE_A          *pMultipleTrustee;
    MULTIPLE_TRUSTEE_OPERATION  MultipleTrusteeOperation;
    TRUSTEE_FORM                TrusteeForm;
    TRUSTEE_TYPE                TrusteeType;
    LPSTR                       ptstrName;
} TRUSTEE_A, *PTRUSTEE_A, TRUSTEEA, *PTRUSTEEA;

typedef struct _TRUSTEE_W
{
    struct _TRUSTEE_W          *pMultipleTrustee;
    MULTIPLE_TRUSTEE_OPERATION  MultipleTrusteeOperation;
    TRUSTEE_FORM                TrusteeForm;
    TRUSTEE_TYPE                TrusteeType;
    LPWSTR                      ptstrName;
} TRUSTEE_W, *PTRUSTEE_W, TRUSTEEW, *PTRUSTEEW;

DECL_WINELIB_TYPE_AW(TRUSTEE_)
DECL_WINELIB_TYPE_AW(PTRUSTEE_)
DECL_WINELIB_TYPE_AW(TRUSTEE)
DECL_WINELIB_TYPE_AW(PTRUSTEE)

typedef enum _ACCESS_MODE
{
    NOT_USED_ACCESS = 0,
    GRANT_ACCESS,
    SET_ACCESS,
    DENY_ACCESS,
    REVOKE_ACCESS,
    SET_AUDIT_SUCCESS,
    SET_AUDIT_FAILURE
} ACCESS_MODE;

#define NO_INHERITANCE                      0x0
#define SUB_OBJECTS_ONLY_INHERIT            0x1
#define SUB_CONTAINERS_ONLY_INHERIT         0x2
#define SUB_CONTAINERS_AND_OBJECTS_INHERIT  0x3
#define INHERIT_NO_PROPAGATE                0x4
#define INHERIT_ONLY                        0x8
#define INHERITED_ACCESS_ENTRY              0x10
#define INHERITED_PARENT                    0x10000000
#define INHERITED_GRANDPARENT               0x20000000

typedef struct _EXPLICIT_ACCESS_A
{
    DWORD        grfAccessPermissions;
    ACCESS_MODE  grfAccessMode;
    DWORD        grfInheritance;
    TRUSTEE_A    Trustee;
} EXPLICIT_ACCESS_A, *PEXPLICIT_ACCESS_A, EXPLICIT_ACCESSA, *PEXPLICIT_ACCESSA;

typedef struct _EXPLICIT_ACCESS_W
{
    DWORD        grfAccessPermissions;
    ACCESS_MODE  grfAccessMode;
    DWORD        grfInheritance;
    TRUSTEE_W    Trustee;
} EXPLICIT_ACCESS_W, *PEXPLICIT_ACCESS_W, EXPLICIT_ACCESSW, *PEXPLICIT_ACCESSW;

DECL_WINELIB_TYPE_AW(EXPLICIT_ACCESS_)
DECL_WINELIB_TYPE_AW(PEXPLICIT_ACCESS_)
DECL_WINELIB_TYPE_AW(EXPLICIT_ACCESS)
DECL_WINELIB_TYPE_AW(PEXPLICIT_ACCESS)

typedef ULONG ACCESS_RIGHTS, *PACCESS_RIGHTS;
typedef ULONG INHERIT_FLAGS, *PINHERIT_FLAGS;

typedef struct _ACTRL_ACCESS_ENTRYA
{
    TRUSTEE_A     Trustee;
    ULONG         fAccessFlags;
    ACCESS_RIGHTS Access;
    ACCESS_RIGHTS ProvSpecificAccess;
    INHERIT_FLAGS Inheritance;
    LPSTR         lpInheritProperty;
} ACTRL_ACCESS_ENTRYA, *PACTRL_ACCESS_ENTRYA;

typedef struct _ACTRL_ACCESS_ENTRYW
{
    TRUSTEE_W     Trustee;
    ULONG         fAccessFlags;
    ACCESS_RIGHTS Access;
    ACCESS_RIGHTS ProvSpecificAccess;
    INHERIT_FLAGS Inheritance;
    LPWSTR        lpInheritProperty;
} ACTRL_ACCESS_ENTRYW, *PACTRL_ACCESS_ENTRYW;

DECL_WINELIB_TYPE_AW(ACTRL_ACCESS_ENTRY)
DECL_WINELIB_TYPE_AW(PACTRL_ACCESS_ENTRY)


typedef struct _ACTRL_ACCESS_ENTRY_LISTA
{
    ULONG                cEntries;
    ACTRL_ACCESS_ENTRYA *pAccessList;
} ACTRL_ACCESS_ENTRY_LISTA, *PACTRL_ACCESS_ENTRY_LISTA;

typedef struct _ACTRL_ACCESS_ENTRY_LISTW
{
    ULONG                cEntries;
    ACTRL_ACCESS_ENTRYW *pAccessList;
} ACTRL_ACCESS_ENTRY_LISTW, *PACTRL_ACCESS_ENTRY_LISTW;

DECL_WINELIB_TYPE_AW(ACTRL_ACCESS_ENTRY_LIST)
DECL_WINELIB_TYPE_AW(PACTRL_ACCESS_ENTRY_LIST)

typedef struct _ACTRL_PROPERTY_ENTRYA
{
    LPSTR                     lpProperty;
    PACTRL_ACCESS_ENTRY_LISTA pAccessEntryList;
    ULONG                     fListFlags;
} ACTRL_PROPERTY_ENTRYA, *PACTRL_PROPERTY_ENTRYA;

typedef struct _ACTRL_PROPERTY_ENTRYW
{
    LPWSTR                    lpProperty;
    PACTRL_ACCESS_ENTRY_LISTW pAccessEntryList;
    ULONG                     fListFlags;
} ACTRL_PROPERTY_ENTRYW, *PACTRL_PROPERTY_ENTRYW;

DECL_WINELIB_TYPE_AW(ACTRL_PROPERTY_ENTRY)
DECL_WINELIB_TYPE_AW(PACTRL_PROPERTY_ENTRY)

typedef struct _ACTRL_ALISTA
{
    ULONG                  cEntries;
    PACTRL_PROPERTY_ENTRYA pPropertyAccessList;
} ACTRL_ACCESSA, *PACTRL_ACCESSA, ACTRL_AUDITA, *PACTRL_AUDITA;

typedef struct _ACTRL_ALISTW
{
    ULONG                  cEntries;
    PACTRL_PROPERTY_ENTRYW pPropertyAccessList;
} ACTRL_ACCESSW, *PACTRL_ACCESSW, ACTRL_AUDITW, *PACTRL_AUDITW;

DECL_WINELIB_TYPE_AW(ACTRL_ACCESS)
DECL_WINELIB_TYPE_AW(PACTRL_ACCESS)
DECL_WINELIB_TYPE_AW(ACTRL_AUDIT)
DECL_WINELIB_TYPE_AW(PACTRL_AUDIT)

#define TRUSTEE_ACCESS_ALLOWED      0x00000001
#define TRUSTEE_ACCESS_READ         0x00000002
#define TRUSTEE_ACCESS_WRITE        0x00000004

#define TRUSTEE_ACCESS_EXPLICIT     0x00000001
#define TRUSTEE_ACCESS_READ_WRITE   (TRUSTEE_ACCESS_READ|TRUSTEE_ACCESS_WRITE)
#define TRUSTEE_ACCESS_ALL          0xFFFFFFFF

typedef struct _TRUSTEE_ACCESSA
{
    LPSTR         lpProperty;
    ACCESS_RIGHTS Access;
    ULONG         fAccessFlags;
    ULONG         fReturnedAccess;
} TRUSTEE_ACCESSA, *PTRUSTEE_ACCESSA;

typedef struct _TRUSTEE_ACCESSW
{
    LPWSTR        lpProperty;
    ACCESS_RIGHTS Access;
    ULONG         fAccessFlags;
    ULONG         fReturnedAccess;
} TRUSTEE_ACCESSW, *PTRUSTEE_ACCESSW;

DECL_WINELIB_TYPE_AW(TRUSTEE_ACCESS)
DECL_WINELIB_TYPE_AW(PTRUSTEE_ACCESS)

#define ACTRL_RESERVED              0x00000000
#define ACTRL_PERM_1                0x00000001
#define ACTRL_PERM_2                0x00000002
#define ACTRL_PERM_3                0x00000004
#define ACTRL_PERM_4                0x00000008
#define ACTRL_PERM_5                0x00000010
#define ACTRL_PERM_6                0x00000020
#define ACTRL_PERM_7                0x00000040
#define ACTRL_PERM_8                0x00000080
#define ACTRL_PERM_9                0x00000100
#define ACTRL_PERM_10               0x00000200
#define ACTRL_PERM_11               0x00000400
#define ACTRL_PERM_12               0x00000800
#define ACTRL_PERM_13               0x00001000
#define ACTRL_PERM_14               0x00002000
#define ACTRL_PERM_15               0x00004000
#define ACTRL_PERM_16               0x00008000
#define ACTRL_PERM_17               0x00010000
#define ACTRL_PERM_18               0x00020000
#define ACTRL_PERM_19               0x00040000
#define ACTRL_PERM_20               0x00080000

#define ACTRL_ACCESS_ALLOWED        0x00000001
#define ACTRL_ACCESS_DENIED         0x00000002
#define ACTRL_AUDIT_SUCCESS         0x00000004
#define ACTRL_AUDIT_FAILURE         0x00000008

#define ACTRL_ACCESS_PROTECTED      0x00000001

#define ACTRL_SYSTEM_ACCESS         0x04000000
#define ACTRL_DELETE                0x08000000
#define ACTRL_READ_CONTROL          0x10000000
#define ACTRL_CHANGE_ACCESS         0x20000000
#define ACTRL_CHANGE_OWNER          0x40000000
#define ACTRL_SYNCHRONIZE           0x80000000
#define ACTRL_STD_RIGHTS_ALL        0xf8000000
#define ACTRL_STD_RIGHT_REQUIRED    (ACTRL_STD_RIGHTS_ALL & ~ACTRL_SYNCHRONIZE)

#define ACTRL_DS_OPEN               ACTRL_RESERVED
#define ACTRL_DS_CREATE_CHILD       ACTRL_PERM_1
#define ACTRL_DS_DELETE_CHILD       ACTRL_PERM_2
#define ACTRL_DS_LIST               ACTRL_PERM_3
#define ACTRL_DS_SELF               ACTRL_PERM_4
#define ACTRL_DS_READ_PROP          ACTRL_PERM_5
#define ACTRL_DS_WRITE_PROP         ACTRL_PERM_6
#define ACTRL_DS_DELETE_TREE        ACTRL_PERM_7
#define ACTRL_DS_LIST_OBJECT        ACTRL_PERM_8
#define ACTRL_DS_CONTROL_ACCESS     ACTRL_PERM_9

#define ACTRL_FILE_READ             ACTRL_PERM_1
#define ACTRL_FILE_WRITE            ACTRL_PERM_2
#define ACTRL_FILE_APPEND           ACTRL_PERM_3
#define ACTRL_FILE_READ_PROP        ACTRL_PERM_4
#define ACTRL_FILE_WRITE_PROP       ACTRL_PERM_5
#define ACTRL_FILE_EXECUTE          ACTRL_PERM_6
#define ACTRL_FILE_READ_ATTRIB      ACTRL_PERM_8
#define ACTRL_FILE_WRITE_ATTRIB     ACTRL_PERM_9
#define ACTRL_FILE_CREATE_PIPE      ACTRL_PERM_10
#define ACTRL_DIR_LIST              ACTRL_PERM_1
#define ACTRL_DIR_CREATE_OBJECT     ACTRL_PERM_2
#define ACTRL_DIR_CREATE_CHILD      ACTRL_PERM_3
#define ACTRL_DIR_DELETE_CHILD      ACTRL_PERM_7
#define ACTRL_DIR_TRAVERSE          ACTRL_PERM_6
#define ACTRL_KERNEL_TERMINATE      ACTRL_PERM_1
#define ACTRL_KERNEL_THREAD         ACTRL_PERM_2
#define ACTRL_KERNEL_VM             ACTRL_PERM_3
#define ACTRL_KERNEL_VM_READ        ACTRL_PERM_4
#define ACTRL_KERNEL_VM_WRITE       ACTRL_PERM_5
#define ACTRL_KERNEL_DUP_HANDLE     ACTRL_PERM_6
#define ACTRL_KERNEL_PROCESS        ACTRL_PERM_7
#define ACTRL_KERNEL_SET_INFO       ACTRL_PERM_8
#define ACTRL_KERNEL_GET_INFO       ACTRL_PERM_9
#define ACTRL_KERNEL_CONTROL        ACTRL_PERM_10
#define ACTRL_KERNEL_ALERT          ACTRL_PERM_11
#define ACTRL_KERNEL_GET_CONTEXT    ACTRL_PERM_12
#define ACTRL_KERNEL_SET_CONTEXT    ACTRL_PERM_13
#define ACTRL_KERNEL_TOKEN          ACTRL_PERM_14
#define ACTRL_KERNEL_IMPERSONATE    ACTRL_PERM_15
#define ACTRL_KERNEL_DIMPERSONATE   ACTRL_PERM_16
#define ACTRL_PRINT_SADMIN          ACTRL_PERM_1
#define ACTRL_PRINT_SLIST           ACTRL_PERM_2
#define ACTRL_PRINT_PADMIN          ACTRL_PERM_3
#define ACTRL_PRINT_PUSE            ACTRL_PERM_4
#define ACTRL_PRINT_JADMIN          ACTRL_PERM_5
#define ACTRL_SVC_GET_INFO          ACTRL_PERM_1
#define ACTRL_SVC_SET_INFO          ACTRL_PERM_2
#define ACTRL_SVC_STATUS            ACTRL_PERM_3
#define ACTRL_SVC_LIST              ACTRL_PERM_4
#define ACTRL_SVC_START             ACTRL_PERM_5
#define ACTRL_SVC_STOP              ACTRL_PERM_6
#define ACTRL_SVC_PAUSE             ACTRL_PERM_7
#define ACTRL_SVC_INTERROGATE       ACTRL_PERM_8
#define ACTRL_SVC_UCONTROL          ACTRL_PERM_9
#define ACTRL_REG_QUERY             ACTRL_PERM_1
#define ACTRL_REG_SET               ACTRL_PERM_2
#define ACTRL_REG_CREATE_CHILD      ACTRL_PERM_3
#define ACTRL_REG_LIST              ACTRL_PERM_4
#define ACTRL_REG_NOTIFY            ACTRL_PERM_5
#define ACTRL_REG_LINK              ACTRL_PERM_6
#define ACTRL_WIN_CLIPBRD           ACTRL_PERM_1
#define ACTRL_WIN_GLOBAL_ATOMS      ACTRL_PERM_2
#define ACTRL_WIN_CREATE            ACTRL_PERM_3
#define ACTRL_WIN_LIST_DESK         ACTRL_PERM_4
#define ACTRL_WIN_LIST              ACTRL_PERM_5
#define ACTRL_WIN_READ_ATTRIBS      ACTRL_PERM_6
#define ACTRL_WIN_WRITE_ATTRIBS     ACTRL_PERM_7
#define ACTRL_WIN_SCREEN            ACTRL_PERM_8
#define ACTRL_WIN_EXIT              ACTRL_PERM_9

#define ACTRL_ACCESS_NO_OPTIONS                 0x00000000
#define ACTRL_ACCESS_SUPPORTS_OBJECT_ENTRIES    0x00000001

typedef struct _ACTRL_OVERLAPPED
{
    union {
        PVOID Provider;
        ULONG Reserved1;
    } DUMMYUNIONNAME;
    ULONG  Reserved2;
    HANDLE hEvent;
} ACTRL_OVERLAPPED, *PACTRL_OVERLAPPED;

typedef struct _ACTRL_ACCESS_INFOA
{
    ULONG  fAccessPermission;
    LPSTR  lpAccessPermissionName;
} ACTRL_ACCESS_INFOA, *PACTRL_ACCESS_INFOA;

typedef struct _ACTRL_ACCESS_INFOW
{
    ULONG  fAccessPermission;
    LPWSTR lpAccessPermissionName;
} ACTRL_ACCESS_INFOW, *PACTRL_ACCESS_INFOW;

DECL_WINELIB_TYPE_AW(ACTRL_ACCESS_INFO)
DECL_WINELIB_TYPE_AW(PACTRL_ACCESS_INFO)

typedef struct _ACTRL_CONTROL_INFOA
{
    LPSTR  lpControlId;
    LPSTR  lpControlName;
} ACTRL_CONTROL_INFOA, *PACTRL_CONTROL_INFOA;

typedef struct _ACTRL_CONTROL_INFOW
{
    LPWSTR lpControlId;
    LPWSTR lpControlName;
} ACTRL_CONTROL_INFOW, *PACTRL_CONTROL_INFOW;

DECL_WINELIB_TYPE_AW(ACTRL_CONTROL_INFO)
DECL_WINELIB_TYPE_AW(PACTRL_CONTROL_INFO)

typedef enum _PROGRESS_INVOKE_SETTING {
    ProgressInvokeNever = 1,
    ProgressInvokeEveryObject,
    ProgressInvokeOnError,
    ProgressCancelOperation,
    ProgressRetryOperation
} PROG_INVOKE_SETTING, *PPROG_INVOKE_SETTING;

typedef struct _INHERITED_FROMA
{
    LONG   GenerationGap;
    LPSTR  AncestorName;
} INHERITED_FROMA, *PINHERITED_FROMA;

typedef struct _INHERITED_FROMW
{
    LONG   GenerationGap;
    LPWSTR AncestorName;
} INHERITED_FROMW, *PINHERITED_FROMW;

DECL_WINELIB_TYPE_AW(INHERITED_FROM)
DECL_WINELIB_TYPE_AW(PINHERITED_FROM)

#define AccFree LocalFree

#ifdef __cplusplus
}
#endif

#endif /* __WINE_ACCCTRL_H */