/*
 * 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 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 BuildTrusteeWithObjectsAndSidA( PTRUSTEEA,
    POBJECTS_AND_SID, GUID*, GUID*, PSID );
void BuildTrusteeWithObjectsAndSidW( PTRUSTEEW,
    POBJECTS_AND_SID, GUID*, GUID*, PSID );
#define     BuildTrusteeWithObjectsAndSid WINELIB_NAME_AW(BuildTrusteeWithObjectsAndSid)

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