/*
 * Copyright (C) 2004 Juan Lang
 *
 * 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_SSPI_H__
#define __WINE_SSPI_H__

/* FIXME: #include <sdkddkver.h> */

#ifdef __cplusplus
extern "C" {
#endif

#define SEC_ENTRY __stdcall

typedef WCHAR SEC_WCHAR;
typedef CHAR  SEC_CHAR;

#ifndef __SECSTATUS_DEFINED__
#define __SECSTATUS_DEFINED__
typedef LONG SECURITY_STATUS;
#endif

#ifdef UNICODE
typedef SEC_WCHAR * SECURITY_PSTR;
typedef const SEC_WCHAR *  SECURITY_PCSTR;
#else
typedef SEC_CHAR * SECURITY_PSTR;
typedef const SEC_CHAR *  SECURITY_PCSTR;
#endif

#ifndef __SECHANDLE_DEFINED__
#define __SECHANDLE_DEFINED__
typedef struct _SecHandle
{
    ULONG_PTR dwLower;
    ULONG_PTR dwUpper;
} SecHandle, *PSecHandle;
#endif

#define SecInvalidateHandle(x) do { \
 ((PSecHandle)(x))->dwLower = ((ULONG_PTR)((INT_PTR)-1)); \
 ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1)); \
 } while (0)

#define SecIsValidHandle(x) \
 ((((PSecHandle)(x))->dwLower != ((ULONG_PTR)(INT_PTR)-1)) && \
 (((PSecHandle)(x))->dwUpper != ((ULONG_PTR)(INT_PTR)-1)))

typedef SecHandle CredHandle;
typedef PSecHandle PCredHandle;

#ifndef __WINE_CTXTHANDLE_DEFINED__
#define __WINE_CTXTHANDLE_DEFINED__
typedef SecHandle CtxtHandle;
typedef PSecHandle PCtxtHandle;
#endif

typedef struct _SECURITY_INTEGER
{
    ULONG LowPart;
    LONG  HighPart;
} SECURITY_INTEGER, *PSECURITY_INTEGER;
typedef SECURITY_INTEGER TimeStamp, *PTimeStamp;

#ifndef __UNICODE_STRING_DEFINED__
#define __UNICODE_STRING_DEFINED__
typedef struct _UNICODE_STRING {
  USHORT Length;        /* bytes */
  USHORT MaximumLength; /* bytes */
  PWSTR  Buffer;
} UNICODE_STRING, *PUNICODE_STRING;
#endif

typedef UNICODE_STRING SECURITY_STRING, *PSECURITY_STRING;

#define SSPIPFC_CREDPROV_DO_NOT_SAVE 0x00000001
#define SSPIPFC_NO_CHECKBOX          0x00000002

typedef void *PSEC_WINNT_AUTH_IDENTITY_OPAQUE;

SECURITY_STATUS SEC_ENTRY SspiEncodeAuthIdentityAsStrings(
    PSEC_WINNT_AUTH_IDENTITY_OPAQUE, PCWSTR *, PCWSTR *, PCWSTR *);

SECURITY_STATUS SEC_ENTRY SspiEncodeStringsAsAuthIdentity(
    PCWSTR, PCWSTR, PCWSTR, PSEC_WINNT_AUTH_IDENTITY_OPAQUE *);

SECURITY_STATUS SEC_ENTRY SspiPrepareForCredWrite(
    PSEC_WINNT_AUTH_IDENTITY_OPAQUE, PCWSTR, PULONG, PCWSTR*, PCWSTR*, PUCHAR*, PULONG);

ULONG SEC_ENTRY SspiPromptForCredentialsA(PCSTR, void *,
    ULONG, PCSTR, PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
    PSEC_WINNT_AUTH_IDENTITY_OPAQUE *, int *, ULONG);
ULONG SEC_ENTRY SspiPromptForCredentialsW(PCWSTR, void *,
    ULONG, PCWSTR, PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
    PSEC_WINNT_AUTH_IDENTITY_OPAQUE *, int *, ULONG);
#define SspiPromptForCredentials WINELIB_NAME_AW(SspiPromptForCredentials)

void SEC_ENTRY SspiFreeAuthIdentity(PSEC_WINNT_AUTH_IDENTITY_OPAQUE);
void SEC_ENTRY SspiLocalFree(void *);
void SEC_ENTRY SspiZeroAuthIdentity(PSEC_WINNT_AUTH_IDENTITY_OPAQUE);

typedef struct _SecPkgInfoA
{
    ULONG     fCapabilities;
    USHORT    wVersion;
    USHORT    wRPCID;
    ULONG     cbMaxToken;
    SEC_CHAR *Name;
    SEC_CHAR *Comment;
} SecPkgInfoA, *PSecPkgInfoA;

typedef struct _SecPkgInfoW
{
    ULONG      fCapabilities;
    USHORT     wVersion;
    USHORT     wRPCID;
    ULONG      cbMaxToken;
    SEC_WCHAR *Name;
    SEC_WCHAR *Comment;
} SecPkgInfoW, *PSecPkgInfoW;

typedef struct _SECURITY_PACKAGE_OPTIONS {
  ULONG Size;
  ULONG Type;
  ULONG Flags;
  ULONG SignatureSize;
  void *Signature;
} SECURITY_PACKAGE_OPTIONS, *PSECURITY_PACKAGE_OPTIONS;

SECURITY_STATUS WINAPI AddSecurityPackageA(LPSTR,SECURITY_PACKAGE_OPTIONS*);
SECURITY_STATUS WINAPI AddSecurityPackageW(LPWSTR,SECURITY_PACKAGE_OPTIONS*);
#define AddSecurityPackage WINELIB_NAME_AW(AddSecurityPackage)

#define SecPkgInfo WINELIB_NAME_AW(SecPkgInfo)
#define PSecPkgInfo WINELIB_NAME_AW(PSecPkgInfo)

/* fCapabilities field of SecPkgInfo */
#define SECPKG_FLAG_INTEGRITY              0x00000001
#define SECPKG_FLAG_PRIVACY                0x00000002
#define SECPKG_FLAG_TOKEN_ONLY             0x00000004
#define SECPKG_FLAG_DATAGRAM               0x00000008
#define SECPKG_FLAG_CONNECTION             0x00000010
#define SECPKG_FLAG_MULTI_REQUIRED         0x00000020
#define SECPKG_FLAG_CLIENT_ONLY            0x00000040
#define SECPKG_FLAG_EXTENDED_ERROR         0x00000080
#define SECPKG_FLAG_IMPERSONATION          0x00000100
#define SECPKG_FLAG_ACCEPT_WIN32_NAME      0x00000200
#define SECPKG_FLAG_STREAM                 0x00000400
#define SECPKG_FLAG_NEGOTIABLE             0x00000800
#define SECPKG_FLAG_GSS_COMPATIBLE         0x00001000
#define SECPKG_FLAG_LOGON                  0x00002000
#define SECPKG_FLAG_ASCII_BUFFERS          0x00004000
#define SECPKG_FLAG_FRAGMENT               0x00008000
#define SECPKG_FLAG_MUTUAL_AUTH            0x00010000
#define SECPKG_FLAG_DELEGATION             0x00020000
#define SECPKG_FLAG_READONLY_WITH_CHECKSUM 0x00040000
#define SECPKG_FLAG_RESTRICTED_TOKENS      0x00080000
#define SECPKG_FLAG_NEGO_EXTENDER          0x00100000
#define SECPKG_FLAG_NEGOTIABLE2            0x00200000
#define SECPKG_FLAG_APPCONTAINER_PASSTHROUGH 0x00400000
#define SECPKG_FLAG_APPCONTAINER_CHECKS    0x00800000

#define SECPKG_ID_NONE  0xffff

typedef struct _SecBuffer
{
    ULONG cbBuffer;
    ULONG BufferType;
    PVOID pvBuffer;
} SecBuffer, *PSecBuffer;

/* values for BufferType */
#define SECBUFFER_EMPTY               0
#define SECBUFFER_DATA                1
#define SECBUFFER_TOKEN               2
#define SECBUFFER_PKG_PARAMS          3
#define SECBUFFER_MISSING             4
#define SECBUFFER_EXTRA               5
#define SECBUFFER_STREAM_TRAILER      6
#define SECBUFFER_STREAM_HEADER       7
#define SECBUFFER_NEGOTIATION_INFO    8
#define SECBUFFER_PADDING             9
#define SECBUFFER_STREAM             10
#define SECBUFFER_MECHLIST           11
#define SECBUFFER_MECHLIST_SIGNATURE 12
#define SECBUFFER_TARGET             13
#define SECBUFFER_CHANNEL_BINDINGS   14

#define SECBUFFER_ATTRMASK               0xf0000000
#define SECBUFFER_READONLY               0x80000000
#define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000
#define SECBUFFER_RESERVED               0x60000000

typedef struct _SecBufferDesc
{
    ULONG      ulVersion;
    ULONG      cBuffers;
    PSecBuffer pBuffers;
} SecBufferDesc, *PSecBufferDesc;

/* values for ulVersion */
#define SECBUFFER_VERSION 0

typedef void (SEC_ENTRY *SEC_GET_KEY_FN)(void *Arg, void *Principal,
 ULONG KeyVer, void **Key, SECURITY_STATUS *Status);

SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesA(PULONG pcPackages,
 PSecPkgInfoA *ppPackageInfo);
SECURITY_STATUS SEC_ENTRY EnumerateSecurityPackagesW(PULONG pcPackages,
 PSecPkgInfoW *ppPackageInfo);
#define EnumerateSecurityPackages WINELIB_NAME_AW(EnumerateSecurityPackages)

typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_A)(PULONG,
 PSecPkgInfoA *);
typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_W)(PULONG,
 PSecPkgInfoW *);
#define ENUMERATE_SECURITY_PACKAGES_FN WINELIB_NAME_AW(ENUMERATE_SECURITY_PACKAGES_FN_)

SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesA(
 PCredHandle phCredential, ULONG ulAttribute, void *pBuffer);
SECURITY_STATUS SEC_ENTRY QueryCredentialsAttributesW(
 PCredHandle phCredential, ULONG ulAttribute, void *pBuffer);
#define QueryCredentialsAttributes WINELIB_NAME_AW(QueryCredentialsAttributes)

typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_A)
 (PCredHandle, ULONG, PVOID);
typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_W)
 (PCredHandle, ULONG, PVOID);
#define QUERY_CREDENTIALS_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CREDENTIALS_ATTRIBUTES_FN_)

typedef struct _SEC_CHANNEL_BINDINGS {
    ULONG dwInitiatorAddrType;
    ULONG cbInitiatorLength;
    ULONG dwInitiatorOffset;
    ULONG dwAcceptorAddrType;
    ULONG cbAcceptorLength;
    ULONG dwAcceptorOffset;
    ULONG cbApplicationDataLength;
    ULONG dwApplicationDataOffset;
} SEC_CHANNEL_BINDINGS, *PSEC_CHANNEL_BINDINGS;

/* values for QueryCredentialsAttributes ulAttribute */
#define SECPKG_CRED_ATTR_NAMES 1

/* types for QueryCredentialsAttributes */
typedef struct _SecPkgCredentials_NamesA
{
    SEC_CHAR *sUserName;
} SecPkgCredentials_NamesA, *PSecPkgCredentials_NamesA;

typedef struct _SecPkgCredentials_NamesW
{
    SEC_WCHAR *sUserName;
} SecPkgCredentials_NamesW, *PSecPkgCredentials_NamesW;

#define SecPkgCredentials_Names WINELIB_NAME_AW(SecPkgCredentials_Names)

SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleA(
 SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialsUse,
 PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn,
 PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry);
SECURITY_STATUS SEC_ENTRY AcquireCredentialsHandleW(
 SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialsUse,
 PLUID pvLogonID, PVOID pAuthData, SEC_GET_KEY_FN pGetKeyFn,
 PVOID pvGetKeyArgument, PCredHandle phCredential, PTimeStamp ptsExpiry);
#define AcquireCredentialsHandle WINELIB_NAME_AW(AcquireCredentialsHandle)

/* flags for fCredentialsUse */
#define SECPKG_CRED_INBOUND  0x00000001
#define SECPKG_CRED_OUTBOUND 0x00000002
#define SECPKG_CRED_BOTH     (SECPKG_CRED_INBOUND | SECPKG_CRED_OUTBOUND)
#define SECPKG_CRED_DEFAULT  0x00000004
#define SECPKG_CRED_RESERVED 0xf0000000

typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_A)(
 SEC_CHAR *, SEC_CHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
 PCredHandle, PTimeStamp);
typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
 SEC_WCHAR *, SEC_WCHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
 PCredHandle, PTimeStamp);
#define ACQUIRE_CREDENTIALS_HANDLE_FN WINELIB_NAME_AW(ACQUIRE_CREDENTIALS_HANDLE_FN_)

SECURITY_STATUS SEC_ENTRY FreeContextBuffer(PVOID pv);

typedef SECURITY_STATUS (SEC_ENTRY *FREE_CONTEXT_BUFFER_FN)(PVOID);

SECURITY_STATUS SEC_ENTRY FreeCredentialsHandle(PCredHandle
 phCredential);

#define FreeCredentialHandle FreeCredentialsHandle

typedef SECURITY_STATUS (SEC_ENTRY *FREE_CREDENTIALS_HANDLE_FN)(PCredHandle);

SECURITY_STATUS SEC_ENTRY InitializeSecurityContextA(
 PCredHandle phCredential, PCtxtHandle phContext,
 SEC_CHAR *pszTargetName, ULONG fContextReq,
 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput,
 ULONG *pfContextAttr, PTimeStamp ptsExpiry);
SECURITY_STATUS SEC_ENTRY InitializeSecurityContextW(
 PCredHandle phCredential, PCtxtHandle phContext,
 SEC_WCHAR *pszTargetName, ULONG fContextReq,
 ULONG Reserved1, ULONG TargetDataRep, PSecBufferDesc pInput,
 ULONG Reserved2, PCtxtHandle phNewContext, PSecBufferDesc pOutput,
 ULONG *pfContextAttr, PTimeStamp ptsExpiry);
#define InitializeSecurityContext WINELIB_NAME_AW(InitializeSecurityContext)

typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_A)
 (PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG, ULONG, PSecBufferDesc,
 ULONG, PCtxtHandle, PSecBufferDesc, ULONG *, PTimeStamp);
typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_W)
 (PCredHandle, PCtxtHandle, SEC_WCHAR *, ULONG, ULONG, ULONG, PSecBufferDesc,
 ULONG, PCtxtHandle, PSecBufferDesc, ULONG *, PTimeStamp);
#define INITIALIZE_SECURITY_CONTEXT_FN WINELIB_NAME_AW(INITIALIZE_SECURITY_CONTEXT_FN_)

/* flags for InitializeSecurityContext fContextReq and pfContextAttr */
#define ISC_REQ_DELEGATE               0x00000001
#define ISC_REQ_MUTUAL_AUTH            0x00000002
#define ISC_REQ_REPLAY_DETECT          0x00000004
#define ISC_REQ_SEQUENCE_DETECT        0x00000008
#define ISC_REQ_CONFIDENTIALITY        0x00000010
#define ISC_REQ_USE_SESSION_KEY        0x00000020
#define ISC_REQ_PROMPT_FOR_CREDS       0x00000040
#define ISC_REQ_USE_SUPPLIED_CREDS     0x00000080
#define ISC_REQ_ALLOCATE_MEMORY        0x00000100
#define ISC_REQ_USE_DCE_STYLE          0x00000200
#define ISC_REQ_DATAGRAM               0x00000400
#define ISC_REQ_CONNECTION             0x00000800
#define ISC_REQ_CALL_LEVEL             0x00001000
#define ISC_REQ_FRAGMENT_SUPPLIED      0x00002000
#define ISC_REQ_EXTENDED_ERROR         0x00004000
#define ISC_REQ_STREAM                 0x00008000
#define ISC_REQ_INTEGRITY              0x00010000
#define ISC_REQ_IDENTIFY               0x00020000
#define ISC_REQ_NULL_SESSION           0x00040000
#define ISC_REQ_MANUAL_CRED_VALIDATION 0x00080000
#define ISC_REQ_RESERVED1              0x00100000
#define ISC_REQ_FRAGMENT_TO_FIT        0x00200000

#define ISC_RET_DELEGATE               0x00000001
#define ISC_RET_MUTUAL_AUTH            0x00000002
#define ISC_RET_REPLAY_DETECT          0x00000004
#define ISC_RET_SEQUENCE_DETECT        0x00000008
#define ISC_RET_CONFIDENTIALITY        0x00000010
#define ISC_RET_USE_SESSION_KEY        0x00000020
#define ISC_RET_USED_COLLECTED_CREDS   0x00000040
#define ISC_RET_USED_SUPPLIED_CREDS    0x00000080
#define ISC_RET_ALLOCATED_MEMORY       0x00000100
#define ISC_RET_USED_DCE_STYLE         0x00000200
#define ISC_RET_DATAGRAM               0x00000400
#define ISC_RET_CONNECTION             0x00000800
#define ISC_RET_INTERMEDIATE_RETURN    0x00001000
#define ISC_RET_CALL_LEVEL             0x00002000
#define ISC_RET_EXTENDED_ERROR         0x00004000
#define ISC_RET_STREAM                 0x00008000
#define ISC_RET_INTEGRITY              0x00010000
#define ISC_RET_IDENTIFY               0x00020000
#define ISC_RET_NULL_SESSION           0x00040000
#define ISC_RET_MANUAL_CRED_VALIDATION 0x00080000
#define ISC_RET_RESERVED1              0x00100000
#define ISC_RET_FRAGMENT_ONLY          0x00200000

SECURITY_STATUS SEC_ENTRY AcceptSecurityContext(
 PCredHandle phCredential, PCtxtHandle phContext, PSecBufferDesc pInput,
 ULONG fContextReq, ULONG TargetDataRep,
 PCtxtHandle phNewContext, PSecBufferDesc pOutput,
 ULONG *pfContextAttr, PTimeStamp ptsExpiry);

typedef SECURITY_STATUS (SEC_ENTRY *ACCEPT_SECURITY_CONTEXT_FN)(PCredHandle,
 PCtxtHandle, PSecBufferDesc, ULONG, ULONG, PCtxtHandle,
 PSecBufferDesc, ULONG *, PTimeStamp);

/* flags for AcceptSecurityContext fContextReq and pfContextAttr */
#define ASC_REQ_DELEGATE               0x00000001
#define ASC_REQ_MUTUAL_AUTH            0x00000002
#define ASC_REQ_REPLAY_DETECT          0x00000004
#define ASC_REQ_SEQUENCE_DETECT        0x00000008
#define ASC_REQ_CONFIDENTIALITY        0x00000010
#define ASC_REQ_USE_SESSION_KEY        0x00000020
#define ASC_REQ_ALLOCATE_MEMORY        0x00000100
#define ASC_REQ_USE_DCE_STYLE          0x00000200
#define ASC_REQ_DATAGRAM               0x00000400
#define ASC_REQ_CONNECTION             0x00000800
#define ASC_REQ_CALL_LEVEL             0x00001000
#define ASC_REQ_FRAGMENT_SUPPLIED      0x00002000
#define ASC_REQ_EXTENDED_ERROR         0x00008000
#define ASC_REQ_STREAM                 0x00010000
#define ASC_REQ_INTEGRITY              0x00020000
#define ASC_REQ_LICENSING              0x00040000
#define ASC_REQ_IDENTIFY               0x00080000
#define ASC_REQ_ALLOW_NULL_SESSION     0x00100000
#define ASC_REQ_ALLOW_NON_USER_LOGONS  0x00200000
#define ASC_REQ_ALLOW_CONTEXT_REPLAY   0x00400000
#define ASC_REQ_FRAGMENT_TO_FIT        0x00800000
#define ASC_REQ_FRAGMENT_NO_TOKEN      0x01000000

#define ASC_RET_DELEGATE               0x00000001
#define ASC_RET_MUTUAL_AUTH            0x00000002
#define ASC_RET_REPLAY_DETECT          0x00000004
#define ASC_RET_SEQUENCE_DETECT        0x00000008
#define ASC_RET_CONFIDENTIALITY        0x00000010
#define ASC_RET_USE_SESSION_KEY        0x00000020
#define ASC_RET_ALLOCATED_MEMORY       0x00000100
#define ASC_RET_USED_DCE_STYLE         0x00000200
#define ASC_RET_DATAGRAM               0x00000400
#define ASC_RET_CONNECTION             0x00000800
#define ASC_RET_CALL_LEVEL             0x00002000
#define ASC_RET_THIRD_LEG_FAILED       0x00004000
#define ASC_RET_EXTENDED_ERROR         0x00008000
#define ASC_RET_STREAM                 0x00010000
#define ASC_RET_INTEGRITY              0x00020000
#define ASC_RET_LICENSING              0x00040000
#define ASC_RET_IDENTIFY               0x00080000
#define ASC_RET_NULL_SESSION           0x00100000
#define ASC_RET_ALLOW_NON_USER_LOGONS  0x00200000
#define ASC_RET_ALLOW_CONTEXT_REPLAY   0x00400000
#define ASC_RET_FRAGMENT_ONLY          0x00800000
#define ASC_RET_NO_TOKEN               0x01000000

/* values for TargetDataRep */
#define SECURITY_NATIVE_DREP  0x00000010
#define SECURITY_NETWORK_DREP 0x00000000

SECURITY_STATUS SEC_ENTRY CompleteAuthToken(PCtxtHandle phContext,
 PSecBufferDesc pToken);

typedef SECURITY_STATUS (SEC_ENTRY *COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle,
 PSecBufferDesc);

SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(PCtxtHandle phContext);

typedef SECURITY_STATUS (SEC_ENTRY *DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle);

SECURITY_STATUS SEC_ENTRY ApplyControlToken(PCtxtHandle phContext,
 PSecBufferDesc pInput);

typedef SECURITY_STATUS (SEC_ENTRY *APPLY_CONTROL_TOKEN_FN)(PCtxtHandle,
 PSecBufferDesc);

SECURITY_STATUS SEC_ENTRY QueryContextAttributesA(PCtxtHandle phContext,
 ULONG ulAttribute, void *pBuffer);
SECURITY_STATUS SEC_ENTRY QueryContextAttributesW(PCtxtHandle phContext,
 ULONG ulAttribute, void *pBuffer);
#define QueryContextAttributes WINELIB_NAME_AW(QueryContextAttributes)

typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
 ULONG, void *);
typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
 ULONG, void *);
#define QUERY_CONTEXT_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CONTEXT_ATTRIBUTES_FN_)

/* values for QueryContextAttributes/SetContextAttributes ulAttribute */
#define SECPKG_ATTR_SIZES               0
#define SECPKG_ATTR_NAMES               1
#define SECPKG_ATTR_LIFESPAN            2
#define SECPKG_ATTR_DCE_INFO            3
#define SECPKG_ATTR_STREAM_SIZES        4
#define SECPKG_ATTR_KEY_INFO            5
#define SECPKG_ATTR_AUTHORITY           6
#define SECPKG_ATTR_PROTO_INFO          7
#define SECPKG_ATTR_PASSWORD_EXPIRY     8
#define SECPKG_ATTR_SESSION_KEY         9
#define SECPKG_ATTR_PACKAGE_INFO       10
#define SECPKG_ATTR_USER_FLAGS         11
#define SECPKG_ATTR_NEGOTIATION_INFO   12
#define SECPKG_ATTR_NATIVE_NAMES       13
#define SECPKG_ATTR_FLAGS              14
#define SECPKG_ATTR_USE_VALIDATED      15
#define SECPKG_ATTR_CREDENTIAL_NAME    16
#define SECPKG_ATTR_TARGET_INFORMATION 17
#define SECPKG_ATTR_ACCESS_TOKEN       18
#define SECPKG_ATTR_TARGET             19
#define SECPKG_ATTR_AUTHENTICATION_ID  20
#define SECPKG_ATTR_LOGOFF_TIME        21
#define SECPKG_ATTR_NEGO_KEYS          22
#define SECPKG_ATTR_PROMPTING_NEEDED   24
#define SECPKG_ATTR_UNIQUE_BINDINGS    25
#define SECPKG_ATTR_ENDPOINT_BINDINGS  26
#define SECPKG_ATTR_CLIENT_SPECIFIED_TARGET  27
#define SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS 30
#define SECPKG_ATTR_NEGO_PKG_INFO      31
#define SECPKG_ATTR_NEGO_STATUS        32
#define SECPKG_ATTR_CONTEXT_DELETED    33

#define SECPKG_ATTR_SUBJECT_SECURITY_ATTRIBUTES 128
#define SECPKG_ATTR_NEGO_INFO_FLAG_NO_KERBEROS 0x1
#define SECPKG_ATTR_NEGO_INFO_FLAG_NO_NTLM     0x2

/* types for QueryContextAttributes/SetContextAttributes */

typedef struct _SecPkgContext_Sizes
{
    ULONG cbMaxToken;
    ULONG cbMaxSignature;
    ULONG cbBlockSize;
    ULONG cbSecurityTrailer;
} SecPkgContext_Sizes, *PSecPkgContext_Sizes;

typedef struct _SecPkgContext_StreamSizes
{
    ULONG cbHeader;
    ULONG cbTrailer;
    ULONG cbMaximumMessage;
    ULONG cbBuffers;
    ULONG cbBlockSize;
} SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;

typedef struct _SecPkgContext_NamesA
{
    SEC_CHAR *sUserName;
} SecPkgContext_NamesA, *PSecPkgContext_NamesA;

typedef struct _SecPkgContext_NamesW
{
    SEC_WCHAR *sUserName;
} SecPkgContext_NamesW, *PSecPkgContext_NamesW;

#define SecPkgContext_Names WINELIB_NAME_AW(SecPkgContext_Names)
#define PSecPkgContext_Names WINELIB_NAME_AW(PSecPkgContext_Names)

typedef struct _SecPkgContext_Lifespan
{
    TimeStamp tsStart;
    TimeStamp tsExpiry;
} SecPkgContext_Lifespan, *PSecPkgContext_Lifespan;

typedef struct _SecPkgContext_DceInfo
{
    ULONG AuthzSvc;
    PVOID pPac;
} SecPkgContext_DceInfo, *PSecPkgContext_DceInfo;

typedef struct _SecPkgContext_KeyInfoA
{
    SEC_CHAR *sSignatureAlgorithmName;
    SEC_CHAR *sEncryptAlgorithmName;
    ULONG     KeySize;
    ULONG     SignatureAlgorithm;
    ULONG     EncryptAlgorithm;
} SecPkgContext_KeyInfoA, *PSecPkgContext_KeyInfoA;

typedef struct _SecPkgContext_KeyInfoW
{
    SEC_WCHAR *sSignatureAlgorithmName;
    SEC_WCHAR *sEncryptAlgorithmName;
    ULONG      KeySize;
    ULONG      SignatureAlgorithm;
    ULONG      EncryptAlgorithm;
} SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW;

#define SecPkgContext_KeyInfo WINELIB_NAME_AW(SecPkgContext_KeyInfo)
#define PSecPkgContext_KeyInfo WINELIB_NAME_AW(PSecPkgContext_KeyInfo)

typedef struct _SecPkgContext_AuthorityA
{
    SEC_CHAR *sAuthorityName;
} SecPkgContext_AuthorityA, *PSecPkgContext_AuthorityA;

typedef struct _SecPkgContext_AuthorityW
{
    SEC_WCHAR *sAuthorityName;
} SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW;

#define SecPkgContext_Authority WINELIB_NAME_AW(SecPkgContext_Authority)
#define PSecPkgContext_Authority WINELIB_NAME_AW(PSecPkgContext_Authority)

typedef struct _SecPkgContext_ProtoInfoA
{
    SEC_CHAR *sProtocolName;
    ULONG     majorVersion;
    ULONG     minorVersion;
} SecPkgContext_ProtoInfoA, *PSecPkgContext_ProtoInfoA;

typedef struct _SecPkgContext_ProtoInfoW
{
    SEC_WCHAR *sProtocolName;
    ULONG      majorVersion;
    ULONG      minorVersion;
} SecPkgContext_ProtoInfoW, *PSecPkgContext_ProtoInfoW;

#define SecPkgContext_ProtoInfo WINELIB_NAME_AW(SecPkgContext_ProtoInfo)
#define PSecPkgContext_ProtoInfo WINELIB_NAME_AW(PSecPkgContext_ProtoInfo)

typedef struct _SecPkgContext_PasswordExpiry
{
    TimeStamp tsPasswordExpires;
} SecPkgContext_PasswordExpiry, *PSecPkgContext_PasswordExpiry;

typedef struct _SecPkgContext_SessionKey
{
    ULONG          SessionKeyLength;
    unsigned char *SessionKey;
} SecPkgContext_SessionKey, *PSecPkgContext_SessionKey;

typedef struct _SecPkgContext_PackageInfoA
{
    PSecPkgInfoA PackageInfo;
} SecPkgContext_PackageInfoA, *PSecPkgContext_PackageInfoA;

typedef struct _SecPkgContext_PackageInfoW
{
    PSecPkgInfoW PackageInfo;
} SecPkgContext_PackageInfoW, *PSecPkgContext_PackageInfoW;

#define SecPkgContext_PackageInfo WINELIB_NAME_AW(SecPkgContext_PackageInfo)
#define PSecPkgContext_PackageInfo WINELIB_NAME_AW(PSecPkgContext_PackageInfo)

typedef struct _SecPkgContext_Flags
{
    ULONG Flags;
} SecPkgContext_Flags, *PSecPkgContext_Flags;

typedef struct _SecPkgContext_UserFlags
{
    ULONG UserFlags;
} SecPkgContext_UserFlags, *PSecPkgContext_UserFlags;

typedef struct _SecPkgContext_NegotiationInfoA
{
    PSecPkgInfoA PackageInfo;
    ULONG        NegotiationState;
} SecPkgContext_NegotiationInfoA, *PSecPkgContext_NegotiationInfoA;

typedef struct _SecPkgContext_NegotiationInfoW
{
    PSecPkgInfoW PackageInfo;
    ULONG        NegotiationState;
} SecPkgContext_NegotiationInfoW, *PSecPkgContext_NegotiationInfoW;

#define SecPkgContext_NegotiationInfo WINELIB_NAME_AW(SecPkgContext_NegotiationInfo)
#define PSecPkgContext_NegotiationInfo WINELIB_NAME_AW(PSecPkgContext_NegotiationInfo)

/* values for NegotiationState */
#define SECPKG_NEGOTIATION_COMPLETE      0
#define SECPKG_NEGOTIATION_OPTIMISTIC    1
#define SECPKG_NEGOTIATION_IN_PROGRESS   2
#define SECPKG_NEGOTIATION_DIRECT        3
#define SECPKG_NEGOTIATION_TRY_MULTICRED 4

typedef struct _SecPkgContext_NativeNamesA
{
    SEC_CHAR *sClientName;
    SEC_CHAR *sServerName;
} SecPkgContext_NativeNamesA, *PSecPkgContext_NativeNamesA;

typedef struct _SecPkgContext_NativeNamesW
{
    SEC_WCHAR *sClientName;
    SEC_WCHAR *sServerName;
} SecPkgContext_NativeNamesW, *PSecPkgContext_NativeNamesW;

#define SecPkgContext_NativeNames WINELIB_NAME_AW(SecPkgContext_NativeNames)
#define PSecPkgContext_NativeNames WINELIB_NAME_AW(PSecPkgContext_NativeNames)

typedef struct _SecPkgContext_CredentialNameA
{
    ULONG     CredentialType;
    SEC_CHAR *sCredentialName;
} SecPkgContext_CredentialNameA, *PSecPkgContext_CredentialNameA;

typedef struct _SecPkgContext_CredentialNameW
{
    ULONG      CredentialType;
    SEC_WCHAR *sCredentialName;
} SecPkgContext_CredentialNameW, *PSecPkgContext_CredentialNameW;

#define SecPkgContext_CredentialName WINELIB_NAME_AW(SecPkgContext_CredentialName)
#define PSecPkgContext_CredentialName WINELIB_NAME_AW(PSecPkgContext_CredentialName)

typedef struct _SecPkgContext_AccessToken
{
    void *AccessToken;
} SecPkgContext_AccessToken, *PSecPkgContext_AccessToken;

typedef struct _SecPkgContext_TargetInformation
{
    ULONG          MarshalledTargetInfoLength;
    unsigned char *MarshalledTargetInfo;
} SecPkgContext_TargetInformation, *PSecPkgContext_TargetInformation;

typedef struct _SecPkgContext_AuthzID
{
    ULONG  AuthzIDLength;
    char  *AuthzID;
} SecPkgContext_AuthzID, *PSecPkgContext_AuthzID;

typedef struct _SecPkgContext_Target
{
    ULONG  TargetLength;
    char  *Target;
} SecPkgContext_Target, *PSecPkgContext_Target;

typedef struct _SecPkgContext_Bindings
{
    ULONG BindingsLength;
    SEC_CHANNEL_BINDINGS *Bindings;
} SecPkgContext_Bindings, *PSecPkgContext_Bindings;

SECURITY_STATUS SEC_ENTRY ImpersonateSecurityContext(PCtxtHandle phContext);

typedef SECURITY_STATUS (SEC_ENTRY *IMPERSONATE_SECURITY_CONTEXT_FN)
 (PCtxtHandle);

SECURITY_STATUS SEC_ENTRY RevertSecurityContext(PCtxtHandle phContext);

typedef SECURITY_STATUS (SEC_ENTRY *REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle);

SECURITY_STATUS SEC_ENTRY MakeSignature(PCtxtHandle phContext,
 ULONG fQOP, PSecBufferDesc pMessage, ULONG MessageSeqNo);

typedef SECURITY_STATUS (SEC_ENTRY *MAKE_SIGNATURE_FN)(PCtxtHandle,
 ULONG, PSecBufferDesc, ULONG);

SECURITY_STATUS SEC_ENTRY VerifySignature(PCtxtHandle phContext,
 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP);

typedef SECURITY_STATUS (SEC_ENTRY *VERIFY_SIGNATURE_FN)(PCtxtHandle,
 PSecBufferDesc, ULONG, PULONG);

SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoA(
 SEC_CHAR *pszPackageName, PSecPkgInfoA *ppPackageInfo);
SECURITY_STATUS SEC_ENTRY QuerySecurityPackageInfoW(
 SEC_WCHAR *pszPackageName, PSecPkgInfoW *ppPackageInfo);
#define QuerySecurityPackageInfo WINELIB_NAME_AW(QuerySecurityPackageInfo)

typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_A)
 (SEC_CHAR *, PSecPkgInfoA *);
typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_W)
 (SEC_WCHAR *, PSecPkgInfoW *);
#define QUERY_SECURITY_PACKAGE_INFO_FN WINELIB_NAME_AW(QUERY_SECURITY_PACKAGE_INFO_FN_)

SECURITY_STATUS SEC_ENTRY ExportSecurityContext(PCtxtHandle phContext,
 ULONG fFlags, PSecBuffer pPackedContext, void **pToken);

typedef SECURITY_STATUS (SEC_ENTRY *EXPORT_SECURITY_CONTEXT_FN)(PCtxtHandle,
 ULONG, PSecBuffer, void **);

/* values for ExportSecurityContext fFlags */
#define SECPKG_CONTEXT_EXPORT_RESET_NEW  0x00000001
#define SECPKG_CONTEXT_EXPORT_DELETE_OLD 0x00000002

SECURITY_STATUS SEC_ENTRY ImportSecurityContextA(SEC_CHAR *pszPackage,
 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext);
SECURITY_STATUS SEC_ENTRY ImportSecurityContextW(SEC_WCHAR *pszPackage,
 PSecBuffer pPackedContext, void *Token, PCtxtHandle phContext);
#define ImportSecurityContext WINELIB_NAME_AW(ImportSecurityContext)

typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_A)(SEC_CHAR *,
 PSecBuffer, void *, PCtxtHandle);
typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_W)(SEC_WCHAR *,
 PSecBuffer, void *, PCtxtHandle);
#define IMPORT_SECURITY_CONTEXT_FN WINELIB_NAME_AW(IMPORT_SECURITY_CONTEXT_FN_)

SECURITY_STATUS SEC_ENTRY AddCredentialsA(PCredHandle hCredentials,
 SEC_CHAR *pszPrincipal, SEC_CHAR *pszPackage, ULONG fCredentialUse,
 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
 PTimeStamp ptsExpiry);
SECURITY_STATUS SEC_ENTRY AddCredentialsW(PCredHandle hCredentials,
 SEC_WCHAR *pszPrincipal, SEC_WCHAR *pszPackage, ULONG fCredentialUse,
 void *pAuthData, SEC_GET_KEY_FN pGetKeyFn, void *pvGetKeyArgument,
 PTimeStamp ptsExpiry);
#define AddCredentials WINELIB_NAME_AW(AddCredentials)

typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_A)(PCredHandle,
 SEC_CHAR *, SEC_CHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
 PTimeStamp);
typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_W)(PCredHandle,
 SEC_WCHAR *, SEC_WCHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
 PTimeStamp);

SECURITY_STATUS SEC_ENTRY QuerySecurityContextToken(PCtxtHandle phContext,
 HANDLE *phToken);

typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_CONTEXT_TOKEN_FN)
 (PCtxtHandle, HANDLE *);

SECURITY_STATUS SEC_ENTRY EncryptMessage(PCtxtHandle phContext, ULONG fQOP,
 PSecBufferDesc pMessage, ULONG MessageSeqNo);
SECURITY_STATUS SEC_ENTRY DecryptMessage(PCtxtHandle phContext,
 PSecBufferDesc pMessage, ULONG MessageSeqNo, PULONG pfQOP);

/* values for EncryptMessage fQOP */
#define SECQOP_WRAP_NO_ENCRYPT 0x80000001

typedef SECURITY_STATUS (SEC_ENTRY *ENCRYPT_MESSAGE_FN)(PCtxtHandle, ULONG,
 PSecBufferDesc, ULONG);
typedef SECURITY_STATUS (SEC_ENTRY *DECRYPT_MESSAGE_FN)(PCtxtHandle,
 PSecBufferDesc, ULONG, PULONG);

SECURITY_STATUS SEC_ENTRY SetContextAttributesA(PCtxtHandle phContext,
 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer);
SECURITY_STATUS SEC_ENTRY SetContextAttributesW(PCtxtHandle phContext,
 ULONG ulAttribute, void *pBuffer, ULONG cbBuffer);
#define SetContextAttributes WINELIB_NAME_AW(SetContextAttributes)

typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
 ULONG, void *, ULONG);
typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
 ULONG, void *, ULONG);

#define SECURITY_ENTRYPOINT_ANSIA "InitSecurityInterfaceA"
#define SECURITY_ENTRYPOINT_ANSIW "InitSecurityInterfaceW"
#define SECURITY_ENTRYPOINT_ANSI WINELIB_NAME_AW(SECURITY_ENTRYPOINT_ANSI)

typedef struct _SECURITY_FUNCTION_TABLE_A
{
    ULONG                             dwVersion;
    ENUMERATE_SECURITY_PACKAGES_FN_A  EnumerateSecurityPackagesA;
    QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
    ACQUIRE_CREDENTIALS_HANDLE_FN_A   AcquireCredentialsHandleA;
    FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
    void                             *Reserved2;
    INITIALIZE_SECURITY_CONTEXT_FN_A  InitializeSecurityContextA;
    ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
    COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
    DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
    APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
    QUERY_CONTEXT_ATTRIBUTES_FN_A     QueryContextAttributesA;
    IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
    REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
    MAKE_SIGNATURE_FN                 MakeSignature;
    VERIFY_SIGNATURE_FN               VerifySignature;
    FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
    QUERY_SECURITY_PACKAGE_INFO_FN_A  QuerySecurityPackageInfoA;
    void                             *Reserved3;
    void                             *Reserved4;
    EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
    IMPORT_SECURITY_CONTEXT_FN_A      ImportSecurityContextA;
    ADD_CREDENTIALS_FN_A              AddCredentialsA;
    void                             *Reserved8;
    QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
    ENCRYPT_MESSAGE_FN                EncryptMessage;
    DECRYPT_MESSAGE_FN                DecryptMessage;
    SET_CONTEXT_ATTRIBUTES_FN_A       SetContextAttributesA;
} SecurityFunctionTableA, *PSecurityFunctionTableA;

typedef struct _SECURITY_FUNCTION_TABLE_W
{
    ULONG                             dwVersion;
    ENUMERATE_SECURITY_PACKAGES_FN_W  EnumerateSecurityPackagesW;
    QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
    ACQUIRE_CREDENTIALS_HANDLE_FN_W   AcquireCredentialsHandleW;
    FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
    void                             *Reserved2;
    INITIALIZE_SECURITY_CONTEXT_FN_W  InitializeSecurityContextW;
    ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
    COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
    DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
    APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
    QUERY_CONTEXT_ATTRIBUTES_FN_W     QueryContextAttributesW;
    IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
    REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
    MAKE_SIGNATURE_FN                 MakeSignature;
    VERIFY_SIGNATURE_FN               VerifySignature;
    FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
    QUERY_SECURITY_PACKAGE_INFO_FN_W  QuerySecurityPackageInfoW;
    void                             *Reserved3;
    void                             *Reserved4;
    EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
    IMPORT_SECURITY_CONTEXT_FN_W      ImportSecurityContextW;
    ADD_CREDENTIALS_FN_W              AddCredentialsW;
    void                             *Reserved8;
    QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
    ENCRYPT_MESSAGE_FN                EncryptMessage;
    DECRYPT_MESSAGE_FN                DecryptMessage;
    SET_CONTEXT_ATTRIBUTES_FN_W       SetContextAttributesW;
} SecurityFunctionTableW, *PSecurityFunctionTableW;

#define SecurityFunctionTable WINELIB_NAME_AW(SecurityFunctionTable)
#define PSecurityFunctionTable WINELIB_NAME_AW(PSecurityFunctionTable)

#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION   1
#define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 2

PSecurityFunctionTableA SEC_ENTRY InitSecurityInterfaceA(void);
PSecurityFunctionTableW SEC_ENTRY InitSecurityInterfaceW(void);
#define InitSecurityInterface WINELIB_NAME_AW(InitSecurityInterface)

typedef PSecurityFunctionTableA (SEC_ENTRY *INIT_SECURITY_INTERFACE_A)(void);
typedef PSecurityFunctionTableW (SEC_ENTRY *INIT_SECURITY_INTERFACE_W)(void);
#define INIT_SECURITY_INTERFACE WINELIB_NAME_AW(INIT_SECURITY_INTERFACE_)

#ifdef __cplusplus
}
#endif

#endif /* ndef __WINE_SSPI_H__ */
