Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1440 lines
40 KiB

  1. //+-----------------------------------------------------------------------
  2. //
  3. // Microsoft Windows
  4. //
  5. // Copyright (c) Microsoft Corporation 1991-1999
  6. //
  7. // File: secpkg.h
  8. //
  9. // Contents: Global definitions for security packages
  10. // This file will contain everything specific to writing
  11. // a security package.
  12. //
  13. //
  14. // History: 10 Mar 92 RichardW Created
  15. // 24-Mar-94 wader Changed EstablishCredentials to SystemLogon
  16. //
  17. //------------------------------------------------------------------------
  18. #ifndef __SECPKG_H__
  19. #define __SECPKG_H__
  20. #if _MSC_VER > 1000
  21. #pragma once
  22. #endif
  23. #include <ntlsa.h> // SECURITY_LOGON_TYPE
  24. // begin_ntsecpkg
  25. #ifdef SECURITY_KERNEL
  26. //
  27. // Can't use the windows.h def'ns in kernel mode.
  28. //
  29. typedef PVOID SEC_THREAD_START;
  30. typedef PVOID SEC_ATTRS;
  31. #else
  32. typedef LPTHREAD_START_ROUTINE SEC_THREAD_START;
  33. typedef LPSECURITY_ATTRIBUTES SEC_ATTRS;
  34. #endif
  35. #define SecEqualLuid(L1, L2) \
  36. ( ( ((PLUID)L1)->LowPart == ((PLUID)L2)->LowPart ) && \
  37. ( ((PLUID)L1)->HighPart == ((PLUID)L2)->HighPart ) ) \
  38. #define SecIsZeroLuid( L1 ) \
  39. ( ( L1->LowPart | L1->HighPart ) == 0 )
  40. //
  41. // The following structures are used by the helper functions
  42. //
  43. typedef struct _SECPKG_CLIENT_INFO {
  44. LUID LogonId; // Effective Logon Id
  45. ULONG ProcessID; // Process Id of caller
  46. ULONG ThreadID; // Thread Id of caller
  47. BOOLEAN HasTcbPrivilege; // Client has TCB
  48. BOOLEAN Impersonating; // Client is impersonating
  49. BOOLEAN Restricted; // Client is restricted
  50. //
  51. // NT 5.1
  52. //
  53. UCHAR ClientFlags; // Extra flags about the client
  54. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; // Impersonation level of client
  55. } SECPKG_CLIENT_INFO, * PSECPKG_CLIENT_INFO;
  56. #define SECPKG_CLIENT_PROCESS_TERMINATED 0x01 // The client process has terminated
  57. #define SECPKG_CLIENT_THREAD_TERMINATED 0x02 // The client thread has terminated
  58. typedef struct _SECPKG_CALL_INFO {
  59. ULONG ProcessId ;
  60. ULONG ThreadId ;
  61. ULONG Attributes ;
  62. ULONG CallCount ;
  63. } SECPKG_CALL_INFO, * PSECPKG_CALL_INFO ;
  64. #define SECPKG_CALL_KERNEL_MODE 0x00000001 // Call originated in kernel mode
  65. #define SECPKG_CALL_ANSI 0x00000002 // Call came from ANSI stub
  66. #define SECPKG_CALL_URGENT 0x00000004 // Call designated urgent
  67. #define SECPKG_CALL_RECURSIVE 0x00000008 // Call is recursing
  68. #define SECPKG_CALL_IN_PROC 0x00000010 // Call originated in process
  69. #define SECPKG_CALL_CLEANUP 0x00000020 // Call is cleanup from a client
  70. #define SECPKG_CALL_WOWCLIENT 0x00000040 // Call is from a WOW client process
  71. #define SECPKG_CALL_THREAD_TERM 0x00000080 // Call is from a thread that has term'd
  72. #define SECPKG_CALL_PROCESS_TERM 0x00000100 // Call is from a process that has term'd
  73. #define SECPKG_CALL_IS_TCB 0x00000200 // Call is from TCB
  74. typedef struct _SECPKG_SUPPLEMENTAL_CRED {
  75. UNICODE_STRING PackageName;
  76. ULONG CredentialSize;
  77. #ifdef MIDL_PASS
  78. [size_is(CredentialSize)]
  79. #endif // MIDL_PASS
  80. PUCHAR Credentials;
  81. } SECPKG_SUPPLEMENTAL_CRED, *PSECPKG_SUPPLEMENTAL_CRED;
  82. typedef ULONG_PTR LSA_SEC_HANDLE ;
  83. typedef LSA_SEC_HANDLE * PLSA_SEC_HANDLE ;
  84. typedef struct _SECPKG_SUPPLEMENTAL_CRED_ARRAY {
  85. ULONG CredentialCount;
  86. #ifdef MIDL_PASS
  87. [size_is(CredentialCount)] SECPKG_SUPPLEMENTAL_CRED Credentials[*];
  88. #else // MIDL_PASS
  89. SECPKG_SUPPLEMENTAL_CRED Credentials[1];
  90. #endif // MIDL_PASS
  91. } SECPKG_SUPPLEMENTAL_CRED_ARRAY, *PSECPKG_SUPPLEMENTAL_CRED_ARRAY;
  92. //
  93. // This flag is used for to indicate which buffers in the LSA are located
  94. // in the client's address space
  95. //
  96. #define SECBUFFER_UNMAPPED 0x40000000
  97. //
  98. // This flag is used to indicate that the buffer was mapped into the LSA
  99. // from kernel mode.
  100. //
  101. #define SECBUFFER_KERNEL_MAP 0x20000000
  102. typedef NTSTATUS
  103. (NTAPI LSA_CALLBACK_FUNCTION)(
  104. ULONG_PTR Argument1,
  105. ULONG_PTR Argument2,
  106. PSecBuffer InputBuffer,
  107. PSecBuffer OutputBuffer
  108. );
  109. typedef LSA_CALLBACK_FUNCTION * PLSA_CALLBACK_FUNCTION ;
  110. #define PRIMARY_CRED_CLEAR_PASSWORD 0x1
  111. #define PRIMARY_CRED_OWF_PASSWORD 0x2
  112. #define PRIMARY_CRED_UPDATE 0x4 // this is a change of existing creds
  113. #define PRIMARY_CRED_CACHED_LOGON 0x8
  114. #define PRIMARY_CRED_LOGON_PACKAGE_SHIFT 24
  115. #define PRIMARY_CRED_PACKAGE_MASK 0xff000000
  116. //
  117. // For cached logons, the RPC id of the package doing the logon is identified
  118. // by shifting the flags to the right by the PRIMARY_CRED_LOGON_PACKAGE_SHIFT.
  119. //
  120. typedef struct _SECPKG_PRIMARY_CRED {
  121. LUID LogonId;
  122. UNICODE_STRING DownlevelName; // Sam Account Name
  123. UNICODE_STRING DomainName; // Netbios domain name where account is located
  124. UNICODE_STRING Password;
  125. UNICODE_STRING OldPassword;
  126. PSID UserSid;
  127. ULONG Flags;
  128. UNICODE_STRING DnsDomainName; // DNS domain name where account is located (if known)
  129. UNICODE_STRING Upn; // UPN of account (if known)
  130. UNICODE_STRING LogonServer;
  131. UNICODE_STRING Spare1;
  132. UNICODE_STRING Spare2;
  133. UNICODE_STRING Spare3;
  134. UNICODE_STRING Spare4;
  135. } SECPKG_PRIMARY_CRED, *PSECPKG_PRIMARY_CRED;
  136. //
  137. // Maximum size of stored credentials.
  138. //
  139. #define MAX_CRED_SIZE 1024
  140. // Values for MachineState
  141. #define SECPKG_STATE_ENCRYPTION_PERMITTED 0x01
  142. #define SECPKG_STATE_STRONG_ENCRYPTION_PERMITTED 0x02
  143. #define SECPKG_STATE_DOMAIN_CONTROLLER 0x04
  144. #define SECPKG_STATE_WORKSTATION 0x08
  145. #define SECPKG_STATE_STANDALONE 0x10
  146. typedef struct _SECPKG_PARAMETERS {
  147. ULONG Version;
  148. ULONG MachineState;
  149. ULONG SetupMode;
  150. PSID DomainSid;
  151. UNICODE_STRING DomainName;
  152. UNICODE_STRING DnsDomainName;
  153. GUID DomainGuid;
  154. } SECPKG_PARAMETERS, *PSECPKG_PARAMETERS;
  155. //
  156. // Extended Package information structures
  157. //
  158. typedef enum _SECPKG_EXTENDED_INFORMATION_CLASS {
  159. SecpkgGssInfo = 1,
  160. SecpkgContextThunks,
  161. SecpkgMutualAuthLevel,
  162. SecpkgWowClientDll,
  163. SecpkgExtraOids,
  164. SecpkgMaxInfo
  165. } SECPKG_EXTENDED_INFORMATION_CLASS ;
  166. typedef struct _SECPKG_GSS_INFO {
  167. ULONG EncodedIdLength ;
  168. UCHAR EncodedId[4] ;
  169. } SECPKG_GSS_INFO, * PSECPKG_GSS_INFO ;
  170. typedef struct _SECPKG_CONTEXT_THUNKS {
  171. ULONG InfoLevelCount ;
  172. ULONG Levels[1] ;
  173. } SECPKG_CONTEXT_THUNKS, *PSECPKG_CONTEXT_THUNKS ;
  174. typedef struct _SECPKG_MUTUAL_AUTH_LEVEL {
  175. ULONG MutualAuthLevel ;
  176. } SECPKG_MUTUAL_AUTH_LEVEL, * PSECPKG_MUTUAL_AUTH_LEVEL ;
  177. typedef struct _SECPKG_WOW_CLIENT_DLL {
  178. SECURITY_STRING WowClientDllPath;
  179. } SECPKG_WOW_CLIENT_DLL, * PSECPKG_WOW_CLIENT_DLL ;
  180. #define SECPKG_MAX_OID_LENGTH 32
  181. typedef struct _SECPKG_SERIALIZED_OID {
  182. ULONG OidLength ;
  183. ULONG OidAttributes ;
  184. UCHAR OidValue[ SECPKG_MAX_OID_LENGTH ];
  185. } SECPKG_SERIALIZED_OID, * PSECPKG_SERIALIZED_OID ;
  186. typedef struct _SECPKG_EXTRA_OIDS {
  187. ULONG OidCount ;
  188. SECPKG_SERIALIZED_OID Oids[ 1 ];
  189. } SECPKG_EXTRA_OIDS, * PSECPKG_EXTRA_OIDS;
  190. typedef struct _SECPKG_EXTENDED_INFORMATION {
  191. SECPKG_EXTENDED_INFORMATION_CLASS Class ;
  192. union {
  193. SECPKG_GSS_INFO GssInfo ;
  194. SECPKG_CONTEXT_THUNKS ContextThunks ;
  195. SECPKG_MUTUAL_AUTH_LEVEL MutualAuthLevel ;
  196. SECPKG_WOW_CLIENT_DLL WowClientDll ;
  197. SECPKG_EXTRA_OIDS ExtraOids ;
  198. } Info ;
  199. } SECPKG_EXTENDED_INFORMATION, * PSECPKG_EXTENDED_INFORMATION ;
  200. #define SECPKG_ATTR_SASL_CONTEXT 0x00010000
  201. typedef struct _SecPkgContext_SaslContext {
  202. PVOID SaslContext ;
  203. } SecPkgContext_SaslContext, * PSecPkgContext_SaslContext ;
  204. //
  205. // Setting this value as the first context thunk value will cause all
  206. // calls to go to the LSA:
  207. //
  208. #define SECPKG_ATTR_THUNK_ALL 0x00010000
  209. #ifndef SECURITY_USER_DATA_DEFINED
  210. #define SECURITY_USER_DATA_DEFINED
  211. typedef struct _SECURITY_USER_DATA {
  212. SECURITY_STRING UserName; // User name
  213. SECURITY_STRING LogonDomainName; // Domain the user logged on to
  214. SECURITY_STRING LogonServer; // Server that logged the user on
  215. PSID pSid; // SID of user
  216. } SECURITY_USER_DATA, *PSECURITY_USER_DATA;
  217. typedef SECURITY_USER_DATA SecurityUserData, * PSecurityUserData;
  218. #define UNDERSTANDS_LONG_NAMES 1
  219. #define NO_LONG_NAMES 2
  220. #endif // SECURITY_USER_DATA_DEFINED
  221. //////////////////////////////////////////////////////////////////////////
  222. //
  223. // The following prototypes are to functions that are provided by the SPMgr
  224. // to security packages.
  225. //
  226. //////////////////////////////////////////////////////////////////////////
  227. typedef NTSTATUS
  228. (NTAPI LSA_IMPERSONATE_CLIENT) (
  229. VOID
  230. );
  231. typedef NTSTATUS
  232. (NTAPI LSA_UNLOAD_PACKAGE)(
  233. VOID
  234. );
  235. typedef NTSTATUS
  236. (NTAPI LSA_DUPLICATE_HANDLE)(
  237. IN HANDLE SourceHandle,
  238. OUT PHANDLE DestionationHandle);
  239. typedef NTSTATUS
  240. (NTAPI LSA_SAVE_SUPPLEMENTAL_CREDENTIALS)(
  241. IN PLUID LogonId,
  242. IN ULONG SupplementalCredSize,
  243. IN PVOID SupplementalCreds,
  244. IN BOOLEAN Synchronous
  245. );
  246. typedef HANDLE
  247. (NTAPI LSA_CREATE_THREAD)(
  248. IN SEC_ATTRS SecurityAttributes,
  249. IN ULONG StackSize,
  250. IN SEC_THREAD_START StartFunction,
  251. IN PVOID ThreadParameter,
  252. IN ULONG CreationFlags,
  253. OUT PULONG ThreadId
  254. );
  255. typedef NTSTATUS
  256. (NTAPI LSA_GET_CLIENT_INFO)(
  257. OUT PSECPKG_CLIENT_INFO ClientInfo
  258. );
  259. typedef HANDLE
  260. (NTAPI LSA_REGISTER_NOTIFICATION)(
  261. IN SEC_THREAD_START StartFunction,
  262. IN PVOID Parameter,
  263. IN ULONG NotificationType,
  264. IN ULONG NotificationClass,
  265. IN ULONG NotificationFlags,
  266. IN ULONG IntervalMinutes,
  267. IN OPTIONAL HANDLE WaitEvent
  268. );
  269. typedef NTSTATUS
  270. (NTAPI LSA_CANCEL_NOTIFICATION)(
  271. IN HANDLE NotifyHandle
  272. );
  273. typedef NTSTATUS
  274. (NTAPI LSA_MAP_BUFFER)(
  275. IN PSecBuffer InputBuffer,
  276. OUT PSecBuffer OutputBuffer
  277. );
  278. typedef NTSTATUS
  279. (NTAPI LSA_CREATE_TOKEN) (
  280. IN PLUID LogonId,
  281. IN PTOKEN_SOURCE TokenSource,
  282. IN SECURITY_LOGON_TYPE LogonType,
  283. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  284. IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  285. IN PVOID TokenInformation,
  286. IN PTOKEN_GROUPS TokenGroups,
  287. IN PUNICODE_STRING AccountName,
  288. IN PUNICODE_STRING AuthorityName,
  289. IN PUNICODE_STRING Workstation,
  290. IN PUNICODE_STRING ProfilePath,
  291. OUT PHANDLE Token,
  292. OUT PNTSTATUS SubStatus
  293. );
  294. typedef enum _SECPKG_SESSIONINFO_TYPE {
  295. SecSessionPrimaryCred // SessionInformation is SECPKG_PRIMARY_CRED
  296. } SECPKG_SESSIONINFO_TYPE ;
  297. typedef NTSTATUS
  298. (NTAPI LSA_CREATE_TOKEN_EX) (
  299. IN PLUID LogonId,
  300. IN PTOKEN_SOURCE TokenSource,
  301. IN SECURITY_LOGON_TYPE LogonType,
  302. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  303. IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  304. IN PVOID TokenInformation,
  305. IN PTOKEN_GROUPS TokenGroups,
  306. IN PUNICODE_STRING Workstation,
  307. IN PUNICODE_STRING ProfilePath,
  308. IN PVOID SessionInformation,
  309. IN SECPKG_SESSIONINFO_TYPE SessionInformationType,
  310. OUT PHANDLE Token,
  311. OUT PNTSTATUS SubStatus
  312. );
  313. typedef VOID
  314. (NTAPI LSA_AUDIT_LOGON) (
  315. IN NTSTATUS Status,
  316. IN NTSTATUS SubStatus,
  317. IN PUNICODE_STRING AccountName,
  318. IN PUNICODE_STRING AuthenticatingAuthority,
  319. IN PUNICODE_STRING WorkstationName,
  320. IN OPTIONAL PSID UserSid,
  321. IN SECURITY_LOGON_TYPE LogonType,
  322. IN PTOKEN_SOURCE TokenSource,
  323. IN PLUID LogonId
  324. );
  325. typedef NTSTATUS
  326. (NTAPI LSA_CALL_PACKAGE) (
  327. IN PUNICODE_STRING AuthenticationPackage,
  328. IN PVOID ProtocolSubmitBuffer,
  329. IN ULONG SubmitBufferLength,
  330. OUT PVOID *ProtocolReturnBuffer,
  331. OUT PULONG ReturnBufferLength,
  332. OUT PNTSTATUS ProtocolStatus
  333. );
  334. typedef NTSTATUS
  335. (NTAPI LSA_CALL_PACKAGEEX) (
  336. IN PUNICODE_STRING AuthenticationPackage,
  337. IN PVOID ClientBufferBase,
  338. IN PVOID ProtocolSubmitBuffer,
  339. IN ULONG SubmitBufferLength,
  340. OUT PVOID *ProtocolReturnBuffer,
  341. OUT PULONG ReturnBufferLength,
  342. OUT PNTSTATUS ProtocolStatus
  343. );
  344. typedef NTSTATUS
  345. (NTAPI LSA_CALL_PACKAGE_PASSTHROUGH) (
  346. IN PUNICODE_STRING AuthenticationPackage,
  347. IN PVOID ClientBufferBase,
  348. IN PVOID ProtocolSubmitBuffer,
  349. IN ULONG SubmitBufferLength,
  350. OUT PVOID *ProtocolReturnBuffer,
  351. OUT PULONG ReturnBufferLength,
  352. OUT PNTSTATUS ProtocolStatus
  353. );
  354. typedef BOOLEAN
  355. (NTAPI LSA_GET_CALL_INFO) (
  356. OUT PSECPKG_CALL_INFO Info
  357. );
  358. typedef PVOID
  359. (NTAPI LSA_CREATE_SHARED_MEMORY)(
  360. ULONG MaxSize,
  361. ULONG InitialSize
  362. );
  363. typedef PVOID
  364. (NTAPI LSA_ALLOCATE_SHARED_MEMORY)(
  365. PVOID SharedMem,
  366. ULONG Size
  367. );
  368. typedef VOID
  369. (NTAPI LSA_FREE_SHARED_MEMORY)(
  370. PVOID SharedMem,
  371. PVOID Memory
  372. );
  373. typedef BOOLEAN
  374. (NTAPI LSA_DELETE_SHARED_MEMORY)(
  375. PVOID SharedMem
  376. );
  377. //
  378. // Account Access
  379. //
  380. typedef enum _SECPKG_NAME_TYPE {
  381. SecNameSamCompatible,
  382. SecNameAlternateId,
  383. SecNameFlat,
  384. SecNameDN
  385. } SECPKG_NAME_TYPE ;
  386. typedef NTSTATUS
  387. (NTAPI LSA_OPEN_SAM_USER)(
  388. PSECURITY_STRING Name,
  389. SECPKG_NAME_TYPE NameType,
  390. PSECURITY_STRING Prefix,
  391. BOOLEAN AllowGuest,
  392. ULONG Reserved,
  393. PVOID * UserHandle
  394. );
  395. typedef NTSTATUS
  396. (NTAPI LSA_GET_USER_CREDENTIALS)(
  397. PVOID UserHandle,
  398. PVOID * PrimaryCreds,
  399. PULONG PrimaryCredsSize,
  400. PVOID * SupplementalCreds,
  401. PULONG SupplementalCredsSize
  402. );
  403. typedef NTSTATUS
  404. (NTAPI LSA_GET_USER_AUTH_DATA)(
  405. PVOID UserHandle,
  406. PUCHAR * UserAuthData,
  407. PULONG UserAuthDataSize
  408. );
  409. typedef NTSTATUS
  410. (NTAPI LSA_CLOSE_SAM_USER)(
  411. PVOID UserHandle
  412. );
  413. typedef NTSTATUS
  414. (NTAPI LSA_GET_AUTH_DATA_FOR_USER)(
  415. PSECURITY_STRING Name,
  416. SECPKG_NAME_TYPE NameType,
  417. PSECURITY_STRING Prefix,
  418. PUCHAR * UserAuthData,
  419. PULONG UserAuthDataSize,
  420. PUNICODE_STRING UserFlatName
  421. );
  422. typedef NTSTATUS
  423. (NTAPI LSA_CONVERT_AUTH_DATA_TO_TOKEN)(
  424. IN PVOID UserAuthData,
  425. IN ULONG UserAuthDataSize,
  426. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  427. IN PTOKEN_SOURCE TokenSource,
  428. IN SECURITY_LOGON_TYPE LogonType,
  429. IN PUNICODE_STRING AuthorityName,
  430. OUT PHANDLE Token,
  431. OUT PLUID LogonId,
  432. OUT PUNICODE_STRING AccountName,
  433. OUT PNTSTATUS SubStatus
  434. );
  435. typedef NTSTATUS
  436. (NTAPI LSA_CRACK_SINGLE_NAME)(
  437. IN ULONG FormatOffered,
  438. IN BOOLEAN PerformAtGC,
  439. IN PUNICODE_STRING NameInput,
  440. IN PUNICODE_STRING Prefix OPTIONAL,
  441. IN ULONG RequestedFormat,
  442. OUT PUNICODE_STRING CrackedName,
  443. OUT PUNICODE_STRING DnsDomainName,
  444. OUT PULONG SubStatus
  445. );
  446. typedef NTSTATUS
  447. (NTAPI LSA_AUDIT_ACCOUNT_LOGON)(
  448. IN ULONG AuditId,
  449. IN BOOLEAN Success,
  450. IN PUNICODE_STRING Source,
  451. IN PUNICODE_STRING ClientName,
  452. IN PUNICODE_STRING MappedName,
  453. IN NTSTATUS Status
  454. );
  455. typedef NTSTATUS
  456. (NTAPI LSA_CLIENT_CALLBACK)(
  457. PCHAR Callback,
  458. ULONG_PTR Argument1,
  459. ULONG_PTR Argument2,
  460. PSecBuffer Input,
  461. PSecBuffer Output
  462. );
  463. typedef
  464. NTSTATUS
  465. (NTAPI LSA_REGISTER_CALLBACK)(
  466. ULONG CallbackId,
  467. PLSA_CALLBACK_FUNCTION Callback
  468. );
  469. #define NOTIFIER_FLAG_NEW_THREAD 0x00000001
  470. #define NOTIFIER_FLAG_ONE_SHOT 0x00000002
  471. #define NOTIFIER_FLAG_SECONDS 0x80000000
  472. #define NOTIFIER_TYPE_INTERVAL 1
  473. #define NOTIFIER_TYPE_HANDLE_WAIT 2
  474. #define NOTIFIER_TYPE_STATE_CHANGE 3
  475. #define NOTIFIER_TYPE_NOTIFY_EVENT 4
  476. #define NOTIFIER_TYPE_IMMEDIATE 16
  477. #define NOTIFY_CLASS_PACKAGE_CHANGE 1
  478. #define NOTIFY_CLASS_ROLE_CHANGE 2
  479. #define NOTIFY_CLASS_DOMAIN_CHANGE 3
  480. #define NOTIFY_CLASS_REGISTRY_CHANGE 4
  481. typedef struct _SECPKG_EVENT_PACKAGE_CHANGE {
  482. ULONG ChangeType;
  483. LSA_SEC_HANDLE PackageId;
  484. SECURITY_STRING PackageName;
  485. } SECPKG_EVENT_PACKAGE_CHANGE, * PSECPKG_EVENT_PACKAGE_CHANGE ;
  486. #define SECPKG_PACKAGE_CHANGE_LOAD 0
  487. #define SECPKG_PACKAGE_CHANGE_UNLOAD 1
  488. #define SECPKG_PACKAGE_CHANGE_SELECT 2
  489. typedef struct _SECPKG_EVENT_ROLE_CHANGE {
  490. ULONG PreviousRole ;
  491. ULONG NewRole ;
  492. } SECPKG_EVENT_ROLE_CHANGE, * PSECPKG_EVENT_ROLE_CHANGE ;
  493. typedef struct _SECPKG_PARAMETERS SECPKG_EVENT_DOMAIN_CHANGE ;
  494. typedef struct _SECPKG_PARAMETERS * PSECPKG_EVENT_DOMAIN_CHANGE ;
  495. typedef struct _SECPKG_EVENT_NOTIFY {
  496. ULONG EventClass;
  497. ULONG Reserved;
  498. ULONG EventDataSize;
  499. PVOID EventData;
  500. PVOID PackageParameter;
  501. } SECPKG_EVENT_NOTIFY, *PSECPKG_EVENT_NOTIFY ;
  502. typedef
  503. NTSTATUS
  504. (NTAPI LSA_UPDATE_PRIMARY_CREDENTIALS)(
  505. IN PSECPKG_PRIMARY_CRED PrimaryCredentials,
  506. IN OPTIONAL PSECPKG_SUPPLEMENTAL_CRED_ARRAY Credentials
  507. );
  508. typedef
  509. VOID
  510. (NTAPI LSA_PROTECT_MEMORY)(
  511. IN PVOID Buffer,
  512. IN ULONG BufferSize
  513. );
  514. typedef
  515. NTSTATUS
  516. (NTAPI LSA_OPEN_TOKEN_BY_LOGON_ID)(
  517. IN PLUID LogonId,
  518. OUT HANDLE *RetTokenHandle
  519. );
  520. typedef
  521. NTSTATUS
  522. (NTAPI LSA_EXPAND_AUTH_DATA_FOR_DOMAIN)(
  523. IN PUCHAR UserAuthData,
  524. IN ULONG UserAuthDataSize,
  525. IN PVOID Reserved,
  526. OUT PUCHAR * ExpandedAuthData,
  527. OUT PULONG ExpandedAuthDataSize
  528. );
  529. typedef LSA_IMPERSONATE_CLIENT * PLSA_IMPERSONATE_CLIENT;
  530. typedef LSA_UNLOAD_PACKAGE * PLSA_UNLOAD_PACKAGE;
  531. typedef LSA_DUPLICATE_HANDLE * PLSA_DUPLICATE_HANDLE ;
  532. typedef LSA_SAVE_SUPPLEMENTAL_CREDENTIALS * PLSA_SAVE_SUPPLEMENTAL_CREDENTIALS;
  533. typedef LSA_CREATE_THREAD * PLSA_CREATE_THREAD;
  534. typedef LSA_GET_CLIENT_INFO * PLSA_GET_CLIENT_INFO;
  535. typedef LSA_REGISTER_NOTIFICATION * PLSA_REGISTER_NOTIFICATION;
  536. typedef LSA_CANCEL_NOTIFICATION * PLSA_CANCEL_NOTIFICATION;
  537. typedef LSA_MAP_BUFFER * PLSA_MAP_BUFFER;
  538. typedef LSA_CREATE_TOKEN * PLSA_CREATE_TOKEN;
  539. typedef LSA_AUDIT_LOGON * PLSA_AUDIT_LOGON;
  540. typedef LSA_CALL_PACKAGE * PLSA_CALL_PACKAGE;
  541. typedef LSA_CALL_PACKAGEEX * PLSA_CALL_PACKAGEEX;
  542. typedef LSA_GET_CALL_INFO * PLSA_GET_CALL_INFO ;
  543. typedef LSA_CREATE_SHARED_MEMORY * PLSA_CREATE_SHARED_MEMORY ;
  544. typedef LSA_ALLOCATE_SHARED_MEMORY * PLSA_ALLOCATE_SHARED_MEMORY ;
  545. typedef LSA_FREE_SHARED_MEMORY * PLSA_FREE_SHARED_MEMORY ;
  546. typedef LSA_DELETE_SHARED_MEMORY * PLSA_DELETE_SHARED_MEMORY ;
  547. typedef LSA_OPEN_SAM_USER * PLSA_OPEN_SAM_USER ;
  548. typedef LSA_GET_USER_CREDENTIALS * PLSA_GET_USER_CREDENTIALS ;
  549. typedef LSA_GET_USER_AUTH_DATA * PLSA_GET_USER_AUTH_DATA ;
  550. typedef LSA_CLOSE_SAM_USER * PLSA_CLOSE_SAM_USER ;
  551. typedef LSA_CONVERT_AUTH_DATA_TO_TOKEN * PLSA_CONVERT_AUTH_DATA_TO_TOKEN ;
  552. typedef LSA_CLIENT_CALLBACK * PLSA_CLIENT_CALLBACK ;
  553. typedef LSA_REGISTER_CALLBACK * PLSA_REGISTER_CALLBACK ;
  554. typedef LSA_UPDATE_PRIMARY_CREDENTIALS * PLSA_UPDATE_PRIMARY_CREDENTIALS;
  555. typedef LSA_GET_AUTH_DATA_FOR_USER * PLSA_GET_AUTH_DATA_FOR_USER ;
  556. typedef LSA_CRACK_SINGLE_NAME * PLSA_CRACK_SINGLE_NAME ;
  557. typedef LSA_AUDIT_ACCOUNT_LOGON * PLSA_AUDIT_ACCOUNT_LOGON ;
  558. typedef LSA_CALL_PACKAGE_PASSTHROUGH * PLSA_CALL_PACKAGE_PASSTHROUGH;
  559. typedef LSA_PROTECT_MEMORY * PLSA_PROTECT_MEMORY;
  560. typedef LSA_OPEN_TOKEN_BY_LOGON_ID * PLSA_OPEN_TOKEN_BY_LOGON_ID;
  561. typedef LSA_EXPAND_AUTH_DATA_FOR_DOMAIN * PLSA_EXPAND_AUTH_DATA_FOR_DOMAIN;
  562. typedef LSA_CREATE_TOKEN_EX * PLSA_CREATE_TOKEN_EX;
  563. #ifdef _WINCRED_H_
  564. //
  565. // When passing a credential around, the CredentialBlob field is encrypted.
  566. // This structure describes this encrypted form.
  567. //
  568. //
  569. #ifndef _ENCRYPTED_CREDENTIAL_DEFINED
  570. #define _ENCRYPTED_CREDENTIAL_DEFINED
  571. typedef struct _ENCRYPTED_CREDENTIALW {
  572. //
  573. // The credential
  574. //
  575. // The CredentialBlob field points to the encrypted credential
  576. // The CredentialBlobSize field is the length (in bytes) of the encrypted credential
  577. //
  578. CREDENTIALW Cred;
  579. //
  580. // The size in bytes of the clear text credential blob
  581. //
  582. ULONG ClearCredentialBlobSize;
  583. } ENCRYPTED_CREDENTIALW, *PENCRYPTED_CREDENTIALW;
  584. #endif // _ENCRYPTED_CREDENTIAL_DEFINED
  585. //
  586. // Values for CredFlags parameter
  587. //
  588. #define CREDP_FLAGS_IN_PROCESS 0x01 // Caller is in-process. Password data may be returned
  589. #define CREDP_FLAGS_USE_MIDL_HEAP 0x02 // Allocated buffer should use MIDL_user_allocte
  590. #define CREDP_FLAGS_DONT_CACHE_TI 0x04 // TargetInformation shouldn't be cached for CredGetTargetInfo
  591. #define CREDP_FLAGS_CLEAR_PASSWORD 0x08 // Credential blob is passed in in-the-clear
  592. typedef NTSTATUS
  593. (NTAPI CredReadFn) (
  594. IN PLUID LogonId,
  595. IN ULONG CredFlags,
  596. IN LPWSTR TargetName,
  597. IN ULONG Type,
  598. IN ULONG Flags,
  599. OUT PENCRYPTED_CREDENTIALW *Credential
  600. );
  601. typedef NTSTATUS
  602. (NTAPI CredReadDomainCredentialsFn) (
  603. IN PLUID LogonId,
  604. IN ULONG CredFlags,
  605. IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
  606. IN ULONG Flags,
  607. OUT PULONG Count,
  608. OUT PENCRYPTED_CREDENTIALW **Credential
  609. );
  610. typedef VOID
  611. (NTAPI CredFreeCredentialsFn) (
  612. IN ULONG Count,
  613. IN PENCRYPTED_CREDENTIALW *Credentials OPTIONAL
  614. );
  615. NTSTATUS
  616. CredMarshalTargetInfo (
  617. IN PCREDENTIAL_TARGET_INFORMATIONW InTargetInfo,
  618. OUT PUSHORT *Buffer,
  619. OUT PULONG BufferSize
  620. );
  621. NTSTATUS
  622. CredUnmarshalTargetInfo (
  623. IN PUSHORT Buffer,
  624. IN ULONG BufferSize,
  625. OUT PCREDENTIAL_TARGET_INFORMATIONW *RetTargetInfo
  626. );
  627. #endif // _WINCRED_H_
  628. //
  629. // Pure 32-bit versions of credential structures for packages
  630. // running wow64:
  631. //
  632. typedef struct _SEC_WINNT_AUTH_IDENTITY32 {
  633. ULONG User ;
  634. ULONG UserLength ;
  635. ULONG Domain ;
  636. ULONG DomainLength ;
  637. ULONG Password ;
  638. ULONG PasswordLength ;
  639. ULONG Flags ;
  640. } SEC_WINNT_AUTH_IDENTITY32, * PSEC_WINNT_AUTH_IDENTITY32 ;
  641. typedef struct _SEC_WINNT_AUTH_IDENTITY_EX32 {
  642. ULONG Version ;
  643. ULONG Length ;
  644. ULONG User ;
  645. ULONG UserLength ;
  646. ULONG Domain ;
  647. ULONG DomainLength ;
  648. ULONG Password ;
  649. ULONG PasswordLength ;
  650. ULONG Flags ;
  651. ULONG PackageList ;
  652. ULONG PackageListLength ;
  653. } SEC_WINNT_AUTH_IDENTITY_EX32, * PSEC_WINNT_AUTH_IDENTITY_EX32 ;
  654. // Functions provided by the SPM to the packages:
  655. typedef struct _LSA_SECPKG_FUNCTION_TABLE {
  656. PLSA_CREATE_LOGON_SESSION CreateLogonSession;
  657. PLSA_DELETE_LOGON_SESSION DeleteLogonSession;
  658. PLSA_ADD_CREDENTIAL AddCredential;
  659. PLSA_GET_CREDENTIALS GetCredentials;
  660. PLSA_DELETE_CREDENTIAL DeleteCredential;
  661. PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap;
  662. PLSA_FREE_LSA_HEAP FreeLsaHeap;
  663. PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer;
  664. PLSA_FREE_CLIENT_BUFFER FreeClientBuffer;
  665. PLSA_COPY_TO_CLIENT_BUFFER CopyToClientBuffer;
  666. PLSA_COPY_FROM_CLIENT_BUFFER CopyFromClientBuffer;
  667. PLSA_IMPERSONATE_CLIENT ImpersonateClient;
  668. PLSA_UNLOAD_PACKAGE UnloadPackage;
  669. PLSA_DUPLICATE_HANDLE DuplicateHandle;
  670. PLSA_SAVE_SUPPLEMENTAL_CREDENTIALS SaveSupplementalCredentials;
  671. PLSA_CREATE_THREAD CreateThread;
  672. PLSA_GET_CLIENT_INFO GetClientInfo;
  673. PLSA_REGISTER_NOTIFICATION RegisterNotification;
  674. PLSA_CANCEL_NOTIFICATION CancelNotification;
  675. PLSA_MAP_BUFFER MapBuffer;
  676. PLSA_CREATE_TOKEN CreateToken;
  677. PLSA_AUDIT_LOGON AuditLogon;
  678. PLSA_CALL_PACKAGE CallPackage;
  679. PLSA_FREE_LSA_HEAP FreeReturnBuffer;
  680. PLSA_GET_CALL_INFO GetCallInfo;
  681. PLSA_CALL_PACKAGEEX CallPackageEx;
  682. PLSA_CREATE_SHARED_MEMORY CreateSharedMemory;
  683. PLSA_ALLOCATE_SHARED_MEMORY AllocateSharedMemory;
  684. PLSA_FREE_SHARED_MEMORY FreeSharedMemory;
  685. PLSA_DELETE_SHARED_MEMORY DeleteSharedMemory;
  686. PLSA_OPEN_SAM_USER OpenSamUser ;
  687. PLSA_GET_USER_CREDENTIALS GetUserCredentials ;
  688. PLSA_GET_USER_AUTH_DATA GetUserAuthData ;
  689. PLSA_CLOSE_SAM_USER CloseSamUser ;
  690. PLSA_CONVERT_AUTH_DATA_TO_TOKEN ConvertAuthDataToToken ;
  691. PLSA_CLIENT_CALLBACK ClientCallback ;
  692. PLSA_UPDATE_PRIMARY_CREDENTIALS UpdateCredentials ;
  693. PLSA_GET_AUTH_DATA_FOR_USER GetAuthDataForUser ;
  694. PLSA_CRACK_SINGLE_NAME CrackSingleName ;
  695. PLSA_AUDIT_ACCOUNT_LOGON AuditAccountLogon ;
  696. PLSA_CALL_PACKAGE_PASSTHROUGH CallPackagePassthrough ;
  697. #ifdef _WINCRED_H_
  698. CredReadFn *CrediRead;
  699. CredReadDomainCredentialsFn *CrediReadDomainCredentials;
  700. CredFreeCredentialsFn *CrediFreeCredentials;
  701. #else // _WINCRED_H_
  702. PLSA_PROTECT_MEMORY DummyFunction1;
  703. PLSA_PROTECT_MEMORY DummyFunction2;
  704. PLSA_PROTECT_MEMORY DummyFunction3;
  705. #endif // _WINCRED_H_
  706. PLSA_PROTECT_MEMORY LsaProtectMemory;
  707. PLSA_PROTECT_MEMORY LsaUnprotectMemory;
  708. PLSA_OPEN_TOKEN_BY_LOGON_ID OpenTokenByLogonId;
  709. PLSA_EXPAND_AUTH_DATA_FOR_DOMAIN ExpandAuthDataForDomain;
  710. PLSA_ALLOCATE_PRIVATE_HEAP AllocatePrivateHeap;
  711. PLSA_FREE_PRIVATE_HEAP FreePrivateHeap;
  712. PLSA_CREATE_TOKEN_EX CreateTokenEx;
  713. } LSA_SECPKG_FUNCTION_TABLE, *PLSA_SECPKG_FUNCTION_TABLE;
  714. typedef struct _SECPKG_DLL_FUNCTIONS {
  715. PLSA_ALLOCATE_LSA_HEAP AllocateHeap;
  716. PLSA_FREE_LSA_HEAP FreeHeap;
  717. PLSA_REGISTER_CALLBACK RegisterCallback ;
  718. } SECPKG_DLL_FUNCTIONS, * PSECPKG_DLL_FUNCTIONS;
  719. //
  720. // The following prototypes are to functions that will be called only while
  721. // in the Security Package Manager context.
  722. //
  723. typedef NTSTATUS
  724. (NTAPI SpInitializeFn)(
  725. IN ULONG_PTR PackageId,
  726. IN PSECPKG_PARAMETERS Parameters,
  727. IN PLSA_SECPKG_FUNCTION_TABLE FunctionTable
  728. );
  729. typedef NTSTATUS
  730. (NTAPI SpShutdownFn)(
  731. VOID
  732. );
  733. typedef NTSTATUS
  734. (NTAPI SpGetInfoFn)(
  735. OUT PSecPkgInfo PackageInfo
  736. );
  737. typedef NTSTATUS
  738. (NTAPI SpGetExtendedInformationFn)(
  739. IN SECPKG_EXTENDED_INFORMATION_CLASS Class,
  740. OUT PSECPKG_EXTENDED_INFORMATION * ppInformation
  741. );
  742. typedef NTSTATUS
  743. (NTAPI SpSetExtendedInformationFn)(
  744. IN SECPKG_EXTENDED_INFORMATION_CLASS Class,
  745. IN PSECPKG_EXTENDED_INFORMATION Info
  746. );
  747. typedef NTSTATUS
  748. (LSA_AP_LOGON_USER_EX2) (
  749. IN PLSA_CLIENT_REQUEST ClientRequest,
  750. IN SECURITY_LOGON_TYPE LogonType,
  751. IN PVOID AuthenticationInformation,
  752. IN PVOID ClientAuthenticationBase,
  753. IN ULONG AuthenticationInformationLength,
  754. OUT PVOID *ProfileBuffer,
  755. OUT PULONG ProfileBufferLength,
  756. OUT PLUID LogonId,
  757. OUT PNTSTATUS SubStatus,
  758. OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  759. OUT PVOID *TokenInformation,
  760. OUT PUNICODE_STRING *AccountName,
  761. OUT PUNICODE_STRING *AuthenticatingAuthority,
  762. OUT PUNICODE_STRING *MachineName,
  763. OUT PSECPKG_PRIMARY_CRED PrimaryCredentials,
  764. OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY * CachedCredentials
  765. );
  766. typedef LSA_AP_LOGON_USER_EX2 *PLSA_AP_LOGON_USER_EX2;
  767. #define LSA_AP_NAME_LOGON_USER_EX2 "LsaApLogonUserEx2\0"
  768. typedef NTSTATUS
  769. (NTAPI SpAcceptCredentialsFn)(
  770. IN SECURITY_LOGON_TYPE LogonType,
  771. IN PUNICODE_STRING AccountName,
  772. IN PSECPKG_PRIMARY_CRED PrimaryCredentials,
  773. IN PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials
  774. );
  775. #define SP_ACCEPT_CREDENTIALS_NAME "SpAcceptCredentials\0"
  776. typedef NTSTATUS
  777. (NTAPI SpAcquireCredentialsHandleFn)(
  778. IN OPTIONAL PUNICODE_STRING PrincipalName,
  779. IN ULONG CredentialUseFlags,
  780. IN OPTIONAL PLUID LogonId,
  781. IN PVOID AuthorizationData,
  782. IN PVOID GetKeyFunciton,
  783. IN PVOID GetKeyArgument,
  784. OUT PLSA_SEC_HANDLE CredentialHandle,
  785. OUT PTimeStamp ExpirationTime
  786. );
  787. typedef NTSTATUS
  788. (NTAPI SpFreeCredentialsHandleFn)(
  789. IN LSA_SEC_HANDLE CredentialHandle
  790. );
  791. typedef NTSTATUS
  792. (NTAPI SpQueryCredentialsAttributesFn)(
  793. IN LSA_SEC_HANDLE CredentialHandle,
  794. IN ULONG CredentialAttribute,
  795. IN OUT PVOID Buffer
  796. );
  797. typedef NTSTATUS
  798. (NTAPI SpAddCredentialsFn)(
  799. IN LSA_SEC_HANDLE CredentialHandle,
  800. IN OPTIONAL PUNICODE_STRING PrincipalName,
  801. IN PUNICODE_STRING Package,
  802. IN ULONG CredentialUseFlags,
  803. IN PVOID AuthorizationData,
  804. IN PVOID GetKeyFunciton,
  805. IN PVOID GetKeyArgument,
  806. OUT PTimeStamp ExpirationTime
  807. );
  808. typedef NTSTATUS
  809. (NTAPI SpSaveCredentialsFn)(
  810. IN LSA_SEC_HANDLE CredentialHandle,
  811. IN PSecBuffer Credentials);
  812. typedef NTSTATUS
  813. (NTAPI SpGetCredentialsFn)(
  814. IN LSA_SEC_HANDLE CredentialHandle,
  815. IN OUT PSecBuffer Credentials
  816. );
  817. typedef NTSTATUS
  818. (NTAPI SpDeleteCredentialsFn)(
  819. IN LSA_SEC_HANDLE CredentialHandle,
  820. IN PSecBuffer Key
  821. );
  822. typedef NTSTATUS
  823. (NTAPI SpInitLsaModeContextFn)(
  824. IN OPTIONAL LSA_SEC_HANDLE CredentialHandle,
  825. IN OPTIONAL LSA_SEC_HANDLE ContextHandle,
  826. IN OPTIONAL PUNICODE_STRING TargetName,
  827. IN ULONG ContextRequirements,
  828. IN ULONG TargetDataRep,
  829. IN PSecBufferDesc InputBuffers,
  830. OUT PLSA_SEC_HANDLE NewContextHandle,
  831. IN OUT PSecBufferDesc OutputBuffers,
  832. OUT PULONG ContextAttributes,
  833. OUT PTimeStamp ExpirationTime,
  834. OUT PBOOLEAN MappedContext,
  835. OUT PSecBuffer ContextData
  836. );
  837. typedef NTSTATUS
  838. (NTAPI SpDeleteContextFn)(
  839. IN LSA_SEC_HANDLE ContextHandle
  840. );
  841. typedef NTSTATUS
  842. (NTAPI SpApplyControlTokenFn)(
  843. IN LSA_SEC_HANDLE ContextHandle,
  844. IN PSecBufferDesc ControlToken);
  845. typedef NTSTATUS
  846. (NTAPI SpAcceptLsaModeContextFn)(
  847. IN OPTIONAL LSA_SEC_HANDLE CredentialHandle,
  848. IN OPTIONAL LSA_SEC_HANDLE ContextHandle,
  849. IN PSecBufferDesc InputBuffer,
  850. IN ULONG ContextRequirements,
  851. IN ULONG TargetDataRep,
  852. OUT PLSA_SEC_HANDLE NewContextHandle,
  853. OUT PSecBufferDesc OutputBuffer,
  854. OUT PULONG ContextAttributes,
  855. OUT PTimeStamp ExpirationTime,
  856. OUT PBOOLEAN MappedContext,
  857. OUT PSecBuffer ContextData
  858. );
  859. typedef NTSTATUS
  860. (NTAPI SpGetUserInfoFn)(
  861. IN PLUID LogonId,
  862. IN ULONG Flags,
  863. OUT PSecurityUserData * UserData
  864. );
  865. typedef NTSTATUS
  866. (NTAPI SpQueryContextAttributesFn)(
  867. IN LSA_SEC_HANDLE ContextHandle,
  868. IN ULONG ContextAttribute,
  869. IN OUT PVOID Buffer);
  870. typedef NTSTATUS
  871. (NTAPI SpSetContextAttributesFn)(
  872. IN LSA_SEC_HANDLE ContextHandle,
  873. IN ULONG ContextAttribute,
  874. IN PVOID Buffer,
  875. IN ULONG BufferSize );
  876. typedef struct _SECPKG_FUNCTION_TABLE {
  877. PLSA_AP_INITIALIZE_PACKAGE InitializePackage;
  878. PLSA_AP_LOGON_USER LogonUser;
  879. PLSA_AP_CALL_PACKAGE CallPackage;
  880. PLSA_AP_LOGON_TERMINATED LogonTerminated;
  881. PLSA_AP_CALL_PACKAGE_UNTRUSTED CallPackageUntrusted;
  882. PLSA_AP_CALL_PACKAGE_PASSTHROUGH CallPackagePassthrough;
  883. PLSA_AP_LOGON_USER_EX LogonUserEx;
  884. PLSA_AP_LOGON_USER_EX2 LogonUserEx2;
  885. SpInitializeFn * Initialize;
  886. SpShutdownFn * Shutdown;
  887. SpGetInfoFn * GetInfo;
  888. SpAcceptCredentialsFn * AcceptCredentials;
  889. SpAcquireCredentialsHandleFn * AcquireCredentialsHandle;
  890. SpQueryCredentialsAttributesFn * QueryCredentialsAttributes;
  891. SpFreeCredentialsHandleFn * FreeCredentialsHandle;
  892. SpSaveCredentialsFn * SaveCredentials;
  893. SpGetCredentialsFn * GetCredentials;
  894. SpDeleteCredentialsFn * DeleteCredentials;
  895. SpInitLsaModeContextFn * InitLsaModeContext;
  896. SpAcceptLsaModeContextFn * AcceptLsaModeContext;
  897. SpDeleteContextFn * DeleteContext;
  898. SpApplyControlTokenFn * ApplyControlToken;
  899. SpGetUserInfoFn * GetUserInfo;
  900. SpGetExtendedInformationFn * GetExtendedInformation ;
  901. SpQueryContextAttributesFn * QueryContextAttributes ;
  902. SpAddCredentialsFn * AddCredentials ;
  903. SpSetExtendedInformationFn * SetExtendedInformation ;
  904. SpSetContextAttributesFn * SetContextAttributes ;
  905. } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE;
  906. //
  907. // The following prototypes are to functions that will be called while in the
  908. // context of a user process that is using the functions through the security
  909. // DLL.
  910. //
  911. typedef NTSTATUS
  912. (NTAPI SpInstanceInitFn)(
  913. IN ULONG Version,
  914. IN PSECPKG_DLL_FUNCTIONS FunctionTable,
  915. OUT PVOID * UserFunctions
  916. );
  917. typedef NTSTATUS
  918. (NTAPI SpInitUserModeContextFn)(
  919. IN LSA_SEC_HANDLE ContextHandle,
  920. IN PSecBuffer PackedContext
  921. );
  922. typedef NTSTATUS
  923. (NTAPI SpMakeSignatureFn)(
  924. IN LSA_SEC_HANDLE ContextHandle,
  925. IN ULONG QualityOfProtection,
  926. IN PSecBufferDesc MessageBuffers,
  927. IN ULONG MessageSequenceNumber
  928. );
  929. typedef NTSTATUS
  930. (NTAPI SpVerifySignatureFn)(
  931. IN LSA_SEC_HANDLE ContextHandle,
  932. IN PSecBufferDesc MessageBuffers,
  933. IN ULONG MessageSequenceNumber,
  934. OUT PULONG QualityOfProtection
  935. );
  936. typedef NTSTATUS
  937. (NTAPI SpSealMessageFn)(
  938. IN LSA_SEC_HANDLE ContextHandle,
  939. IN ULONG QualityOfProtection,
  940. IN PSecBufferDesc MessageBuffers,
  941. IN ULONG MessageSequenceNumber
  942. );
  943. typedef NTSTATUS
  944. (NTAPI SpUnsealMessageFn)(
  945. IN LSA_SEC_HANDLE ContextHandle,
  946. IN PSecBufferDesc MessageBuffers,
  947. IN ULONG MessageSequenceNumber,
  948. OUT PULONG QualityOfProtection
  949. );
  950. typedef NTSTATUS
  951. (NTAPI SpGetContextTokenFn)(
  952. IN LSA_SEC_HANDLE ContextHandle,
  953. OUT PHANDLE ImpersonationToken
  954. );
  955. typedef NTSTATUS
  956. (NTAPI SpExportSecurityContextFn)(
  957. LSA_SEC_HANDLE phContext, // (in) context to export
  958. ULONG fFlags, // (in) option flags
  959. PSecBuffer pPackedContext, // (out) marshalled context
  960. PHANDLE pToken // (out, optional) token handle for impersonation
  961. );
  962. typedef NTSTATUS
  963. (NTAPI SpImportSecurityContextFn)(
  964. PSecBuffer pPackedContext, // (in) marshalled context
  965. HANDLE Token, // (in, optional) handle to token for context
  966. PLSA_SEC_HANDLE phContext // (out) new context handle
  967. );
  968. typedef NTSTATUS
  969. (NTAPI SpCompleteAuthTokenFn)(
  970. IN LSA_SEC_HANDLE ContextHandle,
  971. IN PSecBufferDesc InputBuffer
  972. );
  973. typedef NTSTATUS
  974. (NTAPI SpFormatCredentialsFn)(
  975. IN PSecBuffer Credentials,
  976. OUT PSecBuffer FormattedCredentials
  977. );
  978. typedef NTSTATUS
  979. (NTAPI SpMarshallSupplementalCredsFn)(
  980. IN ULONG CredentialSize,
  981. IN PUCHAR Credentials,
  982. OUT PULONG MarshalledCredSize,
  983. OUT PVOID * MarshalledCreds);
  984. typedef struct _SECPKG_USER_FUNCTION_TABLE {
  985. SpInstanceInitFn * InstanceInit;
  986. SpInitUserModeContextFn * InitUserModeContext;
  987. SpMakeSignatureFn * MakeSignature;
  988. SpVerifySignatureFn * VerifySignature;
  989. SpSealMessageFn * SealMessage;
  990. SpUnsealMessageFn * UnsealMessage;
  991. SpGetContextTokenFn * GetContextToken;
  992. SpQueryContextAttributesFn * QueryContextAttributes;
  993. SpCompleteAuthTokenFn * CompleteAuthToken;
  994. SpDeleteContextFn * DeleteUserModeContext;
  995. SpFormatCredentialsFn * FormatCredentials;
  996. SpMarshallSupplementalCredsFn * MarshallSupplementalCreds;
  997. SpExportSecurityContextFn * ExportContext;
  998. SpImportSecurityContextFn * ImportContext;
  999. } SECPKG_USER_FUNCTION_TABLE, *PSECPKG_USER_FUNCTION_TABLE;
  1000. typedef NTSTATUS
  1001. (SEC_ENTRY * SpLsaModeInitializeFn)(
  1002. IN ULONG LsaVersion,
  1003. OUT PULONG PackageVersion,
  1004. OUT PSECPKG_FUNCTION_TABLE * ppTables,
  1005. OUT PULONG pcTables);
  1006. typedef NTSTATUS
  1007. (SEC_ENTRY * SpUserModeInitializeFn)(
  1008. IN ULONG LsaVersion,
  1009. OUT PULONG PackageVersion,
  1010. OUT PSECPKG_USER_FUNCTION_TABLE *ppTables,
  1011. OUT PULONG pcTables
  1012. );
  1013. #define SECPKG_LSAMODEINIT_NAME "SpLsaModeInitialize"
  1014. #define SECPKG_USERMODEINIT_NAME "SpUserModeInitialize"
  1015. //
  1016. // Version of the security package interface.
  1017. //
  1018. // These define are used for all of the following:
  1019. // * Passed by the LSA to SpLsaModeInitializeFn to indicate the version of the LSA.
  1020. // All packages currently expect the LSA to pass SECPKG_INTERFACE_VERSION.
  1021. // * Passed by secur32.dll to SpUserModeInitialzeFn to indicate the version of the secur32 DLL.
  1022. // All packages currently expect secur32 to pass SECPKG_INTERFACE_VERSION.
  1023. // * Returned from SpLsaModeInitializeFn to indicate the version of SECPKG_FUNCTION_TABLE.
  1024. // SECPKG_INTERFACE_VERSION indicates all fields through SetExtendedInformation are defined (potentially to NULL)
  1025. // SECPKG_INTERFACE_VERSION_2 indicates all fields through SetContextAttributes are defined (potentially to NULL)
  1026. // * Returned from SpUserModeInitializeFn to indicate the version of the auth package.
  1027. // All packages currently return SECPKG_INTERFACE_VERSION
  1028. //
  1029. #define SECPKG_INTERFACE_VERSION 0x00010000
  1030. #define SECPKG_INTERFACE_VERSION_2 0x00020000
  1031. typedef enum _KSEC_CONTEXT_TYPE {
  1032. KSecPaged,
  1033. KSecNonPaged
  1034. } KSEC_CONTEXT_TYPE ;
  1035. typedef struct _KSEC_LIST_ENTRY {
  1036. LIST_ENTRY List ;
  1037. LONG RefCount ;
  1038. ULONG Signature ;
  1039. PVOID OwningList ;
  1040. PVOID Reserved ;
  1041. } KSEC_LIST_ENTRY, * PKSEC_LIST_ENTRY ;
  1042. #define KsecInitializeListEntry( Entry, SigValue ) \
  1043. ((PKSEC_LIST_ENTRY) Entry)->List.Flink = ((PKSEC_LIST_ENTRY) Entry)->List.Blink = NULL ; \
  1044. ((PKSEC_LIST_ENTRY) Entry)->RefCount = 1 ; \
  1045. ((PKSEC_LIST_ENTRY) Entry)->Signature = SigValue ; \
  1046. ((PKSEC_LIST_ENTRY) Entry)->OwningList = NULL ; \
  1047. ((PKSEC_LIST_ENTRY) Entry)->Reserved = NULL ;
  1048. typedef PVOID
  1049. (SEC_ENTRY KSEC_CREATE_CONTEXT_LIST)(
  1050. IN KSEC_CONTEXT_TYPE Type
  1051. );
  1052. typedef VOID
  1053. (SEC_ENTRY KSEC_INSERT_LIST_ENTRY)(
  1054. IN PVOID List,
  1055. IN PKSEC_LIST_ENTRY Entry
  1056. );
  1057. typedef NTSTATUS
  1058. (SEC_ENTRY KSEC_REFERENCE_LIST_ENTRY)(
  1059. IN PKSEC_LIST_ENTRY Entry,
  1060. IN ULONG Signature,
  1061. IN BOOLEAN RemoveNoRef
  1062. );
  1063. typedef VOID
  1064. (SEC_ENTRY KSEC_DEREFERENCE_LIST_ENTRY)(
  1065. IN PKSEC_LIST_ENTRY Entry,
  1066. OUT BOOLEAN * Delete OPTIONAL
  1067. );
  1068. typedef NTSTATUS
  1069. (SEC_ENTRY KSEC_SERIALIZE_WINNT_AUTH_DATA)(
  1070. IN PVOID pvAuthData,
  1071. OUT PULONG Size,
  1072. OUT PVOID * SerializedData );
  1073. #ifndef MIDL_PASS
  1074. KSEC_CREATE_CONTEXT_LIST KSecCreateContextList ;
  1075. KSEC_INSERT_LIST_ENTRY KSecInsertListEntry ;
  1076. KSEC_REFERENCE_LIST_ENTRY KSecReferenceListEntry ;
  1077. KSEC_DEREFERENCE_LIST_ENTRY KSecDereferenceListEntry ;
  1078. KSEC_SERIALIZE_WINNT_AUTH_DATA KSecSerializeWinntAuthData ;
  1079. #endif // not valid for MIDL_PASS
  1080. typedef KSEC_CREATE_CONTEXT_LIST * PKSEC_CREATE_CONTEXT_LIST ;
  1081. typedef KSEC_INSERT_LIST_ENTRY * PKSEC_INSERT_LIST_ENTRY ;
  1082. typedef KSEC_REFERENCE_LIST_ENTRY * PKSEC_REFERENCE_LIST_ENTRY ;
  1083. typedef KSEC_DEREFERENCE_LIST_ENTRY * PKSEC_DEREFERENCE_LIST_ENTRY ;
  1084. typedef KSEC_SERIALIZE_WINNT_AUTH_DATA * PKSEC_SERIALIZE_WINNT_AUTH_DATA ;
  1085. typedef struct _SECPKG_KERNEL_FUNCTIONS {
  1086. PLSA_ALLOCATE_LSA_HEAP AllocateHeap;
  1087. PLSA_FREE_LSA_HEAP FreeHeap;
  1088. PKSEC_CREATE_CONTEXT_LIST CreateContextList ;
  1089. PKSEC_INSERT_LIST_ENTRY InsertListEntry ;
  1090. PKSEC_REFERENCE_LIST_ENTRY ReferenceListEntry ;
  1091. PKSEC_DEREFERENCE_LIST_ENTRY DereferenceListEntry ;
  1092. PKSEC_SERIALIZE_WINNT_AUTH_DATA SerializeWinntAuthData ;
  1093. } SECPKG_KERNEL_FUNCTIONS, *PSECPKG_KERNEL_FUNCTIONS;
  1094. typedef NTSTATUS
  1095. (NTAPI KspInitPackageFn)(
  1096. PSECPKG_KERNEL_FUNCTIONS FunctionTable
  1097. );
  1098. typedef NTSTATUS
  1099. (NTAPI KspDeleteContextFn)(
  1100. IN LSA_SEC_HANDLE ContextId,
  1101. OUT PLSA_SEC_HANDLE LsaContextId
  1102. );
  1103. typedef NTSTATUS
  1104. (NTAPI KspInitContextFn)(
  1105. IN LSA_SEC_HANDLE ContextId,
  1106. IN PSecBuffer ContextData,
  1107. OUT PLSA_SEC_HANDLE NewContextId
  1108. );
  1109. typedef NTSTATUS
  1110. (NTAPI KspMakeSignatureFn)(
  1111. IN LSA_SEC_HANDLE ContextId,
  1112. IN ULONG fQOP,
  1113. IN OUT PSecBufferDesc Message,
  1114. IN ULONG MessageSeqNo
  1115. );
  1116. typedef NTSTATUS
  1117. (NTAPI KspVerifySignatureFn)(
  1118. IN LSA_SEC_HANDLE ContextId,
  1119. IN OUT PSecBufferDesc Message,
  1120. IN ULONG MessageSeqNo,
  1121. OUT PULONG pfQOP
  1122. );
  1123. typedef NTSTATUS
  1124. (NTAPI KspSealMessageFn)(
  1125. IN LSA_SEC_HANDLE ContextId,
  1126. IN ULONG fQOP,
  1127. IN OUT PSecBufferDesc Message,
  1128. IN ULONG MessageSeqNo
  1129. );
  1130. typedef NTSTATUS
  1131. (NTAPI KspUnsealMessageFn)(
  1132. IN LSA_SEC_HANDLE ContextId,
  1133. IN OUT PSecBufferDesc Message,
  1134. IN ULONG MessageSeqNo,
  1135. OUT PULONG pfQOP
  1136. );
  1137. typedef NTSTATUS
  1138. (NTAPI KspGetTokenFn)(
  1139. IN LSA_SEC_HANDLE ContextId,
  1140. OUT PHANDLE ImpersonationToken,
  1141. OUT OPTIONAL PACCESS_TOKEN * RawToken
  1142. );
  1143. typedef NTSTATUS
  1144. (NTAPI KspQueryAttributesFn)(
  1145. IN LSA_SEC_HANDLE ContextId,
  1146. IN ULONG Attribute,
  1147. IN OUT PVOID Buffer
  1148. );
  1149. typedef NTSTATUS
  1150. (NTAPI KspCompleteTokenFn)(
  1151. IN LSA_SEC_HANDLE ContextId,
  1152. IN PSecBufferDesc Token
  1153. );
  1154. typedef NTSTATUS
  1155. (NTAPI KspMapHandleFn)(
  1156. IN LSA_SEC_HANDLE ContextId,
  1157. OUT PLSA_SEC_HANDLE LsaContextId
  1158. );
  1159. typedef NTSTATUS
  1160. (NTAPI KspSetPagingModeFn)(
  1161. IN BOOLEAN PagingMode
  1162. );
  1163. typedef NTSTATUS
  1164. (NTAPI KspSerializeAuthDataFn)(
  1165. IN PVOID pvAuthData,
  1166. OUT PULONG Size,
  1167. OUT PVOID * SerializedData
  1168. );
  1169. typedef struct _SECPKG_KERNEL_FUNCTION_TABLE {
  1170. KspInitPackageFn * Initialize;
  1171. KspDeleteContextFn * DeleteContext;
  1172. KspInitContextFn * InitContext;
  1173. KspMapHandleFn * MapHandle;
  1174. KspMakeSignatureFn * Sign;
  1175. KspVerifySignatureFn * Verify;
  1176. KspSealMessageFn * Seal;
  1177. KspUnsealMessageFn * Unseal;
  1178. KspGetTokenFn * GetToken;
  1179. KspQueryAttributesFn * QueryAttributes;
  1180. KspCompleteTokenFn * CompleteToken;
  1181. SpExportSecurityContextFn * ExportContext;
  1182. SpImportSecurityContextFn * ImportContext;
  1183. KspSetPagingModeFn * SetPackagePagingMode ;
  1184. KspSerializeAuthDataFn * SerializeAuthData ;
  1185. } SECPKG_KERNEL_FUNCTION_TABLE, *PSECPKG_KERNEL_FUNCTION_TABLE;
  1186. SECURITY_STATUS
  1187. SEC_ENTRY
  1188. KSecRegisterSecurityProvider(
  1189. PSECURITY_STRING ProviderName,
  1190. PSECPKG_KERNEL_FUNCTION_TABLE Table
  1191. );
  1192. extern SECPKG_KERNEL_FUNCTIONS KspKernelFunctions;
  1193. // end_ntsecpkg
  1194. #endif // __SECPKG_H__