xref: /reactos/sdk/include/psdk/sspi.h (revision 11fe17c3)
1 /*
2  * Copyright (C) 2004 Juan Lang
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2.1 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17  */
18 #ifndef __WINE_SSPI_H__
19 #define __WINE_SSPI_H__
20 
21 #include <wtypes.h>
22 
23 #ifdef __cplusplus
24 extern "C" {
25 #endif
26 
27 #define SEC_ENTRY WINAPI
28 
29 typedef WCHAR SEC_WCHAR;
30 typedef CHAR  SEC_CHAR;
31 
32 #ifndef __SECSTATUS_DEFINED__
33 #define __SECSTATUS_DEFINED__
34 typedef LONG SECURITY_STATUS;
35 #endif
36 
37 #define UNISP_NAME_A "Microsoft Unified Security Protocol Provider"
38 #define UNISP_NAME_W L"Microsoft Unified Security Protocol Provider"
39 #define UNISP_NAME WINELIB_NAME_AW(UNISP_NAME_)
40 
41 #ifdef UNICODE
42 typedef SEC_WCHAR * SECURITY_PSTR;
43 typedef CONST SEC_WCHAR *  SECURITY_PCSTR;
44 #else
45 typedef SEC_CHAR * SECURITY_PSTR;
46 typedef CONST SEC_CHAR *  SECURITY_PCSTR;
47 #endif
48 
49 #ifndef __SECHANDLE_DEFINED__
50 #define __SECHANDLE_DEFINED__
51 typedef struct _SecHandle
52 {
53     ULONG_PTR dwLower;
54     ULONG_PTR dwUpper;
55 } SecHandle, *PSecHandle;
56 #endif
57 
58 #define SecInvalidateHandle(x) do { \
59  ((PSecHandle)(x))->dwLower = ((ULONG_PTR)((INT_PTR)-1)); \
60  ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1)); \
61  } while (0)
62 
63 #define SecIsValidHandle(x) \
64  ((((PSecHandle)(x))->dwLower != ((ULONG_PTR)(INT_PTR)-1)) && \
65  (((PSecHandle)(x))->dwUpper != ((ULONG_PTR)(INT_PTR)-1)))
66 
67 typedef SecHandle CredHandle;
68 typedef PSecHandle PCredHandle;
69 
70 typedef SecHandle CtxtHandle;
71 typedef PSecHandle PCtxtHandle;
72 
73 typedef struct _SECURITY_INTEGER
74 {
75     ULONG LowPart;
76     LONG HighPart;
77 } SECURITY_INTEGER, *PSECURITY_INTEGER;
78 typedef SECURITY_INTEGER TimeStamp, *PTimeStamp;
79 
80 // UNICODE_STRING should have the same memory layout in 32 bit and 64 bit mode.
81 // In 32 bit mode SECURITY_STRING is simply a clone of UNICODE_STRING.
82 // It is used internal in kernel an security components.
83 #ifndef _NTDEF_
84 typedef struct _SECURITY_STRING {
85     unsigned short Length;
86     unsigned short MaximumLength;
87     unsigned short *Buffer;
88 } SECURITY_STRING, *PSECURITY_STRING;
89 #else
90 typedef UNICODE_STRING SECURITY_STRING, *PSECURITY_STRING;
91 #endif
92 
93 #define SSPIPFC_CREDPROV_DO_NOT_SAVE 0x00000001
94 #define SSPIPFC_NO_CHECKBOX 0x00000002
95 
96 typedef void *PSEC_WINNT_AUTH_IDENTITY_OPAQUE;
97 
98 ULONG SEC_ENTRY SspiPromptForCredentialsW(_In_ PCWSTR, _In_opt_ void *,
99     _In_ ULONG, _In_ PCWSTR, _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE,
100     _Outptr_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE *, _Inout_opt_ int *, _In_ ULONG);
101 
102 typedef struct _SecPkgInfoA
103 {
104     ULONG  fCapabilities;
105     unsigned short wVersion;
106     unsigned short wRPCID;
107     ULONG  cbMaxToken;
108     SEC_CHAR      *Name;
109     SEC_CHAR      *Comment;
110 } SecPkgInfoA, *PSecPkgInfoA;
111 
112 typedef struct _SecPkgInfoW
113 {
114     ULONG  fCapabilities;
115     unsigned short wVersion;
116     unsigned short wRPCID;
117     ULONG  cbMaxToken;
118     SEC_WCHAR     *Name;
119     SEC_WCHAR     *Comment;
120 } SecPkgInfoW, *PSecPkgInfoW;
121 
122 #define SecPkgInfo WINELIB_NAME_AW(SecPkgInfo)
123 #define PSecPkgInfo WINELIB_NAME_AW(PSecPkgInfo)
124 
125 /* fCapabilities field of SecPkgInfo */
126 #define SECPKG_FLAG_INTEGRITY                0x00000001
127 #define SECPKG_FLAG_PRIVACY                  0x00000002
128 #define SECPKG_FLAG_TOKEN_ONLY               0x00000004
129 #define SECPKG_FLAG_DATAGRAM                 0x00000008
130 #define SECPKG_FLAG_CONNECTION               0x00000010
131 #define SECPKG_FLAG_MULTI_REQUIRED           0x00000020
132 #define SECPKG_FLAG_CLIENT_ONLY              0x00000040
133 #define SECPKG_FLAG_EXTENDED_ERROR           0x00000080
134 #define SECPKG_FLAG_IMPERSONATION            0x00000100
135 #define SECPKG_FLAG_ACCEPT_WIN32_NAME        0x00000200
136 #define SECPKG_FLAG_STREAM                   0x00000400
137 #define SECPKG_FLAG_NEGOTIABLE               0x00000800
138 #define SECPKG_FLAG_GSS_COMPATIBLE           0x00001000
139 #define SECPKG_FLAG_LOGON                    0x00002000
140 #define SECPKG_FLAG_ASCII_BUFFERS            0x00004000
141 #define SECPKG_FLAG_FRAGMENT                 0x00008000
142 #define SECPKG_FLAG_MUTUAL_AUTH              0x00010000
143 #define SECPKG_FLAG_DELEGATION               0x00020000
144 #define SECPKG_FLAG_READONLY_WITH_CHECKSUM   0x00040000
145 #define SECPKG_FLAG_RESTRICTED_TOKENS        0x00080000
146 #define SECPKG_FLAG_NEGO_EXTENDER            0x00100000
147 #define SECPKG_FLAG_NEGOTIABLE2              0x00200000
148 #define SECPKG_FLAG_APPCONTAINER_PASSTHROUGH 0x00400000
149 #define SECPKG_FLAG_APPCONTAINER_CHECKS      0x00800000
150 #define SECPKG_FLAG_APPLY_LOOPBACK           0x02000000
151 
152 typedef struct _SecBuffer {
153   ULONG cbBuffer;
154   ULONG BufferType;
155   _Field_size_bytes_(cbBuffer) void *pvBuffer;
156 } SecBuffer, *PSecBuffer;
157 
158 /* values for BufferType */
159 #define SECBUFFER_EMPTY               0
160 #define SECBUFFER_DATA                1
161 #define SECBUFFER_TOKEN               2
162 #define SECBUFFER_PKG_PARAMS          3
163 #define SECBUFFER_MISSING             4
164 #define SECBUFFER_EXTRA               5
165 #define SECBUFFER_STREAM_TRAILER      6
166 #define SECBUFFER_STREAM_HEADER       7
167 #define SECBUFFER_NEGOTIATION_INFO    8
168 #define SECBUFFER_PADDING             9
169 #define SECBUFFER_STREAM             10
170 #define SECBUFFER_MECHLIST           11
171 #define SECBUFFER_MECHLIST_SIGNATURE 12
172 #define SECBUFFER_TARGET             13
173 #define SECBUFFER_CHANNEL_BINDINGS   14
174 
175 #define SECBUFFER_ATTRMASK               0xf0000000
176 #define SECBUFFER_READONLY               0x80000000
177 #define SECBUFFER_READONLY_WITH_CHECKSUM 0x10000000
178 #define SECBUFFER_RESERVED               0x60000000
179 
180 typedef struct _SecBufferDesc {
181   ULONG ulVersion;
182   ULONG cBuffers;
183   _Field_size_(cBuffers) PSecBuffer pBuffers;
184 } SecBufferDesc, *PSecBufferDesc;
185 
186 /* values for ulVersion */
187 #define SECBUFFER_VERSION 0
188 
189 typedef void (SEC_ENTRY *SEC_GET_KEY_FN)(void *Arg, void *Principal,
190  ULONG KeyVer, void **Key, SECURITY_STATUS *Status);
191 
192 SECURITY_STATUS
193 SEC_ENTRY
194 EnumerateSecurityPackagesA(
195   _Out_ PULONG pcPackages,
196   _Outptr_ PSecPkgInfoA *ppPackageInfo);
197 
198 SECURITY_STATUS
199 SEC_ENTRY
200 EnumerateSecurityPackagesW(
201   _Out_ PULONG pcPackages,
202   _Outptr_ PSecPkgInfoW *ppPackageInfo);
203 
204 #define EnumerateSecurityPackages WINELIB_NAME_AW(EnumerateSecurityPackages)
205 
206 typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_A)(PULONG,
207  PSecPkgInfoA *);
208 typedef SECURITY_STATUS (SEC_ENTRY *ENUMERATE_SECURITY_PACKAGES_FN_W)(PULONG,
209  PSecPkgInfoW *);
210 #define ENUMERATE_SECURITY_PACKAGES_FN WINELIB_NAME_AW(ENUMERATE_SECURITY_PACKAGES_FN_)
211 
212 SECURITY_STATUS
213 SEC_ENTRY
214 QueryCredentialsAttributesA(
215   _In_ PCredHandle phCredential,
216   _In_ ULONG ulAttribute,
217   _Inout_ void *pBuffer);
218 
219 SECURITY_STATUS
220 SEC_ENTRY
221 QueryCredentialsAttributesW(
222   _In_ PCredHandle phCredential,
223   _In_ ULONG ulAttribute,
224   _Inout_ void *pBuffer);
225 
226 #define QueryCredentialsAttributes WINELIB_NAME_AW(QueryCredentialsAttributes)
227 
228 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_A)
229  (PCredHandle, ULONG, PVOID);
230 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CREDENTIALS_ATTRIBUTES_FN_W)
231  (PCredHandle, ULONG, PVOID);
232 #define QUERY_CREDENTIALS_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CREDENTIALS_ATTRIBUTES_FN_)
233 
234 typedef struct _SEC_CHANNEL_BINDINGS {
235     ULONG dwInitiatorAddrType;
236     ULONG cbInitiatorLength;
237     ULONG dwInitiatorOffset;
238     ULONG dwAcceptorAddrType;
239     ULONG cbAcceptorLength;
240     ULONG dwAcceptorOffset;
241     ULONG cbApplicationDataLength;
242     ULONG dwApplicationDataOffset;
243 } SEC_CHANNEL_BINDINGS, *PSEC_CHANNEL_BINDINGS;
244 
245 /* values for QueryCredentialsAttributes ulAttribute */
246 #define SECPKG_CRED_ATTR_NAMES 1
247 
248 /* types for QueryCredentialsAttributes */
249 typedef struct _SecPkgCredentials_NamesA
250 {
251     SEC_CHAR *sUserName;
252 } SecPkgCredentials_NamesA, *PSecPkgCredentials_NamesA;
253 
254 typedef struct _SecPkgCredentials_NamesW
255 {
256     SEC_WCHAR *sUserName;
257 } SecPkgCredentials_NamesW, *PSecPkgCredentials_NamesW;
258 
259 #define SecPkgCredentials_Names WINELIB_NAME_AW(SecPkgCredentials_Names)
260 
261 SECURITY_STATUS
262 SEC_ENTRY
263 AcquireCredentialsHandleA(
264   _In_opt_ SEC_CHAR *pszPrincipal,
265   _In_ SEC_CHAR *pszPackage,
266   _In_ ULONG fCredentialsUse,
267   _In_opt_ PLUID pvLogonID,
268   _In_opt_ PVOID pAuthData,
269   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
270   _In_opt_ PVOID pvGetKeyArgument,
271   _Out_ PCredHandle phCredential,
272   _Out_opt_ PTimeStamp ptsExpiry);
273 
274 SECURITY_STATUS
275 SEC_ENTRY
276 AcquireCredentialsHandleW(
277   _In_opt_ SEC_WCHAR *pszPrincipal,
278   _In_ SEC_WCHAR *pszPackage,
279   _In_ ULONG fCredentialsUse,
280   _In_opt_ PLUID pvLogonID,
281   _In_opt_ PVOID pAuthData,
282   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
283   _In_opt_ PVOID pvGetKeyArgument,
284   _Out_ PCredHandle phCredential,
285   _Out_opt_ PTimeStamp ptsExpiry);
286 
287 #define AcquireCredentialsHandle WINELIB_NAME_AW(AcquireCredentialsHandle)
288 
289 /* flags for fCredentialsUse */
290 #define SECPKG_CRED_INBOUND  0x00000001
291 #define SECPKG_CRED_OUTBOUND 0x00000002
292 #define SECPKG_CRED_BOTH     (SECPKG_CRED_INBOUND | SECPKG_CRED_OUTBOUND)
293 #define SECPKG_CRED_DEFAULT  0x00000004
294 #define SECPKG_CRED_RESERVED 0xf0000000
295 
296 typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_A)(
297  SEC_CHAR *, SEC_CHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
298  PCredHandle, PTimeStamp);
299 typedef SECURITY_STATUS (SEC_ENTRY *ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
300  SEC_WCHAR *, SEC_WCHAR *, ULONG, PLUID, PVOID, SEC_GET_KEY_FN, PVOID,
301  PCredHandle, PTimeStamp);
302 #define ACQUIRE_CREDENTIALS_HANDLE_FN WINELIB_NAME_AW(ACQUIRE_CREDENTIALS_HANDLE_FN_)
303 
304 SECURITY_STATUS SEC_ENTRY FreeContextBuffer(_Inout_ PVOID pv);
305 
306 typedef SECURITY_STATUS (SEC_ENTRY *FREE_CONTEXT_BUFFER_FN)(_Inout_ PVOID);
307 
308 SECURITY_STATUS
309 SEC_ENTRY
310 FreeCredentialsHandle(
311   _In_ PCredHandle phCredential);
312 
313 #define FreeCredentialHandle FreeCredentialsHandle
314 
315 typedef SECURITY_STATUS (SEC_ENTRY *FREE_CREDENTIALS_HANDLE_FN)(PCredHandle);
316 
317 SECURITY_STATUS
318 SEC_ENTRY
319 InitializeSecurityContextA(
320   _In_opt_ PCredHandle phCredential,
321   _In_opt_ PCtxtHandle phContext,
322   _In_opt_ SEC_CHAR *pszTargetName,
323   _In_ ULONG fContextReq,
324   _In_ ULONG Reserved1,
325   _In_ ULONG TargetDataRep,
326   _In_opt_ PSecBufferDesc pInput,
327   _In_ ULONG Reserved2,
328   _Inout_opt_ PCtxtHandle phNewContext,
329   _Inout_opt_ PSecBufferDesc pOutput,
330   _Out_ ULONG *pfContextAttr,
331   _Out_opt_ PTimeStamp ptsExpiry);
332 
333 SECURITY_STATUS
334 SEC_ENTRY
335 InitializeSecurityContextW(
336   _In_opt_ PCredHandle phCredential,
337   _In_opt_ PCtxtHandle phContext,
338   _In_opt_ SEC_WCHAR *pszTargetName,
339   _In_ ULONG fContextReq,
340   _In_ ULONG Reserved1,
341   _In_ ULONG TargetDataRep,
342   _In_opt_ PSecBufferDesc pInput,
343   _In_ ULONG Reserved2,
344   _Inout_opt_ PCtxtHandle phNewContext,
345   _Inout_opt_ PSecBufferDesc pOutput,
346   _Out_ ULONG *pfContextAttr,
347   _Out_opt_ PTimeStamp ptsExpiry);
348 
349 #define InitializeSecurityContext WINELIB_NAME_AW(InitializeSecurityContext)
350 
351 typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_A)
352  (PCredHandle, PCtxtHandle, SEC_CHAR *, ULONG, ULONG,
353  ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc,
354  ULONG *, PTimeStamp);
355 typedef SECURITY_STATUS (SEC_ENTRY *INITIALIZE_SECURITY_CONTEXT_FN_W)
356  (PCredHandle, PCtxtHandle, SEC_WCHAR *, ULONG, ULONG,
357  ULONG, PSecBufferDesc, ULONG, PCtxtHandle, PSecBufferDesc,
358  ULONG *, PTimeStamp);
359 #define INITIALIZE_SECURITY_CONTEXT_FN WINELIB_NAME_AW(INITIALIZE_SECURITY_CONTEXT_FN_)
360 
361 /* flags for InitializeSecurityContext fContextReq and pfContextAttr */
362 #define ISC_REQ_DELEGATE               0x00000001
363 #define ISC_REQ_MUTUAL_AUTH            0x00000002
364 #define ISC_REQ_REPLAY_DETECT          0x00000004
365 #define ISC_REQ_SEQUENCE_DETECT        0x00000008
366 #define ISC_REQ_CONFIDENTIALITY        0x00000010
367 #define ISC_REQ_USE_SESSION_KEY        0x00000020
368 #define ISC_REQ_PROMPT_FOR_CREDS       0x00000040
369 #define ISC_REQ_USE_SUPPLIED_CREDS     0x00000080
370 #define ISC_REQ_ALLOCATE_MEMORY        0x00000100
371 #define ISC_REQ_USE_DCE_STYLE          0x00000200
372 #define ISC_REQ_DATAGRAM               0x00000400
373 #define ISC_REQ_CONNECTION             0x00000800
374 #define ISC_REQ_CALL_LEVEL             0x00001000
375 #define ISC_REQ_FRAGMENT_SUPPLIED      0x00002000
376 #define ISC_REQ_EXTENDED_ERROR         0x00004000
377 #define ISC_REQ_STREAM                 0x00008000
378 #define ISC_REQ_INTEGRITY              0x00010000
379 #define ISC_REQ_IDENTIFY               0x00020000
380 #define ISC_REQ_NULL_SESSION           0x00040000
381 #define ISC_REQ_MANUAL_CRED_VALIDATION 0x00080000
382 #define ISC_REQ_RESERVED1              0x00100000
383 #define ISC_REQ_FRAGMENT_TO_FIT        0x00200000
384 
385 #define ISC_RET_DELEGATE               0x00000001
386 #define ISC_RET_MUTUAL_AUTH            0x00000002
387 #define ISC_RET_REPLAY_DETECT          0x00000004
388 #define ISC_RET_SEQUENCE_DETECT        0x00000008
389 #define ISC_RET_CONFIDENTIALITY        0x00000010
390 #define ISC_RET_USE_SESSION_KEY        0x00000020
391 #define ISC_RET_USED_COLLECTED_CREDS   0x00000040
392 #define ISC_RET_USED_SUPPLIED_CREDS    0x00000080
393 #define ISC_RET_ALLOCATED_MEMORY       0x00000100
394 #define ISC_RET_USED_DCE_STYLE         0x00000200
395 #define ISC_RET_DATAGRAM               0x00000400
396 #define ISC_RET_CONNECTION             0x00000800
397 #define ISC_RET_INTERMEDIATE_RETURN    0x00001000
398 #define ISC_RET_CALL_LEVEL             0x00002000
399 #define ISC_RET_EXTENDED_ERROR         0x00004000
400 #define ISC_RET_STREAM                 0x00008000
401 #define ISC_RET_INTEGRITY              0x00010000
402 #define ISC_RET_IDENTIFY               0x00020000
403 #define ISC_RET_NULL_SESSION           0x00040000
404 #define ISC_RET_MANUAL_CRED_VALIDATION 0x00080000
405 #define ISC_RET_RESERVED1              0x00100000
406 #define ISC_RET_FRAGMENT_ONLY          0x00200000
407 
408 SECURITY_STATUS
409 SEC_ENTRY
410 AcceptSecurityContext(
411   _In_opt_ PCredHandle phCredential,
412   _In_opt_ PCtxtHandle phContext,
413   _In_opt_ PSecBufferDesc pInput,
414   _In_ ULONG fContextReq,
415   _In_ ULONG TargetDataRep,
416   _Inout_opt_ PCtxtHandle phNewContext,
417   _Inout_opt_ PSecBufferDesc pOutput,
418   _Out_ ULONG *pfContextAttr,
419   _Out_opt_ PTimeStamp ptsExpiry);
420 
421 typedef SECURITY_STATUS (SEC_ENTRY *ACCEPT_SECURITY_CONTEXT_FN)(PCredHandle,
422  PCtxtHandle, PSecBufferDesc, ULONG, ULONG, PCtxtHandle,
423  PSecBufferDesc, ULONG *, PTimeStamp);
424 
425 /* flags for AcceptSecurityContext fContextReq and pfContextAttr */
426 #define ASC_REQ_DELEGATE               0x00000001
427 #define ASC_REQ_MUTUAL_AUTH            0x00000002
428 #define ASC_REQ_REPLAY_DETECT          0x00000004
429 #define ASC_REQ_SEQUENCE_DETECT        0x00000008
430 #define ASC_REQ_CONFIDENTIALITY        0x00000010
431 #define ASC_REQ_USE_SESSION_KEY        0x00000020
432 #define ASC_REQ_ALLOCATE_MEMORY        0x00000100
433 #define ASC_REQ_USE_DCE_STYLE          0x00000200
434 #define ASC_REQ_DATAGRAM               0x00000400
435 #define ASC_REQ_CONNECTION             0x00000800
436 #define ASC_REQ_CALL_LEVEL             0x00001000
437 #define ASC_REQ_FRAGMENT_SUPPLIED      0x00002000
438 #define ASC_REQ_EXTENDED_ERROR         0x00008000
439 #define ASC_REQ_STREAM                 0x00010000
440 #define ASC_REQ_INTEGRITY              0x00020000
441 #define ASC_REQ_LICENSING              0x00040000
442 #define ASC_REQ_IDENTIFY               0x00080000
443 #define ASC_REQ_ALLOW_NULL_SESSION     0x00100000
444 #define ASC_REQ_ALLOW_NON_USER_LOGONS  0x00200000
445 #define ASC_REQ_ALLOW_CONTEXT_REPLAY   0x00400000
446 #define ASC_REQ_FRAGMENT_TO_FIT        0x00800000
447 #define ASC_REQ_FRAGMENT_NO_TOKEN      0x01000000
448 
449 #define ASC_RET_DELEGATE               0x00000001
450 #define ASC_RET_MUTUAL_AUTH            0x00000002
451 #define ASC_RET_REPLAY_DETECT          0x00000004
452 #define ASC_RET_SEQUENCE_DETECT        0x00000008
453 #define ASC_RET_CONFIDENTIALITY        0x00000010
454 #define ASC_RET_USE_SESSION_KEY        0x00000020
455 #define ASC_RET_ALLOCATED_MEMORY       0x00000100
456 #define ASC_RET_USED_DCE_STYLE         0x00000200
457 #define ASC_RET_DATAGRAM               0x00000400
458 #define ASC_RET_CONNECTION             0x00000800
459 #define ASC_RET_CALL_LEVEL             0x00002000
460 #define ASC_RET_THIRD_LEG_FAILED       0x00004000
461 #define ASC_RET_EXTENDED_ERROR         0x00008000
462 #define ASC_RET_STREAM                 0x00010000
463 #define ASC_RET_INTEGRITY              0x00020000
464 #define ASC_RET_LICENSING              0x00040000
465 #define ASC_RET_IDENTIFY               0x00080000
466 #define ASC_RET_NULL_SESSION           0x00100000
467 #define ASC_RET_ALLOW_NON_USER_LOGONS  0x00200000
468 #define ASC_RET_ALLOW_CONTEXT_REPLAY   0x00400000
469 #define ASC_RET_FRAGMENT_ONLY          0x00800000
470 #define ASC_RET_NO_TOKEN               0x01000000
471 
472 /*Vvalues for TargetDataRep */
473 #define SECURITY_NATIVE_DREP           0x00000010
474 #define SECURITY_NETWORK_DREP          0x00000000
475 
476 SECURITY_STATUS
477 SEC_ENTRY
478 CompleteAuthToken(
479   _In_ PCtxtHandle phContext,
480   _In_ PSecBufferDesc pToken);
481 
482 typedef SECURITY_STATUS (SEC_ENTRY *COMPLETE_AUTH_TOKEN_FN)(PCtxtHandle,
483  PSecBufferDesc);
484 
485 SECURITY_STATUS SEC_ENTRY DeleteSecurityContext(_In_ PCtxtHandle phContext);
486 
487 typedef SECURITY_STATUS (SEC_ENTRY *DELETE_SECURITY_CONTEXT_FN)(PCtxtHandle);
488 
489 SECURITY_STATUS
490 SEC_ENTRY
491 ApplyControlToken(
492   _In_ PCtxtHandle phContext,
493   _In_ PSecBufferDesc pInput);
494 
495 typedef SECURITY_STATUS (SEC_ENTRY *APPLY_CONTROL_TOKEN_FN)(PCtxtHandle,
496  PSecBufferDesc);
497 
498 SECURITY_STATUS
499 SEC_ENTRY
500 QueryContextAttributesA(
501   _In_ PCtxtHandle phContext,
502   _In_ ULONG ulAttribute,
503   _Out_ void *pBuffer);
504 
505 SECURITY_STATUS
506 SEC_ENTRY
507 QueryContextAttributesW(
508   _In_ PCtxtHandle phContext,
509   _In_ ULONG ulAttribute,
510   _Out_ void *pBuffer);
511 
512 #define QueryContextAttributes WINELIB_NAME_AW(QueryContextAttributes)
513 
514 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
515  ULONG, void *);
516 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
517  ULONG, void *);
518 #define QUERY_CONTEXT_ATTRIBUTES_FN WINELIB_NAME_AW(QUERY_CONTEXT_ATTRIBUTES_FN_)
519 
520 /* values for QueryContextAttributes/SetContextAttributes ulAttribute */
521 #define SECPKG_ATTR_SIZES               0
522 #define SECPKG_ATTR_NAMES               1
523 #define SECPKG_ATTR_LIFESPAN            2
524 #define SECPKG_ATTR_DCE_INFO            3
525 #define SECPKG_ATTR_STREAM_SIZES        4
526 #define SECPKG_ATTR_KEY_INFO            5
527 #define SECPKG_ATTR_AUTHORITY           6
528 #define SECPKG_ATTR_PROTO_INFO          7
529 #define SECPKG_ATTR_PASSWORD_EXPIRY     8
530 #define SECPKG_ATTR_SESSION_KEY         9
531 #define SECPKG_ATTR_PACKAGE_INFO       10
532 #define SECPKG_ATTR_USER_FLAGS         11
533 #define SECPKG_ATTR_NEGOTIATION_INFO   12
534 #define SECPKG_ATTR_NATIVE_NAMES       13
535 #define SECPKG_ATTR_FLAGS              14
536 #define SECPKG_ATTR_USE_VALIDATED      15
537 #define SECPKG_ATTR_CREDENTIAL_NAME    16
538 #define SECPKG_ATTR_TARGET_INFORMATION 17
539 #define SECPKG_ATTR_ACCESS_TOKEN       18
540 #define SECPKG_ATTR_TARGET             19
541 #define SECPKG_ATTR_AUTHENTICATION_ID  20
542 #define SECPKG_ATTR_LOGOFF_TIME        21
543 #define SECPKG_ATTR_NEGO_KEYS          22
544 #define SECPKG_ATTR_PROMPTING_NEEDED   24
545 #define SECPKG_ATTR_UNIQUE_BINDINGS    25
546 #define SECPKG_ATTR_ENDPOINT_BINDINGS  26
547 #define SECPKG_ATTR_CLIENT_SPECIFIED_TARGET  27
548 #define SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS 30
549 #define SECPKG_ATTR_NEGO_PKG_INFO      31
550 #define SECPKG_ATTR_NEGO_STATUS        32
551 #define SECPKG_ATTR_CONTEXT_DELETED    33
552 
553 #define SECPKG_ATTR_SUBJECT_SECURITY_ATTRIBUTES 128
554 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_KERBEROS 0x1
555 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_NTLM     0x2
556 
557 /* types for QueryContextAttributes/SetContextAttributes */
558 
559 typedef struct _SecPkgContext_Sizes
560 {
561     ULONG cbMaxToken;
562     ULONG cbMaxSignature;
563     ULONG cbBlockSize;
564     ULONG cbSecurityTrailer;
565 } SecPkgContext_Sizes, *PSecPkgContext_Sizes;
566 
567 typedef struct _SecPkgContext_StreamSizes
568 {
569     ULONG cbHeader;
570     ULONG cbTrailer;
571     ULONG cbMaximumMessage;
572     ULONG cbBuffers;
573     ULONG cbBlockSize;
574 } SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;
575 
576 typedef struct _SecPkgContext_NamesA
577 {
578     SEC_CHAR *sUserName;
579 } SecPkgContext_NamesA, *PSecPkgContext_NamesA;
580 
581 typedef struct _SecPkgContext_NamesW
582 {
583     SEC_WCHAR *sUserName;
584 } SecPkgContext_NamesW, *PSecPkgContext_NamesW;
585 
586 #define SecPkgContext_Names WINELIB_NAME_AW(SecPkgContext_Names)
587 #define PSecPkgContext_Names WINELIB_NAME_AW(PSecPkgContext_Names)
588 
589 typedef struct _SecPkgContext_Lifespan
590 {
591     TimeStamp tsStart;
592     TimeStamp tsExpiry;
593 } SecPkgContext_Lifespan, *PSecPkgContext_Lifespan;
594 
595 typedef struct _SecPkgContext_DceInfo
596 {
597     ULONG AuthzSvc;
598     void *pPac;
599 } SecPkgContext_DceInfo, *PSecPkgContext_DceInfo;
600 
601 typedef struct _SecPkgContext_KeyInfoA
602 {
603     SEC_CHAR      *sSignatureAlgorithmName;
604     SEC_CHAR      *sEncryptAlgorithmName;
605     ULONG  KeySize;
606     ULONG  SignatureAlgorithm;
607     ULONG  EncryptAlgorithm;
608 } SecPkgContext_KeyInfoA, *PSecPkgContext_KeyInfoA;
609 
610 typedef struct _SecPkgContext_KeyInfoW
611 {
612     SEC_WCHAR     *sSignatureAlgorithmName;
613     SEC_WCHAR     *sEncryptAlgorithmName;
614     ULONG  KeySize;
615     ULONG  SignatureAlgorithm;
616     ULONG  EncryptAlgorithm;
617 } SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW;
618 
619 #define SecPkgContext_KeyInfo WINELIB_NAME_AW(SecPkgContext_KeyInfo)
620 #define PSecPkgContext_KeyInfo WINELIB_NAME_AW(PSecPkgContext_KeyInfo)
621 
622 typedef struct _SecPkgContext_AuthorityA
623 {
624     SEC_CHAR *sAuthorityName;
625 } SecPkgContext_AuthorityA, *PSecPkgContext_AuthorityA;
626 
627 typedef struct _SecPkgContext_AuthorityW
628 {
629     SEC_WCHAR *sAuthorityName;
630 } SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW;
631 
632 #define SecPkgContext_Authority WINELIB_NAME_AW(SecPkgContext_Authority)
633 #define PSecPkgContext_Authority WINELIB_NAME_AW(PSecPkgContext_Authority)
634 
635 typedef struct _SecPkgContext_ProtoInfoA
636 {
637     SEC_CHAR     *sProtocolName;
638     ULONG majorVersion;
639     ULONG minorVersion;
640 } SecPkgContext_ProtoInfoA, *PSecPkgContext_ProtoInfoA;
641 
642 typedef struct _SecPkgContext_ProtoInfoW
643 {
644     SEC_WCHAR    *sProtocolName;
645     ULONG majorVersion;
646     ULONG minorVersion;
647 } SecPkgContext_ProtoInfoW, *PSecPkgContext_ProtoInfoW;
648 
649 #define SecPkgContext_ProtoInfo WINELIB_NAME_AW(SecPkgContext_ProtoInfo)
650 #define PSecPkgContext_ProtoInfo WINELIB_NAME_AW(PSecPkgContext_ProtoInfo)
651 
652 typedef struct _SecPkgContext_PasswordExpiry
653 {
654     TimeStamp tsPasswordExpires;
655 } SecPkgContext_PasswordExpiry, *PSecPkgContext_PasswordExpiry;
656 
657 typedef struct _SecPkgContext_SessionKey {
658   ULONG SessionKeyLength;
659   _Field_size_bytes_(SessionKeyLength) unsigned char *SessionKey;
660 } SecPkgContext_SessionKey, *PSecPkgContext_SessionKey;
661 
662 typedef struct _SecPkgContext_PackageInfoA
663 {
664     PSecPkgInfoA PackageInfo;
665 } SecPkgContext_PackageInfoA, *PSecPkgContext_PackageInfoA;
666 
667 typedef struct _SecPkgContext_PackageInfoW
668 {
669     PSecPkgInfoW PackageInfo;
670 } SecPkgContext_PackageInfoW, *PSecPkgContext_PackageInfoW;
671 
672 #define SecPkgContext_PackageInfo WINELIB_NAME_AW(SecPkgContext_PackageInfo)
673 #define PSecPkgContext_PackageInfo WINELIB_NAME_AW(PSecPkgContext_PackageInfo)
674 
675 typedef struct _SecPkgContext_Flags
676 {
677     ULONG Flags;
678 } SecPkgContext_Flags, *PSecPkgContext_Flags;
679 
680 typedef struct _SecPkgContext_UserFlags
681 {
682     ULONG UserFlags;
683 } SecPkgContext_UserFlags, *PSecPkgContext_UserFlags;
684 
685 typedef struct _SecPkgContext_NegotiationInfoA
686 {
687     PSecPkgInfoA  PackageInfo;
688     ULONG NegotiationState;
689 } SecPkgContext_NegotiationInfoA, *PSecPkgContext_NegotiationInfoA;
690 
691 typedef struct _SecPkgContext_NegotiationInfoW
692 {
693     PSecPkgInfoW  PackageInfo;
694     ULONG NegotiationState;
695 } SecPkgContext_NegotiationInfoW, *PSecPkgContext_NegotiationInfoW;
696 
697 #define SecPkgContext_NegotiationInfo WINELIB_NAME_AW(SecPkgContext_NegotiationInfo)
698 #define PSecPkgContext_NegotiationInfo WINELIB_NAME_AW(PSecPkgContext_NegotiationInfo)
699 
700 /* values for NegotiationState */
701 #define SECPKG_NEGOTIATION_COMPLETE      0
702 #define SECPKG_NEGOTIATION_OPTIMISTIC    1
703 #define SECPKG_NEGOTIATION_IN_PROGRESS   2
704 #define SECPKG_NEGOTIATION_DIRECT        3
705 #define SECPKG_NEGOTIATION_TRY_MULTICRED 4
706 
707 typedef struct _SecPkgContext_NativeNamesA
708 {
709     SEC_CHAR *sClientName;
710     SEC_CHAR *sServerName;
711 } SecPkgContext_NativeNamesA, *PSecPkgContext_NativeNamesA;
712 
713 typedef struct _SecPkgContext_NativeNamesW
714 {
715     SEC_WCHAR *sClientName;
716     SEC_WCHAR *sServerName;
717 } SecPkgContext_NativeNamesW, *PSecPkgContext_NativeNamesW;
718 
719 #define SecPkgContext_NativeNames WINELIB_NAME_AW(SecPkgContext_NativeNames)
720 #define PSecPkgContext_NativeNames WINELIB_NAME_AW(PSecPkgContext_NativeNames)
721 
722 typedef struct _SecPkgContext_CredentialNameA
723 {
724     ULONG  CredentialType;
725     SEC_CHAR      *sCredentialName;
726 } SecPkgContext_CredentialNameA, *PSecPkgContext_CredentialNameA;
727 
728 typedef struct _SecPkgContext_CredentialNameW
729 {
730     ULONG  CredentialType;
731     SEC_WCHAR     *sCredentialName;
732 } SecPkgContext_CredentialNameW, *PSecPkgContext_CredentialNameW;
733 
734 #define SecPkgContext_CredentialName WINELIB_NAME_AW(SecPkgContext_CredentialName)
735 #define PSecPkgContext_CredentialName WINELIB_NAME_AW(PSecPkgContext_CredentialName)
736 
737 typedef struct _SecPkgContext_AccessToken
738 {
739     void *AccessToken;
740 } SecPkgContext_AccessToken, *PSecPkgContext_AccessToken;
741 
742 typedef struct _SecPkgContext_TargetInformation
743 {
744     ULONG  MarshalledTargetInfoLength;
745     unsigned char *MarshalledTargetInfo;
746 } SecPkgContext_TargetInformation, *PSecPkgContext_TargetInformation;
747 
748 typedef struct _SecPkgContext_AuthzID
749 {
750     ULONG  AuthzIDLength;
751     char          *AuthzID;
752 } SecPkgContext_AuthzID, *PSecPkgContext_AuthzID;
753 
754 typedef struct _SecPkgContext_Target
755 {
756     ULONG  TargetLength;
757     char          *Target;
758 } SecPkgContext_Target, *PSecPkgContext_Target;
759 
760 typedef struct _SecPkgContext_Bindings
761 {
762     ULONG BindingsLength;
763     SEC_CHANNEL_BINDINGS *Bindings;
764 } SecPkgContext_Bindings, *PSecPkgContext_Bindings;
765 
766 _Check_return_
767 SECURITY_STATUS
768 SEC_ENTRY
769 ImpersonateSecurityContext(
770   _In_ PCtxtHandle phContext);
771 
772 typedef SECURITY_STATUS (SEC_ENTRY *IMPERSONATE_SECURITY_CONTEXT_FN)
773  (PCtxtHandle);
774 
775 SECURITY_STATUS SEC_ENTRY RevertSecurityContext(_In_ PCtxtHandle phContext);
776 
777 typedef SECURITY_STATUS (SEC_ENTRY *REVERT_SECURITY_CONTEXT_FN)(PCtxtHandle);
778 
779 SECURITY_STATUS
780 SEC_ENTRY
781 MakeSignature(
782   _In_ PCtxtHandle phContext,
783   _In_ ULONG fQOP,
784   _In_ PSecBufferDesc pMessage,
785   _In_ ULONG MessageSeqNo);
786 
787 typedef SECURITY_STATUS (SEC_ENTRY *MAKE_SIGNATURE_FN)(PCtxtHandle,
788  ULONG, PSecBufferDesc, ULONG);
789 
790 SECURITY_STATUS
791 SEC_ENTRY
792 VerifySignature(
793   _In_ PCtxtHandle phContext,
794   _In_ PSecBufferDesc pMessage,
795   _In_ ULONG MessageSeqNo,
796   _Out_ PULONG pfQOP);
797 
798 typedef SECURITY_STATUS (SEC_ENTRY *VERIFY_SIGNATURE_FN)(PCtxtHandle,
799  PSecBufferDesc, ULONG, PULONG);
800 
801 SECURITY_STATUS
802 SEC_ENTRY
803 QuerySecurityPackageInfoA(
804   _In_ SEC_CHAR *pszPackageName,
805   _Outptr_ PSecPkgInfoA *ppPackageInfo);
806 
807 SECURITY_STATUS
808 SEC_ENTRY
809 QuerySecurityPackageInfoW(
810   _In_ SEC_WCHAR *pszPackageName,
811   _Outptr_ PSecPkgInfoW *ppPackageInfo);
812 
813 #define QuerySecurityPackageInfo WINELIB_NAME_AW(QuerySecurityPackageInfo)
814 
815 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_A)
816  (SEC_CHAR *, PSecPkgInfoA *);
817 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_PACKAGE_INFO_FN_W)
818  (SEC_WCHAR *, PSecPkgInfoW *);
819 #define QUERY_SECURITY_PACKAGE_INFO_FN WINELIB_NAME_AW(QUERY_SECURITY_PACKAGE_INFO_FN_)
820 
821 SECURITY_STATUS
822 SEC_ENTRY
823 ExportSecurityContext(
824   _In_ PCtxtHandle phContext,
825   _In_ ULONG fFlags,
826   _Out_ PSecBuffer pPackedContext,
827   _Out_ void **pToken);
828 
829 typedef SECURITY_STATUS (SEC_ENTRY *EXPORT_SECURITY_CONTEXT_FN)(PCtxtHandle,
830  ULONG, PSecBuffer, void **);
831 
832 /* values for ExportSecurityContext fFlags */
833 #define SECPKG_CONTEXT_EXPORT_RESET_NEW  0x00000001
834 #define SECPKG_CONTEXT_EXPORT_DELETE_OLD 0x00000002
835 
836 SECURITY_STATUS
837 SEC_ENTRY
838 ImportSecurityContextA(
839   _In_ SEC_CHAR *pszPackage,
840   _In_ PSecBuffer pPackedContext,
841   _In_ void *Token,
842   _Out_ PCtxtHandle phContext);
843 
844 SECURITY_STATUS
845 SEC_ENTRY
846 ImportSecurityContextW(
847   _In_ SEC_WCHAR *pszPackage,
848   _In_ PSecBuffer pPackedContext,
849   _In_ void *Token,
850   _Out_ PCtxtHandle phContext);
851 
852 #define ImportSecurityContext WINELIB_NAME_AW(ImportSecurityContext)
853 
854 typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_A)(SEC_CHAR *,
855  PSecBuffer, void *, PCtxtHandle);
856 typedef SECURITY_STATUS (SEC_ENTRY *IMPORT_SECURITY_CONTEXT_FN_W)(SEC_WCHAR *,
857  PSecBuffer, void *, PCtxtHandle);
858 #define IMPORT_SECURITY_CONTEXT_FN WINELIB_NAME_AW(IMPORT_SECURITY_CONTEXT_FN_)
859 
860 SECURITY_STATUS
861 SEC_ENTRY
862 AddCredentialsA(
863   _In_ PCredHandle hCredentials,
864   _In_opt_ SEC_CHAR *pszPrincipal,
865   _In_ SEC_CHAR *pszPackage,
866   _In_ ULONG fCredentialUse,
867   _In_opt_ void *pAuthData,
868   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
869   _In_opt_ void *pvGetKeyArgument,
870   _Out_opt_ PTimeStamp ptsExpiry);
871 
872 SECURITY_STATUS
873 SEC_ENTRY
874 AddCredentialsW(
875   _In_ PCredHandle hCredentials,
876   _In_opt_ SEC_WCHAR *pszPrincipal,
877   _In_ SEC_WCHAR *pszPackage,
878   _In_ ULONG fCredentialUse,
879   _In_opt_ void *pAuthData,
880   _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
881   _In_opt_ void *pvGetKeyArgument,
882   _Out_opt_ PTimeStamp ptsExpiry);
883 
884 #define AddCredentials WINELIB_NAME_AW(AddCredentials)
885 
886 typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_A)(PCredHandle,
887  SEC_CHAR *, SEC_CHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
888  PTimeStamp);
889 typedef SECURITY_STATUS (SEC_ENTRY *ADD_CREDENTIALS_FN_W)(PCredHandle,
890  SEC_WCHAR *, SEC_WCHAR *, ULONG, void *, SEC_GET_KEY_FN, void *,
891  PTimeStamp);
892 
893 SECURITY_STATUS
894 SEC_ENTRY
895 QuerySecurityContextToken(
896   _In_ PCtxtHandle phContext,
897   _Out_ HANDLE *phToken);
898 
899 typedef SECURITY_STATUS (SEC_ENTRY *QUERY_SECURITY_CONTEXT_TOKEN_FN)
900  (PCtxtHandle, HANDLE *);
901 
902 SECURITY_STATUS
903 SEC_ENTRY
904 EncryptMessage(
905   _In_ PCtxtHandle phContext,
906   _In_ ULONG fQOP,
907   _In_ PSecBufferDesc pMessage,
908   _In_ ULONG MessageSeqNo);
909 
910 SECURITY_STATUS
911 SEC_ENTRY
912 DecryptMessage(
913   _In_ PCtxtHandle phContext,
914   _In_ PSecBufferDesc pMessage,
915   _In_ ULONG MessageSeqNo,
916   _Out_opt_ PULONG pfQOP);
917 
918 /* values for EncryptMessage fQOP */
919 #define SECQOP_WRAP_NO_ENCRYPT 0x80000001
920 
921 typedef SECURITY_STATUS (SEC_ENTRY *ENCRYPT_MESSAGE_FN)(PCtxtHandle, ULONG,
922  PSecBufferDesc, ULONG);
923 typedef SECURITY_STATUS (SEC_ENTRY *DECRYPT_MESSAGE_FN)(PCtxtHandle,
924  PSecBufferDesc, ULONG, PULONG);
925 
926 SECURITY_STATUS
927 SEC_ENTRY
928 SetContextAttributesA(
929   _In_ PCtxtHandle phContext,
930   _In_ ULONG ulAttribute,
931   _In_reads_bytes_(cbBuffer) void *pBuffer,
932   _In_ ULONG cbBuffer);
933 
934 SECURITY_STATUS
935 SEC_ENTRY
936 SetContextAttributesW(
937   _In_ PCtxtHandle phContext,
938   _In_ ULONG ulAttribute,
939   _In_reads_bytes_(cbBuffer) void *pBuffer,
940   _In_ ULONG cbBuffer);
941 
942 #define SetContextAttributes WINELIB_NAME_AW(SetContextAttributes)
943 
944 typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_A)(PCtxtHandle,
945  ULONG, void *, ULONG);
946 typedef SECURITY_STATUS (SEC_ENTRY *SET_CONTEXT_ATTRIBUTES_FN_W)(PCtxtHandle,
947  ULONG, void *, ULONG);
948 
949 #define SECURITY_ENTRYPOINT_ANSIA "InitSecurityInterfaceA"
950 #define SECURITY_ENTRYPOINT_ANSIW "InitSecurityInterfaceW"
951 #define SECURITY_ENTRYPOINT_ANSI WINELIB_NAME_AW(SECURITY_ENTRYPOINT_ANSI)
952 
953 typedef struct _SECURITY_FUNCTION_TABLE_A
954 {
955     ULONG                     dwVersion;
956     ENUMERATE_SECURITY_PACKAGES_FN_A  EnumerateSecurityPackagesA;
957     QUERY_CREDENTIALS_ATTRIBUTES_FN_A QueryCredentialsAttributesA;
958     ACQUIRE_CREDENTIALS_HANDLE_FN_A   AcquireCredentialsHandleA;
959     FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
960     void                             *Reserved2;
961     INITIALIZE_SECURITY_CONTEXT_FN_A  InitializeSecurityContextA;
962     ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
963     COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
964     DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
965     APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
966     QUERY_CONTEXT_ATTRIBUTES_FN_A     QueryContextAttributesA;
967     IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
968     REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
969     MAKE_SIGNATURE_FN                 MakeSignature;
970     VERIFY_SIGNATURE_FN               VerifySignature;
971     FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
972     QUERY_SECURITY_PACKAGE_INFO_FN_A  QuerySecurityPackageInfoA;
973     void                             *Reserved3;
974     void                             *Reserved4;
975     EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
976     IMPORT_SECURITY_CONTEXT_FN_A      ImportSecurityContextA;
977     ADD_CREDENTIALS_FN_A              AddCredentialsA;
978     void                             *Reserved8;
979     QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
980     ENCRYPT_MESSAGE_FN                EncryptMessage;
981     DECRYPT_MESSAGE_FN                DecryptMessage;
982     SET_CONTEXT_ATTRIBUTES_FN_A       SetContextAttributesA;
983 } SecurityFunctionTableA, *PSecurityFunctionTableA;
984 
985 /* No, it really is FreeCredentialsHandle, see the thread beginning
986  * http://sourceforge.net/mailarchive/message.php?msg_id=4321080 for a
987  * discovery discussion. */
988 typedef struct _SECURITY_FUNCTION_TABLE_W
989 {
990     ULONG                     dwVersion;
991     ENUMERATE_SECURITY_PACKAGES_FN_W  EnumerateSecurityPackagesW;
992     QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
993     ACQUIRE_CREDENTIALS_HANDLE_FN_W   AcquireCredentialsHandleW;
994     FREE_CREDENTIALS_HANDLE_FN        FreeCredentialsHandle;
995     void                             *Reserved2;
996     INITIALIZE_SECURITY_CONTEXT_FN_W  InitializeSecurityContextW;
997     ACCEPT_SECURITY_CONTEXT_FN        AcceptSecurityContext;
998     COMPLETE_AUTH_TOKEN_FN            CompleteAuthToken;
999     DELETE_SECURITY_CONTEXT_FN        DeleteSecurityContext;
1000     APPLY_CONTROL_TOKEN_FN            ApplyControlToken;
1001     QUERY_CONTEXT_ATTRIBUTES_FN_W     QueryContextAttributesW;
1002     IMPERSONATE_SECURITY_CONTEXT_FN   ImpersonateSecurityContext;
1003     REVERT_SECURITY_CONTEXT_FN        RevertSecurityContext;
1004     MAKE_SIGNATURE_FN                 MakeSignature;
1005     VERIFY_SIGNATURE_FN               VerifySignature;
1006     FREE_CONTEXT_BUFFER_FN            FreeContextBuffer;
1007     QUERY_SECURITY_PACKAGE_INFO_FN_W  QuerySecurityPackageInfoW;
1008     void                             *Reserved3;
1009     void                             *Reserved4;
1010     EXPORT_SECURITY_CONTEXT_FN        ExportSecurityContext;
1011     IMPORT_SECURITY_CONTEXT_FN_W      ImportSecurityContextW;
1012     ADD_CREDENTIALS_FN_W              AddCredentialsW;
1013     void                             *Reserved8;
1014     QUERY_SECURITY_CONTEXT_TOKEN_FN   QuerySecurityContextToken;
1015     ENCRYPT_MESSAGE_FN                EncryptMessage;
1016     DECRYPT_MESSAGE_FN                DecryptMessage;
1017     SET_CONTEXT_ATTRIBUTES_FN_W       SetContextAttributesW;
1018 } SecurityFunctionTableW, *PSecurityFunctionTableW;
1019 
1020 #define SecurityFunctionTable WINELIB_NAME_AW(SecurityFunctionTable)
1021 #define PSecurityFunctionTable WINELIB_NAME_AW(PSecurityFunctionTable)
1022 
1023 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION   1
1024 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 2
1025 
1026 PSecurityFunctionTableA SEC_ENTRY InitSecurityInterfaceA(void);
1027 PSecurityFunctionTableW SEC_ENTRY InitSecurityInterfaceW(void);
1028 #define InitSecurityInterface WINELIB_NAME_AW(InitSecurityInterface)
1029 
1030 typedef PSecurityFunctionTableA (SEC_ENTRY *INIT_SECURITY_INTERFACE_A)(void);
1031 typedef PSecurityFunctionTableW (SEC_ENTRY *INIT_SECURITY_INTERFACE_W)(void);
1032 #define INIT_SECURITY_INTERFACE WINELIB_NAME_AW(INIT_SECURITY_INTERFACE_)
1033 
1034 #ifdef __cplusplus
1035 }
1036 #endif
1037 
1038 #endif /* ndef __WINE_SSPI_H__ */
1039