/Source/Win32/Source/WinCred.pas

https://github.com/Awesomez/MySQL-Front · Pascal · 1139 lines · 613 code · 108 blank · 418 comment · 0 complexity · 4687d5fdf86bcdc198b0551d0cd738ea MD5 · raw file

  1. ////////////////////////////////////////////////////////////////////////////////
  2. //
  3. // Borland Delphi Runtime Library
  4. // Credential Manager API interface unit
  5. //
  6. // Portions created by Microsoft are
  7. // Copyright (c) 2000, Microsoft Corporation
  8. // All Rights Reserved.
  9. //
  10. // The original file is: wincred.h, released 2004-04-15.
  11. // The original Pascal code is: WinCred.pas, released 2004-07-11.
  12. // The initial developer of the Pascal code is: Nico Bendlin <nicode@gmx.net>.
  13. //
  14. // Portions created by Nico Bendlin are
  15. // Copyright (c) 2004 Nico Bendlin.
  16. //
  17. // The contents of this file are used with permission, subject to the Mozilla
  18. // Public License Version 1.1 (the "License"); you may not use this file except
  19. // in compliance with the License. You may obtain a copy of the License at
  20. // http://www.mozilla.org/MPL/MPL-1.1.html
  21. //
  22. // Software distributed under the License is distributed on an "AS IS" basis,
  23. // WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for
  24. // the specific language governing rights and limitations under the License.
  25. //
  26. // Alternatively, the contents of this file may be used under the terms of
  27. // either the GNU General Public License Version 2 or later (the "GPL"), or
  28. // the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
  29. // in which case the provisions of the GPL or the LGPL are applicable instead
  30. // of those above. If you wish to allow use of your version of this file only
  31. // under the terms of either the GPL or the LGPL, and not to allow others to
  32. // use your version of this file under the terms of the MPL, indicate your
  33. // decision by deleting the provisions above and replace them with the notice
  34. // and other provisions required by the GPL or the LGPL. If you do not delete
  35. // the provisions above, a recipient may use your version of this file under
  36. // the terms of any one of the MPL, the GPL or the LGPL.
  37. //
  38. ////////////////////////////////////////////////////////////////////////////////
  39. {.$DEFINE UNICODE}
  40. {$WEAKPACKAGEUNIT}
  41. unit WinCred;
  42. interface
  43. uses
  44. Windows;
  45. {$HPPEMIT '#include <wownt32.h>'}
  46. //FIXME: [NicoDE] missing type declarations in Windows.pas
  47. type
  48. ULONG_PTR = Cardinal;
  49. {$NODEFINE ULONG_PTR}
  50. LPBYTE = Pointer; // PByteArray
  51. {$NODEFINE LPBYTE}
  52. PCSTR = PAnsiChar; // const
  53. {$NODEFINE PCSTR}
  54. PCWSTR = PWideChar; // const
  55. {$NODEFINE PCWSTR}
  56. PWSTR = PWideChar;
  57. {$NODEFINE PWSTR}
  58. PSTR = PAnsiChar;
  59. {$NODEFINE PSTR}
  60. PVOID = Pointer;
  61. {$NODEFINE PVOID}
  62. //FIXME: [NicoDE] doubleref param
  63. type
  64. PPCredentialW = PPointer;
  65. PPCredentialA = PPointer;
  66. //
  67. // Ensure PCtxtHandle is defined
  68. //
  69. type
  70. PSecHandle = ^TSecHandle;
  71. {$EXTERNALSYM PSecHandle}
  72. _SecHandle = record
  73. dwLower: ULONG_PTR;
  74. dwUpper: ULONG_PTR;
  75. end;
  76. {$EXTERNALSYM _SecHandle}
  77. TSecHandle = _SecHandle;
  78. SecHandle = _SecHandle;
  79. {$EXTERNALSYM SecHandle}
  80. type
  81. PCtxtHandle = PSecHandle;
  82. {$EXTERNALSYM PCtxtHandle}
  83. //-----------------------------------------------------------------------------
  84. // Macros
  85. //-----------------------------------------------------------------------------
  86. //
  87. // Macro to determine whether CredUIPromptForCredentials should be called upon a failed
  88. // authentication attempt.
  89. //
  90. // Implemented as a macro so that the caller can delay load credui.dll only if this
  91. // macro returns TRUE.
  92. //
  93. // Include only status codes that imply the username/password are wrong or that the
  94. // password is expired. In the former case, asking for a another username or password
  95. // is appropriate. In the later case, we put up a different dialog asking the
  96. // user to change the password on the server.
  97. //
  98. // Don't include status codes such as ERROR_ACCOUNT_DISABLED, ERROR_ACCOUNT_RESTRICTION,
  99. // ERROR_ACCOUNT_LOCKED_OUT, ERROR_ACCOUNT_EXPIRED, ERROR_LOGON_TYPE_NOT_GRANTED.
  100. // For those, the user isn't going to have another account so prompting him
  101. // won't help.
  102. //
  103. // STATUS_DOWNGRADE_DETECTED is included to handle the case where a corporate laptop
  104. // is brought to another LAN. A downgrade attack will indeed be detected,
  105. // but we want to popup UI to allow the user to connect to resources in the
  106. // other LAN.
  107. //
  108. // Don't use the CREDUIP_* macros directly. Their definition is private to credui.dll.
  109. //
  110. function CredUIPIsUserPasswordError(Status: HRESULT): Boolean;
  111. {$NODEFINE CredUIPIsUserPasswordError}
  112. {$HPPEMIT '#define CredUIPIsUserPasswordError CREDUIP_IS_USER_PASSWORD_ERROR'}
  113. function CredUIPIsDowngradeError(Status: HRESULT): Boolean;
  114. {$NODEFINE CredUIPIsDowngradeError}
  115. {$HPPEMIT '#define CredUIPIsDowngradeError CREDUIP_IS_DOWNGRADE_ERROR'}
  116. function CredUIPIsExpiredError(Status: HRESULT): Boolean;
  117. {$NODEFINE CredUIPIsExpiredError}
  118. {$HPPEMIT '#define CredUIPIsExpiredError CREDUIP_IS_EXPIRED_ERROR'}
  119. function CredUIIsAuthenticationError(Status: HRESULT): Boolean;
  120. {$NODEFINE CredUIIsAuthenticationError}
  121. {$HPPEMIT '#define CredUIIsAuthenticationError CREDUI_IS_AUTHENTICATION_ERROR'}
  122. function CredUINoPromptAuthenticationError(Status: HRESULT): Boolean;
  123. {$NODEFINE CredUINoPromptAuthenticationError}
  124. {$HPPEMIT '#define CredUINoPromptAuthenticationError CREDUI_NO_PROMPT_AUTHENTICATION_ERROR'}
  125. //-----------------------------------------------------------------------------
  126. // Structures
  127. //-----------------------------------------------------------------------------
  128. //
  129. // Credential Attribute
  130. //
  131. // Maximum length of the various credential string fields (in characters)
  132. const
  133. CRED_MAX_STRING_LENGTH = 256;
  134. {$EXTERNALSYM CRED_MAX_STRING_LENGTH}
  135. // Maximum length of the UserName field. The worst case is <User>@<DnsDomain>
  136. const
  137. CRED_MAX_USERNAME_LENGTH = 256 + 1 + 256;
  138. {$EXTERNALSYM CRED_MAX_USERNAME_LENGTH}
  139. // Maximum length of the TargetName field for CRED_TYPE_GENERIC (in characters)
  140. const
  141. CRED_MAX_GENERIC_TARGET_NAME_LENGTH = 32767;
  142. {$EXTERNALSYM CRED_MAX_GENERIC_TARGET_NAME_LENGTH}
  143. // Maximum length of the TargetName field for CRED_TYPE_DOMAIN_* (in characters)
  144. // Largest one is <DfsRoot>\<DfsShare>
  145. const
  146. CRED_MAX_DOMAIN_TARGET_NAME_LENGTH = 256 + 1 + 80;
  147. {$EXTERNALSYM CRED_MAX_DOMAIN_TARGET_NAME_LENGTH}
  148. // Maximum size of the Credential Attribute Value field (in bytes)
  149. const
  150. CRED_MAX_VALUE_SIZE = 256;
  151. {$EXTERNALSYM CRED_MAX_VALUE_SIZE}
  152. // Maximum number of attributes per credential
  153. const
  154. CRED_MAX_ATTRIBUTES = 64;
  155. {$EXTERNALSYM CRED_MAX_ATTRIBUTES}
  156. type
  157. PCredentialAttributeA = ^TCredentialAttributeA;
  158. PCREDENTIAL_ATTRIBUTEA = PCredentialAttributeA;
  159. {$EXTERNALSYM PCREDENTIAL_ATTRIBUTEA}
  160. _CREDENTIAL_ATTRIBUTEA = record
  161. Keyword : LPSTR;
  162. Flags : DWORD;
  163. ValueSize: DWORD;
  164. Value : LPBYTE;
  165. end;
  166. {$EXTERNALSYM _CREDENTIAL_ATTRIBUTEA}
  167. TCredentialAttributeA = _CREDENTIAL_ATTRIBUTEA;
  168. CREDENTIAL_ATTRIBUTEA = _CREDENTIAL_ATTRIBUTEA;
  169. {$EXTERNALSYM CREDENTIAL_ATTRIBUTEA}
  170. PCredentialAttributeW = ^TCredentialAttributeW;
  171. PCREDENTIAL_ATTRIBUTEW = PCredentialAttributeW;
  172. {$EXTERNALSYM PCREDENTIAL_ATTRIBUTEW}
  173. _CREDENTIAL_ATTRIBUTEW = record
  174. Keyword : LPWSTR;
  175. Flags : DWORD;
  176. ValueSize: DWORD; // 0..CRED_MAX_VALUE_SIZE
  177. Value : LPBYTE;
  178. end;
  179. {$EXTERNALSYM _CREDENTIAL_ATTRIBUTEW}
  180. TCredentialAttributeW = _CREDENTIAL_ATTRIBUTEW;
  181. CREDENTIAL_ATTRIBUTEW = _CREDENTIAL_ATTRIBUTEW;
  182. {$EXTERNALSYM CREDENTIAL_ATTRIBUTEA}
  183. {$IFDEF UNICODE}
  184. CREDENTIAL_ATTRIBUTE = _CREDENTIAL_ATTRIBUTEW;
  185. {$EXTERNALSYM CREDENTIAL_ATTRIBUTE}
  186. TCredentialAttribute = _CREDENTIAL_ATTRIBUTEW;
  187. PCREDENTIAL_ATTRIBUTE = PCredentialAttributeW;
  188. {$EXTERNALSYM PCREDENTIAL_ATTRIBUTE}
  189. PCredentialAttribute = PCredentialAttributeW;
  190. {$ELSE}
  191. CREDENTIAL_ATTRIBUTE = _CREDENTIAL_ATTRIBUTEA;
  192. {$EXTERNALSYM CREDENTIAL_ATTRIBUTE}
  193. TCredentialAttribute = _CREDENTIAL_ATTRIBUTEA;
  194. PCREDENTIAL_ATTRIBUTE = PCredentialAttributeA;
  195. {$EXTERNALSYM PCREDENTIAL_ATTRIBUTE}
  196. PCredentialAttribute = PCredentialAttributeA;
  197. {$ENDIF}
  198. //
  199. // Special values of the TargetName field
  200. //
  201. const
  202. CRED_SESSION_WILDCARD_NAME_W = WideString('*Session');
  203. {$EXTERNALSYM CRED_SESSION_WILDCARD_NAME_W}
  204. CRED_SESSION_WILDCARD_NAME_A = AnsiString('*Session');
  205. {$EXTERNALSYM CRED_SESSION_WILDCARD_NAME_A}
  206. CRED_SESSION_WILDCARD_NAME_LENGTH = Length(CRED_SESSION_WILDCARD_NAME_A) - 1;
  207. {$EXTERNALSYM CRED_SESSION_WILDCARD_NAME_LENGTH}
  208. {$IFDEF UNICODE}
  209. CRED_SESSION_WILDCARD_NAME = CRED_SESSION_WILDCARD_NAME_W;
  210. {$EXTERNALSYM CRED_SESSION_WILDCARD_NAME}
  211. {$ELSE}
  212. CRED_SESSION_WILDCARD_NAME = CRED_SESSION_WILDCARD_NAME_A;
  213. {$EXTERNALSYM CRED_SESSION_WILDCARD_NAME}
  214. {$ENDIF}
  215. //
  216. // Values of the Credential Flags field.
  217. //
  218. const
  219. CRED_FLAGS_PASSWORD_FOR_CERT = $0001;
  220. {$EXTERNALSYM CRED_FLAGS_PASSWORD_FOR_CERT}
  221. CRED_FLAGS_PROMPT_NOW = $0002;
  222. {$EXTERNALSYM CRED_FLAGS_PROMPT_NOW}
  223. CRED_FLAGS_USERNAME_TARGET = $0004;
  224. {$EXTERNALSYM CRED_FLAGS_USERNAME_TARGET}
  225. CRED_FLAGS_OWF_CRED_BLOB = $0008;
  226. {$EXTERNALSYM CRED_FLAGS_OWF_CRED_BLOB}
  227. CRED_FLAGS_VALID_FLAGS = $000F; // Mask of all valid flags
  228. {$EXTERNALSYM CRED_FLAGS_VALID_FLAGS}
  229. //
  230. // Values of the Credential Type field.
  231. //
  232. const
  233. CRED_TYPE_GENERIC = 1;
  234. {$EXTERNALSYM CRED_TYPE_GENERIC}
  235. CRED_TYPE_DOMAIN_PASSWORD = 2;
  236. {$EXTERNALSYM CRED_TYPE_DOMAIN_PASSWORD}
  237. CRED_TYPE_DOMAIN_CERTIFICATE = 3;
  238. {$EXTERNALSYM CRED_TYPE_DOMAIN_CERTIFICATE}
  239. CRED_TYPE_DOMAIN_VISIBLE_PASSWORD = 4;
  240. {$EXTERNALSYM CRED_TYPE_DOMAIN_VISIBLE_PASSWORD}
  241. CRED_TYPE_MAXIMUM = 5; // Maximum supported cred type
  242. {$EXTERNALSYM CRED_TYPE_MAXIMUM}
  243. CRED_TYPE_MAXIMUM_EX = CRED_TYPE_MAXIMUM + 1000; // Allow new applications to run on old OSes
  244. {$EXTERNALSYM CRED_TYPE_MAXIMUM_EX}
  245. //
  246. // Maximum size of the CredBlob field (in bytes)
  247. //
  248. const
  249. CRED_MAX_CREDENTIAL_BLOB_SIZE = 512;
  250. {$EXTERNALSYM CRED_MAX_CREDENTIAL_BLOB_SIZE}
  251. //
  252. // Values of the Credential Persist field
  253. //
  254. const
  255. CRED_PERSIST_NONE = 0;
  256. {$EXTERNALSYM CRED_PERSIST_NONE}
  257. CRED_PERSIST_SESSION = 1;
  258. {$EXTERNALSYM CRED_PERSIST_SESSION}
  259. CRED_PERSIST_LOCAL_MACHINE = 2;
  260. {$EXTERNALSYM CRED_PERSIST_LOCAL_MACHINE}
  261. CRED_PERSIST_ENTERPRISE = 3;
  262. {$EXTERNALSYM CRED_PERSIST_ENTERPRISE}
  263. //
  264. // A credential
  265. //
  266. type
  267. PCredentialA = ^TCredentialA;
  268. {$HPPEMIT 'typedef PCREDENTIALA PCredentialA;'}
  269. _CREDENTIALA = record
  270. Flags : DWORD;
  271. Type_ : DWORD;
  272. TargetName : LPSTR;
  273. Comment : LPSTR;
  274. LastWritten : FILETIME;
  275. CredentialBlobSize: DWORD;
  276. CredentialBlob : LPBYTE;
  277. Persist : DWORD;
  278. AttributeCount : DWORD;
  279. Attributes : PCredentialAttributeA;
  280. TargetAlias : LPSTR;
  281. UserName : LPSTR;
  282. end;
  283. {$EXTERNALSYM _CREDENTIALA}
  284. TCredentialA = _CREDENTIALA;
  285. CREDENTIALA = _CREDENTIALA;
  286. {$EXTERNALSYM CREDENTIALA}
  287. PCredentialW = ^TCredentialW;
  288. {$HPPEMIT 'typedef PCREDENTIALW PCredentialW;'}
  289. _CREDENTIALW = record
  290. Flags : DWORD;
  291. Type_ : DWORD;
  292. TargetName : LPWSTR;
  293. Comment : LPWSTR;
  294. LastWritten : FILETIME;
  295. CredentialBlobSize: DWORD; // 0..CRED_MAX_CREDENTIAL_BLOB_SIZE
  296. CredentialBlob : LPBYTE;
  297. Persist : DWORD;
  298. AttributeCount : DWORD;
  299. Attributes : PCredentialAttributeW;
  300. TargetAlias : LPWSTR;
  301. UserName : LPWSTR;
  302. end;
  303. {$EXTERNALSYM _CREDENTIALW}
  304. TCredentialW = _CREDENTIALW;
  305. CREDENTIALW = _CREDENTIALW;
  306. {$EXTERNALSYM CREDENTIALW}
  307. {$IFDEF UNICODE}
  308. CREDENTIAL = _CREDENTIALW;
  309. {$EXTERNALSYM CREDENTIAL}
  310. TCredential = _CREDENTIALW;
  311. PCredential = PCredentialW;
  312. {$HPPEMIT 'typedef PCREDENTIAL PCredentialW'}
  313. {$ELSE}
  314. CREDENTIAL = _CREDENTIALA;
  315. {$EXTERNALSYM CREDENTIAL}
  316. TCredential = _CREDENTIALA;
  317. PCredential = PCredentialA;
  318. {$HPPEMIT 'typedef PCREDENTIAL PCredentialA'}
  319. {$ENDIF}
  320. //
  321. // Value of the Flags field in CREDENTIAL_TARGET_INFORMATION
  322. //
  323. const
  324. CRED_TI_SERVER_FORMAT_UNKNOWN = $0001; // Don't know if server name is DNS or netbios format
  325. {$EXTERNALSYM CRED_TI_SERVER_FORMAT_UNKNOWN}
  326. CRED_TI_DOMAIN_FORMAT_UNKNOWN = $0002; // Don't know if domain name is DNS or netbios format
  327. {$EXTERNALSYM CRED_TI_DOMAIN_FORMAT_UNKNOWN}
  328. CRED_TI_ONLY_PASSWORD_REQUIRED = $0004; // Server only requires a password and not a username
  329. {$EXTERNALSYM CRED_TI_ONLY_PASSWORD_REQUIRED}
  330. CRED_TI_USERNAME_TARGET = $0008; // TargetName is username
  331. {$EXTERNALSYM CRED_TI_USERNAME_TARGET}
  332. CRED_TI_CREATE_EXPLICIT_CRED = $0010; // When creating a cred, create one named TargetInfo->TargetName
  333. {$EXTERNALSYM CRED_TI_CREATE_EXPLICIT_CRED}
  334. CRED_TI_WORKGROUP_MEMBER = $0020; // Indicates the machine is a member of a workgroup
  335. {$EXTERNALSYM CRED_TI_WORKGROUP_MEMBER}
  336. CRED_TI_VALID_FLAGS = $003F;
  337. {$EXTERNALSYM CRED_TI_VALID_FLAGS}
  338. //
  339. // A credential target
  340. //
  341. type
  342. PCredentialTargetInformationA = ^TCredentialTargetInformationA;
  343. PCREDENTIAL_TARGET_INFORMATIONA = PCredentialTargetInformationA;
  344. {$EXTERNALSYM PCREDENTIAL_TARGET_INFORMATIONA}
  345. _CREDENTIAL_TARGET_INFORMATIONA = record
  346. TargetName : LPSTR;
  347. NetbiosServerName: LPSTR;
  348. DnsServerName : LPSTR;
  349. NetbiosDomainName: LPSTR;
  350. DnsDomainName : LPSTR;
  351. DnsTreeName : LPSTR;
  352. PackageName : LPSTR;
  353. Flags : ULONG;
  354. CredTypeCount : DWORD;
  355. CredTypes : LPDWORD;
  356. end;
  357. {$EXTERNALSYM _CREDENTIAL_TARGET_INFORMATIONA}
  358. TCredentialTargetInformationA = _CREDENTIAL_TARGET_INFORMATIONA;
  359. CREDENTIAL_TARGET_INFORMATIONA = _CREDENTIAL_TARGET_INFORMATIONA;
  360. {$EXTERNALSYM CREDENTIAL_TARGET_INFORMATIONA}
  361. PCredentialTargetInformationW = ^TCredentialTargetInformationW;
  362. PCREDENTIAL_TARGET_INFORMATIONW = PCredentialTargetInformationW;
  363. {$EXTERNALSYM PCREDENTIAL_TARGET_INFORMATIONA}
  364. _CREDENTIAL_TARGET_INFORMATIONW = record
  365. TargetName : LPSTR;
  366. NetbiosServerName: LPSTR;
  367. DnsServerName : LPSTR;
  368. NetbiosDomainName: LPSTR;
  369. DnsDomainName : LPSTR;
  370. DnsTreeName : LPSTR;
  371. PackageName : LPSTR;
  372. Flags : ULONG;
  373. CredTypeCount : DWORD; // 0..CRED_TYPE_MAXIMUM_EX
  374. CredTypes : LPDWORD;
  375. end;
  376. {$EXTERNALSYM _CREDENTIAL_TARGET_INFORMATIONW}
  377. TCredentialTargetInformationW = _CREDENTIAL_TARGET_INFORMATIONW;
  378. CREDENTIAL_TARGET_INFORMATIONW = _CREDENTIAL_TARGET_INFORMATIONW;
  379. {$EXTERNALSYM CREDENTIAL_TARGET_INFORMATIONW}
  380. {$IFDEF UNICODE}
  381. CREDENTIAL_TARGET_INFORMATION = _CREDENTIAL_TARGET_INFORMATIONW;
  382. {$EXTERNALSYM CREDENTIAL_TARGET_INFORMATION}
  383. TCredentialTargetInformation = _CREDENTIAL_TARGET_INFORMATIONW;
  384. PCREDENTIAL_TARGET_INFORMATION = PCredentialTargetInformationW;
  385. {$EXTERNALSYM PCREDENTIAL_TARGET_INFORMATION}
  386. PCredentialTargetInformation = PCredentialTargetInformationW;
  387. {$ELSE}
  388. CREDENTIAL_TARGET_INFORMATION = _CREDENTIAL_TARGET_INFORMATIONA;
  389. {$EXTERNALSYM CREDENTIAL_TARGET_INFORMATION}
  390. TCredentialTargetInformation = _CREDENTIAL_TARGET_INFORMATIONA;
  391. PCREDENTIAL_TARGET_INFORMATION = PCredentialTargetInformationA;
  392. {$EXTERNALSYM PCREDENTIAL_TARGET_INFORMATION}
  393. PCredentialTargetInformation = PCredentialTargetInformationA;
  394. {$ENDIF}
  395. //
  396. // Certificate credential information
  397. //
  398. // The cbSize should be the size of the structure, sizeof(CERT_CREDENTIAL_INFO),
  399. // rgbHashofCert is the hash of the cert which is to be used as the credential.
  400. //
  401. const
  402. CERT_HASH_LENGTH = 20; // SHA1 hashes are used for cert hashes
  403. {$EXTERNALSYM CERT_HASH_LENGTH}
  404. type
  405. PCertCredentialInfo = ^TCertCredentialInfo;
  406. PCERT_CREDENTIAL_INFO = PCertCredentialInfo;
  407. {$EXTERNALSYM PCERT_CREDENTIAL_INFO}
  408. _CERT_CREDENTIAL_INFO = record
  409. cbSize : ULONG;
  410. rgbHashOfCert: array [0..CERT_HASH_LENGTH-1] of UCHAR;
  411. end;
  412. {$EXTERNALSYM _CERT_CREDENTIAL_INFO}
  413. TCertCredentialInfo = _CERT_CREDENTIAL_INFO;
  414. CERT_CREDENTIAL_INFO = _CERT_CREDENTIAL_INFO;
  415. {$EXTERNALSYM CERT_CREDENTIAL_INFO}
  416. //
  417. // Username Target credential information
  418. //
  419. // This credential can be pass to LsaLogonUser to ask it to find a credential with a
  420. // TargetName of UserName.
  421. //
  422. type
  423. PUsernameTargetCredentialInfo = ^TUsernameTargetCredentialInfo;
  424. PUSERNAME_TARGET_CREDENTIAL_INFO = PUsernameTargetCredentialInfo;
  425. {$EXTERNALSYM PUSERNAME_TARGET_CREDENTIAL_INFO}
  426. _USERNAME_TARGET_CREDENTIAL_INFO = record
  427. UserName: LPWSTR;
  428. end;
  429. {$EXTERNALSYM _USERNAME_TARGET_CREDENTIAL_INFO}
  430. TUsernameTargetCredentialInfo = _USERNAME_TARGET_CREDENTIAL_INFO;
  431. USERNAME_TARGET_CREDENTIAL_INFO = _USERNAME_TARGET_CREDENTIAL_INFO;
  432. {$EXTERNALSYM USERNAME_TARGET_CREDENTIAL_INFO}
  433. //
  434. // Credential type for credential marshaling routines
  435. //
  436. type
  437. _CRED_MARSHAL_TYPE = Longint; // enum
  438. {$EXTERNALSYM _CRED_MARSHAL_TYPE}
  439. TCredMarshalType = _CRED_MARSHAL_TYPE;
  440. CRED_MARSHAL_TYPE = _CRED_MARSHAL_TYPE;
  441. {$EXTERNALSYM CRED_MARSHAL_TYPE}
  442. PCredMarshalType = ^TCredMarshalType;
  443. PCRED_MARSHAL_TYPE = PCredMarshalType;
  444. {$EXTERNALSYM PCRED_MARSHAL_TYPE}
  445. const
  446. CertCredential = TCredMarshalType(1);
  447. {$EXTERNALSYM CertCredential}
  448. UsernameTargetCredential = TCredMarshalType(CertCredential + 1);
  449. {$EXTERNALSYM UsernameTargetCredential}
  450. //
  451. // Credential UI info
  452. //
  453. type
  454. PCredUIInfoA = ^TCredUIInfoA;
  455. PCREDUI_INFOA = PCredUIInfoA;
  456. {$EXTERNALSYM PCREDUI_INFOA}
  457. _CREDUI_INFOA = record
  458. cbSize : DWORD;
  459. hwndParent : HWND;
  460. pszMessageText: PCSTR;
  461. pszCaptionText: PCSTR;
  462. hbmBanner : HBITMAP;
  463. end;
  464. {$EXTERNALSYM _CREDUI_INFOA}
  465. TCredUIInfoA = _CREDUI_INFOA;
  466. CREDUI_INFOA = _CREDUI_INFOA;
  467. {$EXTERNALSYM CREDUI_INFOA}
  468. PCredUIInfoW = ^TCredUIInfoW;
  469. PCREDUI_INFOW = PCredUIInfoW;
  470. {$EXTERNALSYM PCREDUI_INFOW}
  471. _CREDUI_INFOW = record
  472. cbSize : DWORD;
  473. hwndParent : HWND;
  474. pszMessageText: PCWSTR;
  475. pszCaptionText: PCWSTR;
  476. hbmBanner : HBITMAP;
  477. end;
  478. {$EXTERNALSYM _CREDUI_INFOW}
  479. TCredUIInfoW = _CREDUI_INFOW;
  480. CREDUI_INFOW = _CREDUI_INFOW;
  481. {$EXTERNALSYM CREDUI_INFOW}
  482. {$IFDEF UNICODE}
  483. CREDUI_INFO = _CREDUI_INFOW;
  484. {$EXTERNALSYM CREDUI_INFO}
  485. TCredUIInfo = _CREDUI_INFOW;
  486. PCREDUI_INFO = PCredUIInfoW;
  487. {$EXTERNALSYM PCREDUI_INFO}
  488. PCredUIInfo = PCredUIInfoW;
  489. {$ELSE}
  490. CREDUI_INFO = _CREDUI_INFOA;
  491. {$EXTERNALSYM CREDUI_INFO}
  492. TCredUIInfo = _CREDUI_INFOA;
  493. PCREDUI_INFO = PCredUIInfoA;
  494. {$EXTERNALSYM PCREDUI_INFO}
  495. PCredUIInfo = PCredUIInfoA;
  496. {$ENDIF}
  497. //-----------------------------------------------------------------------------
  498. // Values
  499. //-----------------------------------------------------------------------------
  500. // String length limits:
  501. const
  502. CREDUI_MAX_MESSAGE_LENGTH = 32767;
  503. {$EXTERNALSYM CREDUI_MAX_MESSAGE_LENGTH}
  504. CREDUI_MAX_CAPTION_LENGTH = 128;
  505. {$EXTERNALSYM CREDUI_MAX_CAPTION_LENGTH}
  506. CREDUI_MAX_GENERIC_TARGET_LENGTH = CRED_MAX_GENERIC_TARGET_NAME_LENGTH;
  507. {$EXTERNALSYM CREDUI_MAX_GENERIC_TARGET_LENGTH}
  508. CREDUI_MAX_DOMAIN_TARGET_LENGTH = CRED_MAX_DOMAIN_TARGET_NAME_LENGTH;
  509. {$EXTERNALSYM CREDUI_MAX_DOMAIN_TARGET_LENGTH}
  510. CREDUI_MAX_USERNAME_LENGTH = CRED_MAX_USERNAME_LENGTH;
  511. {$EXTERNALSYM CREDUI_MAX_USERNAME_LENGTH}
  512. CREDUI_MAX_PASSWORD_LENGTH = CRED_MAX_CREDENTIAL_BLOB_SIZE div 2;
  513. {$EXTERNALSYM CREDUI_MAX_PASSWORD_LENGTH}
  514. //
  515. // Flags for CredUIPromptForCredentials and/or CredUICmdLinePromptForCredentials
  516. //
  517. const
  518. CREDUI_FLAGS_INCORRECT_PASSWORD = $00001; // indicates the username is valid, but password is not
  519. {$EXTERNALSYM CREDUI_FLAGS_INCORRECT_PASSWORD}
  520. CREDUI_FLAGS_DO_NOT_PERSIST = $00002; // Do not show "Save" checkbox, and do not persist credentials
  521. {$EXTERNALSYM CREDUI_FLAGS_DO_NOT_PERSIST}
  522. CREDUI_FLAGS_REQUEST_ADMINISTRATOR = $00004; // Populate list box with admin accounts
  523. {$EXTERNALSYM CREDUI_FLAGS_REQUEST_ADMINISTRATOR}
  524. CREDUI_FLAGS_EXCLUDE_CERTIFICATES = $00008; // do not include certificates in the drop list
  525. {$EXTERNALSYM CREDUI_FLAGS_EXCLUDE_CERTIFICATES}
  526. CREDUI_FLAGS_REQUIRE_CERTIFICATE = $00010;
  527. {$EXTERNALSYM CREDUI_FLAGS_REQUIRE_CERTIFICATE}
  528. CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX = $00040;
  529. {$EXTERNALSYM CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX}
  530. CREDUI_FLAGS_ALWAYS_SHOW_UI = $00080;
  531. {$EXTERNALSYM CREDUI_FLAGS_ALWAYS_SHOW_UI}
  532. CREDUI_FLAGS_REQUIRE_SMARTCARD = $00100;
  533. {$EXTERNALSYM CREDUI_FLAGS_REQUIRE_SMARTCARD}
  534. CREDUI_FLAGS_PASSWORD_ONLY_OK = $00200;
  535. {$EXTERNALSYM CREDUI_FLAGS_PASSWORD_ONLY_OK}
  536. CREDUI_FLAGS_VALIDATE_USERNAME = $00400;
  537. {$EXTERNALSYM CREDUI_FLAGS_VALIDATE_USERNAME}
  538. CREDUI_FLAGS_COMPLETE_USERNAME = $00800;
  539. {$EXTERNALSYM CREDUI_FLAGS_COMPLETE_USERNAME}
  540. CREDUI_FLAGS_PERSIST = $01000; // Do not show "Save" checkbox, but persist credentials anyway
  541. {$EXTERNALSYM CREDUI_FLAGS_PERSIST}
  542. CREDUI_FLAGS_SERVER_CREDENTIAL = $04000;
  543. {$EXTERNALSYM CREDUI_FLAGS_SERVER_CREDENTIAL}
  544. CREDUI_FLAGS_EXPECT_CONFIRMATION = $20000; // do not persist unless caller later confirms credential via CredUIConfirmCredential() api
  545. {$EXTERNALSYM CREDUI_FLAGS_EXPECT_CONFIRMATION}
  546. CREDUI_FLAGS_GENERIC_CREDENTIALS = $40000; // Credential is a generic credential
  547. {$EXTERNALSYM CREDUI_FLAGS_GENERIC_CREDENTIALS}
  548. CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS = $80000; // Credential has a username as the target
  549. {$EXTERNALSYM CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS}
  550. CREDUI_FLAGS_KEEP_USERNAME = $100000; // don't allow the user to change the supplied username
  551. {$EXTERNALSYM CREDUI_FLAGS_KEEP_USERNAME}
  552. //
  553. // Mask of flags valid for CredUIPromptForCredentials
  554. //
  555. const
  556. CREDUI_FLAGS_PROMPT_VALID =
  557. CREDUI_FLAGS_INCORRECT_PASSWORD or
  558. CREDUI_FLAGS_DO_NOT_PERSIST or
  559. CREDUI_FLAGS_REQUEST_ADMINISTRATOR or
  560. CREDUI_FLAGS_EXCLUDE_CERTIFICATES or
  561. CREDUI_FLAGS_REQUIRE_CERTIFICATE or
  562. CREDUI_FLAGS_SHOW_SAVE_CHECK_BOX or
  563. CREDUI_FLAGS_ALWAYS_SHOW_UI or
  564. CREDUI_FLAGS_REQUIRE_SMARTCARD or
  565. CREDUI_FLAGS_PASSWORD_ONLY_OK or
  566. CREDUI_FLAGS_VALIDATE_USERNAME or
  567. CREDUI_FLAGS_COMPLETE_USERNAME or
  568. CREDUI_FLAGS_PERSIST or
  569. CREDUI_FLAGS_SERVER_CREDENTIAL or
  570. CREDUI_FLAGS_EXPECT_CONFIRMATION or
  571. CREDUI_FLAGS_GENERIC_CREDENTIALS or
  572. CREDUI_FLAGS_USERNAME_TARGET_CREDENTIALS or
  573. CREDUI_FLAGS_KEEP_USERNAME;
  574. {$EXTERNALSYM CREDUI_FLAGS_PROMPT_VALID}
  575. //-----------------------------------------------------------------------------
  576. // Functions
  577. //-----------------------------------------------------------------------------
  578. //
  579. // Values of flags to CredWrite and CredWriteDomainCredentials
  580. //
  581. const
  582. CRED_PRESERVE_CREDENTIAL_BLOB = $1;
  583. {$EXTERNALSYM CRED_PRESERVE_CREDENTIAL_BLOB}
  584. function CredWriteW(Credential: PCredentialW; Flags: DWORD): BOOL; stdcall;
  585. {$EXTERNALSYM CredWriteW}
  586. function CredWriteA(Credential: PCredentialA; Flags: DWORD): BOOL; stdcall;
  587. {$EXTERNALSYM CredWriteA}
  588. {$IFDEF UNICODE}
  589. function CredWrite(Credential: PCredentialW; Flags: DWORD): BOOL; stdcall;
  590. {$EXTERNALSYM CredWrite}
  591. {$ELSE}
  592. function CredWrite(Credential: PCredentialA; Flags: DWORD): BOOL; stdcall;
  593. {$EXTERNALSYM CredWrite}
  594. {$ENDIF}
  595. function CredReadW(TargetName: LPCWSTR; Type_, Flags: DWORD;
  596. out Credential: PCredentialW): BOOL; stdcall;
  597. {$EXTERNALSYM CredReadW}
  598. function CredReadA(TargetName: LPCSTR; Type_, Flags: DWORD;
  599. out Credential: PCredentialA): BOOL; stdcall;
  600. {$EXTERNALSYM CredReadA}
  601. {$IFDEF UNICODE}
  602. function CredRead(TargetName: LPCWSTR; Type_, Flags: DWORD;
  603. out Credential: PCredentialW): BOOL; stdcall;
  604. {$EXTERNALSYM CredRead}
  605. {$ELSE}
  606. function CredRead(TargetName: LPCSTR; Type_, Flags: DWORD;
  607. out Credential: PCredentialA): BOOL; stdcall;
  608. {$EXTERNALSYM CredRead}
  609. {$ENDIF}
  610. function CredEnumerateW(Filter: LPCWSTR; Flags: DWORD; out Count: DWORD;
  611. out Credential: PPCredentialW): BOOL; stdcall;
  612. {$EXTERNALSYM CredEnumerateW}
  613. function CredEnumerateA(Filter: LPCSTR; Flags: DWORD; out Count: DWORD;
  614. out Credential: PPCredentialA): BOOL; stdcall;
  615. {$EXTERNALSYM CredEnumerateA}
  616. {$IFDEF UNICODE}
  617. function CredEnumerate(Filter: LPCWSTR; Flags: DWORD; out Count: DWORD;
  618. out Credential: PPCredentialW): BOOL; stdcall;
  619. {$EXTERNALSYM CredEnumerate}
  620. {$ELSE}
  621. function CredEnumerate(Filter: LPCSTR; Flags: DWORD; out Count: DWORD;
  622. out Credential: PPCredentialA): BOOL; stdcall;
  623. {$EXTERNALSYM CredEnumerate}
  624. {$ENDIF}
  625. function CredWriteDomainCredentialsW(TargetInfo: PCredentialTargetInformationW;
  626. Credential: PCredentialW; Flags: DWORD): BOOL; stdcall;
  627. {$EXTERNALSYM CredWriteDomainCredentialsW}
  628. function CredWriteDomainCredentialsA(TargetInfo: PCredentialTargetInformationA;
  629. Credential: PCredentialA; Flags: DWORD): BOOL; stdcall;
  630. {$EXTERNALSYM CredWriteDomainCredentialsA}
  631. {$IFDEF UNICODE}
  632. function CredWriteDomainCredentials(TargetInfo: PCredentialTargetInformationW;
  633. Credential: PCredentialW; Flags: DWORD): BOOL; stdcall;
  634. {$EXTERNALSYM CredWriteDomainCredentials}
  635. {$ELSE}
  636. function CredWriteDomainCredentials(TargetInfo: PCredentialTargetInformationA;
  637. Credential: PCredentialA; Flags: DWORD): BOOL; stdcall;
  638. {$EXTERNALSYM CredWriteDomainCredentials}
  639. {$ENDIF}
  640. //
  641. // Values of flags to CredReadDomainCredentials
  642. //
  643. const
  644. CRED_CACHE_TARGET_INFORMATION = $1;
  645. {$EXTERNALSYM CRED_CACHE_TARGET_INFORMATION}
  646. function CredReadDomainCredentialsW(TargetInfo: PCredentialTargetInformationW;
  647. Flags: DWORD; out Count: DWORD; out Credential: PPCredentialW): BOOL; stdcall;
  648. {$EXTERNALSYM CredReadDomainCredentialsW}
  649. function CredReadDomainCredentialsA(TargetInfo: PCredentialTargetInformationA;
  650. Flags: DWORD; out Count: DWORD; out Credential: PPCredentialA): BOOL; stdcall;
  651. {$EXTERNALSYM CredReadDomainCredentialsA}
  652. {$IFDEF UNICODE}
  653. function CredReadDomainCredentials(TargetInfo: PCredentialTargetInformationW;
  654. Flags: DWORD; out Count: DWORD; out Credential: PPCredentialW): BOOL; stdcall;
  655. {$EXTERNALSYM CredReadDomainCredentials}
  656. {$ELSE}
  657. function CredReadDomainCredentials(TargetInfo: PCredentialTargetInformationA;
  658. Flags: DWORD; out Count: DWORD; out Credential: PPCredentialA): BOOL; stdcall;
  659. {$EXTERNALSYM CredReadDomainCredentials}
  660. {$ENDIF}
  661. function CredDeleteW(TargetName: LPCWSTR; Type_, Flags: DWORD): BOOL; stdcall;
  662. {$EXTERNALSYM CredDeleteW}
  663. function CredDeleteA(TargetName: LPCSTR; Type_, Flags: DWORD): BOOL; stdcall;
  664. {$EXTERNALSYM CredDeleteA}
  665. {$IFDEF UNICODE}
  666. function CredDelete(TargetName: LPCWSTR; Type_, Flags: DWORD): BOOL; stdcall;
  667. {$EXTERNALSYM CredDelete}
  668. {$ELSE}
  669. function CredDelete(TargetName: LPCSTR; Type_, Flags: DWORD): BOOL; stdcall;
  670. {$EXTERNALSYM CredDelete}
  671. {$ENDIF}
  672. function CredRenameW(OldTargetName, NewTargetName: LPCWSTR;
  673. Type_, Flags: DWORD): BOOL; stdcall;
  674. {$EXTERNALSYM CredRenameW}
  675. function CredRenameA(OldTargetName, NewTargetName: LPCSTR;
  676. Type_, Flags: DWORD): BOOL; stdcall;
  677. {$EXTERNALSYM CredRenameA}
  678. {$IFDEF UNICODE}
  679. function CredRename(OldTargetName, NewTargetName: LPCWSTR;
  680. Type_, Flags: DWORD): BOOL; stdcall;
  681. {$EXTERNALSYM CredRename}
  682. {$ELSE}
  683. function CredRename(OldTargetName, NewTargetName: LPCSTR;
  684. Type_, Flags: DWORD): BOOL; stdcall;
  685. {$EXTERNALSYM CredRename}
  686. {$ENDIF}
  687. //
  688. // Values of flags to CredGetTargetInfo
  689. //
  690. const
  691. CRED_ALLOW_NAME_RESOLUTION = $1;
  692. {$EXTERNALSYM CRED_ALLOW_NAME_RESOLUTION}
  693. function CredGetTargetInfoW(TargetName: LPCWSTR; Flags: DWORD;
  694. out TargetInfo: PCredentialTargetInformationW): BOOL; stdcall;
  695. {$EXTERNALSYM CredGetTargetInfoW}
  696. function CredGetTargetInfoA(TargetName: LPCSTR; Flags: DWORD;
  697. out TargetInfo: PCredentialTargetInformationA): BOOL; stdcall;
  698. {$EXTERNALSYM CredGetTargetInfoA}
  699. {$IFDEF UNICODE}
  700. function CredGetTargetInfo(TargetName: LPCWSTR; Flags: DWORD;
  701. out TargetInfo: PCredentialTargetInformationW): BOOL; stdcall;
  702. {$EXTERNALSYM CredGetTargetInfo}
  703. {$ELSE}
  704. function CredGetTargetInfo(TargetName: LPCSTR; Flags: DWORD;
  705. out TargetInfo: PCredentialTargetInformationA): BOOL; stdcall;
  706. {$EXTERNALSYM CredGetTargetInfo}
  707. {$ENDIF}
  708. function CredMarshalCredentialW(CredType: TCredMarshalType; Credential: PVOID;
  709. out MarshaledCredential: LPWSTR): BOOL; stdcall;
  710. {$EXTERNALSYM CredMarshalCredentialW}
  711. function CredMarshalCredentialA(CredType: TCredMarshalType; Credential: PVOID;
  712. out MarshaledCredential: LPSTR): BOOL; stdcall;
  713. {$EXTERNALSYM CredMarshalCredentialA}
  714. {$IFDEF UNICODE}
  715. function CredMarshalCredential(CredType: TCredMarshalType; Credential: PVOID;
  716. out MarshaledCredential: LPWSTR): BOOL; stdcall;
  717. {$EXTERNALSYM CredMarshalCredential}
  718. {$ELSE}
  719. function CredMarshalCredential(CredType: TCredMarshalType; Credential: PVOID;
  720. out MarshaledCredential: LPSTR): BOOL; stdcall;
  721. {$EXTERNALSYM CredMarshalCredential}
  722. {$ENDIF}
  723. function CredUnmarshalCredentialW(MarshaledCredential: LPCWSTR;
  724. CredType: PCredMarshalType; out Credential: PVOID): BOOL; stdcall;
  725. {$EXTERNALSYM CredUnmarshalCredentialW}
  726. function CredUnmarshalCredentialA(MarshaledCredential: LPCSTR;
  727. CredType: PCredMarshalType; out Credential: PVOID): BOOL; stdcall;
  728. {$EXTERNALSYM CredUnmarshalCredentialA}
  729. {$IFDEF UNICODE}
  730. function CredUnmarshalCredential(MarshaledCredential: LPCWSTR;
  731. CredType: PCredMarshalType; out Credential: PVOID): BOOL; stdcall;
  732. {$EXTERNALSYM CredUnmarshalCredential}
  733. {$ELSE}
  734. function CredUnmarshalCredential(MarshaledCredential: LPCSTR;
  735. CredType: PCredMarshalType; out Credential: PVOID): BOOL; stdcall;
  736. {$EXTERNALSYM CredUnmarshalCredential}
  737. {$ENDIF}
  738. function CredIsMarshaledCredentialW(MarshaledCredential: LPCWSTR): BOOL; stdcall;
  739. {$EXTERNALSYM CredIsMarshaledCredentialW}
  740. function CredIsMarshaledCredentialA(MarshaledCredential: LPCSTR): BOOL; stdcall;
  741. {$EXTERNALSYM CredIsMarshaledCredentialA}
  742. {$IFDEF UNICODE}
  743. function CredIsMarshaledCredential(MarshaledCredential: LPCWSTR): BOOL; stdcall;
  744. {$EXTERNALSYM CredIsMarshaledCredential}
  745. {$ELSE}
  746. function CredIsMarshaledCredential(MarshaledCredential: LPCSTR): BOOL; stdcall;
  747. {$EXTERNALSYM CredIsMarshaledCredential}
  748. {$ENDIF}
  749. function CredGetSessionTypes(MaximumPersistCount: DWORD;
  750. MaximumPersist: LPDWORD): BOOL; stdcall;
  751. {$EXTERNALSYM CredGetSessionTypes}
  752. procedure CredFree(Buffer: PVOID); stdcall;
  753. {$EXTERNALSYM CredFree}
  754. function CredUIPromptForCredentialsW(pUiInfo: PCredUIInfoW;
  755. pszTargetName: PCWSTR; pContext: PCtxtHandle; dwAuthError: DWORD;
  756. pszUserName: PWSTR; ulUserNameBufferSize: ULONG; pszPassword: PWSTR;
  757. ulPasswordBufferSize: ULONG; var save: BOOL; dwFlags: DWORD): DWORD; stdcall;
  758. {$EXTERNALSYM CredUIPromptForCredentialsW}
  759. function CredUIPromptForCredentialsA(pUiInfo: PCredUIInfoA;
  760. pszTargetName: PCSTR; pContext: PCtxtHandle; dwAuthError: DWORD;
  761. pszUserName: PSTR; ulUserNameBufferSize: ULONG; pszPassword: PSTR;
  762. ulPasswordBufferSize: ULONG; var save: BOOL; dwFlags: DWORD): DWORD; stdcall;
  763. {$EXTERNALSYM CredUIPromptForCredentialsA}
  764. {$IFDEF UNICODE}
  765. function CredUIPromptForCredentials(pUiInfo: PCredUIInfoW;
  766. pszTargetName: PCWSTR; pContext: PCtxtHandle; dwAuthError: DWORD;
  767. pszUserName: PWSTR; ulUserNameBufferSize: ULONG; pszPassword: PWSTR;
  768. ulPasswordBufferSize: ULONG; var save: BOOL; dwFlags: DWORD): DWORD; stdcall;
  769. {$EXTERNALSYM CredUIPromptForCredentials}
  770. {$ELSE}
  771. function CredUIPromptForCredentials(pUiInfo: PCredUIInfoA;
  772. pszTargetName: PCSTR; pContext: PCtxtHandle; dwAuthError: DWORD;
  773. pszUserName: PSTR; ulUserNameBufferSize: ULONG; pszPassword: PSTR;
  774. ulPasswordBufferSize: ULONG; var save: BOOL; dwFlags: DWORD): DWORD; stdcall;
  775. {$EXTERNALSYM CredUIPromptForCredentials}
  776. {$ENDIF}
  777. function CredUIParseUserNameW(pszUserName: PCWSTR; pszUser: PWSTR;
  778. ulUserBufferSize: ULONG; pszDomain: PWSTR; ulDomainBufferSize: ULONG): DWORD; stdcall;
  779. {$EXTERNALSYM CredUIParseUserNameW}
  780. function CredUIParseUserNameA(pszUserName: PCSTR; pszUser: PSTR;
  781. ulUserBufferSize: ULONG; pszDomain: PSTR; ulDomainBufferSize: ULONG): DWORD; stdcall;
  782. {$EXTERNALSYM CredUIParseUserNameA}
  783. {$IFDEF UNICODE}
  784. function CredUIParseUserName(pszUserName: PCWSTR; pszUser: PWSTR;
  785. ulUserBufferSize: ULONG; pszDomain: PWSTR; ulDomainBufferSize: ULONG): DWORD; stdcall;
  786. {$EXTERNALSYM CredUIParseUserName}
  787. {$ELSE}
  788. function CredUIParseUserName(pszUserName: PCSTR; pszUser: PSTR;
  789. ulUserBufferSize: ULONG; pszDomain: PSTR; ulDomainBufferSize: ULONG): DWORD; stdcall;
  790. {$EXTERNALSYM CredUIParseUserName}
  791. {$ENDIF}
  792. function CredUICmdLinePromptForCredentialsW(pszTargetName: PCWSTR;
  793. pContext: PCtxtHandle; dwAuthError: DWORD; UserName: PWSTR;
  794. ulUserBufferSize: ULONG; pszPassword: PWSTR; ulPasswordBufferSize: ULONG;
  795. pfSave: PBOOL; dwFlags: DWORD): DWORD; stdcall;
  796. {$EXTERNALSYM CredUICmdLinePromptForCredentialsW}
  797. function CredUICmdLinePromptForCredentialsA(pszTargetName: PCSTR;
  798. pContext: PCtxtHandle; dwAuthError: DWORD; UserName: PSTR;
  799. ulUserBufferSize: ULONG; pszPassword: PSTR; ulPasswordBufferSize: ULONG;
  800. pfSave: PBOOL; dwFlags: DWORD): DWORD; stdcall;
  801. {$EXTERNALSYM CredUICmdLinePromptForCredentialsA}
  802. {$IFDEF UNICODE}
  803. function CredUICmdLinePromptForCredentials(pszTargetName: PCWSTR;
  804. pContext: PCtxtHandle; dwAuthError: DWORD; UserName: PWSTR;
  805. ulUserBufferSize: ULONG; pszPassword: PWSTR; ulPasswordBufferSize: ULONG;
  806. pfSave: PBOOL; dwFlags: DWORD): DWORD; stdcall;
  807. {$EXTERNALSYM CredUICmdLinePromptForCredentials}
  808. {$ELSE}
  809. function CredUICmdLinePromptForCredentials(pszTargetName: PCSTR;
  810. pContext: PCtxtHandle; dwAuthError: DWORD; UserName: PSTR;
  811. ulUserBufferSize: ULONG; pszPassword: PSTR; ulPasswordBufferSize: ULONG;
  812. pfSave: PBOOL; dwFlags: DWORD): DWORD; stdcall;
  813. {$EXTERNALSYM CredUICmdLinePromptForCredentials}
  814. {$ENDIF}
  815. //
  816. // Call this API with bConfirm set to TRUE to confirm that the credential (previously created
  817. // via CredUIGetCredentials or CredUIPromptForCredentials worked, or with bConfirm set to FALSE
  818. // to indicate it didn't
  819. function CredUIConfirmCredentialsW(pszTargetName: PCWSTR; bConfirm: BOOL): DWORD; stdcall;
  820. {$EXTERNALSYM CredUIConfirmCredentialsW}
  821. function CredUIConfirmCredentialsA(pszTargetName: PCSTR; bConfirm: BOOL): DWORD; stdcall;
  822. {$EXTERNALSYM CredUIConfirmCredentialsA}
  823. {$IFDEF UNICODE}
  824. function CredUIConfirmCredentials(pszTargetName: PCWSTR; bConfirm: BOOL): DWORD; stdcall;
  825. {$EXTERNALSYM CredUIConfirmCredentials}
  826. {$ELSE}
  827. function CredUIConfirmCredentials(pszTargetName: PCSTR; bConfirm: BOOL): DWORD; stdcall;
  828. {$EXTERNALSYM CredUIConfirmCredentials}
  829. {$ENDIF}
  830. function CredUIStoreSSOCredW(pszRealm, pszUsername, pszPassword: PCWSTR;
  831. bPersist: BOOL): DWORD; stdcall;
  832. {$EXTERNALSYM CredUIStoreSSOCredW}
  833. function CredUIReadSSOCredW(pszRealm: PCWSTR; var ppszUsername: PWSTR): DWORD; stdcall;
  834. {$EXTERNALSYM CredUIReadSSOCredW}
  835. implementation
  836. function CredUIPIsUserPasswordError(Status: HRESULT): Boolean;
  837. type
  838. NTSTATUS = Longint;
  839. const
  840. STATUS_LOGON_FAILURE = NTSTATUS($C000006D);
  841. STATUS_ACCESS_DENIED = NTSTATUS($C0000022);
  842. STATUS_WRONG_PASSWORD = NTSTATUS($C000006A);
  843. SEC_E_NO_CREDENTIALS = HRESULT($8009030E);
  844. SEC_E_LOGON_DENIED = HRESULT($8009030C);
  845. begin
  846. case Status of
  847. HRESULT(ERROR_LOGON_FAILURE),
  848. HRESULT(ERROR_LOGON_FAILURE and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  849. HRESULT(STATUS_LOGON_FAILURE),
  850. HRESULT(STATUS_LOGON_FAILURE or FACILITY_NT_BIT),
  851. HRESULT(ERROR_ACCESS_DENIED),
  852. HRESULT(ERROR_ACCESS_DENIED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  853. HRESULT(STATUS_ACCESS_DENIED),
  854. HRESULT(STATUS_ACCESS_DENIED or FACILITY_NT_BIT),
  855. HRESULT(ERROR_INVALID_PASSWORD),
  856. HRESULT(ERROR_INVALID_PASSWORD and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  857. HRESULT(STATUS_WRONG_PASSWORD),
  858. HRESULT(STATUS_WRONG_PASSWORD or FACILITY_NT_BIT),
  859. HRESULT(SEC_E_NO_CREDENTIALS),
  860. HRESULT(SEC_E_LOGON_DENIED):
  861. Result := True;
  862. else
  863. Result := False;
  864. end;
  865. end;
  866. function CredUIPIsDowngradeError(Status: HRESULT): Boolean;
  867. type
  868. NTSTATUS = Longint;
  869. const
  870. STATUS_DOWNGRADE_DETECTED = NTSTATUS($C0000388);
  871. ERROR_DOWNGRADE_DETECTED = 1265;
  872. begin
  873. case Status of
  874. HRESULT(ERROR_DOWNGRADE_DETECTED),
  875. HRESULT(ERROR_DOWNGRADE_DETECTED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  876. HRESULT(STATUS_DOWNGRADE_DETECTED),
  877. HRESULT(STATUS_DOWNGRADE_DETECTED or FACILITY_NT_BIT):
  878. Result := True;
  879. else
  880. Result := False;
  881. end;
  882. end;
  883. function CredUIPIsExpiredError(Status: HRESULT): Boolean;
  884. type
  885. NTSTATUS = Longint;
  886. const
  887. STATUS_PASSWORD_EXPIRED = NTSTATUS($C0000071);
  888. STATUS_PASSWORD_MUST_CHANGE = NTSTATUS($C0000224);
  889. NERR_BASE = 2100;
  890. NERR_PasswordExpired = NERR_BASE + 142;
  891. begin
  892. case Status of
  893. HRESULT(ERROR_PASSWORD_EXPIRED),
  894. HRESULT(ERROR_PASSWORD_EXPIRED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  895. HRESULT(STATUS_PASSWORD_EXPIRED),
  896. HRESULT(STATUS_PASSWORD_EXPIRED or FACILITY_NT_BIT),
  897. HRESULT(ERROR_PASSWORD_MUST_CHANGE),
  898. HRESULT(ERROR_PASSWORD_MUST_CHANGE and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  899. HRESULT(STATUS_PASSWORD_MUST_CHANGE),
  900. HRESULT(STATUS_PASSWORD_MUST_CHANGE or FACILITY_NT_BIT),
  901. HRESULT(NERR_PasswordExpired),
  902. HRESULT(NERR_PasswordExpired and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000):
  903. Result := True;
  904. else
  905. Result := False;
  906. end;
  907. end;
  908. function CredUIIsAuthenticationError(Status: HRESULT): Boolean;
  909. begin
  910. Result :=
  911. CredUIPIsUserPasswordError(Status) or
  912. CredUIPIsDowngradeError(Status) or
  913. CredUIPIsExpiredError(Status);
  914. end;
  915. function CredUINoPromptAuthenticationError(Status: HRESULT): Boolean;
  916. type
  917. NTSTATUS = Longint;
  918. const
  919. ERROR_AUTHENTICATION_FIREWALL_FAILED = 1935;
  920. STATUS_AUTHENTICATION_FIREWALL_FAILED = NTSTATUS($C0000413);
  921. STATUS_ACCOUNT_DISABLED = NTSTATUS($C0000072);
  922. STATUS_ACCOUNT_RESTRICTION = NTSTATUS($C000006E);
  923. STATUS_ACCOUNT_LOCKED_OUT = NTSTATUS($C0000234);
  924. STATUS_ACCOUNT_EXPIRED = NTSTATUS($C0000193);
  925. STATUS_LOGON_TYPE_NOT_GRANTED = NTSTATUS($C000015B);
  926. begin
  927. case Status of
  928. HRESULT(ERROR_AUTHENTICATION_FIREWALL_FAILED),
  929. HRESULT(ERROR_AUTHENTICATION_FIREWALL_FAILED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  930. HRESULT(STATUS_AUTHENTICATION_FIREWALL_FAILED),
  931. HRESULT(STATUS_AUTHENTICATION_FIREWALL_FAILED or FACILITY_NT_BIT),
  932. HRESULT(ERROR_ACCOUNT_DISABLED),
  933. HRESULT(ERROR_ACCOUNT_DISABLED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  934. HRESULT(STATUS_ACCOUNT_DISABLED),
  935. HRESULT(STATUS_ACCOUNT_DISABLED or FACILITY_NT_BIT),
  936. HRESULT(ERROR_ACCOUNT_RESTRICTION),
  937. HRESULT(ERROR_ACCOUNT_RESTRICTION and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  938. HRESULT(STATUS_ACCOUNT_RESTRICTION),
  939. HRESULT(STATUS_ACCOUNT_RESTRICTION or FACILITY_NT_BIT),
  940. HRESULT(ERROR_ACCOUNT_LOCKED_OUT),
  941. HRESULT(ERROR_ACCOUNT_LOCKED_OUT and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  942. HRESULT(STATUS_ACCOUNT_LOCKED_OUT),
  943. HRESULT(STATUS_ACCOUNT_LOCKED_OUT or FACILITY_NT_BIT),
  944. HRESULT(ERROR_ACCOUNT_EXPIRED),
  945. HRESULT(ERROR_ACCOUNT_EXPIRED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  946. HRESULT(STATUS_ACCOUNT_EXPIRED),
  947. HRESULT(STATUS_ACCOUNT_EXPIRED or FACILITY_NT_BIT),
  948. HRESULT(ERROR_LOGON_TYPE_NOT_GRANTED),
  949. HRESULT(ERROR_LOGON_TYPE_NOT_GRANTED and $0000FFFF or FACILITY_WIN32 shl 16 or $80000000),
  950. HRESULT(STATUS_LOGON_TYPE_NOT_GRANTED),
  951. HRESULT(STATUS_LOGON_TYPE_NOT_GRANTED or FACILITY_NT_BIT):
  952. Result := True;
  953. else
  954. Result := False;
  955. end;
  956. end;
  957. const
  958. advapi32 = 'advapi32.dll';
  959. function CredWriteW; external advapi32 name 'CredWriteW';
  960. function CredWriteA; external advapi32 name 'CredWriteA';
  961. function CredReadW; external advapi32 name 'CredReadW';
  962. function CredReadA; external advapi32 name 'CredReadA';
  963. function CredEnumerateW; external advapi32 name 'CredEnumerateW';
  964. function CredEnumerateA; external advapi32 name 'CredEnumerateA';
  965. function CredWriteDomainCredentialsW; external advapi32 name 'CredWriteDomainCredentialsW';
  966. function CredWriteDomainCredentialsA; external advapi32 name 'CredWriteDomainCredentialsA';
  967. function CredReadDomainCredentialsW; external advapi32 name 'CredReadDomainCredentialsW';
  968. function CredReadDomainCredentialsA; external advapi32 name 'CredReadDomainCredentialsA';
  969. function CredDeleteW; external advapi32 name 'CredDeleteW';
  970. function CredDeleteA; external advapi32 name 'CredDeleteA';
  971. function CredRenameW; external advapi32 name 'CredRenameW';
  972. function CredRenameA; external advapi32 name 'CredRenameA';
  973. function CredGetTargetInfoW; external advapi32 name 'CredGetTargetInfoW';
  974. function CredGetTargetInfoA; external advapi32 name 'CredGetTargetInfoA';
  975. function CredMarshalCredentialW; external advapi32 name 'CredMarshalCredentialW';
  976. function CredMarshalCredentialA; external advapi32 name 'CredMarshalCredentialA';
  977. function CredUnmarshalCredentialW; external advapi32 name 'CredUnmarshalCredentialW';
  978. function CredUnmarshalCredentialA; external advapi32 name 'CredUnmarshalCredentialA';
  979. function CredIsMarshaledCredentialW; external advapi32 name 'CredIsMarshaledCredentialW';
  980. function CredIsMarshaledCredentialA; external advapi32 name 'CredIsMarshaledCredentialA';
  981. {$IFDEF UNICODE}
  982. function CredWrite; external advapi32 name 'CredWriteW';
  983. function CredRead; external advapi32 name 'CredReadW';
  984. function CredEnumerate; external advapi32 name 'CredEnumerateW';
  985. function CredWriteDomainCredentials; external advapi32 name 'CredWriteDomainCredentialsW';
  986. function CredReadDomainCredentials; external advapi32 name 'CredReadDomainCredentialsW';
  987. function CredDelete; external advapi32 name 'CredDeleteW';
  988. function CredRename; external advapi32 name 'CredRenameW';
  989. function CredGetTargetInfo; external advapi32 name 'CredGetTargetInfoW';
  990. function CredMarshalCredential; external advapi32 name 'CredMarshalCredentialW';
  991. function CredUnmarshalCredential; external advapi32 name 'CredUnmarshalCredentialW';
  992. function CredIsMarshaledCredential; external advapi32 name 'CredIsMarshaledCredentialW';
  993. {$ELSE}
  994. function CredWrite; external advapi32 name 'CredWriteA';
  995. function CredRead; external advapi32 name 'CredReadA';
  996. function CredEnumerate; external advapi32 name 'CredEnumerateA';
  997. function CredWriteDomainCredentials; external advapi32 name 'CredWriteDomainCredentialsA';
  998. function CredReadDomainCredentials; external advapi32 name 'CredReadDomainCredentialsA';
  999. function CredDelete; external advapi32 name 'CredDeleteA';
  1000. function CredRename; external advapi32 name 'CredRenameA';
  1001. function CredGetTargetInfo; external advapi32 name 'CredGetTargetInfoA';
  1002. function CredMarshalCredential; external advapi32 name 'CredMarshalCredentialA';
  1003. function CredUnmarshalCredential; external advapi32 name 'CredUnmarshalCredentialA';
  1004. function CredIsMarshaledCredential; external advapi32 name 'CredIsMarshaledCredentialA';
  1005. {$ENDIF}
  1006. function CredGetSessionTypes; external advapi32 name 'CredGetSessionTypes';
  1007. procedure CredFree; external advapi32 name 'CredFree';
  1008. const
  1009. credui = 'credui.dll';
  1010. function CredUIPromptForCredentialsW; external credui name 'CredUIPromptForCredentialsW';
  1011. function CredUIPromptForCredentialsA; external credui name 'CredUIPromptForCredentialsA';
  1012. function CredUIParseUserNameW; external credui name 'CredUIParseUserNameW';
  1013. function CredUIParseUserNameA; external credui name 'CredUIParseUserNameA';
  1014. function CredUICmdLinePromptForCredentialsW; external credui name 'CredUICmdLinePromptForCredentialsW';
  1015. function CredUICmdLinePromptForCredentialsA; external credui name 'CredUICmdLinePromptForCredentialsA';
  1016. function CredUIConfirmCredentialsW; external credui name 'CredUIConfirmCredentialsW';
  1017. function CredUIConfirmCredentialsA; external credui name 'CredUIConfirmCredentialsA';
  1018. {$IFDEF UNICODE}
  1019. function CredUIPromptForCredentials; external credui name 'CredUIPromptForCredentialsW';
  1020. function CredUIParseUserName; external credui name 'CredUIParseUserNameW';
  1021. function CredUICmdLinePromptForCredentials; external credui name 'CredUICmdLinePromptForCredentialsW';
  1022. function CredUIConfirmCredentials; external credui name 'CredUIConfirmCredentialsW';
  1023. {$ELSE}
  1024. function CredUIPromptForCredentials; external credui name 'CredUIPromptForCredentialsA';
  1025. function CredUIParseUserName; external credui name 'CredUIParseUserNameA';
  1026. function CredUICmdLinePromptForCredentials; external credui name 'CredUICmdLinePromptForCredentialsA';
  1027. function CredUIConfirmCredentials; external credui name 'CredUIConfirmCredentialsA';
  1028. {$ENDIF}
  1029. function CredUIStoreSSOCredW; external credui name 'CredUIStoreSSOCredW';
  1030. function CredUIReadSSOCredW; external credui name 'CredUIReadSSOCredW';
  1031. end.