/*
 * Copyright (C) 2004 Mike McCormack
 *
 * 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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#ifndef __WINE_ACLAPI_H
#define __WINE_ACLAPI_H

#ifndef __WINESRC__
# include <windows.h>
#endif
#include <accctrl.h>

#ifdef __cplusplus
extern "C" {
#endif

DWORD WINAPI GetSecurityInfo( HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
        PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);

DWORD WINAPI GetNamedSecurityInfoA(LPSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
        PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
DWORD WINAPI GetNamedSecurityInfoW(LPWSTR, SE_OBJECT_TYPE, SECURITY_INFORMATION,
        PSID*, PSID*, PACL*, PACL*, PSECURITY_DESCRIPTOR*);
#define     GetNamedSecurityInfo WINELIB_NAME_AW(GetNamedSecurityInfo)

DWORD WINAPI SetNamedSecurityInfoA(LPSTR, SE_OBJECT_TYPE,
         SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
DWORD WINAPI SetNamedSecurityInfoW(LPWSTR, SE_OBJECT_TYPE,
         SECURITY_INFORMATION, PSID, PSID, PACL, PACL);
#define     SetNamedSecurityInfo WINELIB_NAME_AW(SetNamedSecurityInfo)

DWORD WINAPI SetEntriesInAclA( ULONG, PEXPLICIT_ACCESSA, PACL, PACL*);
DWORD WINAPI SetEntriesInAclW( ULONG, PEXPLICIT_ACCESSW, PACL, PACL*);
#define     SetEntriesInAcl WINELIB_NAME_AW(SetEntriesInAcl)

DWORD WINAPI SetSecurityInfo(HANDLE, SE_OBJECT_TYPE, SECURITY_INFORMATION,
                             PSID, PSID, PACL, PACL);

TRUSTEE_FORM WINAPI GetTrusteeFormA( PTRUSTEEA );
TRUSTEE_FORM WINAPI GetTrusteeFormW( PTRUSTEEW );
#define     GetTrusteeForm WINELIB_NAME_AW(GetTrusteeForm)

LPSTR WINAPI GetTrusteeNameA( PTRUSTEEA );
LPWSTR WINAPI GetTrusteeNameW( PTRUSTEEW );
#define     GetTrusteeName WINELIB_NAME_AW(GetTrusteeName)

TRUSTEE_TYPE WINAPI GetTrusteeTypeA( PTRUSTEEA );
TRUSTEE_TYPE WINAPI GetTrusteeTypeW( PTRUSTEEW );
#define     GetTrusteeType WINELIB_NAME_AW(GetTrusteeType)

void WINAPI BuildTrusteeWithNameA( PTRUSTEEA, LPSTR );
void WINAPI BuildTrusteeWithNameW( PTRUSTEEW, LPWSTR );
#define     BuildTrusteeWithName WINELIB_NAME_AW(BuildTrusteeWithName)

VOID WINAPI BuildTrusteeWithObjectsAndNameA(PTRUSTEEA, POBJECTS_AND_NAME_A,
                                            SE_OBJECT_TYPE, LPSTR, LPSTR, LPSTR);
VOID WINAPI BuildTrusteeWithObjectsAndNameW(PTRUSTEEW, POBJECTS_AND_NAME_W,
                                            SE_OBJECT_TYPE, LPWSTR, LPWSTR, LPWSTR);
#define     BuildTrusteeWithObjectsAndName WINELIB_NAME_AW(BuildTrusteeWithObjectsAndName)

VOID WINAPI BuildTrusteeWithObjectsAndSidA(PTRUSTEEA, POBJECTS_AND_SID, GUID*, GUID*, PSID);
VOID WINAPI BuildTrusteeWithObjectsAndSidW(PTRUSTEEW, POBJECTS_AND_SID, GUID*, GUID*, PSID);
#define     BuildTrusteeWithObjectsAndSid WINELIB_NAME_AW(BuildTrusteeWithObjectsAndSid)

VOID WINAPI BuildExplicitAccessWithNameA(PEXPLICIT_ACCESSA, LPSTR, DWORD, ACCESS_MODE, DWORD);
VOID WINAPI BuildExplicitAccessWithNameW(PEXPLICIT_ACCESSW, LPWSTR, DWORD, ACCESS_MODE, DWORD);
#define     BuildExplicitAccessWithName WINELIB_NAME_AW(BuildExplicitAccessWithName)

VOID WINAPI BuildTrusteeWithSidA(PTRUSTEEA pTrustee, PSID pSid);
VOID WINAPI BuildTrusteeWithSidW(PTRUSTEEW pTrustee, PSID pSid);
#define     BuildTrusteeWithSid WINELIB_NAME_AW(BuildTrusteeWithSid)

#ifdef __cplusplus
}
#endif

#endif /* __WINE_ACLAPI_H */
