NTSecPkg.h 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892
  1. /*++ BUILD Version: 0000 Increment this if a change has global effects
  2. Copyright (c) Microsoft Corporation. All rights reserved.
  3. Module Name:
  4. ntsecpkg.h
  5. Abstract:
  6. This module defines the structures and APIs for use by a
  7. authentication or security package.
  8. Revision History:
  9. --*/
  10. #ifndef _NTSECPKG_
  11. #define _NTSECPKG_
  12. #ifdef __cplusplus
  13. extern "C" {
  14. #endif
  15. /////////////////////////////////////////////////////////////////////////
  16. // //
  17. // Data types used by authentication packages //
  18. // //
  19. /////////////////////////////////////////////////////////////////////////
  20. //
  21. // opaque data type which represents a client request
  22. //
  23. typedef PVOID *PLSA_CLIENT_REQUEST;
  24. //
  25. // When a logon of a user is requested, the authentication package
  26. // is expected to return one of the following structures indicating
  27. // the contents of a user's token.
  28. //
  29. typedef enum _LSA_TOKEN_INFORMATION_TYPE {
  30. LsaTokenInformationNull, // Implies LSA_TOKEN_INFORMATION_NULL data type
  31. LsaTokenInformationV1, // Implies LSA_TOKEN_INFORMATION_V1 data type
  32. LsaTokenInformationV2 // Implies LSA_TOKEN_INFORMATION_V2 data type
  33. } LSA_TOKEN_INFORMATION_TYPE, *PLSA_TOKEN_INFORMATION_TYPE;
  34. //
  35. // The NULL information is used in cases where a non-authenticated
  36. // system access is needed. For example, a non-authentication network
  37. // circuit (such as LAN Manager's null session) can be given NULL
  38. // information. This will result in an anonymous token being generated
  39. // for the logon that gives the user no ability to access protected system
  40. // resources, but does allow access to non-protected system resources.
  41. //
  42. typedef struct _LSA_TOKEN_INFORMATION_NULL {
  43. //
  44. // Time at which the security context becomes invalid.
  45. // Use a value in the distant future if the context
  46. // never expires.
  47. //
  48. LARGE_INTEGER ExpirationTime;
  49. //
  50. // The SID(s) of groups the user is to be made a member of. This should
  51. // not include WORLD or other system defined and assigned
  52. // SIDs. These will be added automatically by LSA.
  53. //
  54. // Each SID is expected to be in a separately allocated block
  55. // of memory. The TOKEN_GROUPS structure is also expected to
  56. // be in a separately allocated block of memory.
  57. //
  58. PTOKEN_GROUPS Groups;
  59. } LSA_TOKEN_INFORMATION_NULL, *PLSA_TOKEN_INFORMATION_NULL;
  60. //
  61. // The V1 token information structure is superceeded by the V2 token
  62. // information structure. The V1 strucure should only be used for
  63. // backwards compatability.
  64. // This structure contains information that an authentication package
  65. // can place in a Version 1 NT token object.
  66. //
  67. typedef struct _LSA_TOKEN_INFORMATION_V1 {
  68. //
  69. // Time at which the security context becomes invalid.
  70. // Use a value in the distant future if the context
  71. // never expires.
  72. //
  73. LARGE_INTEGER ExpirationTime;
  74. //
  75. // The SID of the user logging on. The SID value is in a
  76. // separately allocated block of memory.
  77. //
  78. TOKEN_USER User;
  79. //
  80. // The SID(s) of groups the user is a member of. This should
  81. // not include WORLD or other system defined and assigned
  82. // SIDs. These will be added automatically by LSA.
  83. //
  84. // Each SID is expected to be in a separately allocated block
  85. // of memory. The TOKEN_GROUPS structure is also expected to
  86. // be in a separately allocated block of memory.
  87. //
  88. PTOKEN_GROUPS Groups;
  89. //
  90. // This field is used to establish the primary group of the user.
  91. // This value does not have to correspond to one of the SIDs
  92. // assigned to the user.
  93. //
  94. // The SID pointed to by this structure is expected to be in
  95. // a separately allocated block of memory.
  96. //
  97. // This field is mandatory and must be filled in.
  98. //
  99. TOKEN_PRIMARY_GROUP PrimaryGroup;
  100. //
  101. // The privileges the user is assigned. This list of privileges
  102. // will be augmented or over-ridden by any local security policy
  103. // assigned privileges.
  104. //
  105. // Each privilege is expected to be in a separately allocated
  106. // block of memory. The TOKEN_PRIVILEGES structure is also
  107. // expected to be in a separately allocated block of memory.
  108. //
  109. // If there are no privileges to assign to the user, this field
  110. // may be set to NULL.
  111. //
  112. PTOKEN_PRIVILEGES Privileges;
  113. //
  114. // This field may be used to establish an explicit default
  115. // owner. Normally, the user ID is used as the default owner.
  116. // If another value is desired, it must be specified here.
  117. //
  118. // The Owner.Sid field may be set to NULL to indicate there is no
  119. // alternate default owner value.
  120. //
  121. TOKEN_OWNER Owner;
  122. //
  123. // This field may be used to establish a default
  124. // protection for the user. If no value is provided, then
  125. // a default protection that grants everyone all access will
  126. // be established.
  127. //
  128. // The DefaultDacl.DefaultDacl field may be set to NULL to indicate
  129. // there is no default protection.
  130. //
  131. TOKEN_DEFAULT_DACL DefaultDacl;
  132. } LSA_TOKEN_INFORMATION_V1, *PLSA_TOKEN_INFORMATION_V1;
  133. //
  134. // The V2 information is used in most cases of logon. The structure is identical
  135. // to the V1 token information structure, with the exception that the memory allocation
  136. // is handled differently. The LSA_TOKEN_INFORMATION_V2 structure is intended to be
  137. // allocated monolithiclly, with the privileges, DACL, sids, and group array either part of
  138. // same allocation, or allocated and freed externally.
  139. //
  140. typedef LSA_TOKEN_INFORMATION_V1 LSA_TOKEN_INFORMATION_V2, *PLSA_TOKEN_INFORMATION_V2;
  141. /////////////////////////////////////////////////////////////////////////
  142. // //
  143. // Interface definitions available for use by authentication packages //
  144. // //
  145. /////////////////////////////////////////////////////////////////////////
  146. typedef NTSTATUS
  147. (NTAPI LSA_CREATE_LOGON_SESSION) (
  148. IN PLUID LogonId
  149. );
  150. typedef NTSTATUS
  151. (NTAPI LSA_DELETE_LOGON_SESSION) (
  152. IN PLUID LogonId
  153. );
  154. typedef NTSTATUS
  155. (NTAPI LSA_ADD_CREDENTIAL) (
  156. IN PLUID LogonId,
  157. IN ULONG AuthenticationPackage,
  158. IN PLSA_STRING PrimaryKeyValue,
  159. IN PLSA_STRING Credentials
  160. );
  161. typedef NTSTATUS
  162. (NTAPI LSA_GET_CREDENTIALS) (
  163. IN PLUID LogonId,
  164. IN ULONG AuthenticationPackage,
  165. IN OUT PULONG QueryContext,
  166. IN BOOLEAN RetrieveAllCredentials,
  167. IN PLSA_STRING PrimaryKeyValue,
  168. OUT PULONG PrimaryKeyLength,
  169. IN PLSA_STRING Credentials
  170. );
  171. typedef NTSTATUS
  172. (NTAPI LSA_DELETE_CREDENTIAL) (
  173. IN PLUID LogonId,
  174. IN ULONG AuthenticationPackage,
  175. IN PLSA_STRING PrimaryKeyValue
  176. );
  177. typedef PVOID
  178. (NTAPI LSA_ALLOCATE_LSA_HEAP) (
  179. IN ULONG Length
  180. );
  181. typedef VOID
  182. (NTAPI LSA_FREE_LSA_HEAP) (
  183. IN PVOID Base
  184. );
  185. typedef PVOID
  186. (NTAPI LSA_ALLOCATE_PRIVATE_HEAP) (
  187. IN SIZE_T Length
  188. );
  189. typedef VOID
  190. (NTAPI LSA_FREE_PRIVATE_HEAP) (
  191. IN PVOID Base
  192. );
  193. typedef NTSTATUS
  194. (NTAPI LSA_ALLOCATE_CLIENT_BUFFER) (
  195. IN PLSA_CLIENT_REQUEST ClientRequest,
  196. IN ULONG LengthRequired,
  197. OUT PVOID *ClientBaseAddress
  198. );
  199. typedef NTSTATUS
  200. (NTAPI LSA_FREE_CLIENT_BUFFER) (
  201. IN PLSA_CLIENT_REQUEST ClientRequest,
  202. IN PVOID ClientBaseAddress
  203. );
  204. typedef NTSTATUS
  205. (NTAPI LSA_COPY_TO_CLIENT_BUFFER) (
  206. IN PLSA_CLIENT_REQUEST ClientRequest,
  207. IN ULONG Length,
  208. IN PVOID ClientBaseAddress,
  209. IN PVOID BufferToCopy
  210. );
  211. typedef NTSTATUS
  212. (NTAPI LSA_COPY_FROM_CLIENT_BUFFER) (
  213. IN PLSA_CLIENT_REQUEST ClientRequest,
  214. IN ULONG Length,
  215. IN PVOID BufferToCopy,
  216. IN PVOID ClientBaseAddress
  217. );
  218. typedef LSA_CREATE_LOGON_SESSION * PLSA_CREATE_LOGON_SESSION ;
  219. typedef LSA_DELETE_LOGON_SESSION * PLSA_DELETE_LOGON_SESSION ;
  220. typedef LSA_ADD_CREDENTIAL * PLSA_ADD_CREDENTIAL ;
  221. typedef LSA_GET_CREDENTIALS * PLSA_GET_CREDENTIALS ;
  222. typedef LSA_DELETE_CREDENTIAL * PLSA_DELETE_CREDENTIAL ;
  223. typedef LSA_ALLOCATE_LSA_HEAP * PLSA_ALLOCATE_LSA_HEAP ;
  224. typedef LSA_FREE_LSA_HEAP * PLSA_FREE_LSA_HEAP ;
  225. typedef LSA_ALLOCATE_PRIVATE_HEAP * PLSA_ALLOCATE_PRIVATE_HEAP ;
  226. typedef LSA_FREE_PRIVATE_HEAP * PLSA_FREE_PRIVATE_HEAP ;
  227. typedef LSA_ALLOCATE_CLIENT_BUFFER * PLSA_ALLOCATE_CLIENT_BUFFER ;
  228. typedef LSA_FREE_CLIENT_BUFFER * PLSA_FREE_CLIENT_BUFFER ;
  229. typedef LSA_COPY_TO_CLIENT_BUFFER * PLSA_COPY_TO_CLIENT_BUFFER ;
  230. typedef LSA_COPY_FROM_CLIENT_BUFFER * PLSA_COPY_FROM_CLIENT_BUFFER ;
  231. //
  232. // The dispatch table of LSA services which are available to
  233. // authentication packages.
  234. //
  235. typedef struct _LSA_DISPATCH_TABLE {
  236. PLSA_CREATE_LOGON_SESSION CreateLogonSession;
  237. PLSA_DELETE_LOGON_SESSION DeleteLogonSession;
  238. PLSA_ADD_CREDENTIAL AddCredential;
  239. PLSA_GET_CREDENTIALS GetCredentials;
  240. PLSA_DELETE_CREDENTIAL DeleteCredential;
  241. PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap;
  242. PLSA_FREE_LSA_HEAP FreeLsaHeap;
  243. PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer;
  244. PLSA_FREE_CLIENT_BUFFER FreeClientBuffer;
  245. PLSA_COPY_TO_CLIENT_BUFFER CopyToClientBuffer;
  246. PLSA_COPY_FROM_CLIENT_BUFFER CopyFromClientBuffer;
  247. } LSA_DISPATCH_TABLE, *PLSA_DISPATCH_TABLE;
  248. ////////////////////////////////////////////////////////////////////////////
  249. // //
  250. // Interface definitions of services provided by authentication packages //
  251. // //
  252. ////////////////////////////////////////////////////////////////////////////
  253. //
  254. // Routine names
  255. //
  256. // The routines provided by the DLL must be assigned the following names
  257. // so that their addresses can be retrieved when the DLL is loaded.
  258. //
  259. #define LSA_AP_NAME_INITIALIZE_PACKAGE "LsaApInitializePackage\0"
  260. #define LSA_AP_NAME_LOGON_USER "LsaApLogonUser\0"
  261. #define LSA_AP_NAME_LOGON_USER_EX "LsaApLogonUserEx\0"
  262. #define LSA_AP_NAME_CALL_PACKAGE "LsaApCallPackage\0"
  263. #define LSA_AP_NAME_LOGON_TERMINATED "LsaApLogonTerminated\0"
  264. #define LSA_AP_NAME_CALL_PACKAGE_UNTRUSTED "LsaApCallPackageUntrusted\0"
  265. #define LSA_AP_NAME_CALL_PACKAGE_PASSTHROUGH "LsaApCallPackagePassthrough\0"
  266. //
  267. // Routine templates
  268. //
  269. typedef NTSTATUS
  270. (NTAPI LSA_AP_INITIALIZE_PACKAGE) (
  271. IN ULONG AuthenticationPackageId,
  272. IN PLSA_DISPATCH_TABLE LsaDispatchTable,
  273. IN PLSA_STRING Database OPTIONAL,
  274. IN PLSA_STRING Confidentiality OPTIONAL,
  275. OUT PLSA_STRING *AuthenticationPackageName
  276. );
  277. typedef NTSTATUS
  278. (NTAPI LSA_AP_LOGON_USER) (
  279. IN PLSA_CLIENT_REQUEST ClientRequest,
  280. IN SECURITY_LOGON_TYPE LogonType,
  281. IN PVOID AuthenticationInformation,
  282. IN PVOID ClientAuthenticationBase,
  283. IN ULONG AuthenticationInformationLength,
  284. OUT PVOID *ProfileBuffer,
  285. OUT PULONG ProfileBufferLength,
  286. OUT PLUID LogonId,
  287. OUT PNTSTATUS SubStatus,
  288. OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  289. OUT PVOID *TokenInformation,
  290. OUT PLSA_UNICODE_STRING *AccountName,
  291. OUT PLSA_UNICODE_STRING *AuthenticatingAuthority
  292. );
  293. typedef NTSTATUS
  294. (NTAPI LSA_AP_LOGON_USER_EX) (
  295. IN PLSA_CLIENT_REQUEST ClientRequest,
  296. IN SECURITY_LOGON_TYPE LogonType,
  297. IN PVOID AuthenticationInformation,
  298. IN PVOID ClientAuthenticationBase,
  299. IN ULONG AuthenticationInformationLength,
  300. OUT PVOID *ProfileBuffer,
  301. OUT PULONG ProfileBufferLength,
  302. OUT PLUID LogonId,
  303. OUT PNTSTATUS SubStatus,
  304. OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  305. OUT PVOID *TokenInformation,
  306. OUT PUNICODE_STRING *AccountName,
  307. OUT PUNICODE_STRING *AuthenticatingAuthority,
  308. OUT PUNICODE_STRING *MachineName
  309. );
  310. typedef NTSTATUS
  311. (NTAPI LSA_AP_CALL_PACKAGE) (
  312. IN PLSA_CLIENT_REQUEST ClientRequest,
  313. IN PVOID ProtocolSubmitBuffer,
  314. IN PVOID ClientBufferBase,
  315. IN ULONG SubmitBufferLength,
  316. OUT PVOID *ProtocolReturnBuffer,
  317. OUT PULONG ReturnBufferLength,
  318. OUT PNTSTATUS ProtocolStatus
  319. );
  320. typedef NTSTATUS
  321. (NTAPI LSA_AP_CALL_PACKAGE_PASSTHROUGH) (
  322. IN PLSA_CLIENT_REQUEST ClientRequest,
  323. IN PVOID ProtocolSubmitBuffer,
  324. IN PVOID ClientBufferBase,
  325. IN ULONG SubmitBufferLength,
  326. OUT PVOID *ProtocolReturnBuffer,
  327. OUT PULONG ReturnBufferLength,
  328. OUT PNTSTATUS ProtocolStatus
  329. );
  330. typedef VOID
  331. (NTAPI LSA_AP_LOGON_TERMINATED) (
  332. IN PLUID LogonId
  333. );
  334. typedef LSA_AP_CALL_PACKAGE LSA_AP_CALL_PACKAGE_UNTRUSTED;
  335. typedef LSA_AP_INITIALIZE_PACKAGE * PLSA_AP_INITIALIZE_PACKAGE ;
  336. typedef LSA_AP_LOGON_USER * PLSA_AP_LOGON_USER ;
  337. typedef LSA_AP_LOGON_USER_EX * PLSA_AP_LOGON_USER_EX ;
  338. typedef LSA_AP_CALL_PACKAGE * PLSA_AP_CALL_PACKAGE ;
  339. typedef LSA_AP_CALL_PACKAGE_PASSTHROUGH * PLSA_AP_CALL_PACKAGE_PASSTHROUGH ;
  340. typedef LSA_AP_LOGON_TERMINATED * PLSA_AP_LOGON_TERMINATED ;
  341. typedef LSA_AP_CALL_PACKAGE_UNTRUSTED * PLSA_AP_CALL_PACKAGE_UNTRUSTED ;
  342. #ifndef _SAM_CREDENTIAL_UPDATE_DEFINED
  343. #define _SAM_CREDENTIAL_UPDATE_DEFINED
  344. typedef NTSTATUS (*PSAM_CREDENTIAL_UPDATE_NOTIFY_ROUTINE) (
  345. IN PUNICODE_STRING ClearPassword,
  346. IN PVOID OldCredentials,
  347. IN ULONG OldCredentialSize,
  348. IN ULONG UserAccountControl,
  349. IN PUNICODE_STRING UPN, OPTIONAL
  350. IN PUNICODE_STRING UserName,
  351. IN PUNICODE_STRING NetbiosDomainName,
  352. IN PUNICODE_STRING DnsDomainName,
  353. OUT PVOID * NewCredentials,
  354. OUT ULONG * NewCredentialSize
  355. );
  356. #define SAM_CREDENTIAL_UPDATE_NOTIFY_ROUTINE "CredentialUpdateNotify"
  357. typedef BOOLEAN (*PSAM_CREDENTIAL_UPDATE_REGISTER_ROUTINE) (
  358. OUT PUNICODE_STRING CredentialName
  359. );
  360. #define SAM_CREDENTIAL_UPDATE_REGISTER_ROUTINE "CredentialUpdateRegister"
  361. typedef VOID (*PSAM_CREDENTIAL_UPDATE_FREE_ROUTINE) (
  362. IN PVOID p
  363. );
  364. #define SAM_CREDENTIAL_UPDATE_FREE_ROUTINE "CredentialUpdateFree"
  365. #endif // _SAM_CREDENTIAL_UPDATE_DEFINED
  366. #ifdef SECURITY_KERNEL
  367. //
  368. // Can't use the windows.h def'ns in kernel mode.
  369. //
  370. typedef PVOID SEC_THREAD_START;
  371. typedef PVOID SEC_ATTRS;
  372. #else
  373. typedef LPTHREAD_START_ROUTINE SEC_THREAD_START;
  374. typedef LPSECURITY_ATTRIBUTES SEC_ATTRS;
  375. #endif
  376. #define SecEqualLuid(L1, L2) \
  377. ( ( ((PLUID)L1)->LowPart == ((PLUID)L2)->LowPart ) && \
  378. ( ((PLUID)L1)->HighPart == ((PLUID)L2)->HighPart ) ) \
  379. #define SecIsZeroLuid( L1 ) \
  380. ( ( L1->LowPart | L1->HighPart ) == 0 )
  381. //
  382. // The following structures are used by the helper functions
  383. //
  384. typedef struct _SECPKG_CLIENT_INFO {
  385. LUID LogonId; // Effective Logon Id
  386. ULONG ProcessID; // Process Id of caller
  387. ULONG ThreadID; // Thread Id of caller
  388. BOOLEAN HasTcbPrivilege; // Client has TCB
  389. BOOLEAN Impersonating; // Client is impersonating
  390. BOOLEAN Restricted; // Client is restricted
  391. //
  392. // NT 5.1
  393. //
  394. UCHAR ClientFlags; // Extra flags about the client
  395. SECURITY_IMPERSONATION_LEVEL ImpersonationLevel; // Impersonation level of client
  396. } SECPKG_CLIENT_INFO, * PSECPKG_CLIENT_INFO;
  397. #define SECPKG_CLIENT_PROCESS_TERMINATED 0x01 // The client process has terminated
  398. #define SECPKG_CLIENT_THREAD_TERMINATED 0x02 // The client thread has terminated
  399. typedef struct _SECPKG_CALL_INFO {
  400. ULONG ProcessId ;
  401. ULONG ThreadId ;
  402. ULONG Attributes ;
  403. ULONG CallCount ;
  404. } SECPKG_CALL_INFO, * PSECPKG_CALL_INFO ;
  405. #define SECPKG_CALL_KERNEL_MODE 0x00000001 // Call originated in kernel mode
  406. #define SECPKG_CALL_ANSI 0x00000002 // Call came from ANSI stub
  407. #define SECPKG_CALL_URGENT 0x00000004 // Call designated urgent
  408. #define SECPKG_CALL_RECURSIVE 0x00000008 // Call is recursing
  409. #define SECPKG_CALL_IN_PROC 0x00000010 // Call originated in process
  410. #define SECPKG_CALL_CLEANUP 0x00000020 // Call is cleanup from a client
  411. #define SECPKG_CALL_WOWCLIENT 0x00000040 // Call is from a WOW client process
  412. #define SECPKG_CALL_THREAD_TERM 0x00000080 // Call is from a thread that has term'd
  413. #define SECPKG_CALL_PROCESS_TERM 0x00000100 // Call is from a process that has term'd
  414. #define SECPKG_CALL_IS_TCB 0x00000200 // Call is from TCB
  415. typedef struct _SECPKG_SUPPLEMENTAL_CRED {
  416. UNICODE_STRING PackageName;
  417. ULONG CredentialSize;
  418. #ifdef MIDL_PASS
  419. [size_is(CredentialSize)]
  420. #endif // MIDL_PASS
  421. PUCHAR Credentials;
  422. } SECPKG_SUPPLEMENTAL_CRED, *PSECPKG_SUPPLEMENTAL_CRED;
  423. typedef ULONG_PTR LSA_SEC_HANDLE ;
  424. typedef LSA_SEC_HANDLE * PLSA_SEC_HANDLE ;
  425. typedef struct _SECPKG_SUPPLEMENTAL_CRED_ARRAY {
  426. ULONG CredentialCount;
  427. #ifdef MIDL_PASS
  428. [size_is(CredentialCount)] SECPKG_SUPPLEMENTAL_CRED Credentials[*];
  429. #else // MIDL_PASS
  430. SECPKG_SUPPLEMENTAL_CRED Credentials[1];
  431. #endif // MIDL_PASS
  432. } SECPKG_SUPPLEMENTAL_CRED_ARRAY, *PSECPKG_SUPPLEMENTAL_CRED_ARRAY;
  433. //
  434. // This flag is used for to indicate which buffers in the LSA are located
  435. // in the client's address space
  436. //
  437. #define SECBUFFER_UNMAPPED 0x40000000
  438. //
  439. // This flag is used to indicate that the buffer was mapped into the LSA
  440. // from kernel mode.
  441. //
  442. #define SECBUFFER_KERNEL_MAP 0x20000000
  443. typedef NTSTATUS
  444. (NTAPI LSA_CALLBACK_FUNCTION)(
  445. ULONG_PTR Argument1,
  446. ULONG_PTR Argument2,
  447. PSecBuffer InputBuffer,
  448. PSecBuffer OutputBuffer
  449. );
  450. typedef LSA_CALLBACK_FUNCTION * PLSA_CALLBACK_FUNCTION ;
  451. #define PRIMARY_CRED_CLEAR_PASSWORD 0x1
  452. #define PRIMARY_CRED_OWF_PASSWORD 0x2
  453. #define PRIMARY_CRED_UPDATE 0x4 // this is a change of existing creds
  454. #define PRIMARY_CRED_CACHED_LOGON 0x8
  455. #define PRIMARY_CRED_LOGON_NO_TCB 0x10
  456. #define PRIMARY_CRED_LOGON_PACKAGE_SHIFT 24
  457. #define PRIMARY_CRED_PACKAGE_MASK 0xff000000
  458. //
  459. // For cached logons, the RPC id of the package doing the logon is identified
  460. // by shifting the flags to the right by the PRIMARY_CRED_LOGON_PACKAGE_SHIFT.
  461. //
  462. typedef struct _SECPKG_PRIMARY_CRED {
  463. LUID LogonId;
  464. UNICODE_STRING DownlevelName; // Sam Account Name
  465. UNICODE_STRING DomainName; // Netbios domain name where account is located
  466. UNICODE_STRING Password;
  467. UNICODE_STRING OldPassword;
  468. PSID UserSid;
  469. ULONG Flags;
  470. UNICODE_STRING DnsDomainName; // DNS domain name where account is located (if known)
  471. UNICODE_STRING Upn; // UPN of account (if known)
  472. UNICODE_STRING LogonServer;
  473. UNICODE_STRING Spare1;
  474. UNICODE_STRING Spare2;
  475. UNICODE_STRING Spare3;
  476. UNICODE_STRING Spare4;
  477. } SECPKG_PRIMARY_CRED, *PSECPKG_PRIMARY_CRED;
  478. //
  479. // Maximum size of stored credentials.
  480. //
  481. #define MAX_CRED_SIZE 1024
  482. // Values for MachineState
  483. #define SECPKG_STATE_ENCRYPTION_PERMITTED 0x01
  484. #define SECPKG_STATE_STRONG_ENCRYPTION_PERMITTED 0x02
  485. #define SECPKG_STATE_DOMAIN_CONTROLLER 0x04
  486. #define SECPKG_STATE_WORKSTATION 0x08
  487. #define SECPKG_STATE_STANDALONE 0x10
  488. typedef struct _SECPKG_PARAMETERS {
  489. ULONG Version;
  490. ULONG MachineState;
  491. ULONG SetupMode;
  492. PSID DomainSid;
  493. UNICODE_STRING DomainName;
  494. UNICODE_STRING DnsDomainName;
  495. GUID DomainGuid;
  496. } SECPKG_PARAMETERS, *PSECPKG_PARAMETERS;
  497. //
  498. // Extended Package information structures
  499. //
  500. typedef enum _SECPKG_EXTENDED_INFORMATION_CLASS {
  501. SecpkgGssInfo = 1,
  502. SecpkgContextThunks,
  503. SecpkgMutualAuthLevel,
  504. SecpkgWowClientDll,
  505. SecpkgExtraOids,
  506. SecpkgMaxInfo
  507. } SECPKG_EXTENDED_INFORMATION_CLASS ;
  508. typedef struct _SECPKG_GSS_INFO {
  509. ULONG EncodedIdLength ;
  510. UCHAR EncodedId[4] ;
  511. } SECPKG_GSS_INFO, * PSECPKG_GSS_INFO ;
  512. typedef struct _SECPKG_CONTEXT_THUNKS {
  513. ULONG InfoLevelCount ;
  514. ULONG Levels[1] ;
  515. } SECPKG_CONTEXT_THUNKS, *PSECPKG_CONTEXT_THUNKS ;
  516. typedef struct _SECPKG_MUTUAL_AUTH_LEVEL {
  517. ULONG MutualAuthLevel ;
  518. } SECPKG_MUTUAL_AUTH_LEVEL, * PSECPKG_MUTUAL_AUTH_LEVEL ;
  519. typedef struct _SECPKG_WOW_CLIENT_DLL {
  520. SECURITY_STRING WowClientDllPath;
  521. } SECPKG_WOW_CLIENT_DLL, * PSECPKG_WOW_CLIENT_DLL ;
  522. #define SECPKG_MAX_OID_LENGTH 32
  523. typedef struct _SECPKG_SERIALIZED_OID {
  524. ULONG OidLength ;
  525. ULONG OidAttributes ;
  526. UCHAR OidValue[ SECPKG_MAX_OID_LENGTH ];
  527. } SECPKG_SERIALIZED_OID, * PSECPKG_SERIALIZED_OID ;
  528. typedef struct _SECPKG_EXTRA_OIDS {
  529. ULONG OidCount ;
  530. SECPKG_SERIALIZED_OID Oids[ 1 ];
  531. } SECPKG_EXTRA_OIDS, * PSECPKG_EXTRA_OIDS;
  532. typedef struct _SECPKG_EXTENDED_INFORMATION {
  533. SECPKG_EXTENDED_INFORMATION_CLASS Class ;
  534. union {
  535. SECPKG_GSS_INFO GssInfo ;
  536. SECPKG_CONTEXT_THUNKS ContextThunks ;
  537. SECPKG_MUTUAL_AUTH_LEVEL MutualAuthLevel ;
  538. SECPKG_WOW_CLIENT_DLL WowClientDll ;
  539. SECPKG_EXTRA_OIDS ExtraOids ;
  540. } Info ;
  541. } SECPKG_EXTENDED_INFORMATION, * PSECPKG_EXTENDED_INFORMATION ;
  542. #define SECPKG_ATTR_SASL_CONTEXT 0x00010000
  543. typedef struct _SecPkgContext_SaslContext {
  544. PVOID SaslContext ;
  545. } SecPkgContext_SaslContext, * PSecPkgContext_SaslContext ;
  546. //
  547. // Setting this value as the first context thunk value will cause all
  548. // calls to go to the LSA:
  549. //
  550. #define SECPKG_ATTR_THUNK_ALL 0x00010000
  551. #ifndef SECURITY_USER_DATA_DEFINED
  552. #define SECURITY_USER_DATA_DEFINED
  553. typedef struct _SECURITY_USER_DATA {
  554. SECURITY_STRING UserName; // User name
  555. SECURITY_STRING LogonDomainName; // Domain the user logged on to
  556. SECURITY_STRING LogonServer; // Server that logged the user on
  557. PSID pSid; // SID of user
  558. } SECURITY_USER_DATA, *PSECURITY_USER_DATA;
  559. typedef SECURITY_USER_DATA SecurityUserData, * PSecurityUserData;
  560. #define UNDERSTANDS_LONG_NAMES 1
  561. #define NO_LONG_NAMES 2
  562. #endif // SECURITY_USER_DATA_DEFINED
  563. //////////////////////////////////////////////////////////////////////////
  564. //
  565. // The following prototypes are to functions that are provided by the SPMgr
  566. // to security packages.
  567. //
  568. //////////////////////////////////////////////////////////////////////////
  569. typedef NTSTATUS
  570. (NTAPI LSA_IMPERSONATE_CLIENT) (
  571. VOID
  572. );
  573. typedef NTSTATUS
  574. (NTAPI LSA_UNLOAD_PACKAGE)(
  575. VOID
  576. );
  577. typedef NTSTATUS
  578. (NTAPI LSA_DUPLICATE_HANDLE)(
  579. IN HANDLE SourceHandle,
  580. OUT PHANDLE DestionationHandle);
  581. typedef NTSTATUS
  582. (NTAPI LSA_SAVE_SUPPLEMENTAL_CREDENTIALS)(
  583. IN PLUID LogonId,
  584. IN ULONG SupplementalCredSize,
  585. IN PVOID SupplementalCreds,
  586. IN BOOLEAN Synchronous
  587. );
  588. typedef HANDLE
  589. (NTAPI LSA_CREATE_THREAD)(
  590. IN SEC_ATTRS SecurityAttributes,
  591. IN ULONG StackSize,
  592. IN SEC_THREAD_START StartFunction,
  593. IN PVOID ThreadParameter,
  594. IN ULONG CreationFlags,
  595. OUT PULONG ThreadId
  596. );
  597. typedef NTSTATUS
  598. (NTAPI LSA_GET_CLIENT_INFO)(
  599. OUT PSECPKG_CLIENT_INFO ClientInfo
  600. );
  601. typedef HANDLE
  602. (NTAPI LSA_REGISTER_NOTIFICATION)(
  603. IN SEC_THREAD_START StartFunction,
  604. IN PVOID Parameter,
  605. IN ULONG NotificationType,
  606. IN ULONG NotificationClass,
  607. IN ULONG NotificationFlags,
  608. IN ULONG IntervalMinutes,
  609. IN OPTIONAL HANDLE WaitEvent
  610. );
  611. typedef NTSTATUS
  612. (NTAPI LSA_CANCEL_NOTIFICATION)(
  613. IN HANDLE NotifyHandle
  614. );
  615. typedef NTSTATUS
  616. (NTAPI LSA_MAP_BUFFER)(
  617. IN PSecBuffer InputBuffer,
  618. OUT PSecBuffer OutputBuffer
  619. );
  620. typedef NTSTATUS
  621. (NTAPI LSA_CREATE_TOKEN) (
  622. IN PLUID LogonId,
  623. IN PTOKEN_SOURCE TokenSource,
  624. IN SECURITY_LOGON_TYPE LogonType,
  625. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  626. IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  627. IN PVOID TokenInformation,
  628. IN PTOKEN_GROUPS TokenGroups,
  629. IN PUNICODE_STRING AccountName,
  630. IN PUNICODE_STRING AuthorityName,
  631. IN PUNICODE_STRING Workstation,
  632. IN PUNICODE_STRING ProfilePath,
  633. OUT PHANDLE Token,
  634. OUT PNTSTATUS SubStatus
  635. );
  636. typedef enum _SECPKG_SESSIONINFO_TYPE {
  637. SecSessionPrimaryCred // SessionInformation is SECPKG_PRIMARY_CRED
  638. } SECPKG_SESSIONINFO_TYPE ;
  639. typedef NTSTATUS
  640. (NTAPI LSA_CREATE_TOKEN_EX) (
  641. IN PLUID LogonId,
  642. IN PTOKEN_SOURCE TokenSource,
  643. IN SECURITY_LOGON_TYPE LogonType,
  644. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  645. IN LSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  646. IN PVOID TokenInformation,
  647. IN PTOKEN_GROUPS TokenGroups,
  648. IN PUNICODE_STRING Workstation,
  649. IN PUNICODE_STRING ProfilePath,
  650. IN PVOID SessionInformation,
  651. IN SECPKG_SESSIONINFO_TYPE SessionInformationType,
  652. OUT PHANDLE Token,
  653. OUT PNTSTATUS SubStatus
  654. );
  655. typedef VOID
  656. (NTAPI LSA_AUDIT_LOGON) (
  657. IN NTSTATUS Status,
  658. IN NTSTATUS SubStatus,
  659. IN PUNICODE_STRING AccountName,
  660. IN PUNICODE_STRING AuthenticatingAuthority,
  661. IN PUNICODE_STRING WorkstationName,
  662. IN OPTIONAL PSID UserSid,
  663. IN SECURITY_LOGON_TYPE LogonType,
  664. IN PTOKEN_SOURCE TokenSource,
  665. IN PLUID LogonId
  666. );
  667. typedef NTSTATUS
  668. (NTAPI LSA_CALL_PACKAGE) (
  669. IN PUNICODE_STRING AuthenticationPackage,
  670. IN PVOID ProtocolSubmitBuffer,
  671. IN ULONG SubmitBufferLength,
  672. OUT PVOID *ProtocolReturnBuffer,
  673. OUT PULONG ReturnBufferLength,
  674. OUT PNTSTATUS ProtocolStatus
  675. );
  676. typedef NTSTATUS
  677. (NTAPI LSA_CALL_PACKAGEEX) (
  678. IN PUNICODE_STRING AuthenticationPackage,
  679. IN PVOID ClientBufferBase,
  680. IN PVOID ProtocolSubmitBuffer,
  681. IN ULONG SubmitBufferLength,
  682. OUT PVOID *ProtocolReturnBuffer,
  683. OUT PULONG ReturnBufferLength,
  684. OUT PNTSTATUS ProtocolStatus
  685. );
  686. typedef NTSTATUS
  687. (NTAPI LSA_CALL_PACKAGE_PASSTHROUGH) (
  688. IN PUNICODE_STRING AuthenticationPackage,
  689. IN PVOID ClientBufferBase,
  690. IN PVOID ProtocolSubmitBuffer,
  691. IN ULONG SubmitBufferLength,
  692. OUT PVOID *ProtocolReturnBuffer,
  693. OUT PULONG ReturnBufferLength,
  694. OUT PNTSTATUS ProtocolStatus
  695. );
  696. typedef BOOLEAN
  697. (NTAPI LSA_GET_CALL_INFO) (
  698. OUT PSECPKG_CALL_INFO Info
  699. );
  700. typedef PVOID
  701. (NTAPI LSA_CREATE_SHARED_MEMORY)(
  702. ULONG MaxSize,
  703. ULONG InitialSize
  704. );
  705. typedef PVOID
  706. (NTAPI LSA_ALLOCATE_SHARED_MEMORY)(
  707. PVOID SharedMem,
  708. ULONG Size
  709. );
  710. typedef VOID
  711. (NTAPI LSA_FREE_SHARED_MEMORY)(
  712. PVOID SharedMem,
  713. PVOID Memory
  714. );
  715. typedef BOOLEAN
  716. (NTAPI LSA_DELETE_SHARED_MEMORY)(
  717. PVOID SharedMem
  718. );
  719. //
  720. // Account Access
  721. //
  722. typedef enum _SECPKG_NAME_TYPE {
  723. SecNameSamCompatible,
  724. SecNameAlternateId,
  725. SecNameFlat,
  726. SecNameDN
  727. } SECPKG_NAME_TYPE ;
  728. typedef NTSTATUS
  729. (NTAPI LSA_OPEN_SAM_USER)(
  730. PSECURITY_STRING Name,
  731. SECPKG_NAME_TYPE NameType,
  732. PSECURITY_STRING Prefix,
  733. BOOLEAN AllowGuest,
  734. ULONG Reserved,
  735. PVOID * UserHandle
  736. );
  737. typedef NTSTATUS
  738. (NTAPI LSA_GET_USER_CREDENTIALS)(
  739. PVOID UserHandle,
  740. PVOID * PrimaryCreds,
  741. PULONG PrimaryCredsSize,
  742. PVOID * SupplementalCreds,
  743. PULONG SupplementalCredsSize
  744. );
  745. typedef NTSTATUS
  746. (NTAPI LSA_GET_USER_AUTH_DATA)(
  747. PVOID UserHandle,
  748. PUCHAR * UserAuthData,
  749. PULONG UserAuthDataSize
  750. );
  751. typedef NTSTATUS
  752. (NTAPI LSA_CLOSE_SAM_USER)(
  753. PVOID UserHandle
  754. );
  755. typedef NTSTATUS
  756. (NTAPI LSA_GET_AUTH_DATA_FOR_USER)(
  757. PSECURITY_STRING Name,
  758. SECPKG_NAME_TYPE NameType,
  759. PSECURITY_STRING Prefix,
  760. PUCHAR * UserAuthData,
  761. PULONG UserAuthDataSize,
  762. PUNICODE_STRING UserFlatName
  763. );
  764. typedef NTSTATUS
  765. (NTAPI LSA_CONVERT_AUTH_DATA_TO_TOKEN)(
  766. IN PVOID UserAuthData,
  767. IN ULONG UserAuthDataSize,
  768. IN SECURITY_IMPERSONATION_LEVEL ImpersonationLevel,
  769. IN PTOKEN_SOURCE TokenSource,
  770. IN SECURITY_LOGON_TYPE LogonType,
  771. IN PUNICODE_STRING AuthorityName,
  772. OUT PHANDLE Token,
  773. OUT PLUID LogonId,
  774. OUT PUNICODE_STRING AccountName,
  775. OUT PNTSTATUS SubStatus
  776. );
  777. typedef NTSTATUS
  778. (NTAPI LSA_CRACK_SINGLE_NAME)(
  779. IN ULONG FormatOffered,
  780. IN BOOLEAN PerformAtGC,
  781. IN PUNICODE_STRING NameInput,
  782. IN PUNICODE_STRING Prefix OPTIONAL,
  783. IN ULONG RequestedFormat,
  784. OUT PUNICODE_STRING CrackedName,
  785. OUT PUNICODE_STRING DnsDomainName,
  786. OUT PULONG SubStatus
  787. );
  788. typedef NTSTATUS
  789. (NTAPI LSA_AUDIT_ACCOUNT_LOGON)(
  790. IN ULONG AuditId,
  791. IN BOOLEAN Success,
  792. IN PUNICODE_STRING Source,
  793. IN PUNICODE_STRING ClientName,
  794. IN PUNICODE_STRING MappedName,
  795. IN NTSTATUS Status
  796. );
  797. typedef NTSTATUS
  798. (NTAPI LSA_CLIENT_CALLBACK)(
  799. PCHAR Callback,
  800. ULONG_PTR Argument1,
  801. ULONG_PTR Argument2,
  802. PSecBuffer Input,
  803. PSecBuffer Output
  804. );
  805. typedef
  806. NTSTATUS
  807. (NTAPI LSA_REGISTER_CALLBACK)(
  808. ULONG CallbackId,
  809. PLSA_CALLBACK_FUNCTION Callback
  810. );
  811. #define NOTIFIER_FLAG_NEW_THREAD 0x00000001
  812. #define NOTIFIER_FLAG_ONE_SHOT 0x00000002
  813. #define NOTIFIER_FLAG_SECONDS 0x80000000
  814. #define NOTIFIER_TYPE_INTERVAL 1
  815. #define NOTIFIER_TYPE_HANDLE_WAIT 2
  816. #define NOTIFIER_TYPE_STATE_CHANGE 3
  817. #define NOTIFIER_TYPE_NOTIFY_EVENT 4
  818. #define NOTIFIER_TYPE_IMMEDIATE 16
  819. #define NOTIFY_CLASS_PACKAGE_CHANGE 1
  820. #define NOTIFY_CLASS_ROLE_CHANGE 2
  821. #define NOTIFY_CLASS_DOMAIN_CHANGE 3
  822. #define NOTIFY_CLASS_REGISTRY_CHANGE 4
  823. typedef struct _SECPKG_EVENT_PACKAGE_CHANGE {
  824. ULONG ChangeType;
  825. LSA_SEC_HANDLE PackageId;
  826. SECURITY_STRING PackageName;
  827. } SECPKG_EVENT_PACKAGE_CHANGE, * PSECPKG_EVENT_PACKAGE_CHANGE ;
  828. #define SECPKG_PACKAGE_CHANGE_LOAD 0
  829. #define SECPKG_PACKAGE_CHANGE_UNLOAD 1
  830. #define SECPKG_PACKAGE_CHANGE_SELECT 2
  831. typedef struct _SECPKG_EVENT_ROLE_CHANGE {
  832. ULONG PreviousRole ;
  833. ULONG NewRole ;
  834. } SECPKG_EVENT_ROLE_CHANGE, * PSECPKG_EVENT_ROLE_CHANGE ;
  835. typedef struct _SECPKG_PARAMETERS SECPKG_EVENT_DOMAIN_CHANGE ;
  836. typedef struct _SECPKG_PARAMETERS * PSECPKG_EVENT_DOMAIN_CHANGE ;
  837. typedef struct _SECPKG_EVENT_NOTIFY {
  838. ULONG EventClass;
  839. ULONG Reserved;
  840. ULONG EventDataSize;
  841. PVOID EventData;
  842. PVOID PackageParameter;
  843. } SECPKG_EVENT_NOTIFY, *PSECPKG_EVENT_NOTIFY ;
  844. typedef
  845. NTSTATUS
  846. (NTAPI LSA_UPDATE_PRIMARY_CREDENTIALS)(
  847. IN PSECPKG_PRIMARY_CRED PrimaryCredentials,
  848. IN OPTIONAL PSECPKG_SUPPLEMENTAL_CRED_ARRAY Credentials
  849. );
  850. typedef
  851. VOID
  852. (NTAPI LSA_PROTECT_MEMORY)(
  853. IN PVOID Buffer,
  854. IN ULONG BufferSize
  855. );
  856. typedef
  857. NTSTATUS
  858. (NTAPI LSA_OPEN_TOKEN_BY_LOGON_ID)(
  859. IN PLUID LogonId,
  860. OUT HANDLE *RetTokenHandle
  861. );
  862. typedef
  863. NTSTATUS
  864. (NTAPI LSA_EXPAND_AUTH_DATA_FOR_DOMAIN)(
  865. IN PUCHAR UserAuthData,
  866. IN ULONG UserAuthDataSize,
  867. IN PVOID Reserved,
  868. OUT PUCHAR * ExpandedAuthData,
  869. OUT PULONG ExpandedAuthDataSize
  870. );
  871. typedef LSA_IMPERSONATE_CLIENT * PLSA_IMPERSONATE_CLIENT;
  872. typedef LSA_UNLOAD_PACKAGE * PLSA_UNLOAD_PACKAGE;
  873. typedef LSA_DUPLICATE_HANDLE * PLSA_DUPLICATE_HANDLE ;
  874. typedef LSA_SAVE_SUPPLEMENTAL_CREDENTIALS * PLSA_SAVE_SUPPLEMENTAL_CREDENTIALS;
  875. typedef LSA_CREATE_THREAD * PLSA_CREATE_THREAD;
  876. typedef LSA_GET_CLIENT_INFO * PLSA_GET_CLIENT_INFO;
  877. typedef LSA_REGISTER_NOTIFICATION * PLSA_REGISTER_NOTIFICATION;
  878. typedef LSA_CANCEL_NOTIFICATION * PLSA_CANCEL_NOTIFICATION;
  879. typedef LSA_MAP_BUFFER * PLSA_MAP_BUFFER;
  880. typedef LSA_CREATE_TOKEN * PLSA_CREATE_TOKEN;
  881. typedef LSA_AUDIT_LOGON * PLSA_AUDIT_LOGON;
  882. typedef LSA_CALL_PACKAGE * PLSA_CALL_PACKAGE;
  883. typedef LSA_CALL_PACKAGEEX * PLSA_CALL_PACKAGEEX;
  884. typedef LSA_GET_CALL_INFO * PLSA_GET_CALL_INFO ;
  885. typedef LSA_CREATE_SHARED_MEMORY * PLSA_CREATE_SHARED_MEMORY ;
  886. typedef LSA_ALLOCATE_SHARED_MEMORY * PLSA_ALLOCATE_SHARED_MEMORY ;
  887. typedef LSA_FREE_SHARED_MEMORY * PLSA_FREE_SHARED_MEMORY ;
  888. typedef LSA_DELETE_SHARED_MEMORY * PLSA_DELETE_SHARED_MEMORY ;
  889. typedef LSA_OPEN_SAM_USER * PLSA_OPEN_SAM_USER ;
  890. typedef LSA_GET_USER_CREDENTIALS * PLSA_GET_USER_CREDENTIALS ;
  891. typedef LSA_GET_USER_AUTH_DATA * PLSA_GET_USER_AUTH_DATA ;
  892. typedef LSA_CLOSE_SAM_USER * PLSA_CLOSE_SAM_USER ;
  893. typedef LSA_CONVERT_AUTH_DATA_TO_TOKEN * PLSA_CONVERT_AUTH_DATA_TO_TOKEN ;
  894. typedef LSA_CLIENT_CALLBACK * PLSA_CLIENT_CALLBACK ;
  895. typedef LSA_REGISTER_CALLBACK * PLSA_REGISTER_CALLBACK ;
  896. typedef LSA_UPDATE_PRIMARY_CREDENTIALS * PLSA_UPDATE_PRIMARY_CREDENTIALS;
  897. typedef LSA_GET_AUTH_DATA_FOR_USER * PLSA_GET_AUTH_DATA_FOR_USER ;
  898. typedef LSA_CRACK_SINGLE_NAME * PLSA_CRACK_SINGLE_NAME ;
  899. typedef LSA_AUDIT_ACCOUNT_LOGON * PLSA_AUDIT_ACCOUNT_LOGON ;
  900. typedef LSA_CALL_PACKAGE_PASSTHROUGH * PLSA_CALL_PACKAGE_PASSTHROUGH;
  901. typedef LSA_PROTECT_MEMORY * PLSA_PROTECT_MEMORY;
  902. typedef LSA_OPEN_TOKEN_BY_LOGON_ID * PLSA_OPEN_TOKEN_BY_LOGON_ID;
  903. typedef LSA_EXPAND_AUTH_DATA_FOR_DOMAIN * PLSA_EXPAND_AUTH_DATA_FOR_DOMAIN;
  904. typedef LSA_CREATE_TOKEN_EX * PLSA_CREATE_TOKEN_EX;
  905. #ifdef _WINCRED_H_
  906. //
  907. // When passing a credential around, the CredentialBlob field is encrypted.
  908. // This structure describes this encrypted form.
  909. //
  910. //
  911. #ifndef _ENCRYPTED_CREDENTIAL_DEFINED
  912. #define _ENCRYPTED_CREDENTIAL_DEFINED
  913. typedef struct _ENCRYPTED_CREDENTIALW {
  914. //
  915. // The credential
  916. //
  917. // The CredentialBlob field points to the encrypted credential
  918. // The CredentialBlobSize field is the length (in bytes) of the encrypted credential
  919. //
  920. CREDENTIALW Cred;
  921. //
  922. // The size in bytes of the clear text credential blob
  923. //
  924. ULONG ClearCredentialBlobSize;
  925. } ENCRYPTED_CREDENTIALW, *PENCRYPTED_CREDENTIALW;
  926. #endif // _ENCRYPTED_CREDENTIAL_DEFINED
  927. //
  928. // Values for CredFlags parameter
  929. //
  930. #define CREDP_FLAGS_IN_PROCESS 0x01 // Caller is in-process. Password data may be returned
  931. #define CREDP_FLAGS_USE_MIDL_HEAP 0x02 // Allocated buffer should use MIDL_user_allocte
  932. #define CREDP_FLAGS_DONT_CACHE_TI 0x04 // TargetInformation shouldn't be cached for CredGetTargetInfo
  933. #define CREDP_FLAGS_CLEAR_PASSWORD 0x08 // Credential blob is passed in in-the-clear
  934. #define CREDP_FLAGS_USER_ENCRYPTED_PASSWORD 0x10 // Credential blob is passed protected by RtlEncryptMemory
  935. typedef NTSTATUS
  936. (NTAPI CredReadFn) (
  937. IN PLUID LogonId,
  938. IN ULONG CredFlags,
  939. IN LPWSTR TargetName,
  940. IN ULONG Type,
  941. IN ULONG Flags,
  942. OUT PENCRYPTED_CREDENTIALW *Credential
  943. );
  944. typedef NTSTATUS
  945. (NTAPI CredReadDomainCredentialsFn) (
  946. IN PLUID LogonId,
  947. IN ULONG CredFlags,
  948. IN PCREDENTIAL_TARGET_INFORMATIONW TargetInfo,
  949. IN ULONG Flags,
  950. OUT PULONG Count,
  951. OUT PENCRYPTED_CREDENTIALW **Credential
  952. );
  953. typedef VOID
  954. (NTAPI CredFreeCredentialsFn) (
  955. IN ULONG Count,
  956. IN PENCRYPTED_CREDENTIALW *Credentials OPTIONAL
  957. );
  958. typedef NTSTATUS
  959. (NTAPI CredWriteFn) (
  960. IN PLUID LogonId,
  961. IN ULONG CredFlags,
  962. IN PENCRYPTED_CREDENTIALW Credential,
  963. IN ULONG Flags
  964. );
  965. NTSTATUS
  966. CredMarshalTargetInfo (
  967. IN PCREDENTIAL_TARGET_INFORMATIONW InTargetInfo,
  968. OUT PUSHORT *Buffer,
  969. OUT PULONG BufferSize
  970. );
  971. NTSTATUS
  972. CredUnmarshalTargetInfo (
  973. IN PUSHORT Buffer,
  974. IN ULONG BufferSize,
  975. OUT PCREDENTIAL_TARGET_INFORMATIONW *RetTargetInfo
  976. );
  977. #endif // _WINCRED_H_
  978. //
  979. // Pure 32-bit versions of credential structures for packages
  980. // running wow64:
  981. //
  982. typedef struct _SEC_WINNT_AUTH_IDENTITY32 {
  983. ULONG User ;
  984. ULONG UserLength ;
  985. ULONG Domain ;
  986. ULONG DomainLength ;
  987. ULONG Password ;
  988. ULONG PasswordLength ;
  989. ULONG Flags ;
  990. } SEC_WINNT_AUTH_IDENTITY32, * PSEC_WINNT_AUTH_IDENTITY32 ;
  991. typedef struct _SEC_WINNT_AUTH_IDENTITY_EX32 {
  992. ULONG Version ;
  993. ULONG Length ;
  994. ULONG User ;
  995. ULONG UserLength ;
  996. ULONG Domain ;
  997. ULONG DomainLength ;
  998. ULONG Password ;
  999. ULONG PasswordLength ;
  1000. ULONG Flags ;
  1001. ULONG PackageList ;
  1002. ULONG PackageListLength ;
  1003. } SEC_WINNT_AUTH_IDENTITY_EX32, * PSEC_WINNT_AUTH_IDENTITY_EX32 ;
  1004. // Functions provided by the SPM to the packages:
  1005. typedef struct _LSA_SECPKG_FUNCTION_TABLE {
  1006. PLSA_CREATE_LOGON_SESSION CreateLogonSession;
  1007. PLSA_DELETE_LOGON_SESSION DeleteLogonSession;
  1008. PLSA_ADD_CREDENTIAL AddCredential;
  1009. PLSA_GET_CREDENTIALS GetCredentials;
  1010. PLSA_DELETE_CREDENTIAL DeleteCredential;
  1011. PLSA_ALLOCATE_LSA_HEAP AllocateLsaHeap;
  1012. PLSA_FREE_LSA_HEAP FreeLsaHeap;
  1013. PLSA_ALLOCATE_CLIENT_BUFFER AllocateClientBuffer;
  1014. PLSA_FREE_CLIENT_BUFFER FreeClientBuffer;
  1015. PLSA_COPY_TO_CLIENT_BUFFER CopyToClientBuffer;
  1016. PLSA_COPY_FROM_CLIENT_BUFFER CopyFromClientBuffer;
  1017. PLSA_IMPERSONATE_CLIENT ImpersonateClient;
  1018. PLSA_UNLOAD_PACKAGE UnloadPackage;
  1019. PLSA_DUPLICATE_HANDLE DuplicateHandle;
  1020. PLSA_SAVE_SUPPLEMENTAL_CREDENTIALS SaveSupplementalCredentials;
  1021. PLSA_CREATE_THREAD CreateThread;
  1022. PLSA_GET_CLIENT_INFO GetClientInfo;
  1023. PLSA_REGISTER_NOTIFICATION RegisterNotification;
  1024. PLSA_CANCEL_NOTIFICATION CancelNotification;
  1025. PLSA_MAP_BUFFER MapBuffer;
  1026. PLSA_CREATE_TOKEN CreateToken;
  1027. PLSA_AUDIT_LOGON AuditLogon;
  1028. PLSA_CALL_PACKAGE CallPackage;
  1029. PLSA_FREE_LSA_HEAP FreeReturnBuffer;
  1030. PLSA_GET_CALL_INFO GetCallInfo;
  1031. PLSA_CALL_PACKAGEEX CallPackageEx;
  1032. PLSA_CREATE_SHARED_MEMORY CreateSharedMemory;
  1033. PLSA_ALLOCATE_SHARED_MEMORY AllocateSharedMemory;
  1034. PLSA_FREE_SHARED_MEMORY FreeSharedMemory;
  1035. PLSA_DELETE_SHARED_MEMORY DeleteSharedMemory;
  1036. PLSA_OPEN_SAM_USER OpenSamUser ;
  1037. PLSA_GET_USER_CREDENTIALS GetUserCredentials ;
  1038. PLSA_GET_USER_AUTH_DATA GetUserAuthData ;
  1039. PLSA_CLOSE_SAM_USER CloseSamUser ;
  1040. PLSA_CONVERT_AUTH_DATA_TO_TOKEN ConvertAuthDataToToken ;
  1041. PLSA_CLIENT_CALLBACK ClientCallback ;
  1042. PLSA_UPDATE_PRIMARY_CREDENTIALS UpdateCredentials ;
  1043. PLSA_GET_AUTH_DATA_FOR_USER GetAuthDataForUser ;
  1044. PLSA_CRACK_SINGLE_NAME CrackSingleName ;
  1045. PLSA_AUDIT_ACCOUNT_LOGON AuditAccountLogon ;
  1046. PLSA_CALL_PACKAGE_PASSTHROUGH CallPackagePassthrough ;
  1047. #ifdef _WINCRED_H_
  1048. CredReadFn *CrediRead;
  1049. CredReadDomainCredentialsFn *CrediReadDomainCredentials;
  1050. CredFreeCredentialsFn *CrediFreeCredentials;
  1051. #else // _WINCRED_H_
  1052. PLSA_PROTECT_MEMORY DummyFunction1;
  1053. PLSA_PROTECT_MEMORY DummyFunction2;
  1054. PLSA_PROTECT_MEMORY DummyFunction3;
  1055. #endif // _WINCRED_H_
  1056. PLSA_PROTECT_MEMORY LsaProtectMemory;
  1057. PLSA_PROTECT_MEMORY LsaUnprotectMemory;
  1058. PLSA_OPEN_TOKEN_BY_LOGON_ID OpenTokenByLogonId;
  1059. PLSA_EXPAND_AUTH_DATA_FOR_DOMAIN ExpandAuthDataForDomain;
  1060. PLSA_ALLOCATE_PRIVATE_HEAP AllocatePrivateHeap;
  1061. PLSA_FREE_PRIVATE_HEAP FreePrivateHeap;
  1062. PLSA_CREATE_TOKEN_EX CreateTokenEx;
  1063. #ifdef _WINCRED_H_
  1064. CredWriteFn *CrediWrite;
  1065. #else // _WINCRED_H_
  1066. PLSA_PROTECT_MEMORY DummyFunction4;
  1067. #endif // _WINCRED_H_
  1068. } LSA_SECPKG_FUNCTION_TABLE, *PLSA_SECPKG_FUNCTION_TABLE;
  1069. typedef struct _SECPKG_DLL_FUNCTIONS {
  1070. PLSA_ALLOCATE_LSA_HEAP AllocateHeap;
  1071. PLSA_FREE_LSA_HEAP FreeHeap;
  1072. PLSA_REGISTER_CALLBACK RegisterCallback ;
  1073. } SECPKG_DLL_FUNCTIONS, * PSECPKG_DLL_FUNCTIONS;
  1074. //
  1075. // The following prototypes are to functions that will be called only while
  1076. // in the Security Package Manager context.
  1077. //
  1078. typedef NTSTATUS
  1079. (NTAPI SpInitializeFn)(
  1080. IN ULONG_PTR PackageId,
  1081. IN PSECPKG_PARAMETERS Parameters,
  1082. IN PLSA_SECPKG_FUNCTION_TABLE FunctionTable
  1083. );
  1084. typedef NTSTATUS
  1085. (NTAPI SpShutdownFn)(
  1086. VOID
  1087. );
  1088. typedef NTSTATUS
  1089. (NTAPI SpGetInfoFn)(
  1090. OUT PSecPkgInfo PackageInfo
  1091. );
  1092. typedef NTSTATUS
  1093. (NTAPI SpGetExtendedInformationFn)(
  1094. IN SECPKG_EXTENDED_INFORMATION_CLASS Class,
  1095. OUT PSECPKG_EXTENDED_INFORMATION * ppInformation
  1096. );
  1097. typedef NTSTATUS
  1098. (NTAPI SpSetExtendedInformationFn)(
  1099. IN SECPKG_EXTENDED_INFORMATION_CLASS Class,
  1100. IN PSECPKG_EXTENDED_INFORMATION Info
  1101. );
  1102. typedef NTSTATUS
  1103. (LSA_AP_LOGON_USER_EX2) (
  1104. IN PLSA_CLIENT_REQUEST ClientRequest,
  1105. IN SECURITY_LOGON_TYPE LogonType,
  1106. IN PVOID AuthenticationInformation,
  1107. IN PVOID ClientAuthenticationBase,
  1108. IN ULONG AuthenticationInformationLength,
  1109. OUT PVOID *ProfileBuffer,
  1110. OUT PULONG ProfileBufferLength,
  1111. OUT PLUID LogonId,
  1112. OUT PNTSTATUS SubStatus,
  1113. OUT PLSA_TOKEN_INFORMATION_TYPE TokenInformationType,
  1114. OUT PVOID *TokenInformation,
  1115. OUT PUNICODE_STRING *AccountName,
  1116. OUT PUNICODE_STRING *AuthenticatingAuthority,
  1117. OUT PUNICODE_STRING *MachineName,
  1118. OUT PSECPKG_PRIMARY_CRED PrimaryCredentials,
  1119. OUT PSECPKG_SUPPLEMENTAL_CRED_ARRAY * CachedCredentials
  1120. );
  1121. typedef LSA_AP_LOGON_USER_EX2 *PLSA_AP_LOGON_USER_EX2;
  1122. #define LSA_AP_NAME_LOGON_USER_EX2 "LsaApLogonUserEx2\0"
  1123. typedef NTSTATUS
  1124. (NTAPI SpAcceptCredentialsFn)(
  1125. IN SECURITY_LOGON_TYPE LogonType,
  1126. IN PUNICODE_STRING AccountName,
  1127. IN PSECPKG_PRIMARY_CRED PrimaryCredentials,
  1128. IN PSECPKG_SUPPLEMENTAL_CRED SupplementalCredentials
  1129. );
  1130. #define SP_ACCEPT_CREDENTIALS_NAME "SpAcceptCredentials\0"
  1131. typedef NTSTATUS
  1132. (NTAPI SpAcquireCredentialsHandleFn)(
  1133. IN OPTIONAL PUNICODE_STRING PrincipalName,
  1134. IN ULONG CredentialUseFlags,
  1135. IN OPTIONAL PLUID LogonId,
  1136. IN PVOID AuthorizationData,
  1137. IN PVOID GetKeyFunciton,
  1138. IN PVOID GetKeyArgument,
  1139. OUT PLSA_SEC_HANDLE CredentialHandle,
  1140. OUT PTimeStamp ExpirationTime
  1141. );
  1142. typedef NTSTATUS
  1143. (NTAPI SpFreeCredentialsHandleFn)(
  1144. IN LSA_SEC_HANDLE CredentialHandle
  1145. );
  1146. typedef NTSTATUS
  1147. (NTAPI SpQueryCredentialsAttributesFn)(
  1148. IN LSA_SEC_HANDLE CredentialHandle,
  1149. IN ULONG CredentialAttribute,
  1150. IN OUT PVOID Buffer
  1151. );
  1152. typedef NTSTATUS
  1153. (NTAPI SpAddCredentialsFn)(
  1154. IN LSA_SEC_HANDLE CredentialHandle,
  1155. IN OPTIONAL PUNICODE_STRING PrincipalName,
  1156. IN PUNICODE_STRING Package,
  1157. IN ULONG CredentialUseFlags,
  1158. IN PVOID AuthorizationData,
  1159. IN PVOID GetKeyFunciton,
  1160. IN PVOID GetKeyArgument,
  1161. OUT PTimeStamp ExpirationTime
  1162. );
  1163. typedef NTSTATUS
  1164. (NTAPI SpSaveCredentialsFn)(
  1165. IN LSA_SEC_HANDLE CredentialHandle,
  1166. IN PSecBuffer Credentials);
  1167. typedef NTSTATUS
  1168. (NTAPI SpGetCredentialsFn)(
  1169. IN LSA_SEC_HANDLE CredentialHandle,
  1170. IN OUT PSecBuffer Credentials
  1171. );
  1172. typedef NTSTATUS
  1173. (NTAPI SpDeleteCredentialsFn)(
  1174. IN LSA_SEC_HANDLE CredentialHandle,
  1175. IN PSecBuffer Key
  1176. );
  1177. typedef NTSTATUS
  1178. (NTAPI SpInitLsaModeContextFn)(
  1179. IN OPTIONAL LSA_SEC_HANDLE CredentialHandle,
  1180. IN OPTIONAL LSA_SEC_HANDLE ContextHandle,
  1181. IN OPTIONAL PUNICODE_STRING TargetName,
  1182. IN ULONG ContextRequirements,
  1183. IN ULONG TargetDataRep,
  1184. IN PSecBufferDesc InputBuffers,
  1185. OUT PLSA_SEC_HANDLE NewContextHandle,
  1186. IN OUT PSecBufferDesc OutputBuffers,
  1187. OUT PULONG ContextAttributes,
  1188. OUT PTimeStamp ExpirationTime,
  1189. OUT PBOOLEAN MappedContext,
  1190. OUT PSecBuffer ContextData
  1191. );
  1192. typedef NTSTATUS
  1193. (NTAPI SpDeleteContextFn)(
  1194. IN LSA_SEC_HANDLE ContextHandle
  1195. );
  1196. typedef NTSTATUS
  1197. (NTAPI SpApplyControlTokenFn)(
  1198. IN LSA_SEC_HANDLE ContextHandle,
  1199. IN PSecBufferDesc ControlToken);
  1200. typedef NTSTATUS
  1201. (NTAPI SpAcceptLsaModeContextFn)(
  1202. IN OPTIONAL LSA_SEC_HANDLE CredentialHandle,
  1203. IN OPTIONAL LSA_SEC_HANDLE ContextHandle,
  1204. IN PSecBufferDesc InputBuffer,
  1205. IN ULONG ContextRequirements,
  1206. IN ULONG TargetDataRep,
  1207. OUT PLSA_SEC_HANDLE NewContextHandle,
  1208. OUT PSecBufferDesc OutputBuffer,
  1209. OUT PULONG ContextAttributes,
  1210. OUT PTimeStamp ExpirationTime,
  1211. OUT PBOOLEAN MappedContext,
  1212. OUT PSecBuffer ContextData
  1213. );
  1214. typedef NTSTATUS
  1215. (NTAPI SpGetUserInfoFn)(
  1216. IN PLUID LogonId,
  1217. IN ULONG Flags,
  1218. OUT PSecurityUserData * UserData
  1219. );
  1220. typedef NTSTATUS
  1221. (NTAPI SpQueryContextAttributesFn)(
  1222. IN LSA_SEC_HANDLE ContextHandle,
  1223. IN ULONG ContextAttribute,
  1224. IN OUT PVOID Buffer);
  1225. typedef NTSTATUS
  1226. (NTAPI SpSetContextAttributesFn)(
  1227. IN LSA_SEC_HANDLE ContextHandle,
  1228. IN ULONG ContextAttribute,
  1229. IN PVOID Buffer,
  1230. IN ULONG BufferSize );
  1231. typedef struct _SECPKG_FUNCTION_TABLE {
  1232. PLSA_AP_INITIALIZE_PACKAGE InitializePackage;
  1233. PLSA_AP_LOGON_USER LogonUser;
  1234. PLSA_AP_CALL_PACKAGE CallPackage;
  1235. PLSA_AP_LOGON_TERMINATED LogonTerminated;
  1236. PLSA_AP_CALL_PACKAGE_UNTRUSTED CallPackageUntrusted;
  1237. PLSA_AP_CALL_PACKAGE_PASSTHROUGH CallPackagePassthrough;
  1238. PLSA_AP_LOGON_USER_EX LogonUserEx;
  1239. PLSA_AP_LOGON_USER_EX2 LogonUserEx2;
  1240. SpInitializeFn * Initialize;
  1241. SpShutdownFn * Shutdown;
  1242. SpGetInfoFn * GetInfo;
  1243. SpAcceptCredentialsFn * AcceptCredentials;
  1244. SpAcquireCredentialsHandleFn * AcquireCredentialsHandle;
  1245. SpQueryCredentialsAttributesFn * QueryCredentialsAttributes;
  1246. SpFreeCredentialsHandleFn * FreeCredentialsHandle;
  1247. SpSaveCredentialsFn * SaveCredentials;
  1248. SpGetCredentialsFn * GetCredentials;
  1249. SpDeleteCredentialsFn * DeleteCredentials;
  1250. SpInitLsaModeContextFn * InitLsaModeContext;
  1251. SpAcceptLsaModeContextFn * AcceptLsaModeContext;
  1252. SpDeleteContextFn * DeleteContext;
  1253. SpApplyControlTokenFn * ApplyControlToken;
  1254. SpGetUserInfoFn * GetUserInfo;
  1255. SpGetExtendedInformationFn * GetExtendedInformation ;
  1256. SpQueryContextAttributesFn * QueryContextAttributes ;
  1257. SpAddCredentialsFn * AddCredentials ;
  1258. SpSetExtendedInformationFn * SetExtendedInformation ;
  1259. SpSetContextAttributesFn * SetContextAttributes ;
  1260. } SECPKG_FUNCTION_TABLE, *PSECPKG_FUNCTION_TABLE;
  1261. //
  1262. // The following prototypes are to functions that will be called while in the
  1263. // context of a user process that is using the functions through the security
  1264. // DLL.
  1265. //
  1266. typedef NTSTATUS
  1267. (NTAPI SpInstanceInitFn)(
  1268. IN ULONG Version,
  1269. IN PSECPKG_DLL_FUNCTIONS FunctionTable,
  1270. OUT PVOID * UserFunctions
  1271. );
  1272. typedef NTSTATUS
  1273. (NTAPI SpInitUserModeContextFn)(
  1274. IN LSA_SEC_HANDLE ContextHandle,
  1275. IN PSecBuffer PackedContext
  1276. );
  1277. typedef NTSTATUS
  1278. (NTAPI SpMakeSignatureFn)(
  1279. IN LSA_SEC_HANDLE ContextHandle,
  1280. IN ULONG QualityOfProtection,
  1281. IN PSecBufferDesc MessageBuffers,
  1282. IN ULONG MessageSequenceNumber
  1283. );
  1284. typedef NTSTATUS
  1285. (NTAPI SpVerifySignatureFn)(
  1286. IN LSA_SEC_HANDLE ContextHandle,
  1287. IN PSecBufferDesc MessageBuffers,
  1288. IN ULONG MessageSequenceNumber,
  1289. OUT PULONG QualityOfProtection
  1290. );
  1291. typedef NTSTATUS
  1292. (NTAPI SpSealMessageFn)(
  1293. IN LSA_SEC_HANDLE ContextHandle,
  1294. IN ULONG QualityOfProtection,
  1295. IN PSecBufferDesc MessageBuffers,
  1296. IN ULONG MessageSequenceNumber
  1297. );
  1298. typedef NTSTATUS
  1299. (NTAPI SpUnsealMessageFn)(
  1300. IN LSA_SEC_HANDLE ContextHandle,
  1301. IN PSecBufferDesc MessageBuffers,
  1302. IN ULONG MessageSequenceNumber,
  1303. OUT PULONG QualityOfProtection
  1304. );
  1305. typedef NTSTATUS
  1306. (NTAPI SpGetContextTokenFn)(
  1307. IN LSA_SEC_HANDLE ContextHandle,
  1308. OUT PHANDLE ImpersonationToken
  1309. );
  1310. typedef NTSTATUS
  1311. (NTAPI SpExportSecurityContextFn)(
  1312. LSA_SEC_HANDLE phContext, // (in) context to export
  1313. ULONG fFlags, // (in) option flags
  1314. PSecBuffer pPackedContext, // (out) marshalled context
  1315. PHANDLE pToken // (out, optional) token handle for impersonation
  1316. );
  1317. typedef NTSTATUS
  1318. (NTAPI SpImportSecurityContextFn)(
  1319. PSecBuffer pPackedContext, // (in) marshalled context
  1320. HANDLE Token, // (in, optional) handle to token for context
  1321. PLSA_SEC_HANDLE phContext // (out) new context handle
  1322. );
  1323. typedef NTSTATUS
  1324. (NTAPI SpCompleteAuthTokenFn)(
  1325. IN LSA_SEC_HANDLE ContextHandle,
  1326. IN PSecBufferDesc InputBuffer
  1327. );
  1328. typedef NTSTATUS
  1329. (NTAPI SpFormatCredentialsFn)(
  1330. IN PSecBuffer Credentials,
  1331. OUT PSecBuffer FormattedCredentials
  1332. );
  1333. typedef NTSTATUS
  1334. (NTAPI SpMarshallSupplementalCredsFn)(
  1335. IN ULONG CredentialSize,
  1336. IN PUCHAR Credentials,
  1337. OUT PULONG MarshalledCredSize,
  1338. OUT PVOID * MarshalledCreds);
  1339. typedef struct _SECPKG_USER_FUNCTION_TABLE {
  1340. SpInstanceInitFn * InstanceInit;
  1341. SpInitUserModeContextFn * InitUserModeContext;
  1342. SpMakeSignatureFn * MakeSignature;
  1343. SpVerifySignatureFn * VerifySignature;
  1344. SpSealMessageFn * SealMessage;
  1345. SpUnsealMessageFn * UnsealMessage;
  1346. SpGetContextTokenFn * GetContextToken;
  1347. SpQueryContextAttributesFn * QueryContextAttributes;
  1348. SpCompleteAuthTokenFn * CompleteAuthToken;
  1349. SpDeleteContextFn * DeleteUserModeContext;
  1350. SpFormatCredentialsFn * FormatCredentials;
  1351. SpMarshallSupplementalCredsFn * MarshallSupplementalCreds;
  1352. SpExportSecurityContextFn * ExportContext;
  1353. SpImportSecurityContextFn * ImportContext;
  1354. } SECPKG_USER_FUNCTION_TABLE, *PSECPKG_USER_FUNCTION_TABLE;
  1355. typedef NTSTATUS
  1356. (SEC_ENTRY * SpLsaModeInitializeFn)(
  1357. IN ULONG LsaVersion,
  1358. OUT PULONG PackageVersion,
  1359. OUT PSECPKG_FUNCTION_TABLE * ppTables,
  1360. OUT PULONG pcTables);
  1361. typedef NTSTATUS
  1362. (SEC_ENTRY * SpUserModeInitializeFn)(
  1363. IN ULONG LsaVersion,
  1364. OUT PULONG PackageVersion,
  1365. OUT PSECPKG_USER_FUNCTION_TABLE *ppTables,
  1366. OUT PULONG pcTables
  1367. );
  1368. #define SECPKG_LSAMODEINIT_NAME "SpLsaModeInitialize"
  1369. #define SECPKG_USERMODEINIT_NAME "SpUserModeInitialize"
  1370. //
  1371. // Version of the security package interface.
  1372. //
  1373. // These define are used for all of the following:
  1374. // * Passed by the LSA to SpLsaModeInitializeFn to indicate the version of the LSA.
  1375. // All packages currently expect the LSA to pass SECPKG_INTERFACE_VERSION.
  1376. // * Passed by secur32.dll to SpUserModeInitialzeFn to indicate the version of the secur32 DLL.
  1377. // All packages currently expect secur32 to pass SECPKG_INTERFACE_VERSION.
  1378. // * Returned from SpLsaModeInitializeFn to indicate the version of SECPKG_FUNCTION_TABLE.
  1379. // SECPKG_INTERFACE_VERSION indicates all fields through SetExtendedInformation are defined (potentially to NULL)
  1380. // SECPKG_INTERFACE_VERSION_2 indicates all fields through SetContextAttributes are defined (potentially to NULL)
  1381. // * Returned from SpUserModeInitializeFn to indicate the version of the auth package.
  1382. // All packages currently return SECPKG_INTERFACE_VERSION
  1383. //
  1384. #define SECPKG_INTERFACE_VERSION 0x00010000
  1385. #define SECPKG_INTERFACE_VERSION_2 0x00020000
  1386. typedef enum _KSEC_CONTEXT_TYPE {
  1387. KSecPaged,
  1388. KSecNonPaged
  1389. } KSEC_CONTEXT_TYPE ;
  1390. typedef struct _KSEC_LIST_ENTRY {
  1391. LIST_ENTRY List ;
  1392. LONG RefCount ;
  1393. ULONG Signature ;
  1394. PVOID OwningList ;
  1395. PVOID Reserved ;
  1396. } KSEC_LIST_ENTRY, * PKSEC_LIST_ENTRY ;
  1397. #define KsecInitializeListEntry( Entry, SigValue ) \
  1398. ((PKSEC_LIST_ENTRY) Entry)->List.Flink = ((PKSEC_LIST_ENTRY) Entry)->List.Blink = NULL ; \
  1399. ((PKSEC_LIST_ENTRY) Entry)->RefCount = 1 ; \
  1400. ((PKSEC_LIST_ENTRY) Entry)->Signature = SigValue ; \
  1401. ((PKSEC_LIST_ENTRY) Entry)->OwningList = NULL ; \
  1402. ((PKSEC_LIST_ENTRY) Entry)->Reserved = NULL ;
  1403. typedef PVOID
  1404. (SEC_ENTRY KSEC_CREATE_CONTEXT_LIST)(
  1405. IN KSEC_CONTEXT_TYPE Type
  1406. );
  1407. typedef VOID
  1408. (SEC_ENTRY KSEC_INSERT_LIST_ENTRY)(
  1409. IN PVOID List,
  1410. IN PKSEC_LIST_ENTRY Entry
  1411. );
  1412. typedef NTSTATUS
  1413. (SEC_ENTRY KSEC_REFERENCE_LIST_ENTRY)(
  1414. IN PKSEC_LIST_ENTRY Entry,
  1415. IN ULONG Signature,
  1416. IN BOOLEAN RemoveNoRef
  1417. );
  1418. typedef VOID
  1419. (SEC_ENTRY KSEC_DEREFERENCE_LIST_ENTRY)(
  1420. IN PKSEC_LIST_ENTRY Entry,
  1421. OUT BOOLEAN * Delete OPTIONAL
  1422. );
  1423. typedef NTSTATUS
  1424. (SEC_ENTRY KSEC_SERIALIZE_WINNT_AUTH_DATA)(
  1425. IN PVOID pvAuthData,
  1426. OUT PULONG Size,
  1427. OUT PVOID * SerializedData );
  1428. #ifndef MIDL_PASS
  1429. KSEC_CREATE_CONTEXT_LIST KSecCreateContextList ;
  1430. KSEC_INSERT_LIST_ENTRY KSecInsertListEntry ;
  1431. KSEC_REFERENCE_LIST_ENTRY KSecReferenceListEntry ;
  1432. KSEC_DEREFERENCE_LIST_ENTRY KSecDereferenceListEntry ;
  1433. KSEC_SERIALIZE_WINNT_AUTH_DATA KSecSerializeWinntAuthData ;
  1434. #endif // not valid for MIDL_PASS
  1435. typedef KSEC_CREATE_CONTEXT_LIST * PKSEC_CREATE_CONTEXT_LIST ;
  1436. typedef KSEC_INSERT_LIST_ENTRY * PKSEC_INSERT_LIST_ENTRY ;
  1437. typedef KSEC_REFERENCE_LIST_ENTRY * PKSEC_REFERENCE_LIST_ENTRY ;
  1438. typedef KSEC_DEREFERENCE_LIST_ENTRY * PKSEC_DEREFERENCE_LIST_ENTRY ;
  1439. typedef KSEC_SERIALIZE_WINNT_AUTH_DATA * PKSEC_SERIALIZE_WINNT_AUTH_DATA ;
  1440. typedef struct _SECPKG_KERNEL_FUNCTIONS {
  1441. PLSA_ALLOCATE_LSA_HEAP AllocateHeap;
  1442. PLSA_FREE_LSA_HEAP FreeHeap;
  1443. PKSEC_CREATE_CONTEXT_LIST CreateContextList ;
  1444. PKSEC_INSERT_LIST_ENTRY InsertListEntry ;
  1445. PKSEC_REFERENCE_LIST_ENTRY ReferenceListEntry ;
  1446. PKSEC_DEREFERENCE_LIST_ENTRY DereferenceListEntry ;
  1447. PKSEC_SERIALIZE_WINNT_AUTH_DATA SerializeWinntAuthData ;
  1448. } SECPKG_KERNEL_FUNCTIONS, *PSECPKG_KERNEL_FUNCTIONS;
  1449. typedef NTSTATUS
  1450. (NTAPI KspInitPackageFn)(
  1451. PSECPKG_KERNEL_FUNCTIONS FunctionTable
  1452. );
  1453. typedef NTSTATUS
  1454. (NTAPI KspDeleteContextFn)(
  1455. IN LSA_SEC_HANDLE ContextId,
  1456. OUT PLSA_SEC_HANDLE LsaContextId
  1457. );
  1458. typedef NTSTATUS
  1459. (NTAPI KspInitContextFn)(
  1460. IN LSA_SEC_HANDLE ContextId,
  1461. IN PSecBuffer ContextData,
  1462. OUT PLSA_SEC_HANDLE NewContextId
  1463. );
  1464. typedef NTSTATUS
  1465. (NTAPI KspMakeSignatureFn)(
  1466. IN LSA_SEC_HANDLE ContextId,
  1467. IN ULONG fQOP,
  1468. IN OUT PSecBufferDesc Message,
  1469. IN ULONG MessageSeqNo
  1470. );
  1471. typedef NTSTATUS
  1472. (NTAPI KspVerifySignatureFn)(
  1473. IN LSA_SEC_HANDLE ContextId,
  1474. IN OUT PSecBufferDesc Message,
  1475. IN ULONG MessageSeqNo,
  1476. OUT PULONG pfQOP
  1477. );
  1478. typedef NTSTATUS
  1479. (NTAPI KspSealMessageFn)(
  1480. IN LSA_SEC_HANDLE ContextId,
  1481. IN ULONG fQOP,
  1482. IN OUT PSecBufferDesc Message,
  1483. IN ULONG MessageSeqNo
  1484. );
  1485. typedef NTSTATUS
  1486. (NTAPI KspUnsealMessageFn)(
  1487. IN LSA_SEC_HANDLE ContextId,
  1488. IN OUT PSecBufferDesc Message,
  1489. IN ULONG MessageSeqNo,
  1490. OUT PULONG pfQOP
  1491. );
  1492. typedef NTSTATUS
  1493. (NTAPI KspGetTokenFn)(
  1494. IN LSA_SEC_HANDLE ContextId,
  1495. OUT PHANDLE ImpersonationToken,
  1496. OUT OPTIONAL PACCESS_TOKEN * RawToken
  1497. );
  1498. typedef NTSTATUS
  1499. (NTAPI KspQueryAttributesFn)(
  1500. IN LSA_SEC_HANDLE ContextId,
  1501. IN ULONG Attribute,
  1502. IN OUT PVOID Buffer
  1503. );
  1504. typedef NTSTATUS
  1505. (NTAPI KspCompleteTokenFn)(
  1506. IN LSA_SEC_HANDLE ContextId,
  1507. IN PSecBufferDesc Token
  1508. );
  1509. typedef NTSTATUS
  1510. (NTAPI KspMapHandleFn)(
  1511. IN LSA_SEC_HANDLE ContextId,
  1512. OUT PLSA_SEC_HANDLE LsaContextId
  1513. );
  1514. typedef NTSTATUS
  1515. (NTAPI KspSetPagingModeFn)(
  1516. IN BOOLEAN PagingMode
  1517. );
  1518. typedef NTSTATUS
  1519. (NTAPI KspSerializeAuthDataFn)(
  1520. IN PVOID pvAuthData,
  1521. OUT PULONG Size,
  1522. OUT PVOID * SerializedData
  1523. );
  1524. typedef struct _SECPKG_KERNEL_FUNCTION_TABLE {
  1525. KspInitPackageFn * Initialize;
  1526. KspDeleteContextFn * DeleteContext;
  1527. KspInitContextFn * InitContext;
  1528. KspMapHandleFn * MapHandle;
  1529. KspMakeSignatureFn * Sign;
  1530. KspVerifySignatureFn * Verify;
  1531. KspSealMessageFn * Seal;
  1532. KspUnsealMessageFn * Unseal;
  1533. KspGetTokenFn * GetToken;
  1534. KspQueryAttributesFn * QueryAttributes;
  1535. KspCompleteTokenFn * CompleteToken;
  1536. SpExportSecurityContextFn * ExportContext;
  1537. SpImportSecurityContextFn * ImportContext;
  1538. KspSetPagingModeFn * SetPackagePagingMode ;
  1539. KspSerializeAuthDataFn * SerializeAuthData ;
  1540. } SECPKG_KERNEL_FUNCTION_TABLE, *PSECPKG_KERNEL_FUNCTION_TABLE;
  1541. SECURITY_STATUS
  1542. SEC_ENTRY
  1543. KSecRegisterSecurityProvider(
  1544. PSECURITY_STRING ProviderName,
  1545. PSECPKG_KERNEL_FUNCTION_TABLE Table
  1546. );
  1547. extern SECPKG_KERNEL_FUNCTIONS KspKernelFunctions;
  1548. #ifdef __cplusplus
  1549. }
  1550. #endif
  1551. #endif /* _NTSECPKG_ */