/*
 * 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)

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 */
