jwadsgetdc.pas 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013
  1. {******************************************************************************}
  2. { }
  3. { Directory Services API interface Unit for Object Pascal }
  4. { }
  5. { Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft }
  6. { Corporation. All Rights Reserved. }
  7. { }
  8. { The original file is: dsgetdc.h, released June 2000. The original Pascal }
  9. { code is: DsGetDc.pas, released December 2000. The initial developer of the }
  10. { Pascal code is Marcel van Brakel (brakelm att chello dott nl). }
  11. { }
  12. { Portions created by Marcel van Brakel are Copyright (C) 1999-2001 }
  13. { Marcel van Brakel. All Rights Reserved. }
  14. { }
  15. { Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI) }
  16. { }
  17. { You may retrieve the latest version of this file at the Project JEDI }
  18. { APILIB home page, located at http://jedi-apilib.sourceforge.net }
  19. { }
  20. { The contents of this file are used with permission, subject to the Mozilla }
  21. { Public License Version 1.1 (the "License"); you may not use this file except }
  22. { in compliance with the License. You may obtain a copy of the License at }
  23. { http://www.mozilla.org/MPL/MPL-1.1.html }
  24. { }
  25. { Software distributed under the License is distributed on an "AS IS" basis, }
  26. { WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
  27. { the specific language governing rights and limitations under the License. }
  28. { }
  29. { Alternatively, the contents of this file may be used under the terms of the }
  30. { GNU Lesser General Public License (the "LGPL License"), in which case the }
  31. { provisions of the LGPL License are applicable instead of those above. }
  32. { If you wish to allow use of your version of this file only under the terms }
  33. { of the LGPL License and not to allow others to use your version of this file }
  34. { under the MPL, indicate your decision by deleting the provisions above and }
  35. { replace them with the notice and other provisions required by the LGPL }
  36. { License. If you do not delete the provisions above, a recipient may use }
  37. { your version of this file under either the MPL or the LGPL License. }
  38. { }
  39. { For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
  40. { }
  41. {******************************************************************************}
  42. unit JwaDSGetDc;
  43. {$WEAKPACKAGEUNIT}
  44. {$HPPEMIT ''}
  45. {$HPPEMIT '#include "DsGetDC.h"'}
  46. {$HPPEMIT ''}
  47. {$I jediapilib.inc}
  48. interface
  49. uses
  50. JwaNtSecApi, JwaWinNT, JwaWinType;
  51. //
  52. // Structure definitions
  53. //
  54. //
  55. // Flags to passed to DsGetDcName
  56. //
  57. const
  58. DS_FORCE_REDISCOVERY = $00000001;
  59. {$EXTERNALSYM DS_FORCE_REDISCOVERY}
  60. DS_DIRECTORY_SERVICE_REQUIRED = $00000010;
  61. {$EXTERNALSYM DS_DIRECTORY_SERVICE_REQUIRED}
  62. DS_DIRECTORY_SERVICE_PREFERRED = $00000020;
  63. {$EXTERNALSYM DS_DIRECTORY_SERVICE_PREFERRED}
  64. DS_GC_SERVER_REQUIRED = $00000040;
  65. {$EXTERNALSYM DS_GC_SERVER_REQUIRED}
  66. DS_PDC_REQUIRED = $00000080;
  67. {$EXTERNALSYM DS_PDC_REQUIRED}
  68. DS_BACKGROUND_ONLY = $00000100;
  69. {$EXTERNALSYM DS_BACKGROUND_ONLY}
  70. DS_IP_REQUIRED = $00000200;
  71. {$EXTERNALSYM DS_IP_REQUIRED}
  72. DS_KDC_REQUIRED = $00000400;
  73. {$EXTERNALSYM DS_KDC_REQUIRED}
  74. DS_TIMESERV_REQUIRED = $00000800;
  75. {$EXTERNALSYM DS_TIMESERV_REQUIRED}
  76. DS_WRITABLE_REQUIRED = $00001000;
  77. {$EXTERNALSYM DS_WRITABLE_REQUIRED}
  78. DS_GOOD_TIMESERV_PREFERRED = $00002000;
  79. {$EXTERNALSYM DS_GOOD_TIMESERV_PREFERRED}
  80. DS_AVOID_SELF = $00004000;
  81. {$EXTERNALSYM DS_AVOID_SELF}
  82. DS_ONLY_LDAP_NEEDED = $00008000;
  83. {$EXTERNALSYM DS_ONLY_LDAP_NEEDED}
  84. DS_IS_FLAT_NAME = $00010000;
  85. {$EXTERNALSYM DS_IS_FLAT_NAME}
  86. DS_IS_DNS_NAME = $00020000;
  87. {$EXTERNALSYM DS_IS_DNS_NAME}
  88. DS_RETURN_DNS_NAME = $40000000;
  89. {$EXTERNALSYM DS_RETURN_DNS_NAME}
  90. DS_RETURN_FLAT_NAME = DWORD($80000000);
  91. {$EXTERNALSYM DS_RETURN_FLAT_NAME}
  92. DSGETDC_VALID_FLAGS =
  93. DS_FORCE_REDISCOVERY or
  94. DS_DIRECTORY_SERVICE_REQUIRED or
  95. DS_DIRECTORY_SERVICE_PREFERRED or
  96. DS_GC_SERVER_REQUIRED or
  97. DS_PDC_REQUIRED or
  98. DS_BACKGROUND_ONLY or
  99. DS_IP_REQUIRED or
  100. DS_KDC_REQUIRED or
  101. DS_TIMESERV_REQUIRED or
  102. DS_WRITABLE_REQUIRED or
  103. DS_GOOD_TIMESERV_PREFERRED or
  104. DS_AVOID_SELF or
  105. DS_ONLY_LDAP_NEEDED or
  106. DS_IS_FLAT_NAME or
  107. DS_IS_DNS_NAME or
  108. DS_RETURN_FLAT_NAME or
  109. DS_RETURN_DNS_NAME;
  110. {$EXTERNALSYM DSGETDC_VALID_FLAGS}
  111. //
  112. // Structure returned from DsGetDcName
  113. //
  114. type
  115. PDOMAIN_CONTROLLER_INFOA = ^DOMAIN_CONTROLLER_INFOA;
  116. {$EXTERNALSYM PDOMAIN_CONTROLLER_INFOA}
  117. _DOMAIN_CONTROLLER_INFOA = record
  118. DomainControllerName: LPSTR;
  119. DomainControllerAddress: LPSTR;
  120. DomainControllerAddressType: ULONG;
  121. DomainGuid: GUID;
  122. DomainName: LPSTR;
  123. DnsForestName: LPSTR;
  124. Flags: ULONG;
  125. DcSiteName: LPSTR;
  126. ClientSiteName: LPSTR;
  127. end;
  128. {$EXTERNALSYM _DOMAIN_CONTROLLER_INFOA}
  129. DOMAIN_CONTROLLER_INFOA = _DOMAIN_CONTROLLER_INFOA;
  130. {$EXTERNALSYM DOMAIN_CONTROLLER_INFOA}
  131. TDomainControllerInfoA = DOMAIN_CONTROLLER_INFOA;
  132. PDomainControllerInfoA = PDOMAIN_CONTROLLER_INFOA;
  133. PDOMAIN_CONTROLLER_INFOW = ^DOMAIN_CONTROLLER_INFOW;
  134. {$EXTERNALSYM PDOMAIN_CONTROLLER_INFOW}
  135. _DOMAIN_CONTROLLER_INFOW = record
  136. DomainControllerName: LPWSTR;
  137. DomainControllerAddress: LPWSTR;
  138. DomainControllerAddressType: ULONG;
  139. DomainGuid: GUID;
  140. DomainName: LPWSTR;
  141. DnsForestName: LPWSTR;
  142. Flags: ULONG;
  143. DcSiteName: LPWSTR;
  144. ClientSiteName: LPWSTR;
  145. end;
  146. {$EXTERNALSYM _DOMAIN_CONTROLLER_INFOW}
  147. DOMAIN_CONTROLLER_INFOW = _DOMAIN_CONTROLLER_INFOW;
  148. {$EXTERNALSYM DOMAIN_CONTROLLER_INFOW}
  149. TDomainControllerInfoW = DOMAIN_CONTROLLER_INFOW;
  150. PDomainControllerInfoW = PDOMAIN_CONTROLLER_INFOW;
  151. {$IFDEF UNICODE}
  152. DOMAIN_CONTROLLER_INFO = DOMAIN_CONTROLLER_INFOW;
  153. {$EXTERNALSYM DOMAIN_CONTROLLER_INFO}
  154. PDOMAIN_CONTROLLER_INFO = PDOMAIN_CONTROLLER_INFOW;
  155. {$EXTERNALSYM PDOMAIN_CONTROLLER_INFO}
  156. TDomainControllerInfo = TDomainControllerInfoW;
  157. PDomainControllerInfo = PDomainControllerInfoW;
  158. {$ELSE}
  159. DOMAIN_CONTROLLER_INFO = DOMAIN_CONTROLLER_INFOA;
  160. {$EXTERNALSYM DOMAIN_CONTROLLER_INFO}
  161. PDOMAIN_CONTROLLER_INFO = PDOMAIN_CONTROLLER_INFOA;
  162. {$EXTERNALSYM PDOMAIN_CONTROLLER_INFO}
  163. TDomainControllerInfo = TDomainControllerInfoA;
  164. PDomainControllerInfo = PDomainControllerInfoA;
  165. {$ENDIF UNICODE}
  166. //
  167. // Values for DomainControllerAddressType
  168. //
  169. const
  170. DS_INET_ADDRESS = 1;
  171. {$EXTERNALSYM DS_INET_ADDRESS}
  172. DS_NETBIOS_ADDRESS = 2;
  173. {$EXTERNALSYM DS_NETBIOS_ADDRESS}
  174. //
  175. // Values for returned Flags
  176. //
  177. DS_PDC_FLAG = $00000001; // DC is PDC of Domain
  178. {$EXTERNALSYM DS_PDC_FLAG}
  179. DS_GC_FLAG = $00000004; // DC is a GC of forest
  180. {$EXTERNALSYM DS_GC_FLAG}
  181. DS_LDAP_FLAG = $00000008; // Server supports an LDAP server
  182. {$EXTERNALSYM DS_LDAP_FLAG}
  183. DS_DS_FLAG = $00000010; // DC supports a DS and is a Domain Controller
  184. {$EXTERNALSYM DS_DS_FLAG}
  185. DS_KDC_FLAG = $00000020; // DC is running KDC service
  186. {$EXTERNALSYM DS_KDC_FLAG}
  187. DS_TIMESERV_FLAG = $00000040; // DC is running time service
  188. {$EXTERNALSYM DS_TIMESERV_FLAG}
  189. DS_CLOSEST_FLAG = $00000080; // DC is in closest site to client
  190. {$EXTERNALSYM DS_CLOSEST_FLAG}
  191. DS_WRITABLE_FLAG = $00000100; // DC has a writable DS
  192. {$EXTERNALSYM DS_WRITABLE_FLAG}
  193. DS_GOOD_TIMESERV_FLAG = $00000200; // DC is running time service (and has clock hardware)
  194. {$EXTERNALSYM DS_GOOD_TIMESERV_FLAG}
  195. DS_NDNC_FLAG = $00000400; // DomainName is non-domain NC serviced by the LDAP server
  196. {$EXTERNALSYM DS_NDNC_FLAG}
  197. DS_PING_FLAGS = $0000FFFF; // Flags returned on ping
  198. {$EXTERNALSYM DS_PING_FLAGS}
  199. DS_DNS_CONTROLLER_FLAG = $20000000; // DomainControllerName is a DNS name
  200. {$EXTERNALSYM DS_DNS_CONTROLLER_FLAG}
  201. DS_DNS_DOMAIN_FLAG = $40000000; // DomainName is a DNS name
  202. {$EXTERNALSYM DS_DNS_DOMAIN_FLAG}
  203. DS_DNS_FOREST_FLAG = DWORD($80000000); // DnsForestName is a DNS name
  204. {$EXTERNALSYM DS_DNS_FOREST_FLAG}
  205. //
  206. // Function Prototypes
  207. //
  208. function DsGetDcNameA(ComputerName, DomainName: LPCSTR; DomainGuid: LPGUID;
  209. SiteName: LPCSTR; Flags: ULONG; var DomainControllerInfo: PDOMAIN_CONTROLLER_INFOA): DWORD; stdcall;
  210. {$EXTERNALSYM DsGetDcNameA}
  211. function DsGetDcNameW(ComputerName, DomainName: LPCWSTR; DomainGuid: LPGUID;
  212. SiteName: LPCWSTR; Flags: ULONG; var DomainControllerInfo: PDOMAIN_CONTROLLER_INFOW): DWORD; stdcall;
  213. {$EXTERNALSYM DsGetDcNameW}
  214. function DsGetDcName(ComputerName, DomainName: LPCTSTR; DomainGuid: LPGUID;
  215. SiteName: LPCTSTR; Flags: ULONG; var DomainControllerInfo: PDOMAIN_CONTROLLER_INFO): DWORD; stdcall;
  216. {$EXTERNALSYM DsGetDcName}
  217. function DsGetSiteNameA(ComputerName: LPCSTR; var SiteName: LPSTR): DWORD; stdcall;
  218. {$EXTERNALSYM DsGetSiteNameA}
  219. function DsGetSiteNameW(ComputerName: LPCWSTR; var SiteName: LPWSTR): DWORD; stdcall;
  220. {$EXTERNALSYM DsGetSiteNameW}
  221. function DsGetSiteName(ComputerName: LPCTSTR; var SiteName: LPTSTR): DWORD; stdcall;
  222. {$EXTERNALSYM DsGetSiteName}
  223. function DsValidateSubnetNameA(SubnetName: LPCSTR): DWORD; stdcall;
  224. {$EXTERNALSYM DsValidateSubnetNameA}
  225. function DsValidateSubnetNameW(SubnetName: LPCWSTR): DWORD; stdcall;
  226. {$EXTERNALSYM DsValidateSubnetNameW}
  227. function DsValidateSubnetName(SubnetName: LPCTSTR): DWORD; stdcall;
  228. {$EXTERNALSYM DsValidateSubnetName}
  229. //
  230. // Only include if winsock2.h has been included
  231. //
  232. // Types from Winsock2.h
  233. type
  234. sockaddr = record
  235. sa_family: Word; // address family
  236. sa_data: array [0..13]of Char; // up to 14 bytes of direct address
  237. end;
  238. {$EXTERNALSYM sockaddr}
  239. PSOCKADDR = ^SOCKADDR;
  240. {$EXTERNALSYM PSOCKADDR}
  241. LPSOCKADDR = PSOCKADDR;
  242. {$EXTERNALSYM LPSOCKADDR}
  243. _SOCKET_ADDRESS = record
  244. lpSockaddr: LPSOCKADDR;
  245. iSockaddrLength: Integer;
  246. end;
  247. {$EXTERNALSYM _SOCKET_ADDRESS}
  248. SOCKET_ADDRESS = _SOCKET_ADDRESS;
  249. {$EXTERNALSYM SOCKET_ADDRESS}
  250. PSOCKET_ADDRESS = ^SOCKET_ADDRESS;
  251. {$EXTERNALSYM PSOCKET_ADDRESS}
  252. LPSOCKET_ADDRESS = PSOCKET_ADDRESS;
  253. {$EXTERNALSYM LPSOCKET_ADDRESS}
  254. TSocketAddress = SOCKET_ADDRESS;
  255. PSocketAddress = LPSOCKET_ADDRESS;
  256. function DsAddressToSiteNamesA(ComputerName: LPCSTR; EntryCount: DWORD;
  257. SocketAddresses: PSOCKET_ADDRESS; var SiteNames: PPChar): DWORD; stdcall;
  258. {$EXTERNALSYM DsAddressToSiteNamesA}
  259. function DsAddressToSiteNamesW(ComputerName: LPCWSTR; EntryCount: DWORD;
  260. SocketAddresses: PSOCKET_ADDRESS; var SiteNames: PPWideChar): DWORD; stdcall;
  261. {$EXTERNALSYM DsAddressToSiteNamesW}
  262. function DsAddressToSiteNames(ComputerName: LPCTSTR; EntryCount: DWORD;
  263. SocketAddresses: PSOCKET_ADDRESS; var SiteNames: PPTCHAR): DWORD; stdcall;
  264. {$EXTERNALSYM DsAddressToSiteNames}
  265. function DsAddressToSiteNamesExA(ComputerName: LPCSTR; EntryCount: DWORD;
  266. SocketAddresses: PSOCKET_ADDRESS; var SiteNames, SubnetNames: PPChar): DWORD; stdcall;
  267. {$EXTERNALSYM DsAddressToSiteNamesExA}
  268. function DsAddressToSiteNamesExW(ComputerName: LPCWSTR; EntryCount: DWORD;
  269. SocketAddresses: PSOCKET_ADDRESS; var SiteNames, SubnetNames: PPWideChar): DWORD; stdcall;
  270. {$EXTERNALSYM DsAddressToSiteNamesExW}
  271. function DsAddressToSiteNamesEx(ComputerName: LPCTSTR; EntryCount: DWORD;
  272. SocketAddresses: PSOCKET_ADDRESS; var SiteNames, SubnetNames: PPTCHAR): DWORD; stdcall;
  273. {$EXTERNALSYM DsAddressToSiteNamesEx}
  274. //
  275. // API to enumerate trusted domains
  276. //
  277. const
  278. DS_DOMAIN_IN_FOREST = $0001; // Domain is a member of the forest
  279. {$EXTERNALSYM DS_DOMAIN_IN_FOREST}
  280. DS_DOMAIN_DIRECT_OUTBOUND = $0002; // Domain is directly trusted
  281. {$EXTERNALSYM DS_DOMAIN_DIRECT_OUTBOUND}
  282. DS_DOMAIN_TREE_ROOT = $0004; // Domain is root of a tree in the forest
  283. {$EXTERNALSYM DS_DOMAIN_TREE_ROOT}
  284. DS_DOMAIN_PRIMARY = $0008; // Domain is the primary domain of queried server
  285. {$EXTERNALSYM DS_DOMAIN_PRIMARY}
  286. DS_DOMAIN_NATIVE_MODE = $0010; // Primary domain is running in native mode
  287. {$EXTERNALSYM DS_DOMAIN_NATIVE_MODE}
  288. DS_DOMAIN_DIRECT_INBOUND = $0020; // Domain is directly trusting
  289. {$EXTERNALSYM DS_DOMAIN_DIRECT_INBOUND}
  290. DS_DOMAIN_VALID_FLAGS = DS_DOMAIN_IN_FOREST or DS_DOMAIN_DIRECT_OUTBOUND or
  291. DS_DOMAIN_TREE_ROOT or DS_DOMAIN_PRIMARY or DS_DOMAIN_NATIVE_MODE or
  292. DS_DOMAIN_DIRECT_INBOUND;
  293. {$EXTERNALSYM DS_DOMAIN_VALID_FLAGS}
  294. type
  295. PDS_DOMAIN_TRUSTSW = ^DS_DOMAIN_TRUSTSW;
  296. {$EXTERNALSYM PDS_DOMAIN_TRUSTSW}
  297. _DS_DOMAIN_TRUSTSW = record
  298. //
  299. // Name of the trusted domain.
  300. //
  301. NetbiosDomainName: LPWSTR;
  302. DnsDomainName: LPWSTR;
  303. //
  304. // Flags defining attributes of the trust.
  305. //
  306. Flags: ULONG;
  307. //
  308. // Index to the domain that is the parent of this domain.
  309. // Only defined if NETLOGON_DOMAIN_IN_FOREST is set and
  310. // NETLOGON_DOMAIN_TREE_ROOT is not set.
  311. //
  312. ParentIndex: ULONG;
  313. //
  314. // The trust type and attributes of this trust.
  315. //
  316. // If NETLOGON_DOMAIN_DIRECTLY_TRUSTED is not set,
  317. // these value are infered.
  318. //
  319. TrustType: ULONG;
  320. TrustAttributes: ULONG;
  321. //
  322. // The SID of the trusted domain.
  323. //
  324. // If NETLOGON_DOMAIN_DIRECTLY_TRUSTED is not set,
  325. // this value will be NULL.
  326. //
  327. DomainSid: PSID;
  328. //
  329. // The GUID of the trusted domain.
  330. //
  331. DomainGuid: GUID;
  332. end;
  333. {$EXTERNALSYM _DS_DOMAIN_TRUSTSW}
  334. DS_DOMAIN_TRUSTSW = _DS_DOMAIN_TRUSTSW;
  335. {$EXTERNALSYM DS_DOMAIN_TRUSTSW}
  336. TDsDomainTrustsW = DS_DOMAIN_TRUSTSW;
  337. PDsDomainTrustsW = PDS_DOMAIN_TRUSTSW;
  338. //
  339. // ANSI version of the above struct
  340. //
  341. PDS_DOMAIN_TRUSTSA = ^DS_DOMAIN_TRUSTSA;
  342. {$EXTERNALSYM PDS_DOMAIN_TRUSTSA}
  343. _DS_DOMAIN_TRUSTSA = record
  344. NetbiosDomainName: LPSTR;
  345. DnsDomainName: LPSTR;
  346. Flags: ULONG;
  347. ParentIndex: ULONG;
  348. TrustType: ULONG;
  349. TrustAttributes: ULONG;
  350. DomainSid: PSID;
  351. DomainGuid: GUID;
  352. end;
  353. {$EXTERNALSYM _DS_DOMAIN_TRUSTSA}
  354. DS_DOMAIN_TRUSTSA = _DS_DOMAIN_TRUSTSA;
  355. {$EXTERNALSYM DS_DOMAIN_TRUSTSA}
  356. TDsDomainTrustsA = DS_DOMAIN_TRUSTSA;
  357. PDsDomainTrustsA = PDS_DOMAIN_TRUSTSA;
  358. {$IFDEF UNICODE}
  359. DS_DOMAIN_TRUSTS = DS_DOMAIN_TRUSTSW;
  360. {$EXTERNALSYM DS_DOMAIN_TRUSTS}
  361. PDS_DOMAIN_TRUSTS = PDS_DOMAIN_TRUSTSW;
  362. {$EXTERNALSYM PDS_DOMAIN_TRUSTS}
  363. TDsDomainTrusts = TDsDomainTrustsW;
  364. PDsDomainTrusts = PDsDomainTrustsW;
  365. {$ELSE}
  366. DS_DOMAIN_TRUSTS = DS_DOMAIN_TRUSTSA;
  367. {$EXTERNALSYM DS_DOMAIN_TRUSTS}
  368. PDS_DOMAIN_TRUSTS = PDS_DOMAIN_TRUSTSA;
  369. {$EXTERNALSYM PDS_DOMAIN_TRUSTS}
  370. TDsDomainTrusts = TDsDomainTrustsA;
  371. PDsDomainTrusts = PDsDomainTrustsA;
  372. {$ENDIF UNICODE}
  373. function DsEnumerateDomainTrustsA(ServerName: LPSTR; Flags: ULONG;
  374. var Domains: PDS_DOMAIN_TRUSTSA; var DomainCount: ULONG): DWORD; stdcall;
  375. {$EXTERNALSYM DsEnumerateDomainTrustsA}
  376. function DsEnumerateDomainTrustsW(ServerName: LPWSTR; Flags: ULONG;
  377. var Domains: PDS_DOMAIN_TRUSTSW; var DomainCount: ULONG): DWORD; stdcall;
  378. {$EXTERNALSYM DsEnumerateDomainTrustsW}
  379. function DsEnumerateDomainTrusts(ServerName: LPTSTR; Flags: ULONG;
  380. var Domains: PDS_DOMAIN_TRUSTS; var DomainCount: ULONG): DWORD; stdcall;
  381. {$EXTERNALSYM DsEnumerateDomainTrusts}
  382. //
  383. // Only define this API if the caller has #included the pre-requisite
  384. // ntlsa.h or ntsecapi.h
  385. //
  386. function DsGetForestTrustInformationW(ServerName, TrustedDomainName: LPCWSTR;
  387. Flags: DWORD; var ForestTrustInfo: PLSA_FOREST_TRUST_INFORMATION): DWORD; stdcall;
  388. {$EXTERNALSYM DsGetForestTrustInformationW}
  389. const
  390. DS_GFTI_UPDATE_TDO = $1; // Update TDO with information returned
  391. {$EXTERNALSYM DS_GFTI_UPDATE_TDO}
  392. DS_GFTI_VALID_FLAGS = $1; // All valid flags to DsGetForestTrustInformation
  393. {$EXTERNALSYM DS_GFTI_VALID_FLAGS}
  394. function DsMergeForestTrustInformationW(DomainName: LPCWSTR; NewForestTrustInfo,
  395. OldForestTrustInfo: PLSA_FOREST_TRUST_INFORMATION;
  396. var MergedForestTrustInfo: PLSA_FOREST_TRUST_INFORMATION): DWORD; stdcall;
  397. {$EXTERNALSYM DsMergeForestTrustInformationW}
  398. function DsGetDcSiteCoverageA(ServerName: LPCSTR; var EntryCount: ULONG;
  399. var SiteNames: PPChar): DWORD; stdcall;
  400. {$EXTERNALSYM DsGetDcSiteCoverageA}
  401. function DsGetDcSiteCoverageW(ServerName: LPCWSTR; var EntryCount: ULONG;
  402. var SiteNames: PPWideChar): DWORD; stdcall;
  403. {$EXTERNALSYM DsGetDcSiteCoverageW}
  404. function DsGetDcSiteCoverage(ServerName: LPCTSTR; var EntryCount: ULONG;
  405. var SiteNames: PPTCHAR): DWORD; stdcall;
  406. {$EXTERNALSYM DsGetDcSiteCoverage}
  407. function DsDeregisterDnsHostRecordsA(ServerName, DnsDomainName: LPSTR;
  408. DomainGuid, DsaGuid: LPGUID; DnsHostName: LPSTR): DWORD; stdcall;
  409. {$EXTERNALSYM DsDeregisterDnsHostRecordsA}
  410. function DsDeregisterDnsHostRecordsW(ServerName, DnsDomainName: LPWSTR;
  411. DomainGuid, DsaGuid: LPGUID; DnsHostName: LPWSTR): DWORD; stdcall;
  412. {$EXTERNALSYM DsDeregisterDnsHostRecordsW}
  413. function DsDeregisterDnsHostRecords(ServerName, DnsDomainName: LPTSTR;
  414. DomainGuid, DsaGuid: LPGUID; DnsHostName: LPTSTR): DWORD; stdcall;
  415. {$EXTERNALSYM DsDeregisterDnsHostRecords}
  416. //
  417. // Option flags passed to DsGetDcOpen
  418. //
  419. const
  420. DS_ONLY_DO_SITE_NAME = $01; // Non-site specific names should be avoided.
  421. {$EXTERNALSYM DS_ONLY_DO_SITE_NAME}
  422. DS_NOTIFY_AFTER_SITE_RECORDS = $02; // Return ERROR_FILEMARK_DETECTED after all
  423. {$EXTERNALSYM DS_NOTIFY_AFTER_SITE_RECORDS}
  424. // site specific records have been processed.
  425. DS_OPEN_VALID_OPTION_FLAGS = DS_ONLY_DO_SITE_NAME or DS_NOTIFY_AFTER_SITE_RECORDS;
  426. {$EXTERNALSYM DS_OPEN_VALID_OPTION_FLAGS}
  427. //
  428. // Valid DcFlags for DsGetDcOpen
  429. //
  430. DS_OPEN_VALID_FLAGS =
  431. DS_FORCE_REDISCOVERY or
  432. DS_ONLY_LDAP_NEEDED or
  433. DS_KDC_REQUIRED or
  434. DS_PDC_REQUIRED or
  435. DS_GC_SERVER_REQUIRED or
  436. DS_WRITABLE_REQUIRED;
  437. {$EXTERNALSYM DS_OPEN_VALID_FLAGS}
  438. function DsGetDcOpenW(DnsName: LPCWSTR; OptionFlags: ULONG; SiteName: LPCWSTR;
  439. DomainGuid: PGUID; DnsForestName: LPCWSTR; DcFlags: ULONG;
  440. var RetGetDcContext: HANDLE): DWORD; stdcall;
  441. {$EXTERNALSYM DsGetDcOpenW}
  442. function DsGetDcOpenA(DnsName: LPCSTR; OptionFlags: ULONG; SiteName: LPCSTR;
  443. DomainGuid: PGUID; DnsForestName: LPCSTR; DcFlags: ULONG;
  444. var RetGetDcContext: HANDLE): DWORD; stdcall;
  445. {$EXTERNALSYM DsGetDcOpenA}
  446. function DsGetDcOpen(DnsName: LPCTSTR; OptionFlags: ULONG; SiteName: LPCTSTR;
  447. DomainGuid: PGUID; DnsForestName: LPCTSTR; DcFlags: ULONG;
  448. var RetGetDcContext: HANDLE): DWORD; stdcall;
  449. {$EXTERNALSYM DsGetDcOpen}
  450. function DsGetDcNextA(GetDcContextHandle: HANDLE; SockAddressCount: PULONG;
  451. SockAddresses: LPSOCKET_ADDRESS; DnsHostName: LPSTR): DWORD; stdcall;
  452. {$EXTERNALSYM DsGetDcNextA}
  453. function DsGetDcNextW(GetDcContextHandle: HANDLE; SockAddressCount: PULONG;
  454. SockAddresses: LPSOCKET_ADDRESS; DnsHostName: LPWSTR): DWORD; stdcall;
  455. {$EXTERNALSYM DsGetDcNextW}
  456. function DsGetDcNext(GetDcContextHandle: HANDLE; SockAddressCount: PULONG;
  457. SockAddresses: LPSOCKET_ADDRESS; DnsHostName: LPTSTR): DWORD; stdcall;
  458. {$EXTERNALSYM DsGetDcNext}
  459. procedure DsGetDcCloseW(GetDcContextHandle: HANDLE); stdcall;
  460. {$EXTERNALSYM DsGetDcCloseW}
  461. procedure DsGetDcClose(GetDcContextHandle: HANDLE); stdcall;
  462. {$EXTERNALSYM DsGetDcClose}
  463. implementation
  464. const
  465. netapi32 = 'netapi32.dll';
  466. {$IFDEF UNICODE}
  467. AWSuffix = 'W';
  468. {$ELSE}
  469. AWSuffix = 'A';
  470. {$ENDIF UNICODE}
  471. {$IFDEF DYNAMIC_LINK}
  472. var
  473. _DsGetDcNameA: Pointer;
  474. function DsGetDcNameA;
  475. begin
  476. GetProcedureAddress(_DsGetDcNameA, netapi32, 'DsGetDcNameA');
  477. asm
  478. MOV ESP, EBP
  479. POP EBP
  480. JMP [_DsGetDcNameA]
  481. end;
  482. end;
  483. var
  484. _DsGetDcNameW: Pointer;
  485. function DsGetDcNameW;
  486. begin
  487. GetProcedureAddress(_DsGetDcNameW, netapi32, 'DsGetDcNameW');
  488. asm
  489. MOV ESP, EBP
  490. POP EBP
  491. JMP [_DsGetDcNameW]
  492. end;
  493. end;
  494. var
  495. _DsGetDcName: Pointer;
  496. function DsGetDcName;
  497. begin
  498. GetProcedureAddress(_DsGetDcName, netapi32, 'DsGetDcName' + AWSuffix);
  499. asm
  500. MOV ESP, EBP
  501. POP EBP
  502. JMP [_DsGetDcName]
  503. end;
  504. end;
  505. var
  506. _DsGetSiteNameA: Pointer;
  507. function DsGetSiteNameA;
  508. begin
  509. GetProcedureAddress(_DsGetSiteNameA, netapi32, 'DsGetSiteNameA');
  510. asm
  511. MOV ESP, EBP
  512. POP EBP
  513. JMP [_DsGetSiteNameA]
  514. end;
  515. end;
  516. var
  517. _DsGetSiteNameW: Pointer;
  518. function DsGetSiteNameW;
  519. begin
  520. GetProcedureAddress(_DsGetSiteNameW, netapi32, 'DsGetSiteNameW');
  521. asm
  522. MOV ESP, EBP
  523. POP EBP
  524. JMP [_DsGetSiteNameW]
  525. end;
  526. end;
  527. var
  528. _DsGetSiteName: Pointer;
  529. function DsGetSiteName;
  530. begin
  531. GetProcedureAddress(_DsGetSiteName, netapi32, 'DsGetSiteName' + AWSuffix);
  532. asm
  533. MOV ESP, EBP
  534. POP EBP
  535. JMP [_DsGetSiteName]
  536. end;
  537. end;
  538. var
  539. _DsValidateSubnetNameA: Pointer;
  540. function DsValidateSubnetNameA;
  541. begin
  542. GetProcedureAddress(_DsValidateSubnetNameA, netapi32, 'DsValidateSubnetNameA');
  543. asm
  544. MOV ESP, EBP
  545. POP EBP
  546. JMP [_DsValidateSubnetNameA]
  547. end;
  548. end;
  549. var
  550. _DsValidateSubnetNameW: Pointer;
  551. function DsValidateSubnetNameW;
  552. begin
  553. GetProcedureAddress(_DsValidateSubnetNameW, netapi32, 'DsValidateSubnetNameW');
  554. asm
  555. MOV ESP, EBP
  556. POP EBP
  557. JMP [_DsValidateSubnetNameW]
  558. end;
  559. end;
  560. var
  561. _DsValidateSubnetName: Pointer;
  562. function DsValidateSubnetName;
  563. begin
  564. GetProcedureAddress(_DsValidateSubnetName, netapi32, 'DsValidateSubnetName' + AWSuffix);
  565. asm
  566. MOV ESP, EBP
  567. POP EBP
  568. JMP [_DsValidateSubnetName]
  569. end;
  570. end;
  571. var
  572. _DsAddressToSiteNamesA: Pointer;
  573. function DsAddressToSiteNamesA;
  574. begin
  575. GetProcedureAddress(_DsAddressToSiteNamesA, netapi32, 'DsAddressToSiteNamesA');
  576. asm
  577. MOV ESP, EBP
  578. POP EBP
  579. JMP [_DsAddressToSiteNamesA]
  580. end;
  581. end;
  582. var
  583. _DsAddressToSiteNamesW: Pointer;
  584. function DsAddressToSiteNamesW;
  585. begin
  586. GetProcedureAddress(_DsAddressToSiteNamesW, netapi32, 'DsAddressToSiteNamesW');
  587. asm
  588. MOV ESP, EBP
  589. POP EBP
  590. JMP [_DsAddressToSiteNamesW]
  591. end;
  592. end;
  593. var
  594. _DsAddressToSiteNames: Pointer;
  595. function DsAddressToSiteNames;
  596. begin
  597. GetProcedureAddress(_DsAddressToSiteNames, netapi32, 'DsAddressToSiteNames' + AWSuffix);
  598. asm
  599. MOV ESP, EBP
  600. POP EBP
  601. JMP [_DsAddressToSiteNames]
  602. end;
  603. end;
  604. var
  605. _DsAddressToSiteNamesExA: Pointer;
  606. function DsAddressToSiteNamesExA;
  607. begin
  608. GetProcedureAddress(_DsAddressToSiteNamesExA, netapi32, 'DsAddressToSiteNamesExA');
  609. asm
  610. MOV ESP, EBP
  611. POP EBP
  612. JMP [_DsAddressToSiteNamesExA]
  613. end;
  614. end;
  615. var
  616. _DsAddressToSiteNamesExW: Pointer;
  617. function DsAddressToSiteNamesExW;
  618. begin
  619. GetProcedureAddress(_DsAddressToSiteNamesExW, netapi32, 'DsAddressToSiteNamesExW');
  620. asm
  621. MOV ESP, EBP
  622. POP EBP
  623. JMP [_DsAddressToSiteNamesExW]
  624. end;
  625. end;
  626. var
  627. _DsAddressToSiteNamesEx: Pointer;
  628. function DsAddressToSiteNamesEx;
  629. begin
  630. GetProcedureAddress(_DsAddressToSiteNamesEx, netapi32, 'DsAddressToSiteNamesEx' + AWSuffix);
  631. asm
  632. MOV ESP, EBP
  633. POP EBP
  634. JMP [_DsAddressToSiteNamesEx]
  635. end;
  636. end;
  637. var
  638. _DsEnumerateDomainTrustsA: Pointer;
  639. function DsEnumerateDomainTrustsA;
  640. begin
  641. GetProcedureAddress(_DsEnumerateDomainTrustsA, netapi32, 'DsEnumerateDomainTrustsA');
  642. asm
  643. MOV ESP, EBP
  644. POP EBP
  645. JMP [_DsEnumerateDomainTrustsA]
  646. end;
  647. end;
  648. var
  649. _DsEnumerateDomainTrustsW: Pointer;
  650. function DsEnumerateDomainTrustsW;
  651. begin
  652. GetProcedureAddress(_DsEnumerateDomainTrustsW, netapi32, 'DsEnumerateDomainTrustsW');
  653. asm
  654. MOV ESP, EBP
  655. POP EBP
  656. JMP [_DsEnumerateDomainTrustsW]
  657. end;
  658. end;
  659. var
  660. _DsEnumerateDomainTrusts: Pointer;
  661. function DsEnumerateDomainTrusts;
  662. begin
  663. GetProcedureAddress(_DsEnumerateDomainTrusts, netapi32, 'DsEnumerateDomainTrusts' + AWSuffix);
  664. asm
  665. MOV ESP, EBP
  666. POP EBP
  667. JMP [_DsEnumerateDomainTrusts]
  668. end;
  669. end;
  670. var
  671. _DsGetForestTrustInformationW: Pointer;
  672. function DsGetForestTrustInformationW;
  673. begin
  674. GetProcedureAddress(_DsGetForestTrustInformationW, netapi32, 'DsGetForestTrustInformationW');
  675. asm
  676. MOV ESP, EBP
  677. POP EBP
  678. JMP [_DsGetForestTrustInformationW]
  679. end;
  680. end;
  681. var
  682. _DsMergeForestTrustInformationW: Pointer;
  683. function DsMergeForestTrustInformationW;
  684. begin
  685. GetProcedureAddress(_DsMergeForestTrustInformationW, netapi32, 'DsMergeForestTrustInformationW');
  686. asm
  687. MOV ESP, EBP
  688. POP EBP
  689. JMP [_DsMergeForestTrustInformationW]
  690. end;
  691. end;
  692. var
  693. _DsGetDcSiteCoverageA: Pointer;
  694. function DsGetDcSiteCoverageA;
  695. begin
  696. GetProcedureAddress(_DsGetDcSiteCoverageA, netapi32, 'DsGetDcSiteCoverageA');
  697. asm
  698. MOV ESP, EBP
  699. POP EBP
  700. JMP [_DsGetDcSiteCoverageA]
  701. end;
  702. end;
  703. var
  704. _DsGetDcSiteCoverageW: Pointer;
  705. function DsGetDcSiteCoverageW;
  706. begin
  707. GetProcedureAddress(_DsGetDcSiteCoverageW, netapi32, 'DsGetDcSiteCoverageW');
  708. asm
  709. MOV ESP, EBP
  710. POP EBP
  711. JMP [_DsGetDcSiteCoverageW]
  712. end;
  713. end;
  714. var
  715. _DsGetDcSiteCoverage: Pointer;
  716. function DsGetDcSiteCoverage;
  717. begin
  718. GetProcedureAddress(_DsGetDcSiteCoverage, netapi32, 'DsGetDcSiteCoverage' + AWSuffix);
  719. asm
  720. MOV ESP, EBP
  721. POP EBP
  722. JMP [_DsGetDcSiteCoverage]
  723. end;
  724. end;
  725. var
  726. _DsDeregisterDnsHostRecordsA: Pointer;
  727. function DsDeregisterDnsHostRecordsA;
  728. begin
  729. GetProcedureAddress(_DsDeregisterDnsHostRecordsA, netapi32, 'DsDeregisterDnsHostRecordsA');
  730. asm
  731. MOV ESP, EBP
  732. POP EBP
  733. JMP [_DsDeregisterDnsHostRecordsA]
  734. end;
  735. end;
  736. var
  737. _DsDeregisterDnsHostRecordsW: Pointer;
  738. function DsDeregisterDnsHostRecordsW;
  739. begin
  740. GetProcedureAddress(_DsDeregisterDnsHostRecordsW, netapi32, 'DsDeregisterDnsHostRecordsW');
  741. asm
  742. MOV ESP, EBP
  743. POP EBP
  744. JMP [_DsDeregisterDnsHostRecordsW]
  745. end;
  746. end;
  747. var
  748. _DsDeregisterDnsHostRecords: Pointer;
  749. function DsDeregisterDnsHostRecords;
  750. begin
  751. GetProcedureAddress(_DsDeregisterDnsHostRecords, netapi32, 'DsDeregisterDnsHostRecords' + AWSuffix);
  752. asm
  753. MOV ESP, EBP
  754. POP EBP
  755. JMP [_DsDeregisterDnsHostRecords]
  756. end;
  757. end;
  758. var
  759. _DsGetDcOpenW: Pointer;
  760. function DsGetDcOpenW;
  761. begin
  762. GetProcedureAddress(_DsGetDcOpenW, netapi32, 'DsGetDcOpenW');
  763. asm
  764. MOV ESP, EBP
  765. POP EBP
  766. JMP [_DsGetDcOpenW]
  767. end;
  768. end;
  769. var
  770. _DsGetDcOpenA: Pointer;
  771. function DsGetDcOpenA;
  772. begin
  773. GetProcedureAddress(_DsGetDcOpenA, netapi32, 'DsGetDcOpenA');
  774. asm
  775. MOV ESP, EBP
  776. POP EBP
  777. JMP [_DsGetDcOpenA]
  778. end;
  779. end;
  780. var
  781. _DsGetDcOpen: Pointer;
  782. function DsGetDcOpen;
  783. begin
  784. GetProcedureAddress(_DsGetDcOpen, netapi32, 'DsGetDcOpen' + AWSuffix);
  785. asm
  786. MOV ESP, EBP
  787. POP EBP
  788. JMP [_DsGetDcOpen]
  789. end;
  790. end;
  791. var
  792. _DsGetDcNextW: Pointer;
  793. function DsGetDcNextW;
  794. begin
  795. GetProcedureAddress(_DsGetDcNextW, netapi32, 'DsGetDcNextW');
  796. asm
  797. MOV ESP, EBP
  798. POP EBP
  799. JMP [_DsGetDcNextW]
  800. end;
  801. end;
  802. var
  803. _DsGetDcNextA: Pointer;
  804. function DsGetDcNextA;
  805. begin
  806. GetProcedureAddress(_DsGetDcNextA, netapi32, 'DsGetDcNextA');
  807. asm
  808. MOV ESP, EBP
  809. POP EBP
  810. JMP [_DsGetDcNextA]
  811. end;
  812. end;
  813. var
  814. _DsGetDcNext: Pointer;
  815. function DsGetDcNext;
  816. begin
  817. GetProcedureAddress(_DsGetDcNext, netapi32, 'DsGetDcNext' + AWSuffix);
  818. asm
  819. MOV ESP, EBP
  820. POP EBP
  821. JMP [_DsGetDcNext]
  822. end;
  823. end;
  824. var
  825. _DsGetDcCloseW: Pointer;
  826. procedure DsGetDcCloseW;
  827. begin
  828. GetProcedureAddress(_DsGetDcCloseW, netapi32, 'DsGetDcCloseW');
  829. asm
  830. MOV ESP, EBP
  831. POP EBP
  832. JMP [_DsGetDcCloseW]
  833. end;
  834. end;
  835. var
  836. _DsGetDcClose: Pointer;
  837. procedure DsGetDcClose;
  838. begin
  839. GetProcedureAddress(_DsGetDcClose, netapi32, 'DsGetDcClose');
  840. asm
  841. MOV ESP, EBP
  842. POP EBP
  843. JMP [_DsGetDcClose]
  844. end;
  845. end;
  846. {$ELSE}
  847. function DsGetDcNameA; external netapi32 name 'DsGetDcNameA';
  848. function DsGetDcNameW; external netapi32 name 'DsGetDcNameW';
  849. function DsGetDcName; external netapi32 name 'DsGetDcName' + AWSuffix;
  850. function DsGetSiteNameA; external netapi32 name 'DsGetSiteNameA';
  851. function DsGetSiteNameW; external netapi32 name 'DsGetSiteNameW';
  852. function DsGetSiteName; external netapi32 name 'DsGetSiteName' + AWSuffix;
  853. function DsValidateSubnetNameA; external netapi32 name 'DsValidateSubnetNameA';
  854. function DsValidateSubnetNameW; external netapi32 name 'DsValidateSubnetNameW';
  855. function DsValidateSubnetName; external netapi32 name 'DsValidateSubnetName' + AWSuffix;
  856. function DsAddressToSiteNamesA; external netapi32 name 'DsAddressToSiteNamesA';
  857. function DsAddressToSiteNamesW; external netapi32 name 'DsAddressToSiteNamesW';
  858. function DsAddressToSiteNames; external netapi32 name 'DsAddressToSiteNames' + AWSuffix;
  859. function DsAddressToSiteNamesExA; external netapi32 name 'DsAddressToSiteNamesExA';
  860. function DsAddressToSiteNamesExW; external netapi32 name 'DsAddressToSiteNamesExW';
  861. function DsAddressToSiteNamesEx; external netapi32 name 'DsAddressToSiteNamesEx' + AWSuffix;
  862. function DsEnumerateDomainTrustsA; external netapi32 name 'DsEnumerateDomainTrustsA';
  863. function DsEnumerateDomainTrustsW; external netapi32 name 'DsEnumerateDomainTrustsW';
  864. function DsEnumerateDomainTrusts; external netapi32 name 'DsEnumerateDomainTrusts' + AWSuffix;
  865. function DsGetForestTrustInformationW; external netapi32 name 'DsGetForestTrustInformationW';
  866. function DsMergeForestTrustInformationW; external netapi32 name 'DsMergeForestTrustInformationW';
  867. function DsGetDcSiteCoverageA; external netapi32 name 'DsGetDcSiteCoverageA';
  868. function DsGetDcSiteCoverageW; external netapi32 name 'DsGetDcSiteCoverageW';
  869. function DsGetDcSiteCoverage; external netapi32 name 'DsGetDcSiteCoverage' + AWSuffix;
  870. function DsDeregisterDnsHostRecordsA; external netapi32 name 'DsDeregisterDnsHostRecordsA';
  871. function DsDeregisterDnsHostRecordsW; external netapi32 name 'DsDeregisterDnsHostRecordsW';
  872. function DsDeregisterDnsHostRecords; external netapi32 name 'DsDeregisterDnsHostRecords' + AWSuffix;
  873. function DsGetDcOpenW; external netapi32 name 'DsGetDcOpenW';
  874. function DsGetDcOpenA; external netapi32 name 'DsGetDcOpenA';
  875. function DsGetDcOpen; external netapi32 name 'DsGetDcOpen' + AWSuffix;
  876. function DsGetDcNextW; external netapi32 name 'DsGetDcNextW';
  877. function DsGetDcNextA; external netapi32 name 'DsGetDcNextA';
  878. function DsGetDcNext; external netapi32 name 'DsGetDcNext' + AWSuffix;
  879. procedure DsGetDcCloseW; external netapi32 name 'DsGetDcCloseW';
  880. procedure DsGetDcClose; external netapi32 name 'DsGetDcClose';
  881. {$ENDIF DYNAMIC_LINK}
  882. end.