xref: /reactos/sdk/include/xdk/sspi.h (revision 40462c92)
1 #ifndef __SSPI_H__
2 #define __SSPI_H__
3 
4 // for ntifs.h:
5 #define ISSP_LEVEL 32
6 #define ISSP_MODE 0
7 
8 #ifdef MIDL_PASS
9 #define MIDL_PROP(x) x
10 #else
11 #define MIDL_PROP(x)
12 #endif
13 
14 #define SEC_TEXT TEXT
15 #define SEC_FAR
16 #define SEC_ENTRY __stdcall
17 
18 #if defined(_NO_KSECDD_IMPORT_)
19 #define KSECDDDECLSPEC
20 #else
21 #define KSECDDDECLSPEC __declspec(dllimport)
22 #endif
23 
24 #define SECQOP_WRAP_NO_ENCRYPT 0x80000001
25 #define SECQOP_WRAP_OOB_DATA   0x40000000
26 
27 #define SECURITY_ENTRYPOINTW SEC_TEXT("InitSecurityInterfaceW")
28 #define SECURITY_ENTRYPOINT SECURITY_ENTRYPOINTW
29 
30 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION   1
31 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_2 2
32 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_3 3
33 #define SECURITY_SUPPORT_PROVIDER_INTERFACE_VERSION_4 4
34 
35 #define SECURITY_NATIVE_DREP  0x00000010
36 #define SECURITY_NETWORK_DREP 0x00000000
37 
38 #define SECPKG_ID_NONE 0xFFFF
39 
40 #define SECPKG_CRED_ATTR_NAMES                1
41 #define SECPKG_CRED_ATTR_SSI_PROVIDER         2
42 
43 #define SECPKG_ATTR_SIZES                     0
44 #define SECPKG_ATTR_NAMES                     1
45 #define SECPKG_ATTR_LIFESPAN                  2
46 #define SECPKG_ATTR_DCE_INFO                  3
47 #define SECPKG_ATTR_STREAM_SIZES              4
48 #define SECPKG_ATTR_KEY_INFO                  5
49 #define SECPKG_ATTR_AUTHORITY                 6
50 #define SECPKG_ATTR_PROTO_INFO                7
51 #define SECPKG_ATTR_PASSWORD_EXPIRY           8
52 #define SECPKG_ATTR_SESSION_KEY               9
53 #define SECPKG_ATTR_PACKAGE_INFO             10
54 #define SECPKG_ATTR_USER_FLAGS               11
55 #define SECPKG_ATTR_NEGOTIATION_INFO         12
56 #define SECPKG_ATTR_NATIVE_NAMES             13
57 #define SECPKG_ATTR_FLAGS                    14
58 #define SECPKG_ATTR_USE_VALIDATED            15
59 #define SECPKG_ATTR_CREDENTIAL_NAME          16
60 #define SECPKG_ATTR_TARGET_INFORMATION       17
61 #define SECPKG_ATTR_ACCESS_TOKEN             18
62 #define SECPKG_ATTR_TARGET                   19
63 #define SECPKG_ATTR_AUTHENTICATION_ID        20
64 #define SECPKG_ATTR_LOGOFF_TIME              21
65 #define SECPKG_ATTR_NEGO_KEYS                22
66 #define SECPKG_ATTR_PROMPTING_NEEDED         24
67 #define SECPKG_ATTR_UNIQUE_BINDINGS          25
68 #define SECPKG_ATTR_ENDPOINT_BINDINGS        26
69 #define SECPKG_ATTR_CLIENT_SPECIFIED_TARGET  27
70 #define SECPKG_ATTR_LAST_CLIENT_TOKEN_STATUS 30
71 #define SECPKG_ATTR_NEGO_PKG_INFO            31
72 #define SECPKG_ATTR_NEGO_STATUS              32
73 #define SECPKG_ATTR_CONTEXT_DELETED          33
74 
75 #define SECPKG_FLAG_INTEGRITY               0x00000001
76 #define SECPKG_FLAG_PRIVACY                 0x00000002
77 #define SECPKG_FLAG_TOKEN_ONLY              0x00000004
78 #define SECPKG_FLAG_DATAGRAM                0x00000008
79 #define SECPKG_FLAG_CONNECTION              0x00000010
80 #define SECPKG_FLAG_MULTI_REQUIRED          0x00000020
81 #define SECPKG_FLAG_CLIENT_ONLY             0x00000040
82 #define SECPKG_FLAG_EXTENDED_ERROR          0x00000080
83 #define SECPKG_FLAG_IMPERSONATION           0x00000100
84 #define SECPKG_FLAG_ACCEPT_WIN32_NAME       0x00000200
85 #define SECPKG_FLAG_STREAM                  0x00000400
86 #define SECPKG_FLAG_NEGOTIABLE              0x00000800
87 #define SECPKG_FLAG_GSS_COMPATIBLE          0x00001000
88 #define SECPKG_FLAG_LOGON                   0x00002000
89 #define SECPKG_FLAG_ASCII_BUFFERS           0x00004000
90 #define SECPKG_FLAG_FRAGMENT                0x00008000
91 #define SECPKG_FLAG_MUTUAL_AUTH             0x00010000
92 #define SECPKG_FLAG_DELEGATION              0x00020000
93 #define SECPKG_FLAG_READONLY_WITH_CHECKSUM  0x00040000
94 #define SECPKG_FLAG_RESTRICTED_TOKENS       0x00080000
95 #define SECPKG_FLAG_NEGO_EXTENDER           0x00100000
96 #define SECPKG_FLAG_NEGOTIABLE2             0x00200000
97 
98 #define SECPKG_CRED_INBOUND                 0x00000001
99 #define SECPKG_CRED_OUTBOUND                0x00000002
100 #define SECPKG_CRED_BOTH                    0x00000003
101 #define SECPKG_CRED_DEFAULT                 0x00000004
102 #define SECPKG_CRED_RESERVED                0xF0000000
103 #define SECPKG_CRED_AUTOLOGON_RESTRICTED    0x00000010
104 #define SECPKG_CRED_PROCESS_POLICY_ONLY     0x00000020
105 
106 #define SECPKG_CONTEXT_EXPORT_RESET_NEW     0x00000001
107 #define SECPKG_CONTEXT_EXPORT_DELETE_OLD    0x00000002
108 #define SECPKG_CONTEXT_EXPORT_TO_KERNEL     0x00000004
109 
110 #define SECPKG_ATTR_SUBJECT_SECURITY_ATTRIBUTES 128
111 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_KERBEROS 0x1
112 #define SECPKG_ATTR_NEGO_INFO_FLAG_NO_NTLM     0x2
113 
114 #define SecPkgContext_NativeNames SecPkgContext_NativeNamesW
115 #define PSecPkgContext_NativeNames PSecPkgContext_NativeNamesW
116 
117 #define SECBUFFER_VERSION 0
118 
119 #define SECBUFFER_EMPTY                 0
120 #define SECBUFFER_DATA                  1
121 #define SECBUFFER_TOKEN                 2
122 #define SECBUFFER_PKG_PARAMS            3
123 #define SECBUFFER_MISSING               4
124 #define SECBUFFER_EXTRA                 5
125 #define SECBUFFER_STREAM_TRAILER        6
126 #define SECBUFFER_STREAM_HEADER         7
127 #define SECBUFFER_NEGOTIATION_INFO      8
128 #define SECBUFFER_PADDING               9
129 #define SECBUFFER_STREAM               10
130 #define SECBUFFER_MECHLIST             11
131 #define SECBUFFER_MECHLIST_SIGNATURE   12
132 #define SECBUFFER_TARGET               13
133 #define SECBUFFER_CHANNEL_BINDINGS     14
134 #define SECBUFFER_CHANGE_PASS_RESPONSE 15
135 #define SECBUFFER_TARGET_HOST          16
136 #define SECBUFFER_ALERT                17
137 
138 #define SECBUFFER_ATTRMASK                0xF0000000
139 #define SECBUFFER_READONLY                0x80000000
140 #define SECBUFFER_READONLY_WITH_CHECKSUM  0x10000000
141 #define SECBUFFER_RESERVED                0x60000000
142 
143 #define ISC_REQ_DELEGATE                 0x00000001
144 #define ISC_REQ_MUTUAL_AUTH              0x00000002
145 #define ISC_REQ_REPLAY_DETECT            0x00000004
146 #define ISC_REQ_SEQUENCE_DETECT          0x00000008
147 #define ISC_REQ_CONFIDENTIALITY          0x00000010
148 #define ISC_REQ_USE_SESSION_KEY          0x00000020
149 #define ISC_REQ_PROMPT_FOR_CREDS         0x00000040
150 #define ISC_REQ_USE_SUPPLIED_CREDS       0x00000080
151 #define ISC_REQ_ALLOCATE_MEMORY          0x00000100
152 #define ISC_REQ_USE_DCE_STYLE            0x00000200
153 #define ISC_REQ_DATAGRAM                 0x00000400
154 #define ISC_REQ_CONNECTION               0x00000800
155 #define ISC_REQ_CALL_LEVEL               0x00001000
156 #define ISC_REQ_FRAGMENT_SUPPLIED        0x00002000
157 #define ISC_REQ_EXTENDED_ERROR           0x00004000
158 #define ISC_REQ_STREAM                   0x00008000
159 #define ISC_REQ_INTEGRITY                0x00010000
160 #define ISC_REQ_IDENTIFY                 0x00020000
161 #define ISC_REQ_NULL_SESSION             0x00040000
162 #define ISC_REQ_MANUAL_CRED_VALIDATION   0x00080000
163 #define ISC_REQ_RESERVED1                0x00100000
164 #define ISC_REQ_FRAGMENT_TO_FIT          0x00200000
165 #define ISC_REQ_FORWARD_CREDENTIALS      0x00400000
166 #define ISC_REQ_NO_INTEGRITY             0x00800000
167 #define ISC_REQ_USE_HTTP_STYLE           0x01000000
168 
169 #define ISC_RET_DELEGATE                 0x00000001
170 #define ISC_RET_MUTUAL_AUTH              0x00000002
171 #define ISC_RET_REPLAY_DETECT            0x00000004
172 #define ISC_RET_SEQUENCE_DETECT          0x00000008
173 #define ISC_RET_CONFIDENTIALITY          0x00000010
174 #define ISC_RET_USE_SESSION_KEY          0x00000020
175 #define ISC_RET_USED_COLLECTED_CREDS     0x00000040
176 #define ISC_RET_USED_SUPPLIED_CREDS      0x00000080
177 #define ISC_RET_ALLOCATED_MEMORY         0x00000100
178 #define ISC_RET_USED_DCE_STYLE           0x00000200
179 #define ISC_RET_DATAGRAM                 0x00000400
180 #define ISC_RET_CONNECTION               0x00000800
181 #define ISC_RET_INTERMEDIATE_RETURN      0x00001000
182 #define ISC_RET_CALL_LEVEL               0x00002000
183 #define ISC_RET_EXTENDED_ERROR           0x00004000
184 #define ISC_RET_STREAM                   0x00008000
185 #define ISC_RET_INTEGRITY                0x00010000
186 #define ISC_RET_IDENTIFY                 0x00020000
187 #define ISC_RET_NULL_SESSION             0x00040000
188 #define ISC_RET_MANUAL_CRED_VALIDATION   0x00080000
189 #define ISC_RET_RESERVED1                0x00100000
190 #define ISC_RET_FRAGMENT_ONLY            0x00200000
191 #define ISC_RET_FORWARD_CREDENTIALS      0x00400000
192 #define ISC_RET_USED_HTTP_STYLE          0x01000000
193 #define ISC_RET_NO_ADDITIONAL_TOKEN      0x02000000
194 #define ISC_RET_REAUTHENTICATION         0x08000000
195 
196 #define ASC_REQ_DELEGATE                 0x00000001
197 #define ASC_REQ_MUTUAL_AUTH              0x00000002
198 #define ASC_REQ_REPLAY_DETECT            0x00000004
199 #define ASC_REQ_SEQUENCE_DETECT          0x00000008
200 #define ASC_REQ_CONFIDENTIALITY          0x00000010
201 #define ASC_REQ_USE_SESSION_KEY          0x00000020
202 #define ASC_REQ_ALLOCATE_MEMORY          0x00000100
203 #define ASC_REQ_USE_DCE_STYLE            0x00000200
204 #define ASC_REQ_DATAGRAM                 0x00000400
205 #define ASC_REQ_CONNECTION               0x00000800
206 #define ASC_REQ_CALL_LEVEL               0x00001000
207 #define ASC_REQ_EXTENDED_ERROR           0x00008000
208 #define ASC_REQ_STREAM                   0x00010000
209 #define ASC_REQ_INTEGRITY                0x00020000
210 #define ASC_REQ_LICENSING                0x00040000
211 #define ASC_REQ_IDENTIFY                 0x00080000
212 #define ASC_REQ_ALLOW_NULL_SESSION       0x00100000
213 #define ASC_REQ_ALLOW_NON_USER_LOGONS    0x00200000
214 #define ASC_REQ_ALLOW_CONTEXT_REPLAY     0x00400000
215 #define ASC_REQ_FRAGMENT_TO_FIT          0x00800000
216 #define ASC_REQ_FRAGMENT_SUPPLIED        0x00002000
217 #define ASC_REQ_NO_TOKEN                 0x01000000
218 #define ASC_REQ_PROXY_BINDINGS           0x04000000
219 //#define SSP_RET_REAUTHENTICATION         0x08000000 // internal
220 
221 #define ASC_REQ_ALLOW_MISSING_BINDINGS   0x10000000
222 #define ASC_RET_DELEGATE                 0x00000001
223 #define ASC_RET_MUTUAL_AUTH              0x00000002
224 #define ASC_RET_REPLAY_DETECT            0x00000004
225 #define ASC_RET_SEQUENCE_DETECT          0x00000008
226 #define ASC_RET_CONFIDENTIALITY          0x00000010
227 #define ASC_RET_USE_SESSION_KEY          0x00000020
228 #define ASC_RET_ALLOCATED_MEMORY         0x00000100
229 #define ASC_RET_USED_DCE_STYLE           0x00000200
230 #define ASC_RET_DATAGRAM                 0x00000400
231 #define ASC_RET_CONNECTION               0x00000800
232 #define ASC_RET_CALL_LEVEL               0x00002000
233 #define ASC_RET_THIRD_LEG_FAILED         0x00004000
234 #define ASC_RET_EXTENDED_ERROR           0x00008000
235 #define ASC_RET_STREAM                   0x00010000
236 #define ASC_RET_INTEGRITY                0x00020000
237 #define ASC_RET_LICENSING                0x00040000
238 #define ASC_RET_IDENTIFY                 0x00080000
239 #define ASC_RET_NULL_SESSION             0x00100000
240 #define ASC_RET_ALLOW_NON_USER_LOGONS    0x00200000
241 #define ASC_RET_ALLOW_CONTEXT_REPLAY     0x00400000
242 #define ASC_RET_FRAGMENT_ONLY            0x00800000
243 #define ASC_RET_NO_TOKEN                 0x01000000
244 #define ASC_RET_NO_ADDITIONAL_TOKEN      0x02000000
245 #define ASC_RET_NO_PROXY_BINDINGS        0x04000000
246 //#define SSP_RET_REAUTHENTICATION         0x08000000 // internal
247 #define ASC_RET_MISSING_BINDINGS         0x10000000
248 
249 #define SEC_DELETED_HANDLE ((ULONG_PTR)(-2))
250 
251 #define SecInvalidateHandle(x) \
252     ((PSecHandle)(x))->dwLower = ((PSecHandle)(x))->dwUpper = ((ULONG_PTR)((INT_PTR)-1));
253 
254 #define SecIsValidHandle(x) \
255     ( ( ((PSecHandle)(x))->dwLower != (ULONG_PTR)(INT_PTR)-1 ) && \
256       ( ((PSecHandle)(x))->dwUpper != (ULONG_PTR)(INT_PTR)-1 ) )
257 
258 typedef WCHAR SEC_WCHAR;
259 typedef CHAR SEC_CHAR;
260 typedef LARGE_INTEGER _SECURITY_INTEGER, SECURITY_INTEGER, *PSECURITY_INTEGER;
261 typedef SECURITY_INTEGER TimeStamp, *PTimeStamp;
262 typedef UNICODE_STRING SECURITY_STRING, *PSECURITY_STRING;
263 #if ISSP_MODE == 0
264 #define PSSPI_SEC_STRING PSECURITY_STRING
265 #else
266 #define PSSPI_SEC_STRING SEC_WCHAR*
267 #endif
268 
269 typedef PVOID PSEC_WINNT_AUTH_IDENTITY_OPAQUE;
270 
271 #ifndef __SECSTATUS_DEFINED__
272 typedef LONG SECURITY_STATUS;
273 #define __SECSTATUS_DEFINED__
274 #endif
275 
276 typedef enum _SECPKG_CRED_CLASS
277 {
278     SecPkgCredClass_None = 0,
279     SecPkgCredClass_Ephemeral = 10,
280     SecPkgCredClass_PersistedGeneric = 20,
281     SecPkgCredClass_PersistedSpecific = 30,
282     SecPkgCredClass_Explicit = 40,
283 } SECPKG_CRED_CLASS, *PSECPKG_CRED_CLASS;
284 
285 typedef struct _SEC_NEGOTIATION_INFO
286 {
287     ULONG Size;
288     ULONG NameLength;
289     SEC_WCHAR *Name;
290     PVOID Reserved;
291 } SEC_NEGOTIATION_INFO, *PSEC_NEGOTIATION_INFO;
292 
293 typedef struct _SEC_CHANNEL_BINDINGS
294 {
295     ULONG dwInitiatorAddrType;
296     ULONG cbInitiatorLength;
297     ULONG dwInitiatorOffset;
298     ULONG dwAcceptorAddrType;
299     ULONG cbAcceptorLength;
300     ULONG dwAcceptorOffset;
301     ULONG cbApplicationDataLength;
302     ULONG dwApplicationDataOffset;
303 } SEC_CHANNEL_BINDINGS, *PSEC_CHANNEL_BINDINGS;
304 
305 #ifndef _AUTH_IDENTITY_EX2_DEFINED
306 #define _AUTH_IDENTITY_EX2_DEFINED
307 typedef struct _SEC_WINNT_AUTH_IDENTITY_EX2
308 {
309     ULONG Version;
310     USHORT cbHeaderLength;
311     ULONG cbStructureLength;
312     ULONG UserOffset;
313     USHORT UserLength;
314     ULONG DomainOffset;
315     USHORT DomainLength;
316     ULONG PackedCredentialsOffset;
317     USHORT PackedCredentialsLength;
318     ULONG Flags;
319     ULONG PackageListOffset;
320     USHORT PackageListLength;
321 } SEC_WINNT_AUTH_IDENTITY_EX2, *PSEC_WINNT_AUTH_IDENTITY_EX2;
322 #define SEC_WINNT_AUTH_IDENTITY_VERSION_2 0x201
323 #endif
324 
325 #ifndef _AUTH_IDENTITY_DEFINED
326 #define _AUTH_IDENTITY_DEFINED
327 typedef struct _SEC_WINNT_AUTH_IDENTITY_W
328 {
329     PUSHORT User;
330     ULONG UserLength;
331     PUSHORT Domain;
332     ULONG DomainLength;
333     PUSHORT Password;
334     ULONG PasswordLength;
335     ULONG Flags;
336 } SEC_WINNT_AUTH_IDENTITY_W, *PSEC_WINNT_AUTH_IDENTITY_W;
337 #define SEC_WINNT_AUTH_IDENTITY_ANSI    0x1
338 #define SEC_WINNT_AUTH_IDENTITY_UNICODE 0x2
339 #define SEC_WINNT_AUTH_IDENTITY SEC_WINNT_AUTH_IDENTITY_W
340 #define PSEC_WINNT_AUTH_IDENTITY PSEC_WINNT_AUTH_IDENTITY_W
341 #define _SEC_WINNT_AUTH_IDENTITY _SEC_WINNT_AUTH_IDENTITY_W
342 #endif
343 
344 #ifndef SEC_WINNT_AUTH_IDENTITY_VERSION
345 #define SEC_WINNT_AUTH_IDENTITY_VERSION 0x200
346 typedef struct _SEC_WINNT_AUTH_IDENTITY_EXW
347 {
348     ULONG Version;
349     ULONG Length;
350     PUSHORT User;
351     ULONG UserLength;
352     PUSHORT Domain;
353     ULONG DomainLength;
354     PUSHORT Password;
355     ULONG PasswordLength;
356     ULONG Flags;
357     PUSHORT PackageList;
358     ULONG PackageListLength;
359 } SEC_WINNT_AUTH_IDENTITY_EXW, *PSEC_WINNT_AUTH_IDENTITY_EXW;
360 #define SEC_WINNT_AUTH_IDENTITY_EX  SEC_WINNT_AUTH_IDENTITY_EXW
361 #define PSEC_WINNT_AUTH_IDENTITY_EX PSEC_WINNT_AUTH_IDENTITY_EXW
362 #endif
363 
364 #ifndef __SECHANDLE_DEFINED__
365 typedef struct _SecHandle
366 {
367     ULONG_PTR dwLower;
368     ULONG_PTR dwUpper;
369 } SecHandle, *PSecHandle;
370 #define __SECHANDLE_DEFINED__
371 #endif
372 
373 typedef SecHandle CredHandle, *PCredHandle, CtxtHandle, *PCtxtHandle;
374 
375 typedef struct _SecBuffer
376 {
377     ULONG cbBuffer;
378     ULONG BufferType;
379 #ifdef MIDL_PASS
380     MIDL_PROP([size_is(cbBuffer)]) PCHAR pvBuffer;
381 #else
382     _Field_size_bytes_(cbBuffer) void SEC_FAR *pvBuffer;
383 #endif
384 } SecBuffer, *PSecBuffer;
385 
386 typedef struct _SecBufferDesc
387 {
388     ULONG ulVersion;
389     ULONG cBuffers;
390     MIDL_PROP([size_is(cBuffers)]) _Field_size_(cBuffers) PSecBuffer pBuffers;
391 } SecBufferDesc, SEC_FAR *PSecBufferDesc;
392 
393 typedef struct _SecPkgInfoW
394 {
395     ULONG fCapabilities;
396     USHORT wVersion;
397     USHORT wRPCID;
398     ULONG cbMaxToken;
399     MIDL_PROP([string]) SEC_WCHAR *Name;
400     MIDL_PROP([string]) SEC_WCHAR *Comment;
401 } SecPkgInfoW, *PSecPkgInfoW;
402 #define SecPkgInfo SecPkgInfoW
403 #define PSecPkgInfo PSecPkgInfoW
404 
405 typedef struct _SecPkgCredentials_NamesW
406 {
407     MIDL_PROP([string]) SEC_WCHAR *sUserName;
408 } SecPkgCredentials_NamesW, *PSecPkgCredentials_NamesW;
409 #define SecPkgCredentials_Names SecPkgCredentials_NamesW
410 #define PSecPkgCredentials_Names PSecPkgCredentials_NamesW
411 
412 typedef struct _SecPkgContext_NamesW
413 {
414     SEC_WCHAR *sUserName;
415 } SecPkgContext_NamesW, *PSecPkgContext_NamesW;
416 #define SecPkgContext_Names SecPkgContext_NamesW
417 #define PSecPkgContext_Names PSecPkgContext_NamesW
418 
419 #if OSVER(NTDDI_VERSION) > NTDDI_WIN2K
420 typedef struct _SecPkgContext_CredentialNameW
421 {
422     ULONG CredentialType;
423     SEC_WCHAR *sCredentialName;
424 } SecPkgContext_CredentialNameW, *PSecPkgContext_CredentialNameW;
425 #endif
426 #define SecPkgContext_CredentialName SecPkgContext_CredentialNameW
427 #define PSecPkgContext_CredentialName PSecPkgContext_CredentialNameW
428 
429 typedef struct _SecPkgContext_SubjectAttributes
430 {
431     PVOID AttributeInfo;
432 } SecPkgContext_SubjectAttributes, *PSecPkgContext_SubjectAttributes;
433 
434 typedef struct _SecPkgContext_CredInfo
435 {
436     SECPKG_CRED_CLASS CredClass;
437     ULONG IsPromptingNeeded;
438 } SecPkgContext_CredInfo, *PSecPkgContext_CredInfo;
439 
440 typedef struct _SecPkgContext_NegoPackageInfo
441 {
442     ULONG PackageMask;
443 } SecPkgContext_NegoPackageInfo, *PSecPkgContext_NegoPackageInfo;
444 
445 typedef struct _SecPkgContext_NegoStatus
446 {
447     ULONG LastStatus;
448 } SecPkgContext_NegoStatus, *PSecPkgContext_NegoStatus;
449 
450 typedef struct _SecPkgContext_Sizes
451 {
452     ULONG cbMaxToken;
453     ULONG cbMaxSignature;
454     ULONG cbBlockSize;
455     ULONG cbSecurityTrailer;
456 } SecPkgContext_Sizes, *PSecPkgContext_Sizes;
457 
458 typedef struct _SecPkgContext_StreamSizes
459 {
460     ULONG cbHeader;
461     ULONG cbTrailer;
462     ULONG cbMaximumMessage;
463     ULONG cBuffers;
464     ULONG cbBlockSize;
465 } SecPkgContext_StreamSizes, *PSecPkgContext_StreamSizes;
466 
467 typedef struct _SecPkgContext_Lifespan
468 {
469     TimeStamp tsStart;
470     TimeStamp tsExpiry;
471 } SecPkgContext_Lifespan, *PSecPkgContext_Lifespan;
472 
473 typedef struct _SecPkgContext_PasswordExpiry
474 {
475     TimeStamp tsPasswordExpires;
476 } SecPkgContext_PasswordExpiry, *PSecPkgContext_PasswordExpiry;
477 
478 typedef struct _SecPkgContext_ProtoInfoW
479 {
480     SEC_WCHAR *sProtocolName;
481     ULONG majorVersion;
482     ULONG minorVersion;
483 } SecPkgContext_ProtoInfoW, *PSecPkgContext_ProtoInfoW;
484 #define SecPkgContext_ProtoInfo SecPkgContext_ProtoInfoW
485 #define PSecPkgContext_ProtoInfo PSecPkgContext_ProtoInfoW
486 
487 typedef struct _SecPkgContext_KeyInfoW
488 {
489     SEC_WCHAR *sSignatureAlgorithmName;
490     SEC_WCHAR *sEncryptAlgorithmName;
491     ULONG KeySize;
492     ULONG SignatureAlgorithm;
493     ULONG EncryptAlgorithm;
494 } SecPkgContext_KeyInfoW, *PSecPkgContext_KeyInfoW;
495 #define SecPkgContext_KeyInfo SecPkgContext_KeyInfoW
496 #define PSecPkgContext_KeyInfo PSecPkgContext_KeyInfoW
497 
498 typedef struct _SecPkgContext_SessionKey
499 {
500     ULONG SessionKeyLength;
501     _Field_size_bytes_(SessionKeyLength) PUCHAR SessionKey;
502 } SecPkgContext_SessionKey, *PSecPkgContext_SessionKey;
503 
504 typedef struct _SecPkgContext_NegoKeys
505 {
506     ULONG KeyType;
507     USHORT KeyLength;
508     _Field_size_bytes_(KeyLength) PUCHAR KeyValue;
509     ULONG  VerifyKeyType;
510     USHORT VerifyKeyLength;
511     _Field_size_bytes_(VerifyKeyLength) PUCHAR VerifyKeyValue;
512 } SecPkgContext_NegoKeys, *PSecPkgContext_NegoKeys;
513 
514 typedef struct _SecPkgContext_DceInfo
515 {
516     ULONG AuthzSvc;
517     PVOID pPac;
518 } SecPkgContext_DceInfo, *PSecPkgContext_DceInfo;
519 
520 typedef struct _SecPkgContext_PackageInfoW
521 {
522     PSecPkgInfoW PackageInfo;
523 } SecPkgContext_PackageInfoW, *PSecPkgContext_PackageInfoW;
524 #define SecPkgContext_PackageInfo SecPkgContext_PackageInfoW
525 #define PSecPkgContext_PackageInfo PSecPkgContext_PackageInfoW
526 
527 typedef struct _SecPkgContext_UserFlags
528 {
529     ULONG UserFlags;
530 } SecPkgContext_UserFlags, *PSecPkgContext_UserFlags;
531 
532 typedef struct _SecPkgContext_Flags
533 {
534     ULONG Flags;
535 } SecPkgContext_Flags, *PSecPkgContext_Flags;
536 
537 typedef struct _SecPkgContext_NegotiationInfoW
538 {
539     PSecPkgInfoW PackageInfo ;
540     ULONG NegotiationState ;
541 } SecPkgContext_NegotiationInfoW, *PSecPkgContext_NegotiationInfoW;
542 
543 typedef struct _SecPkgContext_AuthorityW
544 {
545     SEC_WCHAR *sAuthorityName;
546 } SecPkgContext_AuthorityW, *PSecPkgContext_AuthorityW;
547 #define SecPkgContext_Authority SecPkgContext_AuthorityW
548 #define PSecPkgContext_Authority PSecPkgContext_AuthorityW
549 
550 
551 #if NTDDI_VERSION > NTDDI_WS03
552 typedef struct _SecPkgCredentials_SSIProviderW
553 {
554     SEC_WCHAR *sProviderName;
555     ULONG ProviderInfoLength;
556     PCHAR ProviderInfo;
557 } SecPkgCredentials_SSIProviderW, *PSecPkgCredentials_SSIProviderW;
558 #define SecPkgCredentials_SSIProvider SecPkgCredentials_SSIProviderW
559 #define PSecPkgCredentials_SSIProvider PSecPkgCredentials_SSIProviderW
560 
561 typedef struct _SecPkgContext_LogoffTime
562 {
563     TimeStamp tsLogoffTime;
564 } SecPkgContext_LogoffTime, *PSecPkgContext_LogoffTime;
565 #endif
566 
567 /* forward declaration */
568 typedef struct _SECURITY_FUNCTION_TABLE_W SecurityFunctionTableW, *PSecurityFunctionTableW;
569 #define SecurityFunctionTable SecurityFunctionTableW
570 #define PSecurityFunctionTable PSecurityFunctionTableW
571 
572 typedef
573 VOID
574 (SEC_ENTRY * SEC_GET_KEY_FN)(
575     PVOID Arg,
576     PVOID Principal,
577     ULONG KeyVer,
578     PVOID *Key,
579     SECURITY_STATUS *Status);
580 
581 KSECDDDECLSPEC
582 SECURITY_STATUS
583 SEC_ENTRY
584 AcceptSecurityContext(
585     _In_opt_ PCredHandle phCredential,
586     _In_opt_ PCtxtHandle phContext,
587     _In_opt_ PSecBufferDesc pInput,
588     _In_ ULONG fContextReq,
589     _In_ ULONG TargetDataRep,
590     _In_opt_ PCtxtHandle phNewContext,
591     _In_opt_ PSecBufferDesc pOutput,
592     _Out_ PULONG pfContextAttr,
593     _Out_opt_ PTimeStamp ptsExpiry);
594 
595 typedef
596 SECURITY_STATUS
597 (SEC_ENTRY * ACCEPT_SECURITY_CONTEXT_FN)(
598     PCredHandle,
599     PCtxtHandle,
600     PSecBufferDesc,
601     ULONG,
602     ULONG,
603     PCtxtHandle,
604     PSecBufferDesc,
605     PULONG,
606     PTimeStamp);
607 
608 KSECDDDECLSPEC
609 SECURITY_STATUS
610 SEC_ENTRY
611 AcquireCredentialsHandleW(
612     _In_opt_ PSSPI_SEC_STRING pPrincipal,
613     _In_ PSSPI_SEC_STRING pPackage,
614     _In_ ULONG fCredentialUse,
615     _In_opt_ PVOID pvLogonId,
616     _In_opt_ PVOID pAuthData,
617     _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
618     _In_opt_ PVOID pvGetKeyArgument,
619     _Out_ PCredHandle phCredential,
620     _Out_opt_ PTimeStamp ptsExpiry);
621 #define AcquireCredentialsHandle AcquireCredentialsHandleW
622 
623 typedef
624 SECURITY_STATUS
625 (SEC_ENTRY * ACQUIRE_CREDENTIALS_HANDLE_FN_W)(
626     PSSPI_SEC_STRING,
627     PSSPI_SEC_STRING,
628     ULONG,
629     PVOID,
630     PVOID,
631     SEC_GET_KEY_FN,
632     PVOID,
633     PCredHandle,
634     PTimeStamp);
635 #define ACQUIRE_CREDENTIALS_HANDLE_FN ACQUIRE_CREDENTIALS_HANDLE_FN_W
636 
637 SECURITY_STATUS
638 SEC_ENTRY
639 AddCredentialsA(
640     _In_ PCredHandle hCredentials,
641     _In_opt_ LPSTR pszPrincipal,
642     _In_ LPSTR pszPackage,
643     _In_ ULONG fCredentialUse,
644     _In_opt_ PVOID pAuthData,
645     _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
646     _In_opt_ PVOID pvGetKeyArgument,
647     _Out_opt_ PTimeStamp ptsExpiry);
648 
649 typedef
650 SECURITY_STATUS
651 (SEC_ENTRY * ADD_CREDENTIALS_FN_A)(
652     PCredHandle,
653     SEC_CHAR *,
654     SEC_CHAR *,
655     ULONG,
656     PVOID,
657     SEC_GET_KEY_FN,
658     PVOID,
659     PTimeStamp);
660 
661 KSECDDDECLSPEC
662 SECURITY_STATUS
663 SEC_ENTRY
664 AddCredentialsW(
665     _In_ PCredHandle hCredentials,
666     _In_opt_ PSSPI_SEC_STRING pPrincipal,
667     _In_ PSSPI_SEC_STRING pPackage,
668     _In_ ULONG fCredentialUse,
669     _In_opt_ PVOID pAuthData,
670     _In_opt_ SEC_GET_KEY_FN pGetKeyFn,
671     _In_opt_ PVOID pvGetKeyArgument,
672     _Out_opt_ PTimeStamp ptsExpiry);
673 
674 typedef
675 SECURITY_STATUS
676 (SEC_ENTRY * ADD_CREDENTIALS_FN_W)(
677     PCredHandle,
678     PSSPI_SEC_STRING,
679     PSSPI_SEC_STRING,
680     ULONG,
681     PVOID,
682     SEC_GET_KEY_FN,
683     PVOID,
684     PTimeStamp);
685 
686 #ifdef UNICODE
687 #define AddCredentials  AddCredentialsW
688 #define ADD_CREDENTIALS_FN  ADD_CREDENTIALS_FN_W
689 #else
690 #define AddCredentials  AddCredentialsA
691 #define ADD_CREDENTIALS_FN ADD_CREDENTIALS_FN_A
692 #endif
693 
694 KSECDDDECLSPEC
695 SECURITY_STATUS
696 SEC_ENTRY
697 ApplyControlToken(
698     _In_ PCtxtHandle phContext,
699     _In_ PSecBufferDesc pInput);
700 
701 typedef
702 SECURITY_STATUS
703 (SEC_ENTRY * APPLY_CONTROL_TOKEN_FN)(
704     PCtxtHandle, PSecBufferDesc);
705 
706 #if (ISSP_MODE != 0)
707 
708 SECURITY_STATUS
709 SEC_ENTRY
710 ChangeAccountPasswordA(
711     _In_ SEC_CHAR* pszPackageName,
712     _In_ SEC_CHAR* pszDomainName,
713     _In_ SEC_CHAR* pszAccountName,
714     _In_ SEC_CHAR* pszOldPassword,
715     _In_ SEC_CHAR* pszNewPassword,
716     _In_ BOOLEAN bImpersonating,
717     _In_ ULONG dwReserved,
718     _Inout_ PSecBufferDesc pOutput);
719 
720 typedef
721 SECURITY_STATUS
722 (SEC_ENTRY * CHANGE_PASSWORD_FN_A)(
723     SEC_CHAR *,
724     SEC_CHAR *,
725     SEC_CHAR *,
726     SEC_CHAR *,
727     SEC_CHAR *,
728     BOOLEAN,
729     ULONG,
730     PSecBufferDesc);
731 
732 SECURITY_STATUS
733 SEC_ENTRY
734 ChangeAccountPasswordW(
735     _In_ SEC_WCHAR* pszPackageName,
736     _In_ SEC_WCHAR* pszDomainName,
737     _In_ SEC_WCHAR* pszAccountName,
738     _In_ SEC_WCHAR* pszOldPassword,
739     _In_ SEC_WCHAR* pszNewPassword,
740     _In_ BOOLEAN bImpersonating,
741     _In_ ULONG dwReserved,
742     _Inout_ PSecBufferDesc pOutput);
743 
744 typedef
745 SECURITY_STATUS
746 (SEC_ENTRY * CHANGE_PASSWORD_FN_W)(
747     SEC_WCHAR *,
748     SEC_WCHAR *,
749     SEC_WCHAR *,
750     SEC_WCHAR *,
751     SEC_WCHAR *,
752     BOOLEAN,
753     ULONG,
754     PSecBufferDesc);
755 
756 #ifdef UNICODE
757 #define ChangeAccountPassword ChangeAccountPasswordW
758 #define CHANGE_PASSWORD_FN CHANGE_PASSWORD_FN_W
759 #else
760 #define ChangeAccountPassword ChangeAccountPasswordA
761 #define CHANGE_PASSWORD_FN CHANGE_PASSWORD_FN_A
762 #endif
763 
764 #endif /* ISSP_MODE != 0 */
765 
766 SECURITY_STATUS
767 SEC_ENTRY
768 CompleteAuthToken(
769     _In_ PCtxtHandle phContext,
770     _In_ PSecBufferDesc pToken);
771 
772 typedef
773 SECURITY_STATUS
774 (SEC_ENTRY * COMPLETE_AUTH_TOKEN_FN)(
775     PCtxtHandle,
776     PSecBufferDesc);
777 
778 SECURITY_STATUS
779 SEC_ENTRY
780 DecryptMessage(
781     _In_ PCtxtHandle phContext,
782     _Inout_ PSecBufferDesc pMessage,
783     _In_ ULONG MessageSeqNo,
784     _Out_opt_ PULONG pfQOP);
785 
786 typedef
787 SECURITY_STATUS
788 (SEC_ENTRY * DECRYPT_MESSAGE_FN)(
789     PCtxtHandle,
790     PSecBufferDesc,
791     ULONG,
792     PULONG);
793 
794 KSECDDDECLSPEC
795 SECURITY_STATUS
796 SEC_ENTRY
797 DeleteSecurityContext(
798     _In_ PCtxtHandle phContext);
799 
800 typedef
801 SECURITY_STATUS
802 (SEC_ENTRY * DELETE_SECURITY_CONTEXT_FN)(
803     PCtxtHandle);
804 
805 SECURITY_STATUS
806 SEC_ENTRY
807 EncryptMessage(
808     _In_ PCtxtHandle phContext,
809     _In_ ULONG  fQOP,
810     _Inout_ PSecBufferDesc pMessage,
811     _In_ ULONG MessageSeqNo);
812 
813 typedef
814 SECURITY_STATUS
815 (SEC_ENTRY * ENCRYPT_MESSAGE_FN)(
816     PCtxtHandle,
817     ULONG,
818     PSecBufferDesc,
819     ULONG);
820 
821 KSECDDDECLSPEC
822 SECURITY_STATUS
823 SEC_ENTRY
824 EnumerateSecurityPackagesW(
825     _Out_ PULONG pcPackages,
826     _Deref_out_ PSecPkgInfoW* ppPackageInfo);
827 #define EnumerateSecurityPackages EnumerateSecurityPackagesW
828 
829 typedef
830 SECURITY_STATUS
831 (SEC_ENTRY * ENUMERATE_SECURITY_PACKAGES_FN_W)(
832     PULONG,
833     PSecPkgInfoW*);
834 #define ENUMERATE_SECURITY_PACKAGES_FN ENUMERATE_SECURITY_PACKAGES_FN_W
835 
836 KSECDDDECLSPEC
837 SECURITY_STATUS
838 SEC_ENTRY
839 ExportSecurityContext(
840     _In_ PCtxtHandle phContext,
841     _In_ ULONG fFlags,
842     _Out_ PSecBuffer pPackedContext,
843     _Out_ PVOID* pToken);
844 
845 typedef
846 SECURITY_STATUS
847 (SEC_ENTRY * EXPORT_SECURITY_CONTEXT_FN)(
848     PCtxtHandle,
849     ULONG,
850     PSecBuffer,
851     PVOID*);
852 
853 SECURITY_STATUS
854 SEC_ENTRY
855 FreeContextBuffer(
856     _Inout_ PVOID pvContextBuffer);
857 
858 typedef
859 SECURITY_STATUS
860 (SEC_ENTRY * FREE_CONTEXT_BUFFER_FN)(
861     _Inout_ PVOID);
862 
863 KSECDDDECLSPEC
864 SECURITY_STATUS
865 SEC_ENTRY
866 FreeCredentialsHandle(
867     _In_ PCredHandle phCredential);
868 
869 typedef
870 SECURITY_STATUS
871 (SEC_ENTRY * FREE_CREDENTIALS_HANDLE_FN)(
872     PCredHandle);
873 
874 KSECDDDECLSPEC
875 SECURITY_STATUS
876 SEC_ENTRY
877 ImpersonateSecurityContext(
878     _In_ PCtxtHandle phContext);
879 
880 typedef
881 SECURITY_STATUS
882 (SEC_ENTRY * IMPERSONATE_SECURITY_CONTEXT_FN)(
883     PCtxtHandle);
884 
885 KSECDDDECLSPEC
886 SECURITY_STATUS
887 SEC_ENTRY
888 ImportSecurityContextW(
889     _In_ PSSPI_SEC_STRING pszPackage,
890     _In_ PSecBuffer pPackedContext,
891     _In_ PVOID Token,
892     _Out_ PCtxtHandle phContext);
893 #define ImportSecurityContext ImportSecurityContextW
894 
895 typedef
896 SECURITY_STATUS
897 (SEC_ENTRY * IMPORT_SECURITY_CONTEXT_FN_W)(
898     PSSPI_SEC_STRING,
899     PSecBuffer,
900     PVOID,
901     PCtxtHandle);
902 #define IMPORT_SECURITY_CONTEXT_FN IMPORT_SECURITY_CONTEXT_FN_W
903 
904 KSECDDDECLSPEC
905 SECURITY_STATUS
906 SEC_ENTRY
907 InitializeSecurityContextW(
908     _In_opt_ PCredHandle phCredential,
909     _In_opt_ PCtxtHandle phContext,
910     _In_opt_ PSSPI_SEC_STRING pTargetName,
911     _In_ ULONG fContextReq,
912     _In_ ULONG Reserved1,
913     _In_ ULONG TargetDataRep,
914     _In_opt_ PSecBufferDesc pInput,
915     _In_ ULONG Reserved2,
916     _Inout_opt_ PCtxtHandle phNewContext,
917     _Inout_opt_ PSecBufferDesc pOutput,
918     _Out_ PULONG pfContextAttr,
919     _Out_opt_ PTimeStamp ptsExpiry);
920 #define InitializeSecurityContext InitializeSecurityContextW
921 
922 typedef
923 SECURITY_STATUS
924 (SEC_ENTRY * INITIALIZE_SECURITY_CONTEXT_FN_W)(
925     PCredHandle,
926     PCtxtHandle,
927     PSSPI_SEC_STRING,
928     ULONG,
929     ULONG,
930     ULONG,
931     PSecBufferDesc,
932     ULONG,
933     PCtxtHandle,
934     PSecBufferDesc,
935     PULONG,
936     PTimeStamp);
937 #define INITIALIZE_SECURITY_CONTEXT_FN INITIALIZE_SECURITY_CONTEXT_FN_W
938 
939 KSECDDDECLSPEC
940 PSecurityFunctionTableW
941 SEC_ENTRY
942 InitSecurityInterfaceW(VOID);
943 #define InitSecurityInterface InitSecurityInterfaceW
944 
945 typedef
946 PSecurityFunctionTableW
947 (SEC_ENTRY * INIT_SECURITY_INTERFACE_W)(VOID);
948 #define INIT_SECURITY_INTERFACE INIT_SECURITY_INTERFACE_W
949 
950 KSECDDDECLSPEC
951 SECURITY_STATUS
952 SEC_ENTRY
953 MakeSignature(
954     _In_ PCtxtHandle phContext,
955     _In_ ULONG fQOP,
956     _In_ PSecBufferDesc pMessage,
957     _In_ ULONG MessageSeqNo);
958 
959 typedef
960 SECURITY_STATUS
961 (SEC_ENTRY * MAKE_SIGNATURE_FN)(
962     PCtxtHandle,
963     ULONG,
964     PSecBufferDesc,
965     ULONG);
966 
967 KSECDDDECLSPEC
968 SECURITY_STATUS
969 SEC_ENTRY
970 QueryContextAttributesW(
971     _In_ PCtxtHandle phContext,
972     _In_ ULONG ulAttribute,
973     _Out_ PVOID pBuffer);
974 #define QueryContextAttributes QueryContextAttributesW
975 
976 typedef
977 SECURITY_STATUS
978 (SEC_ENTRY * QUERY_CONTEXT_ATTRIBUTES_FN_W)(
979     PCtxtHandle,
980     ULONG,
981     PVOID);
982 #define QUERY_CONTEXT_ATTRIBUTES_FN QUERY_CONTEXT_ATTRIBUTES_FN_W
983 
984 KSECDDDECLSPEC
985 SECURITY_STATUS
986 SEC_ENTRY
987 QueryCredentialsAttributesW(
988     _In_    PCredHandle phCredential,
989     _In_    ULONG ulAttribute,
990     _Inout_ PVOID pBuffer);
991 #define QueryCredentialsAttributes QueryCredentialsAttributesW
992 
993 typedef
994 SECURITY_STATUS
995 (SEC_ENTRY * QUERY_CREDENTIALS_ATTRIBUTES_FN_W)(
996     PCredHandle,
997     ULONG,
998     PVOID);
999 #define QUERY_CREDENTIALS_ATTRIBUTES_FN QUERY_CREDENTIALS_ATTRIBUTES_FN_W
1000 
1001 KSECDDDECLSPEC
1002 SECURITY_STATUS
1003 SEC_ENTRY
1004 QuerySecurityContextToken(
1005     _In_ PCtxtHandle phContext,
1006     _Out_ PVOID* Token);
1007 
1008 typedef
1009 SECURITY_STATUS
1010 (SEC_ENTRY * QUERY_SECURITY_CONTEXT_TOKEN_FN)(
1011     PCtxtHandle, PVOID *);
1012 
1013 KSECDDDECLSPEC
1014 SECURITY_STATUS
1015 SEC_ENTRY
1016 QuerySecurityPackageInfoW(
1017     _In_ PSSPI_SEC_STRING pPackageName,
1018     _Deref_out_ PSecPkgInfoW *ppPackageInfo);
1019 #define QuerySecurityPackageInfo QuerySecurityPackageInfoW
1020 
1021 typedef
1022 SECURITY_STATUS
1023 (SEC_ENTRY * QUERY_SECURITY_PACKAGE_INFO_FN_W)(
1024     PSSPI_SEC_STRING,
1025     PSecPkgInfoW *);
1026 #define QUERY_SECURITY_PACKAGE_INFO_FN QUERY_SECURITY_PACKAGE_INFO_FN_W
1027 
1028 KSECDDDECLSPEC
1029 SECURITY_STATUS
1030 SEC_ENTRY
1031 RevertSecurityContext(
1032     _In_ PCtxtHandle phContext);
1033 
1034 typedef
1035 SECURITY_STATUS
1036 (SEC_ENTRY * REVERT_SECURITY_CONTEXT_FN)(
1037     PCtxtHandle);
1038 
1039 #if (OSVER(NTDDI_VERSION) > NTDDI_WIN2K)
1040 SECURITY_STATUS
1041 SEC_ENTRY
1042 SetContextAttributesW(
1043     _In_ PCtxtHandle phContext,
1044     _In_ ULONG ulAttribute,
1045     _In_bytecount_(cbBuffer) PVOID pBuffer,
1046     _In_ ULONG cbBuffer);
1047 #define SetContextAttributes SetContextAttributesW
1048 
1049 typedef
1050 SECURITY_STATUS
1051 (SEC_ENTRY * SET_CONTEXT_ATTRIBUTES_FN_W)(
1052     PCtxtHandle,
1053     ULONG,
1054     PVOID,
1055     ULONG);
1056 #define SET_CONTEXT_ATTRIBUTES_FN SET_CONTEXT_ATTRIBUTES_FN_W
1057 #endif
1058 
1059 #if (NTDDI_VERSION > NTDDI_WS03)
1060 KSECDDDECLSPEC
1061 SECURITY_STATUS
1062 SEC_ENTRY
1063 SetCredentialsAttributesW(
1064     _In_ PCredHandle phCredential,
1065     _In_ ULONG ulAttribute,
1066     _In_bytecount_(cbBuffer) PVOID pBuffer,
1067     _In_ ULONG cbBuffer);
1068 #define SetCredentialsAttributes SetCredentialsAttributesW
1069 
1070 typedef
1071 SECURITY_STATUS
1072 (SEC_ENTRY * SET_CREDENTIALS_ATTRIBUTES_FN_W)(
1073     PCredHandle,
1074     ULONG,
1075     PVOID,
1076     ULONG);
1077 #define SET_CREDENTIALS_ATTRIBUTES_FN SET_CREDENTIALS_ATTRIBUTES_FN_W
1078 #endif /* NTDDI_VERSION > NTDDI_WS03 */
1079 
1080 KSECDDDECLSPEC
1081 SECURITY_STATUS
1082 SEC_ENTRY
1083 VerifySignature(
1084     _In_ PCtxtHandle phContext,
1085     _In_ PSecBufferDesc pMessage,
1086     _In_ ULONG MessageSeqNo,
1087     _Out_ PULONG pfQOP);
1088 
1089 typedef
1090 SECURITY_STATUS
1091 (SEC_ENTRY * VERIFY_SIGNATURE_FN)(
1092     PCtxtHandle,
1093     PSecBufferDesc,
1094     ULONG,
1095     PULONG);
1096 
1097 #if (ISSP_MODE == 0)
1098 
1099 KSECDDDECLSPEC
1100 NTSTATUS
1101 NTAPI
1102 SecMakeSPN(
1103     _In_ PUNICODE_STRING ServiceClass,
1104     _In_ PUNICODE_STRING ServiceName,
1105     _In_opt_ PUNICODE_STRING InstanceName,
1106     _In_opt_ USHORT InstancePort,
1107     _In_opt_ PUNICODE_STRING Referrer,
1108     _Inout_ PUNICODE_STRING Spn,
1109     _Out_opt_ PULONG Length,
1110     _In_ BOOLEAN Allocate);
1111 
1112 #if (NTDDI_VERSION >= NTDDI_WINXP)
1113 KSECDDDECLSPEC
1114 NTSTATUS
1115 NTAPI
1116 SecMakeSPNEx(
1117     _In_ PUNICODE_STRING ServiceClass,
1118     _In_ PUNICODE_STRING ServiceName,
1119     _In_opt_ PUNICODE_STRING InstanceName,
1120     _In_opt_ USHORT InstancePort,
1121     _In_opt_ PUNICODE_STRING Referrer,
1122     _In_opt_ PUNICODE_STRING TargetInfo,
1123     _Inout_ PUNICODE_STRING Spn,
1124     _Out_ PULONG Length OPTIONAL,
1125     _In_ BOOLEAN Allocate);
1126 
1127 KSECDDDECLSPEC
1128 NTSTATUS
1129 SEC_ENTRY
1130 SecLookupAccountSid(
1131     _In_ PSID Sid,
1132     _Out_ PULONG NameSize,
1133     _Inout_ PUNICODE_STRING NameBuffer,
1134     _Out_ PULONG DomainSize OPTIONAL,
1135     _Out_opt_ PUNICODE_STRING DomainBuffer,
1136     _Out_ PSID_NAME_USE NameUse);
1137 
1138 KSECDDDECLSPEC
1139 NTSTATUS
1140 SEC_ENTRY
1141 SecLookupAccountName(
1142     _In_ PUNICODE_STRING Name,
1143     _Inout_ PULONG SidSize,
1144     _Out_ PSID Sid,
1145     _Out_ PSID_NAME_USE NameUse,
1146     _Out_opt_ PULONG DomainSize, // WDK says _Out_ only + ... OPTIONAL
1147     _Inout_opt_ PUNICODE_STRING ReferencedDomain);
1148 #endif
1149 
1150 #if (NTDDI_VERSION >= NTDDI_WS03)
1151 KSECDDDECLSPEC
1152 NTSTATUS
1153 SEC_ENTRY
1154 SecLookupWellKnownSid(
1155     _In_ WELL_KNOWN_SID_TYPE SidType,
1156     _Out_ PSID Sid,
1157     _In_ ULONG SidBufferSize,
1158     _Inout_opt_ PULONG SidSize);
1159 #endif
1160 
1161 #if (NTDDI_VERSION >= NTDDI_VISTA)
1162 KSECDDDECLSPEC
1163 NTSTATUS
1164 NTAPI
1165 SecMakeSPNEx2(
1166     _In_ PUNICODE_STRING ServiceClass,
1167     _In_ PUNICODE_STRING ServiceName,
1168     _In_opt_ PUNICODE_STRING InstanceName,
1169     _In_opt_ USHORT InstancePort,
1170     _In_opt_ PUNICODE_STRING Referrer,
1171     _In_opt_ PUNICODE_STRING InTargetInfo,
1172     _Inout_ PUNICODE_STRING Spn,
1173     _Out_opt_ PULONG TotalSize,
1174     _In_ BOOLEAN Allocate,
1175     _In_ BOOLEAN IsTargetInfoMarshaled);
1176 #endif
1177 
1178 #endif /* ISSP_MODE == 0 */
1179 
1180 #if (NTDDI_VERSION >= NTDDI_WIN7)
1181 
1182 SECURITY_STATUS
1183 SEC_ENTRY
1184 SspiEncodeAuthIdentityAsStrings(
1185     _In_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE pAuthIdentity,
1186     _Deref_out_opt_ PCWSTR* ppszUserName,
1187     _Deref_out_opt_ PCWSTR* ppszDomainName,
1188     _Deref_opt_out_opt_ PCWSTR* ppszPackedCredentialsString);
1189 
1190 SECURITY_STATUS
1191 SEC_ENTRY
1192 SspiValidateAuthIdentity(
1193     _In_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthData);
1194 
1195 SECURITY_STATUS
1196 SEC_ENTRY
1197 SspiCopyAuthIdentity(
1198     _In_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthData,
1199     _Deref_out_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE* AuthDataCopy);
1200 
1201 VOID
1202 SEC_ENTRY
1203 SspiFreeAuthIdentity(
1204     _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthData);
1205 
1206 VOID
1207 SEC_ENTRY
1208 SspiZeroAuthIdentity(
1209     _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthData);
1210 
1211 VOID
1212 SEC_ENTRY
1213 SspiLocalFree(
1214     _In_opt_ PVOID DataBuffer);
1215 
1216 SECURITY_STATUS
1217 SEC_ENTRY
1218 SspiEncodeStringsAsAuthIdentity(
1219     _In_opt_ PCWSTR pszUserName,
1220     _In_opt_ PCWSTR pszDomainName,
1221     _In_opt_ PCWSTR pszPackedCredentialsString,
1222     _Deref_out_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE* ppAuthIdentity);
1223 
1224 SECURITY_STATUS
1225 SEC_ENTRY
1226 SspiCompareAuthIdentities(
1227     _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthIdentity1,
1228     _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthIdentity2,
1229     _Out_opt_ PBOOLEAN SameSuppliedUser,
1230     _Out_opt_ PBOOLEAN SameSuppliedIdentity);
1231 
1232 SECURITY_STATUS
1233 SEC_ENTRY
1234 SspiMarshalAuthIdentity(
1235     _In_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthIdentity,
1236     _Out_ PULONG AuthIdentityLength,
1237     _Outptr_result_bytebuffer_(*AuthIdentityLength) PCHAR* AuthIdentityByteArray);
1238 
1239 SECURITY_STATUS
1240 SEC_ENTRY
1241 SspiUnmarshalAuthIdentity(
1242     _In_ PULONG AuthIdentityLength,
1243     _In_reads_bytes_(AuthIdentityLength) PCHAR AuthIdentityByteArray,
1244     _Outptr_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE* ppAuthIdentity);
1245 
1246 BOOLEAN
1247 SEC_ENTRY
1248 SspiIsPromptingNeeded(
1249     _In_ PULONG ErrorOrNtStatus);
1250 
1251 SECURITY_STATUS
1252 SEC_ENTRY
1253 SspiGetTargetHostName(
1254     _In_ PCWSTR pszTargetName,
1255     _Outptr_ PWSTR* pszHostName);
1256 
1257 SECURITY_STATUS
1258 SEC_ENTRY
1259 SspiExcludePackage(
1260     _In_opt_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE AuthIdentity,
1261     _In_ PCWSTR pszPackageName,
1262     _Outptr_ PSEC_WINNT_AUTH_IDENTITY_OPAQUE* ppNewAuthIdentity);
1263 
1264 #define SEC_WINNT_AUTH_IDENTITY_MARSHALLED 0x04
1265 #define SEC_WINNT_AUTH_IDENTITY_ONLY 0x08
1266 
1267 #endif /* NTDDI_VERSION >= NTDDI_WIN7 */
1268 
1269 #define FreeCredentialHandle FreeCredentialsHandle
1270 struct _SECURITY_FUNCTION_TABLE_W
1271 {
1272     ULONG dwVersion;
1273     ENUMERATE_SECURITY_PACKAGES_FN_W EnumerateSecurityPackagesW;
1274     QUERY_CREDENTIALS_ATTRIBUTES_FN_W QueryCredentialsAttributesW;
1275     ACQUIRE_CREDENTIALS_HANDLE_FN_W AcquireCredentialsHandleW;
1276     FREE_CREDENTIALS_HANDLE_FN FreeCredentialsHandle;
1277     PVOID Reserved2;
1278     INITIALIZE_SECURITY_CONTEXT_FN_W InitializeSecurityContextW;
1279     ACCEPT_SECURITY_CONTEXT_FN AcceptSecurityContext;
1280     COMPLETE_AUTH_TOKEN_FN CompleteAuthToken;
1281     DELETE_SECURITY_CONTEXT_FN DeleteSecurityContext;
1282     APPLY_CONTROL_TOKEN_FN ApplyControlToken;
1283     QUERY_CONTEXT_ATTRIBUTES_FN_W QueryContextAttributesW;
1284     IMPERSONATE_SECURITY_CONTEXT_FN ImpersonateSecurityContext;
1285     REVERT_SECURITY_CONTEXT_FN RevertSecurityContext;
1286     MAKE_SIGNATURE_FN MakeSignature;
1287     VERIFY_SIGNATURE_FN VerifySignature;
1288     FREE_CONTEXT_BUFFER_FN FreeContextBuffer;
1289     QUERY_SECURITY_PACKAGE_INFO_FN_W QuerySecurityPackageInfoW;
1290     PVOID Reserved3;
1291     PVOID Reserved4;
1292     EXPORT_SECURITY_CONTEXT_FN ExportSecurityContext;
1293     IMPORT_SECURITY_CONTEXT_FN_W ImportSecurityContextW;
1294     ADD_CREDENTIALS_FN_W AddCredentialsW ;
1295     PVOID Reserved8;
1296     QUERY_SECURITY_CONTEXT_TOKEN_FN QuerySecurityContextToken;
1297     ENCRYPT_MESSAGE_FN EncryptMessage;
1298     DECRYPT_MESSAGE_FN DecryptMessage;
1299 #if OSVER(NTDDI_VERSION) > NTDDI_WIN2K
1300     SET_CONTEXT_ATTRIBUTES_FN_W SetContextAttributesW;
1301 #endif
1302 #if NTDDI_VERSION > NTDDI_WS03SP1
1303     SET_CREDENTIALS_ATTRIBUTES_FN_W SetCredentialsAttributesW;
1304 #endif
1305 #if ISSP_MODE != 0
1306     CHANGE_PASSWORD_FN_W ChangeAccountPasswordW;
1307 #else
1308     PVOID Reserved9;
1309 #endif
1310 };
1311 
1312 #endif /* !__SSPI_H__ */
1313