jwadsgetdc.pas 31 KB

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