1 /**
2  * Windows API header module
3  *
4  * Translated from MinGW Windows headers
5  *
6  * Authors: Stewart Gordon
7  * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
8  * Source: $(DRUNTIMESRC core/sys/windows/_winldap.d)
9  */
10 /// Automatically imported and edited from the druntime module
11 /// core.sys.windows.winldap for the auto-generated win32 package.
12 module win32.winldap;
13 //version (Windows):
14 @system:
15 
16 version (ANSI) {} else version = Unicode;
17 
18 /* Comment from MinGW
19   winldap.h - Header file for the Windows LDAP API
20 
21   Written by Filip Navara <xnavara@volny.cz>
22 
23   References:
24     The C LDAP Application Program Interface
25     http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt
26 
27     Lightweight Directory Access Protocol Reference
28     http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp
29 
30   This library is distributed in the hope that it will be useful,
31   but WITHOUT ANY WARRANTY; without even the implied warranty of
32   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
33 */
34 
35 import win32.schannel, win32.winber;
36 import win32.wincrypt, win32.windef;
37 
38 //align(4):
39 
40 enum {
41     LDAP_VERSION1    = 1,
42     LDAP_VERSION2    = 2,
43     LDAP_VERSION3    = 3,
44     LDAP_VERSION     = LDAP_VERSION2,
45     LDAP_VERSION_MIN = LDAP_VERSION2,
46     LDAP_VERSION_MAX = LDAP_VERSION3
47 }
48 
49 /*  MinGW defines ANSI and Unicode versions as LDAP_VENDOR_NAME and
50  *  LDAP_VENDOR_NAME_W respectively; similarly with other string constants
51  *  defined in this module.
52  */
53 const TCHAR[] LDAP_VENDOR_NAME = "Microsoft Corporation.";
54 
55 enum LDAP_API_VERSION          = 2004;
56 enum LDAP_VENDOR_VERSION       =  510;
57 enum LDAP_API_INFO_VERSION     =    1;
58 enum LDAP_FEATURE_INFO_VERSION =    1;
59 
60 enum {
61     LDAP_SUCCESS                    = 0x00,
62     LDAP_OPT_SUCCESS                = LDAP_SUCCESS,
63     LDAP_OPERATIONS_ERROR,
64     LDAP_PROTOCOL_ERROR,
65     LDAP_TIMELIMIT_EXCEEDED,
66     LDAP_SIZELIMIT_EXCEEDED,
67     LDAP_COMPARE_FALSE,
68     LDAP_COMPARE_TRUE,
69     LDAP_STRONG_AUTH_NOT_SUPPORTED,
70     LDAP_AUTH_METHOD_NOT_SUPPORTED  = LDAP_STRONG_AUTH_NOT_SUPPORTED,
71     LDAP_STRONG_AUTH_REQUIRED,
72     LDAP_REFERRAL_V2,
73     LDAP_PARTIAL_RESULTS            = LDAP_REFERRAL_V2,
74     LDAP_REFERRAL,
75     LDAP_ADMIN_LIMIT_EXCEEDED,
76     LDAP_UNAVAILABLE_CRIT_EXTENSION,
77     LDAP_CONFIDENTIALITY_REQUIRED,
78     LDAP_SASL_BIND_IN_PROGRESS,  // = 0x0e
79     LDAP_NO_SUCH_ATTRIBUTE          = 0x10,
80     LDAP_UNDEFINED_TYPE,
81     LDAP_INAPPROPRIATE_MATCHING,
82     LDAP_CONSTRAINT_VIOLATION,
83     LDAP_TYPE_OR_VALUE_EXISTS,
84     LDAP_ATTRIBUTE_OR_VALUE_EXISTS  = LDAP_TYPE_OR_VALUE_EXISTS,
85     LDAP_INVALID_SYNTAX,         // = 0x15
86     LDAP_NO_SUCH_OBJECT             = 0x20,
87     LDAP_ALIAS_PROBLEM,
88     LDAP_INVALID_DN_SYNTAX,
89     LDAP_IS_LEAF,
90     LDAP_ALIAS_DEREF_PROBLEM,    // = 0x24
91     LDAP_INAPPROPRIATE_AUTH         = 0x30,
92     LDAP_INVALID_CREDENTIALS,
93     LDAP_INSUFFICIENT_ACCESS,
94     LDAP_INSUFFICIENT_RIGHTS        = LDAP_INSUFFICIENT_ACCESS,
95     LDAP_BUSY,
96     LDAP_UNAVAILABLE,
97     LDAP_UNWILLING_TO_PERFORM,
98     LDAP_LOOP_DETECT,            // = 0x36
99     LDAP_NAMING_VIOLATION           = 0x40,
100     LDAP_OBJECT_CLASS_VIOLATION,
101     LDAP_NOT_ALLOWED_ON_NONLEAF,
102     LDAP_NOT_ALLOWED_ON_RDN,
103     LDAP_ALREADY_EXISTS,
104     LDAP_NO_OBJECT_CLASS_MODS,
105     LDAP_RESULTS_TOO_LARGE,
106     LDAP_AFFECTS_MULTIPLE_DSAS,  // = 0x47
107     LDAP_OTHER                      = 0x50,
108     LDAP_SERVER_DOWN,
109     LDAP_LOCAL_ERROR,
110     LDAP_ENCODING_ERROR,
111     LDAP_DECODING_ERROR,
112     LDAP_TIMEOUT,
113     LDAP_AUTH_UNKNOWN,
114     LDAP_FILTER_ERROR,
115     LDAP_USER_CANCELLED,
116     LDAP_PARAM_ERROR,
117     LDAP_NO_MEMORY,
118     LDAP_CONNECT_ERROR,
119     LDAP_NOT_SUPPORTED,
120     LDAP_CONTROL_NOT_FOUND,
121     LDAP_NO_RESULTS_RETURNED,
122     LDAP_MORE_RESULTS_TO_RETURN,
123     LDAP_CLIENT_LOOP,
124     LDAP_REFERRAL_LIMIT_EXCEEDED // = 0x61
125 }
126 
127 enum {
128     LDAP_PORT        =  389,
129     LDAP_SSL_PORT    =  636,
130     LDAP_GC_PORT     = 3268,
131     LDAP_SSL_GC_PORT = 3269
132 }
133 
134 enum void*
135     LDAP_OPT_OFF = null,
136     LDAP_OPT_ON = cast(void*) 1;
137 
138 enum {
139     LDAP_OPT_API_INFO               = 0x00,
140     LDAP_OPT_DESC,
141     LDAP_OPT_DEREF,
142     LDAP_OPT_SIZELIMIT,
143     LDAP_OPT_TIMELIMIT,
144     LDAP_OPT_THREAD_FN_PTRS,
145     LDAP_OPT_REBIND_FN,
146     LDAP_OPT_REBIND_ARG,
147     LDAP_OPT_REFERRALS,
148     LDAP_OPT_RESTART,
149     LDAP_OPT_SSL,
150     LDAP_OPT_TLS                    = LDAP_OPT_SSL,
151     LDAP_OPT_IO_FN_PTRS,         // = 0x0b
152     LDAP_OPT_CACHE_FN_PTRS          = 0x0d,
153     LDAP_OPT_CACHE_STRATEGY,
154     LDAP_OPT_CACHE_ENABLE,
155     LDAP_OPT_REFERRAL_HOP_LIMIT,
156     LDAP_OPT_PROTOCOL_VERSION,
157     LDAP_OPT_VERSION                = LDAP_OPT_PROTOCOL_VERSION,
158     LDAP_OPT_SERVER_CONTROLS,
159     LDAP_OPT_CLIENT_CONTROLS,    // = 0x13
160     LDAP_OPT_API_FEATURE_INFO       = 0x15,
161     LDAP_OPT_HOST_NAME              = 0x30,
162     LDAP_OPT_ERROR_NUMBER,
163     LDAP_OPT_ERROR_STRING,
164     LDAP_OPT_SERVER_ERROR,
165     LDAP_OPT_SERVER_EXT_ERROR,   // = 0x34
166     LDAP_OPT_PING_KEEP_ALIVE        = 0x36,
167     LDAP_OPT_PING_WAIT_TIME,
168     LDAP_OPT_PING_LIMIT,         // = 0x38
169     LDAP_OPT_DNSDOMAIN_NAME         = 0x3b,
170     LDAP_OPT_GETDSNAME_FLAGS        = 0x3d,
171     LDAP_OPT_HOST_REACHABLE,
172     LDAP_OPT_PROMPT_CREDENTIALS,
173     LDAP_OPT_TCP_KEEPALIVE,      // = 0x40
174     LDAP_OPT_REFERRAL_CALLBACK      = 0x70,
175     LDAP_OPT_CLIENT_CERTIFICATE     = 0x80,
176     LDAP_OPT_SERVER_CERTIFICATE, // = 0x81
177     LDAP_OPT_AUTO_RECONNECT         = 0x91,
178     LDAP_OPT_SSPI_FLAGS,
179     LDAP_OPT_SSL_INFO,
180     LDAP_OPT_TLS_INFO               = LDAP_OPT_SSL_INFO,
181     LDAP_OPT_REF_DEREF_CONN_PER_MSG,
182     LDAP_OPT_SIGN,
183     LDAP_OPT_ENCRYPT,
184     LDAP_OPT_SASL_METHOD,
185     LDAP_OPT_AREC_EXCLUSIVE,
186     LDAP_OPT_SECURITY_CONTEXT,
187     LDAP_OPT_ROOTDSE_CACHE       // = 0x9a
188 }
189 
190 enum {
191     LDAP_DEREF_NEVER,
192     LDAP_DEREF_SEARCHING,
193     LDAP_DEREF_FINDING,
194     LDAP_DEREF_ALWAYS
195 }
196 
197 enum LDAP_NO_LIMIT = 0;
198 
199 const TCHAR[] LDAP_CONTROL_REFERRALS = "1.2.840.113556.1.4.616";
200 
201 // FIXME: check type (declared with U suffix in MinGW)
202 enum : uint {
203     LDAP_CHASE_SUBORDINATE_REFERRALS = 0x20,
204     LDAP_CHASE_EXTERNAL_REFERRALS    = 0x40
205 }
206 
207 enum {
208     LDAP_SCOPE_DEFAULT = -1,
209     LDAP_SCOPE_BASE,
210     LDAP_SCOPE_ONELEVEL,
211     LDAP_SCOPE_SUBTREE
212 }
213 
214 enum {
215     LDAP_MOD_ADD,
216     LDAP_MOD_DELETE,
217     LDAP_MOD_REPLACE,
218     LDAP_MOD_BVALUES = 0x80
219 }
220 
221 enum : int {
222     LDAP_RES_BIND             = 0x61,
223     LDAP_RES_SEARCH_ENTRY     = 0x64,
224     LDAP_RES_SEARCH_RESULT    = 0x65,
225     LDAP_RES_MODIFY           = 0x67,
226     LDAP_RES_ADD              = 0x69,
227     LDAP_RES_DELETE           = 0x6b,
228     LDAP_RES_MODRDN           = 0x6d,
229     LDAP_RES_COMPARE          = 0x6f,
230     LDAP_RES_SEARCH_REFERENCE = 0x73,
231     LDAP_RES_EXTENDED         = 0x78,
232     LDAP_RES_ANY              = -1
233 }
234 
235 enum {
236     LDAP_MSG_ONE,
237     LDAP_MSG_ALL,
238     LDAP_MSG_RECEIVED
239 }
240 
241 const TCHAR[]
242     LDAP_SERVER_SORT_OID         = "1.2.840.113556.1.4.473",
243     LDAP_SERVER_RESP_SORT_OID    = "1.2.840.113556.1.4.474",
244     LDAP_PAGED_RESULT_OID_STRING = "1.2.840.113556.1.4.319",
245     LDAP_CONTROL_VLVREQUEST      = "2.16.840.1.113730.3.4.9",
246     LDAP_CONTROL_VLVRESPONSE     = "2.16.840.1.113730.3.4.10",
247     LDAP_START_TLS_OID           = "1.3.6.1.4.1.1466.20037",
248     LDAP_TTL_EXTENDED_OP_OID     = "1.3.6.1.4.1.1466.101.119.1";
249 
250 enum {
251     LDAP_AUTH_NONE      = 0x00U,
252     LDAP_AUTH_SIMPLE    = 0x80U,
253     LDAP_AUTH_SASL      = 0x83U,
254     LDAP_AUTH_OTHERKIND = 0x86U,
255     LDAP_AUTH_EXTERNAL  = LDAP_AUTH_OTHERKIND | 0x0020U,
256     LDAP_AUTH_SICILY    = LDAP_AUTH_OTHERKIND | 0x0200U,
257     LDAP_AUTH_NEGOTIATE = LDAP_AUTH_OTHERKIND | 0x0400U,
258     LDAP_AUTH_MSN       = LDAP_AUTH_OTHERKIND | 0x0800U,
259     LDAP_AUTH_NTLM      = LDAP_AUTH_OTHERKIND | 0x1000U,
260     LDAP_AUTH_DIGEST    = LDAP_AUTH_OTHERKIND | 0x4000U,
261     LDAP_AUTH_DPA       = LDAP_AUTH_OTHERKIND | 0x2000U,
262     LDAP_AUTH_SSPI      = LDAP_AUTH_NEGOTIATE
263 }
264 
265 enum {
266     LDAP_FILTER_AND        = 0xa0,
267     LDAP_FILTER_OR,
268     LDAP_FILTER_NOT,
269     LDAP_FILTER_EQUALITY,
270     LDAP_FILTER_SUBSTRINGS,
271     LDAP_FILTER_GE,
272     LDAP_FILTER_LE,     // = 0xa6
273     LDAP_FILTER_APPROX     = 0xa8,
274     LDAP_FILTER_EXTENSIBLE,
275     LDAP_FILTER_PRESENT    = 0x87
276 }
277 
278 enum {
279     LDAP_SUBSTRING_INITIAL = 0x80,
280     LDAP_SUBSTRING_ANY,
281     LDAP_SUBSTRING_FINAL
282 }
283 
284 // should be opaque structure
285 struct LDAP {
286     struct _ld_sp {
287         UINT_PTR sb_sd;
288         UCHAR[(10*ULONG.sizeof)+1] Reserved1;
289         ULONG_PTR sb_naddr;
290         UCHAR[(6*ULONG.sizeof)] Reserved2;
291     }
292     _ld_sp   ld_sp;
293     PCHAR    ld_host;
294     ULONG    ld_version;
295     UCHAR    ld_lberoptions;
296     int      ld_deref;
297     int      ld_timelimit;
298     int      ld_sizelimit;
299     int      ld_errno;
300     PCHAR    ld_matched;
301     PCHAR    ld_error;
302 }
303 alias LDAP* PLDAP;
304 
305 // should be opaque structure
306 struct LDAPMessage {
307     ULONG        lm_msgid;
308     ULONG        lm_msgtype;
309     BerElement*  lm_ber;
310     LDAPMessage* lm_chain;
311     LDAPMessage* lm_next;
312     ULONG        lm_time;
313 }
314 alias LDAPMessage* PLDAPMessage;
315 
316 struct LDAP_TIMEVAL {
317     LONG tv_sec;
318     LONG tv_usec;
319 }
320 alias LDAP_TIMEVAL* PLDAP_TIMEVAL;
321 
322 struct LDAPAPIInfoA {
323     int    ldapai_info_version;
324     int    ldapai_api_version;
325     int    ldapai_protocol_version;
326     char** ldapai_extensions;
327     char*  ldapai_vendor_name;
328     int    ldapai_vendor_version;
329 }
330 alias LDAPAPIInfoA* PLDAPAPIInfoA;
331 
332 struct LDAPAPIInfoW {
333     int     ldapai_info_version;
334     int     ldapai_api_version;
335     int     ldapai_protocol_version;
336     PWCHAR* ldapai_extensions;
337     PWCHAR  ldapai_vendor_name;
338     int     ldapai_vendor_version;
339 }
340 alias LDAPAPIInfoW* PLDAPAPIInfoW;
341 
342 struct LDAPAPIFeatureInfoA {
343     int   ldapaif_info_version;
344     char* ldapaif_name;
345     int   ldapaif_version;
346 }
347 alias LDAPAPIFeatureInfoA* PLDAPAPIFeatureInfoA;
348 
349 struct LDAPAPIFeatureInfoW {
350     int    ldapaif_info_version;
351     PWCHAR ldapaif_name;
352     int    ldapaif_version;
353 }
354 alias LDAPAPIFeatureInfoW* PLDAPAPIFeatureInfoW;
355 
356 struct LDAPControlA {
357     PCHAR    ldctl_oid;
358     BerValue ldctl_value;
359     BOOLEAN  ldctl_iscritical;
360 }
361 alias LDAPControlA* PLDAPControlA;
362 
363 struct LDAPControlW {
364     PWCHAR   ldctl_oid;
365     BerValue ldctl_value;
366     BOOLEAN  ldctl_iscritical;
367 }
368 alias LDAPControlW* PLDAPControlW;
369 
370 /*  Do we really need these?  In MinGW, LDAPModA/W have only mod_op, mod_type
371  *  and mod_vals, and macros are used to simulate anonymous unions in those
372  *  structures.
373  */
374 union mod_vals_u_tA {
375     PCHAR*     modv_strvals;
376     BerValue** modv_bvals;
377 }
378 
379 union mod_vals_u_tW {
380     PWCHAR*    modv_strvals;
381     BerValue** modv_bvals;
382 }
383 
384 struct LDAPModA {
385     ULONG         mod_op;
386     PCHAR         mod_type;
387 
388     union {
389         mod_vals_u_tA mod_vals;
390         // The following members are defined as macros in MinGW.
391         PCHAR*        mod_values;
392         BerValue**    mod_bvalues;
393     }
394 }
395 alias LDAPModA* PLDAPModA;
396 
397 struct LDAPModW {
398     ULONG         mod_op;
399     PWCHAR        mod_type;
400 
401     union {
402         mod_vals_u_tW mod_vals;
403         // The following members are defined as macros in MinGW.
404         PWCHAR*       mod_values;
405         BerValue**    mod_bvalues;
406     }
407 }
408 alias LDAPModW* PLDAPModW;
409 
410 /* Opaque structure
411  *  http://msdn.microsoft.com/library/en-us/ldap/ldap/ldapsearch.asp
412  */
413 struct LDAPSearch;
414 alias LDAPSearch* PLDAPSearch;
415 
416 struct LDAPSortKeyA {
417     PCHAR   sk_attrtype;
418     PCHAR   sk_matchruleoid;
419     BOOLEAN sk_reverseorder;
420 }
421 alias LDAPSortKeyA* PLDAPSortKeyA;
422 
423 struct LDAPSortKeyW {
424     PWCHAR  sk_attrtype;
425     PWCHAR  sk_matchruleoid;
426     BOOLEAN sk_reverseorder;
427 }
428 alias LDAPSortKeyW* PLDAPSortKeyW;
429 
430 /*  MinGW defines these as immediate function typedefs, which don't translate
431  *  well into D.
432  */
433 extern (C) {
434     alias ULONG function(PLDAP, PLDAP, PWCHAR, PCHAR, ULONG, PVOID, PVOID,
435       PLDAP*) QUERYFORCONNECTION;
436     alias BOOLEAN function(PLDAP, PLDAP, PWCHAR, PCHAR, PLDAP, ULONG, PVOID,
437       PVOID, ULONG) NOTIFYOFNEWCONNECTION;
438     alias ULONG function(PLDAP, PLDAP) DEREFERENCECONNECTION;
439     alias BOOLEAN function(PLDAP, PSecPkgContext_IssuerListInfoEx,
440       PCCERT_CONTEXT*) QUERYCLIENTCERT;
441 }
442 
443 struct LDAP_REFERRAL_CALLBACK {
444     ULONG                  SizeOfCallbacks;
445     QUERYFORCONNECTION*    QueryForConnection;
446     NOTIFYOFNEWCONNECTION* NotifyRoutine;
447     DEREFERENCECONNECTION* DereferenceRoutine;
448 }
449 alias LDAP_REFERRAL_CALLBACK* PLDAP_REFERRAL_CALLBACK;
450 
451 struct LDAPVLVInfo {
452     int       ldvlv_version;
453     uint      ldvlv_before_count;
454     uint      ldvlv_after_count;
455     uint      ldvlv_offset;
456     uint      ldvlv_count;
457     BerValue* ldvlv_attrvalue;
458     BerValue* ldvlv_context;
459     void*     ldvlv_extradata;
460 }
461 
462 /*
463  * Under Microsoft WinLDAP the function ldap_error is only stub.
464  * This macro uses LDAP structure to get error string and pass it to the user.
465  */
466 private extern (C) int printf(const scope char* format, ...);
467 int ldap_perror()(LDAP* handle, char* message) {
468     return printf("%s: %s\n", message, handle.ld_error);
469 }
470 
471 /*  FIXME: In MinGW, these are WINLDAPAPI == DECLSPEC_IMPORT.  Linkage
472  *  attribute?
473  */
474 extern (C) {
475     PLDAP ldap_initA(PCHAR, ULONG);
476     PLDAP ldap_initW(PWCHAR, ULONG);
477     PLDAP ldap_openA(PCHAR, ULONG);
478     PLDAP ldap_openW(PWCHAR, ULONG);
479     PLDAP cldap_openA(PCHAR, ULONG);
480     PLDAP cldap_openW(PWCHAR, ULONG);
481     ULONG ldap_connect(LDAP*, LDAP_TIMEVAL*);
482     PLDAP ldap_sslinitA(PCHAR, ULONG, int);
483     PLDAP ldap_sslinitW(PWCHAR, ULONG, int);
484     ULONG ldap_start_tls_sA(LDAP*, PLDAPControlA*, PLDAPControlA*);
485     ULONG ldap_start_tls_sW(LDAP*, PLDAPControlW*, PLDAPControlW*);
486     BOOLEAN ldap_stop_tls_s(LDAP*);
487     ULONG ldap_get_optionA(LDAP*, int, void*);
488     ULONG ldap_get_optionW(LDAP*, int, void*);
489     ULONG ldap_set_optionA(LDAP*, int, void*);
490     ULONG ldap_set_optionW(LDAP*, int, void*);
491     ULONG ldap_control_freeA(LDAPControlA*);
492     ULONG ldap_control_freeW(LDAPControlW*);
493     ULONG ldap_controls_freeA(LDAPControlA**);
494     ULONG ldap_controls_freeW(LDAPControlW**);
495     ULONG ldap_free_controlsA(LDAPControlA**);
496     ULONG ldap_free_controlsW(LDAPControlW**);
497     ULONG ldap_sasl_bindA(LDAP*, PCSTR, PCSTR, BERVAL*, PLDAPControlA*,
498       PLDAPControlA*, int*);
499     ULONG ldap_sasl_bindW(LDAP*, PCWSTR, PCWSTR, BERVAL*, PLDAPControlW*,
500       PLDAPControlW*, int*);
501     ULONG ldap_sasl_bind_sA(LDAP*, PCSTR, PCSTR, BERVAL*, PLDAPControlA*,
502       PLDAPControlA*, PBERVAL*);
503     ULONG ldap_sasl_bind_sW(LDAP*, PCWSTR, PCWSTR, BERVAL*, PLDAPControlW*,
504       PLDAPControlW*, PBERVAL*);
505     ULONG ldap_simple_bindA(LDAP*, PSTR, PSTR);
506     ULONG ldap_simple_bindW(LDAP*, PWSTR, PWSTR);
507     ULONG ldap_simple_bind_sA(LDAP*, PSTR, PSTR);
508     ULONG ldap_simple_bind_sW(LDAP*, PWSTR, PWSTR);
509     ULONG ldap_unbind(LDAP*);
510     ULONG ldap_unbind_s(LDAP*);
511     ULONG ldap_search_extA(LDAP*, PCSTR, ULONG, PCSTR, PZPSTR, ULONG,
512       PLDAPControlA*, PLDAPControlA*, ULONG, ULONG, ULONG*);
513     ULONG ldap_search_extW(LDAP*, PCWSTR, ULONG, PCWSTR, PZPWSTR, ULONG,
514       PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, ULONG*);
515     ULONG ldap_search_ext_sA(LDAP*, PCSTR, ULONG, PCSTR, PZPSTR, ULONG,
516       PLDAPControlA*, PLDAPControlA*, LDAP_TIMEVAL*, ULONG, PLDAPMessage*);
517     ULONG ldap_search_ext_sW(LDAP*, PCWSTR, ULONG, PCWSTR, PZPWSTR, ULONG,
518       PLDAPControlW*, PLDAPControlW*, LDAP_TIMEVAL*, ULONG, PLDAPMessage*);
519     ULONG ldap_searchA(LDAP*, PCSTR, ULONG, PCSTR, PZPSTR, ULONG);
520     ULONG ldap_searchW(LDAP*, PCWSTR, ULONG, PCWSTR, PZPWSTR, ULONG);
521     ULONG ldap_search_sA(LDAP*, PCSTR, ULONG, PCSTR, PZPSTR, ULONG,
522       PLDAPMessage*);
523     ULONG ldap_search_sW(LDAP*, PCWSTR, ULONG, PCWSTR, PZPWSTR, ULONG,
524       PLDAPMessage*);
525     ULONG ldap_search_stA(LDAP*, PCSTR, ULONG, PCSTR, PZPSTR, ULONG,
526       LDAP_TIMEVAL*, PLDAPMessage*);
527     ULONG ldap_search_stW(LDAP*, PCWSTR, ULONG, PCWSTR, PZPWSTR, ULONG,
528       LDAP_TIMEVAL*, PLDAPMessage*);
529     ULONG ldap_compare_extA(LDAP*, PCSTR, PCSTR, PCSTR, BerValue*,
530       PLDAPControlA*, PLDAPControlA*, ULONG*);
531     ULONG ldap_compare_extW(LDAP*, PCWSTR, PCWSTR, PCWSTR, BerValue*,
532       PLDAPControlW*, PLDAPControlW*, ULONG*);
533     ULONG ldap_compare_ext_sA(LDAP*, PCSTR, PCSTR, PCSTR, BerValue*,
534       PLDAPControlA*, PLDAPControlA*);
535     ULONG ldap_compare_ext_sW(LDAP*, PCWSTR, PCWSTR, PCWSTR, BerValue*,
536       PLDAPControlW*, PLDAPControlW*);
537     ULONG ldap_compareA(LDAP*, PCSTR, PCSTR, PCSTR);
538     ULONG ldap_compareW(LDAP*, PCWSTR, PCWSTR, PCWSTR);
539     ULONG ldap_compare_sA(LDAP*, PCSTR, PCSTR, PCSTR);
540     ULONG ldap_compare_sW(LDAP*, PCWSTR, PCWSTR, PCWSTR);
541     ULONG ldap_modify_extA(LDAP*, PCSTR, LDAPModA**, PLDAPControlA*,
542       PLDAPControlA*, ULONG*);
543     ULONG ldap_modify_extW(LDAP*, PCWSTR, LDAPModW**, PLDAPControlW*,
544       PLDAPControlW*, ULONG*);
545     ULONG ldap_modify_ext_sA(LDAP*, PCSTR, LDAPModA**, PLDAPControlA*,
546       PLDAPControlA*);
547     ULONG ldap_modify_ext_sW(LDAP*, PCWSTR, LDAPModW**, PLDAPControlW*,
548       PLDAPControlW*);
549     ULONG ldap_modifyA(LDAP*, PSTR, LDAPModA**);
550     ULONG ldap_modifyW(LDAP*, PWSTR, LDAPModW**);
551     ULONG ldap_modify_sA(LDAP*, PSTR, LDAPModA**);
552     ULONG ldap_modify_sW(LDAP*, PWSTR, LDAPModW**);
553     ULONG ldap_rename_extA(LDAP*, PCSTR, PCSTR, PCSTR, INT, PLDAPControlA*,
554       PLDAPControlA*, ULONG*);
555     ULONG ldap_rename_extW(LDAP*, PCWSTR, PCWSTR, PCWSTR, INT, PLDAPControlW*,
556       PLDAPControlW*, ULONG*);
557     ULONG ldap_rename_ext_sA(LDAP*, PCSTR, PCSTR, PCSTR, INT,
558       PLDAPControlA*, PLDAPControlA*);
559     ULONG ldap_rename_ext_sW(LDAP*, PCWSTR, PCWSTR, PCWSTR, INT,
560       PLDAPControlW*, PLDAPControlW*);
561     ULONG ldap_add_extA(LDAP*, PCSTR, LDAPModA**, PLDAPControlA*,
562       PLDAPControlA*, ULONG*);
563     ULONG ldap_add_extW(LDAP*, PCWSTR, LDAPModW**, PLDAPControlW*,
564       PLDAPControlW*, ULONG*);
565     ULONG ldap_add_ext_sA(LDAP*, PCSTR, LDAPModA**, PLDAPControlA*,
566       PLDAPControlA*);
567     ULONG ldap_add_ext_sW(LDAP*, PCWSTR, LDAPModW**, PLDAPControlW*,
568       PLDAPControlW*);
569     ULONG ldap_addA(LDAP*, PSTR, LDAPModA**);
570     ULONG ldap_addW(LDAP*, PWSTR, LDAPModW**);
571     ULONG ldap_add_sA(LDAP*, PSTR, LDAPModA**);
572     ULONG ldap_add_sW(LDAP*, PWSTR, LDAPModW**);
573     ULONG ldap_delete_extA(LDAP*, PCSTR, PLDAPControlA*, PLDAPControlA*,
574       ULONG*);
575     ULONG ldap_delete_extW(LDAP*, PCWSTR, PLDAPControlW*, PLDAPControlW*,
576       ULONG*);
577     ULONG ldap_delete_ext_sA(LDAP*, PCSTR, PLDAPControlA*, PLDAPControlA*);
578     ULONG ldap_delete_ext_sW(LDAP*, PCWSTR, PLDAPControlW*, PLDAPControlW*);
579     ULONG ldap_deleteA(LDAP*, PCSTR);
580     ULONG ldap_deleteW(LDAP*, PCWSTR);
581     ULONG ldap_delete_sA(LDAP*, PCSTR);
582     ULONG ldap_delete_sW(LDAP*, PCWSTR);
583     ULONG ldap_extended_operationA(LDAP*, PCSTR, BerValue*, PLDAPControlA*,
584       PLDAPControlA*, ULONG*);
585     ULONG ldap_extended_operationW(LDAP*, PCWSTR, BerValue*, PLDAPControlW*,
586       PLDAPControlW*, ULONG*);
587     ULONG ldap_extended_operation_sA(LDAP*, PSTR, BerValue*, PLDAPControlA*,
588       PLDAPControlA*, PCHAR*, BerValue**);
589     ULONG ldap_extended_operation_sW(LDAP*, PWSTR, BerValue*, PLDAPControlW*,
590       PLDAPControlW*, PWCHAR*, BerValue**);
591     ULONG ldap_close_extended_op(LDAP*, ULONG);
592     ULONG ldap_abandon(LDAP*, ULONG);
593     ULONG ldap_result(LDAP*, ULONG, ULONG, LDAP_TIMEVAL*, LDAPMessage**);
594     ULONG ldap_msgfree(LDAPMessage*);
595     ULONG ldap_parse_resultA(LDAP*, LDAPMessage*, ULONG*, PSTR*, PSTR*,
596       PZPSTR*, PLDAPControlA**, BOOLEAN);
597     ULONG ldap_parse_resultW(LDAP*, LDAPMessage*, ULONG*, PWSTR*, PWSTR*,
598       PZPWSTR*, PLDAPControlW**, BOOLEAN);
599     ULONG ldap_parse_extended_resultA(LDAP, LDAPMessage*, PSTR*, BerValue**,
600       BOOLEAN);
601     ULONG ldap_parse_extended_resultW(LDAP, LDAPMessage*, PWSTR*, BerValue**,
602       BOOLEAN);
603     PCHAR ldap_err2stringA(ULONG);
604     PWCHAR ldap_err2stringW(ULONG);
605     ULONG LdapGetLastError();
606     ULONG LdapMapErrorToWin32(ULONG);
607     ULONG ldap_result2error(LDAP*, LDAPMessage*, ULONG);
608     PLDAPMessage ldap_first_entry(LDAP*, LDAPMessage*);
609     PLDAPMessage ldap_next_entry(LDAP*, LDAPMessage*);
610     PLDAPMessage ldap_first_reference(LDAP*, LDAPMessage*);
611     PLDAPMessage ldap_next_reference(LDAP*, LDAPMessage*);
612     ULONG ldap_count_entries(LDAP*, LDAPMessage*);
613     ULONG ldap_count_references(LDAP*, LDAPMessage*);
614     PCHAR ldap_first_attributeA(LDAP*, LDAPMessage*, BerElement**);
615     PWCHAR ldap_first_attributeW(LDAP*, LDAPMessage*, BerElement**);
616     PCHAR ldap_next_attributeA(LDAP*, LDAPMessage*, BerElement*);
617     PWCHAR ldap_next_attributeW(LDAP*, LDAPMessage*, BerElement*);
618     VOID ldap_memfreeA(PCHAR);
619     VOID ldap_memfreeW(PWCHAR);
620     PCHAR* ldap_get_valuesA(LDAP*, LDAPMessage*, PCSTR);
621     PWCHAR* ldap_get_valuesW(LDAP*, LDAPMessage*, PCWSTR);
622     BerValue** ldap_get_values_lenA(LDAP*, LDAPMessage*, PCSTR);
623     BerValue** ldap_get_values_lenW(LDAP*, LDAPMessage*, PCWSTR);
624     ULONG ldap_count_valuesA(PCHAR*);
625     ULONG ldap_count_valuesW(PWCHAR*);
626     ULONG ldap_count_values_len(BerValue**);
627     ULONG ldap_value_freeA(PCHAR*);
628     ULONG ldap_value_freeW(PWCHAR*);
629     ULONG ldap_value_free_len(BerValue**);
630     PCHAR ldap_get_dnA(LDAP*, LDAPMessage*);
631     PWCHAR ldap_get_dnW(LDAP*, LDAPMessage*);
632     PCHAR ldap_explode_dnA(PCSTR, ULONG);
633     PWCHAR ldap_explode_dnW(PCWSTR, ULONG);
634     PCHAR ldap_dn2ufnA(PCSTR);
635     PWCHAR ldap_dn2ufnW(PCWSTR);
636     ULONG ldap_ufn2dnA(PCSTR, PSTR*);
637     ULONG ldap_ufn2dnW(PCWSTR, PWSTR*);
638     ULONG ldap_parse_referenceA(LDAP*, LDAPMessage*, PCHAR**);
639     ULONG ldap_parse_referenceW(LDAP*, LDAPMessage*, PWCHAR**);
640     ULONG ldap_check_filterA(LDAP*, PSTR);
641     ULONG ldap_check_filterW(LDAP*, PWSTR);
642     ULONG ldap_create_page_controlA(PLDAP, ULONG, BerValue*, UCHAR,
643       PLDAPControlA*);
644     ULONG ldap_create_page_controlW(PLDAP, ULONG, BerValue*, UCHAR,
645       PLDAPControlW*);
646     ULONG ldap_create_sort_controlA(PLDAP, PLDAPSortKeyA*, UCHAR,
647       PLDAPControlA*);
648     ULONG ldap_create_sort_controlW(PLDAP, PLDAPSortKeyW*, UCHAR,
649     PLDAPControlW*);
650     INT ldap_create_vlv_controlA(LDAP*, LDAPVLVInfo*, UCHAR, PLDAPControlA*);
651     INT ldap_create_vlv_controlW(LDAP*, LDAPVLVInfo*, UCHAR, PLDAPControlW*);
652     ULONG ldap_encode_sort_controlA(PLDAP, PLDAPSortKeyA*, PLDAPControlA,
653       BOOLEAN);
654     ULONG ldap_encode_sort_controlW(PLDAP, PLDAPSortKeyW*, PLDAPControlW,
655       BOOLEAN);
656     ULONG ldap_escape_filter_elementA(PCHAR, ULONG, PCHAR, ULONG);
657     ULONG ldap_escape_filter_elementW(PWCHAR, ULONG, PWCHAR, ULONG);
658     ULONG ldap_get_next_page(PLDAP, PLDAPSearch, ULONG, ULONG*);
659     ULONG ldap_get_next_page_s(PLDAP, PLDAPSearch, LDAP_TIMEVAL*, ULONG,
660       ULONG*, LDAPMessage**);
661     ULONG ldap_get_paged_count(PLDAP, PLDAPSearch, ULONG*, PLDAPMessage);
662     ULONG ldap_parse_page_controlA(PLDAP, PLDAPControlA*, ULONG*, BerValue**);
663     ULONG ldap_parse_page_controlW(PLDAP, PLDAPControlW*, ULONG*, BerValue**);
664     ULONG ldap_parse_sort_controlA(PLDAP, PLDAPControlA*, ULONG*, PCHAR*);
665     ULONG ldap_parse_sort_controlW(PLDAP, PLDAPControlW*, ULONG*, PWCHAR*);
666     INT ldap_parse_vlv_controlA(PLDAP, PLDAPControlA*, PULONG, PULONG,
667       BerValue**, PINT);
668     INT ldap_parse_vlv_controlW(PLDAP, PLDAPControlW*, PULONG, PULONG,
669       BerValue**, PINT);
670     PLDAPSearch ldap_search_init_pageA(PLDAP, PCSTR, ULONG, PCSTR, PZPSTR,
671       ULONG, PLDAPControlA*, PLDAPControlA*, ULONG, ULONG, PLDAPSortKeyA*);
672     PLDAPSearch ldap_search_init_pageW(PLDAP, PCWSTR, ULONG, PCWSTR, PZPWSTR,
673       ULONG, PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, PLDAPSortKeyW*);
674     ULONG ldap_search_abandon_page(PLDAP, PLDAPSearch);
675     LDAP ldap_conn_from_msg(LDAP*, LDAPMessage*);
676     INT LdapUnicodeToUTF8(LPCWSTR, int, LPSTR, int);
677     INT LdapUTF8ToUnicode(LPCSTR, int, LPWSTR, int);
678     ULONG ldap_bindA(LDAP*, PSTR, PCHAR, ULONG);
679     ULONG ldap_bindW(LDAP*, PWSTR, PWCHAR, ULONG);
680     ULONG ldap_bind_sA(LDAP*, PSTR, PCHAR, ULONG);
681     ULONG ldap_bind_sW(LDAP*, PWSTR, PWCHAR, ULONG);
682     deprecated ("For LDAP 3 or later, use the ldap_rename_ext or ldap_rename_ext_s functions") {
683         ULONG ldap_modrdnA(LDAP*, PCSTR, PCSTR);
684         ULONG ldap_modrdnW(LDAP*, PCWSTR, PCWSTR);
685         ULONG ldap_modrdn_sA(LDAP*, PCSTR, PCSTR);
686         ULONG ldap_modrdn_sW(LDAP*, PCWSTR, PCWSTR);
687         ULONG ldap_modrdn2A(LDAP*, PCSTR, PCSTR, INT);
688         ULONG ldap_modrdn2W(LDAP*, PCWSTR, PCWSTR, INT);
689         ULONG ldap_modrdn2_sA(LDAP*, PCSTR, PCSTR, INT);
690         ULONG ldap_modrdn2_sW(LDAP*, PCWSTR, PCWSTR, INT);
691     }
692 }
693 
694 version (Unicode) {
695     alias LDAPControlW LDAPControl;
696     alias PLDAPControlW PLDAPControl;
697     alias LDAPModW LDAPMod;
698     alias LDAPModW PLDAPMod;
699     alias LDAPSortKeyW LDAPSortKey;
700     alias PLDAPSortKeyW PLDAPSortKey;
701     alias LDAPAPIInfoW LDAPAPIInfo;
702     alias PLDAPAPIInfoW PLDAPAPIInfo;
703     alias LDAPAPIFeatureInfoW LDAPAPIFeatureInfo;
704     alias PLDAPAPIFeatureInfoW PLDAPAPIFeatureInfo;
705     alias cldap_openW cldap_open;
706     alias ldap_openW ldap_open;
707     alias ldap_simple_bindW ldap_simple_bind;
708     alias ldap_simple_bind_sW ldap_simple_bind_s;
709     alias ldap_sasl_bindW ldap_sasl_bind;
710     alias ldap_sasl_bind_sW ldap_sasl_bind_s;
711     alias ldap_initW ldap_init;
712     alias ldap_sslinitW ldap_sslinit;
713     alias ldap_get_optionW ldap_get_option;
714     alias ldap_set_optionW ldap_set_option;
715     alias ldap_start_tls_sW ldap_start_tls_s;
716     alias ldap_addW ldap_add;
717     alias ldap_add_extW ldap_add_ext;
718     alias ldap_add_sW ldap_add_s;
719     alias ldap_add_ext_sW ldap_add_ext_s;
720     alias ldap_compareW ldap_compare;
721     alias ldap_compare_extW ldap_compare_ext;
722     alias ldap_compare_sW ldap_compare_s;
723     alias ldap_compare_ext_sW ldap_compare_ext_s;
724     alias ldap_deleteW ldap_delete;
725     alias ldap_delete_extW ldap_delete_ext;
726     alias ldap_delete_sW ldap_delete_s;
727     alias ldap_delete_ext_sW ldap_delete_ext_s;
728     alias ldap_extended_operation_sW ldap_extended_operation_s;
729     alias ldap_extended_operationW ldap_extended_operation;
730     alias ldap_modifyW ldap_modify;
731     alias ldap_modify_extW ldap_modify_ext;
732     alias ldap_modify_sW ldap_modify_s;
733     alias ldap_modify_ext_sW ldap_modify_ext_s;
734     alias ldap_check_filterW ldap_check_filter;
735     alias ldap_count_valuesW ldap_count_values;
736     alias ldap_create_page_controlW ldap_create_page_control;
737     alias ldap_create_sort_controlW ldap_create_sort_control;
738     alias ldap_create_vlv_controlW ldap_create_vlv_control;
739     alias ldap_encode_sort_controlW ldap_encode_sort_control;
740     alias ldap_escape_filter_elementW ldap_escape_filter_element;
741     alias ldap_first_attributeW ldap_first_attribute;
742     alias ldap_next_attributeW ldap_next_attribute;
743     alias ldap_get_valuesW ldap_get_values;
744     alias ldap_get_values_lenW ldap_get_values_len;
745     alias ldap_parse_extended_resultW ldap_parse_extended_result;
746     alias ldap_parse_page_controlW ldap_parse_page_control;
747     alias ldap_parse_referenceW ldap_parse_reference;
748     alias ldap_parse_resultW ldap_parse_result;
749     alias ldap_parse_sort_controlW ldap_parse_sort_control;
750     alias ldap_parse_vlv_controlW ldap_parse_vlv_control;
751     alias ldap_searchW ldap_search;
752     alias ldap_search_sW ldap_search_s;
753     alias ldap_search_stW ldap_search_st;
754     alias ldap_search_extW ldap_search_ext;
755     alias ldap_search_ext_sW ldap_search_ext_s;
756     alias ldap_search_init_pageW ldap_search_init_page;
757     alias ldap_err2stringW ldap_err2string;
758     alias ldap_control_freeW ldap_control_free;
759     alias ldap_controls_freeW ldap_controls_free;
760     alias ldap_free_controlsW ldap_free_controls;
761     alias ldap_memfreeW ldap_memfree;
762     alias ldap_value_freeW ldap_value_free;
763     alias ldap_dn2ufnW ldap_dn2ufn;
764     alias ldap_ufn2dnW ldap_ufn2dn;
765     alias ldap_explode_dnW ldap_explode_dn;
766     alias ldap_get_dnW ldap_get_dn;
767     alias ldap_rename_extW ldap_rename;
768     alias ldap_rename_ext_sW ldap_rename_s;
769     alias ldap_rename_extW ldap_rename_ext;
770     alias ldap_rename_ext_sW ldap_rename_ext_s;
771     deprecated {
772         alias ldap_bindW ldap_bind;
773         alias ldap_bind_sW ldap_bind_s;
774         alias ldap_modrdnW ldap_modrdn;
775         alias ldap_modrdn_sW ldap_modrdn_s;
776         alias ldap_modrdn2W ldap_modrdn2;
777         alias ldap_modrdn2_sW ldap_modrdn2_s;
778     }
779 } else {
780     alias LDAPControlA LDAPControl;
781     alias PLDAPControlA PLDAPControl;
782     alias LDAPModA LDAPMod;
783     alias LDAPModA PLDAPMod;
784     alias LDAPSortKeyA LDAPSortKey;
785     alias PLDAPSortKeyA PLDAPSortKey;
786     alias LDAPAPIInfoA LDAPAPIInfo;
787     alias PLDAPAPIInfoA PLDAPAPIInfo;
788     alias LDAPAPIFeatureInfoA LDAPAPIFeatureInfo;
789     alias PLDAPAPIFeatureInfoA PLDAPAPIFeatureInfo;
790     alias cldap_openA cldap_open;
791     alias ldap_openA ldap_open;
792     alias ldap_simple_bindA ldap_simple_bind;
793     alias ldap_simple_bind_sA ldap_simple_bind_s;
794     alias ldap_sasl_bindA ldap_sasl_bind;
795     alias ldap_sasl_bind_sA ldap_sasl_bind_s;
796     alias ldap_initA ldap_init;
797     alias ldap_sslinitA ldap_sslinit;
798     alias ldap_get_optionA ldap_get_option;
799     alias ldap_set_optionA ldap_set_option;
800     alias ldap_start_tls_sA ldap_start_tls_s;
801     alias ldap_addA ldap_add;
802     alias ldap_add_extA ldap_add_ext;
803     alias ldap_add_sA ldap_add_s;
804     alias ldap_add_ext_sA ldap_add_ext_s;
805     alias ldap_compareA ldap_compare;
806     alias ldap_compare_extA ldap_compare_ext;
807     alias ldap_compare_sA ldap_compare_s;
808     alias ldap_compare_ext_sA ldap_compare_ext_s;
809     alias ldap_deleteA ldap_delete;
810     alias ldap_delete_extA ldap_delete_ext;
811     alias ldap_delete_sA ldap_delete_s;
812     alias ldap_delete_ext_sA ldap_delete_ext_s;
813     alias ldap_extended_operation_sA ldap_extended_operation_s;
814     alias ldap_extended_operationA ldap_extended_operation;
815     alias ldap_modifyA ldap_modify;
816     alias ldap_modify_extA ldap_modify_ext;
817     alias ldap_modify_sA ldap_modify_s;
818     alias ldap_modify_ext_sA ldap_modify_ext_s;
819     alias ldap_check_filterA ldap_check_filter;
820     alias ldap_count_valuesA ldap_count_values;
821     alias ldap_create_page_controlA ldap_create_page_control;
822     alias ldap_create_sort_controlA ldap_create_sort_control;
823     alias ldap_create_vlv_controlA ldap_create_vlv_control;
824     alias ldap_encode_sort_controlA ldap_encode_sort_control;
825     alias ldap_escape_filter_elementA ldap_escape_filter_element;
826     alias ldap_first_attributeA ldap_first_attribute;
827     alias ldap_next_attributeA ldap_next_attribute;
828     alias ldap_get_valuesA ldap_get_values;
829     alias ldap_get_values_lenA ldap_get_values_len;
830     alias ldap_parse_extended_resultA ldap_parse_extended_result;
831     alias ldap_parse_page_controlA ldap_parse_page_control;
832     alias ldap_parse_referenceA ldap_parse_reference;
833     alias ldap_parse_resultA ldap_parse_result;
834     alias ldap_parse_sort_controlA ldap_parse_sort_control;
835     alias ldap_parse_vlv_controlA ldap_parse_vlv_control;
836     alias ldap_searchA ldap_search;
837     alias ldap_search_sA ldap_search_s;
838     alias ldap_search_stA ldap_search_st;
839     alias ldap_search_extA ldap_search_ext;
840     alias ldap_search_ext_sA ldap_search_ext_s;
841     alias ldap_search_init_pageA ldap_search_init_page;
842     alias ldap_err2stringA ldap_err2string;
843     alias ldap_control_freeA ldap_control_free;
844     alias ldap_controls_freeA ldap_controls_free;
845     alias ldap_free_controlsA ldap_free_controls;
846     alias ldap_memfreeA ldap_memfree;
847     alias ldap_value_freeA ldap_value_free;
848     alias ldap_dn2ufnA ldap_dn2ufn;
849     alias ldap_ufn2dnA ldap_ufn2dn;
850     alias ldap_explode_dnA ldap_explode_dn;
851     alias ldap_get_dnA ldap_get_dn;
852     alias ldap_rename_extA ldap_rename;
853     alias ldap_rename_ext_sA ldap_rename_s;
854     alias ldap_rename_extA ldap_rename_ext;
855     alias ldap_rename_ext_sA ldap_rename_ext_s;
856     deprecated {
857         alias ldap_bindA ldap_bind;
858         alias ldap_bind_sA ldap_bind_s;
859         alias ldap_modrdnA ldap_modrdn;
860         alias ldap_modrdn_sA ldap_modrdn_s;
861         alias ldap_modrdn2A ldap_modrdn2;
862         alias ldap_modrdn2_sA ldap_modrdn2_s;
863     }
864 }