diff win32/winldap.d @ 1:4a9dcbd9e54f

-files of 0.13 beta -fixes so that it now compiles with the current dmd version
author marton@basel.hu
date Tue, 05 Apr 2011 20:44:01 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/win32/winldap.d	Tue Apr 05 20:44:01 2011 +0200
@@ -0,0 +1,853 @@
+/***********************************************************************\
+*                               winldap.d                               *
+*                                                                       *
+*                       Windows API header module                       *
+*                                                                       *
+*                 Translated from MinGW Windows headers                 *
+*                           by Stewart Gordon                           *
+*                                                                       *
+*                       Placed into public domain                       *
+\***********************************************************************/
+module win32.winldap;
+
+/* Comment from MinGW
+  winldap.h - Header file for the Windows LDAP API
+
+  Written by Filip Navara <xnavara@volny.cz>
+
+  References:
+    The C LDAP Application Program Interface
+    http://www.watersprings.org/pub/id/draft-ietf-ldapext-ldap-c-api-05.txt
+
+    Lightweight Directory Access Protocol Reference
+    http://msdn.microsoft.com/library/en-us/netdir/ldap/ldap_reference.asp
+
+  This library is distributed in the hope that it will be useful,
+  but WITHOUT ANY WARRANTY; without even the implied warranty of
+  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+import win32.schannel, win32.winber;
+private import win32.wincrypt, win32.windef;
+version(Tango){
+    private import tango.stdc.stdio;
+}
+
+align(4):
+
+enum {
+	LDAP_VERSION1    = 1,
+	LDAP_VERSION2    = 2,
+	LDAP_VERSION3    = 3,
+	LDAP_VERSION     = LDAP_VERSION2,
+	LDAP_VERSION_MIN = LDAP_VERSION2,
+	LDAP_VERSION_MAX = LDAP_VERSION3
+}
+
+/*	MinGW defines ANSI and Unicode versions as LDAP_VENDOR_NAME and
+ *	LDAP_VENDOR_NAME_W respectively; similarly with other string constants
+ *	defined in this module.
+ */
+const TCHAR[] LDAP_VENDOR_NAME = "Microsoft Corporation.";
+
+const LDAP_API_VERSION          = 2004;
+const LDAP_VENDOR_VERSION       =  510;
+const LDAP_API_INFO_VERSION     =    1;
+const LDAP_FEATURE_INFO_VERSION =    1;
+
+enum {
+	LDAP_SUCCESS                    = 0x00,
+	LDAP_OPT_SUCCESS                = LDAP_SUCCESS,
+	LDAP_OPERATIONS_ERROR,
+	LDAP_PROTOCOL_ERROR,
+	LDAP_TIMELIMIT_EXCEEDED,
+	LDAP_SIZELIMIT_EXCEEDED,
+	LDAP_COMPARE_FALSE,
+	LDAP_COMPARE_TRUE,
+	LDAP_STRONG_AUTH_NOT_SUPPORTED,
+	LDAP_AUTH_METHOD_NOT_SUPPORTED  = LDAP_STRONG_AUTH_NOT_SUPPORTED,
+	LDAP_STRONG_AUTH_REQUIRED,
+	LDAP_REFERRAL_V2,
+	LDAP_PARTIAL_RESULTS            = LDAP_REFERRAL_V2,
+	LDAP_REFERRAL,
+	LDAP_ADMIN_LIMIT_EXCEEDED,
+	LDAP_UNAVAILABLE_CRIT_EXTENSION,
+	LDAP_CONFIDENTIALITY_REQUIRED,
+	LDAP_SASL_BIND_IN_PROGRESS,  // = 0x0e
+	LDAP_NO_SUCH_ATTRIBUTE          = 0x10,
+	LDAP_UNDEFINED_TYPE,
+	LDAP_INAPPROPRIATE_MATCHING,
+	LDAP_CONSTRAINT_VIOLATION,
+	LDAP_TYPE_OR_VALUE_EXISTS,
+	LDAP_ATTRIBUTE_OR_VALUE_EXISTS  = LDAP_TYPE_OR_VALUE_EXISTS,
+	LDAP_INVALID_SYNTAX,         // = 0x15
+	LDAP_NO_SUCH_OBJECT             = 0x20,
+	LDAP_ALIAS_PROBLEM,
+	LDAP_INVALID_DN_SYNTAX,
+	LDAP_IS_LEAF,
+	LDAP_ALIAS_DEREF_PROBLEM,    // = 0x24
+	LDAP_INAPPROPRIATE_AUTH         = 0x30,
+	LDAP_INVALID_CREDENTIALS,
+	LDAP_INSUFFICIENT_ACCESS,
+	LDAP_INSUFFICIENT_RIGHTS        = LDAP_INSUFFICIENT_ACCESS,
+	LDAP_BUSY,
+	LDAP_UNAVAILABLE,
+	LDAP_UNWILLING_TO_PERFORM,
+	LDAP_LOOP_DETECT,            // = 0x36
+	LDAP_NAMING_VIOLATION           = 0x40,
+	LDAP_OBJECT_CLASS_VIOLATION,
+	LDAP_NOT_ALLOWED_ON_NONLEAF,
+	LDAP_NOT_ALLOWED_ON_RDN,
+	LDAP_ALREADY_EXISTS,
+	LDAP_NO_OBJECT_CLASS_MODS,
+	LDAP_RESULTS_TOO_LARGE,
+	LDAP_AFFECTS_MULTIPLE_DSAS,  // = 0x47
+	LDAP_OTHER                      = 0x50,
+	LDAP_SERVER_DOWN,
+	LDAP_LOCAL_ERROR,
+	LDAP_ENCODING_ERROR,
+	LDAP_DECODING_ERROR,
+	LDAP_TIMEOUT,
+	LDAP_AUTH_UNKNOWN,
+	LDAP_FILTER_ERROR,
+	LDAP_USER_CANCELLED,
+	LDAP_PARAM_ERROR,
+	LDAP_NO_MEMORY,
+	LDAP_CONNECT_ERROR,
+	LDAP_NOT_SUPPORTED,
+	LDAP_CONTROL_NOT_FOUND,
+	LDAP_NO_RESULTS_RETURNED,
+	LDAP_MORE_RESULTS_TO_RETURN,
+	LDAP_CLIENT_LOOP,
+	LDAP_REFERRAL_LIMIT_EXCEEDED // = 0x61
+}
+
+enum {
+	LDAP_PORT        =  389,
+	LDAP_SSL_PORT    =  636,
+	LDAP_GC_PORT     = 3268,
+	LDAP_SSL_GC_PORT = 3269
+}
+
+const void*
+	LDAP_OPT_OFF = null,
+	LDAP_OPT_ON = cast(void*) 1;
+
+enum {
+	LDAP_OPT_API_INFO               = 0x00,
+	LDAP_OPT_DESC,
+	LDAP_OPT_DEREF,
+	LDAP_OPT_SIZELIMIT,
+	LDAP_OPT_TIMELIMIT,
+	LDAP_OPT_THREAD_FN_PTRS,
+	LDAP_OPT_REBIND_FN,
+	LDAP_OPT_REBIND_ARG,
+	LDAP_OPT_REFERRALS,
+	LDAP_OPT_RESTART,
+	LDAP_OPT_SSL,
+	LDAP_OPT_TLS                    = LDAP_OPT_SSL,
+	LDAP_OPT_IO_FN_PTRS,         // = 0x0b
+	LDAP_OPT_CACHE_FN_PTRS          = 0x0d,
+	LDAP_OPT_CACHE_STRATEGY,
+	LDAP_OPT_CACHE_ENABLE,
+	LDAP_OPT_REFERRAL_HOP_LIMIT,
+	LDAP_OPT_PROTOCOL_VERSION,
+	LDAP_OPT_VERSION                = LDAP_OPT_PROTOCOL_VERSION,
+	LDAP_OPT_SERVER_CONTROLS,
+	LDAP_OPT_CLIENT_CONTROLS,    // = 0x13
+	LDAP_OPT_API_FEATURE_INFO       = 0x15,
+	LDAP_OPT_HOST_NAME              = 0x30,
+	LDAP_OPT_ERROR_NUMBER,
+	LDAP_OPT_ERROR_STRING,
+	LDAP_OPT_SERVER_ERROR,
+	LDAP_OPT_SERVER_EXT_ERROR,   // = 0x34
+	LDAP_OPT_PING_KEEP_ALIVE        = 0x36,
+	LDAP_OPT_PING_WAIT_TIME,
+	LDAP_OPT_PING_LIMIT,         // = 0x38
+	LDAP_OPT_DNSDOMAIN_NAME         = 0x3b,
+	LDAP_OPT_GETDSNAME_FLAGS        = 0x3d,
+	LDAP_OPT_HOST_REACHABLE,
+	LDAP_OPT_PROMPT_CREDENTIALS,
+	LDAP_OPT_TCP_KEEPALIVE,      // = 0x40
+	LDAP_OPT_REFERRAL_CALLBACK      = 0x70,
+	LDAP_OPT_CLIENT_CERTIFICATE     = 0x80,
+	LDAP_OPT_SERVER_CERTIFICATE, // = 0x81
+	LDAP_OPT_AUTO_RECONNECT         = 0x91,
+	LDAP_OPT_SSPI_FLAGS,
+	LDAP_OPT_SSL_INFO,
+	LDAP_OPT_TLS_INFO               = LDAP_OPT_SSL_INFO,
+	LDAP_OPT_REF_DEREF_CONN_PER_MSG,
+	LDAP_OPT_SIGN,
+	LDAP_OPT_ENCRYPT,
+	LDAP_OPT_SASL_METHOD,
+	LDAP_OPT_AREC_EXCLUSIVE,
+	LDAP_OPT_SECURITY_CONTEXT,
+	LDAP_OPT_ROOTDSE_CACHE       // = 0x9a
+}
+
+enum {
+	LDAP_DEREF_NEVER,
+	LDAP_DEREF_SEARCHING,
+	LDAP_DEREF_FINDING,
+	LDAP_DEREF_ALWAYS
+}
+
+const LDAP_NO_LIMIT = 0;
+
+const TCHAR[] LDAP_CONTROL_REFERRALS = "1.2.840.113556.1.4.616";
+
+// FIXME: check type (declared with U suffix in MinGW)
+enum : uint {
+	LDAP_CHASE_SUBORDINATE_REFERRALS = 0x20,
+	LDAP_CHASE_EXTERNAL_REFERRALS    = 0x40
+}
+
+enum {
+	LDAP_SCOPE_DEFAULT = -1,
+	LDAP_SCOPE_BASE,
+	LDAP_SCOPE_ONELEVEL,
+	LDAP_SCOPE_SUBTREE
+}
+
+enum {
+	LDAP_MOD_ADD,
+	LDAP_MOD_DELETE,
+	LDAP_MOD_REPLACE,
+	LDAP_MOD_BVALUES = 0x80
+}
+
+enum : int {
+	LDAP_RES_BIND             = 0x61,
+	LDAP_RES_SEARCH_ENTRY     = 0x64,
+	LDAP_RES_SEARCH_RESULT    = 0x65,
+	LDAP_RES_MODIFY           = 0x67,
+	LDAP_RES_ADD              = 0x69,
+	LDAP_RES_DELETE           = 0x6b,
+	LDAP_RES_MODRDN           = 0x6d,
+	LDAP_RES_COMPARE          = 0x6f,
+	LDAP_RES_SEARCH_REFERENCE = 0x73,
+	LDAP_RES_EXTENDED         = 0x78,
+	LDAP_RES_ANY              = -1
+}
+
+enum {
+	LDAP_MSG_ONE,
+	LDAP_MSG_ALL,
+	LDAP_MSG_RECEIVED
+}
+
+const TCHAR[]
+	LDAP_SERVER_SORT_OID         = "1.2.840.113556.1.4.473",
+	LDAP_SERVER_RESP_SORT_OID    = "1.2.840.113556.1.4.474",
+	LDAP_PAGED_RESULT_OID_STRING = "1.2.840.113556.1.4.319",
+	LDAP_CONTROL_VLVREQUEST      = "2.16.840.1.113730.3.4.9",
+	LDAP_CONTROL_VLVRESPONSE     = "2.16.840.1.113730.3.4.10",
+	LDAP_START_TLS_OID           = "1.3.6.1.4.1.1466.20037",
+	LDAP_TTL_EXTENDED_OP_OID     = "1.3.6.1.4.1.1466.101.119.1";
+
+enum {
+	LDAP_AUTH_NONE      = 0x00U,
+	LDAP_AUTH_SIMPLE    = 0x80U,
+	LDAP_AUTH_SASL      = 0x83U,
+	LDAP_AUTH_OTHERKIND = 0x86U,
+	LDAP_AUTH_EXTERNAL  = LDAP_AUTH_OTHERKIND | 0x0020U,
+	LDAP_AUTH_SICILY    = LDAP_AUTH_OTHERKIND | 0x0200U,
+	LDAP_AUTH_NEGOTIATE = LDAP_AUTH_OTHERKIND | 0x0400U,
+	LDAP_AUTH_MSN       = LDAP_AUTH_OTHERKIND | 0x0800U,
+	LDAP_AUTH_NTLM      = LDAP_AUTH_OTHERKIND | 0x1000U,
+	LDAP_AUTH_DIGEST    = LDAP_AUTH_OTHERKIND | 0x4000U,
+	LDAP_AUTH_DPA       = LDAP_AUTH_OTHERKIND | 0x2000U,
+	LDAP_AUTH_SSPI      = LDAP_AUTH_NEGOTIATE
+}
+
+enum {
+	LDAP_FILTER_AND        = 0xa0,
+	LDAP_FILTER_OR,
+	LDAP_FILTER_NOT,
+	LDAP_FILTER_EQUALITY,
+	LDAP_FILTER_SUBSTRINGS,
+	LDAP_FILTER_GE,
+	LDAP_FILTER_LE,     // = 0xa6
+	LDAP_FILTER_APPROX     = 0xa8,
+	LDAP_FILTER_EXTENSIBLE,
+	LDAP_FILTER_PRESENT    = 0x87
+}
+
+enum {
+	LDAP_SUBSTRING_INITIAL = 0x80,
+	LDAP_SUBSTRING_ANY,
+	LDAP_SUBSTRING_FINAL
+}
+
+struct LDAP {
+	char[76] Reserved;
+	PCHAR    ld_host;
+	ULONG    ld_version;
+	UCHAR    ld_lberoptions;
+	int      ld_deref;
+	int      ld_timelimit;
+	int      ld_sizelimit;
+	int      ld_errno;
+	PCHAR    ld_matched;
+	PCHAR    ld_error;
+}
+alias LDAP* PLDAP;
+
+struct LDAPMessage {
+	ULONG        lm_msgid;
+	ULONG        lm_msgtype;
+	BerElement*  lm_ber;
+	LDAPMessage* lm_chain;
+	LDAPMessage* lm_next;
+	ULONG        lm_time;
+}
+alias LDAPMessage* PLDAPMessage;
+
+struct LDAP_TIMEVAL {
+	LONG tv_sec;
+	LONG tv_usec;
+}
+alias LDAP_TIMEVAL* PLDAP_TIMEVAL;
+
+struct LDAPAPIInfoA {
+	int    ldapai_info_version;
+	int    ldapai_api_version;
+	int    ldapai_protocol_version;
+	char** ldapai_extensions;
+	char*  ldapai_vendor_name;
+	int    ldapai_vendor_version;
+}
+alias LDAPAPIInfoA* PLDAPAPIInfoA;
+
+struct LDAPAPIInfoW {
+	int     ldapai_info_version;
+	int     ldapai_api_version;
+	int     ldapai_protocol_version;
+	PWCHAR* ldapai_extensions;
+	PWCHAR  ldapai_vendor_name;
+	int     ldapai_vendor_version;
+}
+alias LDAPAPIInfoW* PLDAPAPIInfoW;
+
+struct LDAPAPIFeatureInfoA {
+	int   ldapaif_info_version;
+	char* ldapaif_name;
+	int   ldapaif_version;
+}
+alias LDAPAPIFeatureInfoA* PLDAPAPIFeatureInfoA;
+
+struct LDAPAPIFeatureInfoW {
+	int    ldapaif_info_version;
+	PWCHAR ldapaif_name;
+	int    ldapaif_version;
+}
+alias LDAPAPIFeatureInfoW* PLDAPAPIFeatureInfoW;
+
+struct LDAPControlA {
+	PCHAR    ldctl_oid;
+	BerValue ldctl_value;
+	BOOLEAN  ldctl_iscritical;
+}
+alias LDAPControlA* PLDAPControlA;
+
+struct LDAPControlW {
+	PWCHAR   ldctl_oid;
+	BerValue ldctl_value;
+	BOOLEAN  ldctl_iscritical;
+}
+alias LDAPControlW* PLDAPControlW;
+
+/*	Do we really need these?  In MinGW, LDAPModA/W have only mod_op, mod_type
+ *	and mod_vals, and macros are used to simulate anonymous unions in those
+ *	structures.
+ */
+union mod_vals_u_tA {
+	PCHAR*     modv_strvals;
+	BerValue** modv_bvals;
+}
+
+union mod_vals_u_tW {
+	PWCHAR*    modv_strvals;
+	BerValue** modv_bvals;
+}
+
+struct LDAPModA {
+	ULONG         mod_op;
+	PCHAR         mod_type;
+
+	union {
+		mod_vals_u_tA mod_vals;
+		// The following members are defined as macros in MinGW.
+		PCHAR*        mod_values;
+		BerValue**    mod_bvalues;
+	}
+}
+alias LDAPModA* PLDAPModA;
+
+struct LDAPModW {
+	ULONG         mod_op;
+	PWCHAR        mod_type;
+
+	union {
+		mod_vals_u_tW mod_vals;
+		// The following members are defined as macros in MinGW.
+		PWCHAR*       mod_values;
+		BerValue**    mod_bvalues;
+	}
+}
+alias LDAPModW* PLDAPModW;
+
+/* Opaque structure
+ *	http://msdn.microsoft.com/library/en-us/ldap/ldap/ldapsearch.asp
+ */
+struct LDAPSearch;
+alias LDAPSearch* PLDAPSearch;
+
+struct LDAPSortKeyA {
+	PCHAR   sk_attrtype;
+	PCHAR   sk_matchruleoid;
+	BOOLEAN sk_reverseorder;
+}
+alias LDAPSortKeyA* PLDAPSortKeyA;
+
+struct LDAPSortKeyW {
+	PWCHAR  sk_attrtype;
+	PWCHAR  sk_matchruleoid;
+	BOOLEAN sk_reverseorder;
+}
+alias LDAPSortKeyW* PLDAPSortKeyW;
+
+/*	MinGW defines these as immediate function typedefs, which don't translate
+ *	well into D.
+ */
+extern (C) {
+	alias ULONG function(PLDAP, PLDAP, PWCHAR, PCHAR, ULONG, PVOID, PVOID,
+	  PLDAP*) QUERYFORCONNECTION;
+	alias BOOLEAN function(PLDAP, PLDAP, PWCHAR, PCHAR, PLDAP, ULONG, PVOID,
+	  PVOID, ULONG) NOTIFYOFNEWCONNECTION;
+	alias ULONG function(PLDAP, PLDAP) DEREFERENCECONNECTION;
+	alias BOOLEAN function(PLDAP, PSecPkgContext_IssuerListInfoEx,
+	  PCCERT_CONTEXT*) QUERYCLIENTCERT;
+}
+
+struct LDAP_REFERRAL_CALLBACK {
+	ULONG                  SizeOfCallbacks;
+	QUERYFORCONNECTION*    QueryForConnection;
+	NOTIFYOFNEWCONNECTION* NotifyRoutine;
+	DEREFERENCECONNECTION* DereferenceRoutine;
+}
+alias LDAP_REFERRAL_CALLBACK* PLDAP_REFERRAL_CALLBACK;
+
+struct LDAPVLVInfo {
+	int       ldvlv_version;
+	uint      ldvlv_before_count;
+	uint      ldvlv_after_count;
+	uint      ldvlv_offset;
+	uint      ldvlv_count;
+	BerValue* ldvlv_attrvalue;
+	BerValue* ldvlv_context;
+	void*     ldvlv_extradata;
+}
+
+/*
+ * Under Microsoft WinLDAP the function ldap_error is only stub.
+ * This macro uses LDAP structure to get error string and pass it to the user.
+ */
+int ldap_perror(LDAP* handle, char* message) {
+	return printf("%s: %s\n", message, handle.ld_error);
+}
+
+/*	FIXME: In MinGW, these are WINLDAPAPI == DECLSPEC_IMPORT.  Linkage
+ *	attribute?
+ */
+extern (C) {
+	PLDAP ldap_initA(PCHAR, ULONG);
+	PLDAP ldap_initW(PWCHAR, ULONG);
+	PLDAP ldap_openA(PCHAR, ULONG);
+	PLDAP ldap_openW(PWCHAR, ULONG);
+	PLDAP cldap_openA(PCHAR, ULONG);
+	PLDAP cldap_openW(PWCHAR, ULONG);
+	ULONG ldap_connect(LDAP*, LDAP_TIMEVAL*);
+	PLDAP ldap_sslinitA(PCHAR, ULONG, int);
+	PLDAP ldap_sslinitW(PWCHAR, ULONG, int);
+	ULONG ldap_start_tls_sA(LDAP*, PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_start_tls_sW(LDAP*, PLDAPControlW*, PLDAPControlW*);
+	BOOLEAN ldap_stop_tls_s(LDAP*);
+	ULONG ldap_get_optionA(LDAP*, int, void*);
+	ULONG ldap_get_optionW(LDAP*, int, void*);
+	ULONG ldap_set_optionA(LDAP*, int, void*);
+	ULONG ldap_set_optionW(LDAP*, int, void*);
+	ULONG ldap_control_freeA(LDAPControlA*);
+	ULONG ldap_control_freeW(LDAPControlW*);
+	ULONG ldap_controls_freeA(LDAPControlA**);
+	ULONG ldap_controls_freeW(LDAPControlW**);
+	ULONG ldap_free_controlsA(LDAPControlA**);
+	ULONG ldap_free_controlsW(LDAPControlW**);
+	ULONG ldap_sasl_bindA(LDAP*, PCHAR, PCHAR, BERVAL*, PLDAPControlA*,
+	  PLDAPControlA*, int*);
+	ULONG ldap_sasl_bindW(LDAP*, PWCHAR, PWCHAR, BERVAL*, PLDAPControlW*,
+	  PLDAPControlW*, int*);
+	ULONG ldap_sasl_bind_sA(LDAP*, PCHAR, PCHAR, BERVAL*, PLDAPControlA*,
+	  PLDAPControlA*, PBERVAL*);
+	ULONG ldap_sasl_bind_sW(LDAP*, PWCHAR, PWCHAR, BERVAL*, PLDAPControlW*,
+	  PLDAPControlW*, PBERVAL*);
+	ULONG ldap_simple_bindA(LDAP*, PCHAR, PCHAR);
+	ULONG ldap_simple_bindW(LDAP*, PWCHAR, PWCHAR);
+	ULONG ldap_simple_bind_sA(LDAP*, PCHAR, PCHAR);
+	ULONG ldap_simple_bind_sW(LDAP*, PWCHAR, PWCHAR);
+	ULONG ldap_unbind(LDAP*);
+	ULONG ldap_unbind_s(LDAP*);
+	ULONG ldap_search_extA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, ULONG*);
+	ULONG ldap_search_extW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, ULONG*);
+	ULONG ldap_search_ext_sA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  PLDAPControlA*, PLDAPControlA*, LDAP_TIMEVAL*, ULONG, LDAPMessage**);
+	ULONG ldap_search_ext_sW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  PLDAPControlW*, PLDAPControlW*, LDAP_TIMEVAL*, ULONG, LDAPMessage**);
+	ULONG ldap_searchA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG);
+	ULONG ldap_searchW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG);
+	ULONG ldap_search_sA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  LDAPMessage**);
+	ULONG ldap_search_sW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  LDAPMessage**);
+	ULONG ldap_search_stA(LDAP*, PCHAR, ULONG, PCHAR, PCHAR[], ULONG,
+	  LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_search_stW(LDAP*, PWCHAR, ULONG, PWCHAR, PWCHAR[], ULONG,
+	  LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_compare_extA(LDAP*, PCHAR, PCHAR, PCHAR, BerValue*,
+	  PLDAPControlA*, PLDAPControlA*, ULONG*);
+	ULONG ldap_compare_extW(LDAP*, PWCHAR, PWCHAR, PWCHAR, BerValue*,
+	  PLDAPControlW*, PLDAPControlW*, ULONG*);
+	ULONG ldap_compare_ext_sA(LDAP*, PCHAR, PCHAR, PCHAR, BerValue*,
+	  PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_compare_ext_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR, BerValue*,
+	  PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_compareA(LDAP*, PCHAR, PCHAR, PCHAR);
+	ULONG ldap_compareW(LDAP*, PWCHAR, PWCHAR, PWCHAR);
+	ULONG ldap_compare_sA(LDAP*, PCHAR, PCHAR, PCHAR);
+	ULONG ldap_compare_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR);
+	ULONG ldap_modify_extA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_modify_extW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_modify_ext_sA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*);
+	ULONG ldap_modify_ext_sW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*);
+	ULONG ldap_modifyA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_modifyW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_modify_sA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_modify_sW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_rename_extA(LDAP*, PCHAR, PCHAR, PCHAR, INT, PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_rename_extW(LDAP*, PWCHAR, PWCHAR, PWCHAR, INT, PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_rename_ext_sA(LDAP*, PCHAR, PCHAR, PCHAR, INT,
+	  PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_rename_ext_sW(LDAP*, PWCHAR, PWCHAR, PWCHAR, INT,
+	  PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_add_extA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_add_extW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_add_ext_sA(LDAP*, PCHAR, LDAPModA*[], PLDAPControlA*,
+	  PLDAPControlA*);
+	ULONG ldap_add_ext_sW(LDAP*, PWCHAR, LDAPModW*[], PLDAPControlW*,
+	  PLDAPControlW*);
+	ULONG ldap_addA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_addW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_add_sA(LDAP*, PCHAR, LDAPModA*[]);
+	ULONG ldap_add_sW(LDAP*, PWCHAR, LDAPModW*[]);
+	ULONG ldap_delete_extA(LDAP*, PCHAR, PLDAPControlA*, PLDAPControlA*,
+	  ULONG*);
+	ULONG ldap_delete_extW(LDAP*, PWCHAR, PLDAPControlW*, PLDAPControlW*,
+	  ULONG*);
+	ULONG ldap_delete_ext_sA(LDAP*, PCHAR, PLDAPControlA*, PLDAPControlA*);
+	ULONG ldap_delete_ext_sW(LDAP*, PWCHAR, PLDAPControlW*, PLDAPControlW*);
+	ULONG ldap_deleteA(LDAP*, PCHAR);
+	ULONG ldap_deleteW(LDAP*, PWCHAR);
+	ULONG ldap_delete_sA(LDAP*, PCHAR);
+	ULONG ldap_delete_sW(LDAP*, PWCHAR);
+	ULONG ldap_extended_operationA(LDAP*, PCHAR, BerValue*, PLDAPControlA*,
+	  PLDAPControlA*, ULONG*);
+	ULONG ldap_extended_operationW(LDAP*, PWCHAR, BerValue*, PLDAPControlW*,
+	  PLDAPControlW*, ULONG*);
+	ULONG ldap_extended_operation_sA(LDAP*, PCHAR, BerValue*, PLDAPControlA*,
+	  PLDAPControlA*, PCHAR*, BerValue**);
+	ULONG ldap_extended_operation_sW(LDAP*, PWCHAR, BerValue*, PLDAPControlW*,
+	  PLDAPControlW*, PWCHAR*, BerValue**);
+	ULONG ldap_close_extended_op(LDAP*, ULONG);
+	ULONG ldap_abandon(LDAP*, ULONG);
+	ULONG ldap_result(LDAP*, ULONG, ULONG, LDAP_TIMEVAL*, LDAPMessage**);
+	ULONG ldap_msgfree(LDAPMessage*);
+	ULONG ldap_parse_resultA(LDAP*, LDAPMessage*, ULONG*, PCHAR*, PCHAR*,
+	  PCHAR**, PLDAPControlA**, BOOLEAN);
+	ULONG ldap_parse_resultW(LDAP*, LDAPMessage*, ULONG*, PWCHAR*, PWCHAR*,
+	  PWCHAR**, PLDAPControlW**, BOOLEAN);
+	ULONG ldap_parse_extended_resultA(LDAP, LDAPMessage*, PCHAR*, BerValue**,
+	  BOOLEAN);
+	ULONG ldap_parse_extended_resultW(LDAP, LDAPMessage*, PWCHAR*, BerValue**,
+	  BOOLEAN);
+	PCHAR ldap_err2stringA(ULONG);
+	PWCHAR ldap_err2stringW(ULONG);
+	ULONG LdapGetLastError();
+	ULONG LdapMapErrorToWin32(ULONG);
+	ULONG ldap_result2error(LDAP*, LDAPMessage*, ULONG);
+	PLDAPMessage ldap_first_entry(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_next_entry(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_first_reference(LDAP*, LDAPMessage*);
+	PLDAPMessage ldap_next_reference(LDAP*, LDAPMessage*);
+	ULONG ldap_count_entries(LDAP*, LDAPMessage*);
+	ULONG ldap_count_references(LDAP*, LDAPMessage*);
+	PCHAR ldap_first_attributeA(LDAP*, LDAPMessage*, BerElement**);
+	PWCHAR ldap_first_attributeW(LDAP*, LDAPMessage*, BerElement**);
+	PCHAR ldap_next_attributeA(LDAP*, LDAPMessage*, BerElement*);
+	PWCHAR ldap_next_attributeW(LDAP*, LDAPMessage*, BerElement*);
+	VOID ldap_memfreeA(PCHAR);
+	VOID ldap_memfreeW(PWCHAR);
+	PCHAR* ldap_get_valuesA(LDAP*, LDAPMessage*, PCHAR);
+	PWCHAR* ldap_get_valuesW(LDAP*, LDAPMessage*, PWCHAR);
+	BerValue** ldap_get_values_lenA(LDAP*, LDAPMessage*, PCHAR);
+	BerValue** ldap_get_values_lenW(LDAP*, LDAPMessage*, PWCHAR);
+	ULONG ldap_count_valuesA(PCHAR*);
+	ULONG ldap_count_valuesW(PWCHAR*);
+	ULONG ldap_count_values_len(BerValue**);
+	ULONG ldap_value_freeA(PCHAR*);
+	ULONG ldap_value_freeW(PWCHAR*);
+	ULONG ldap_value_free_len(BerValue**);
+	PCHAR ldap_get_dnA(LDAP*, LDAPMessage*);
+	PWCHAR ldap_get_dnW(LDAP*, LDAPMessage*);
+	PCHAR ldap_explode_dnA(PCHAR, ULONG);
+	PWCHAR ldap_explode_dnW(PWCHAR, ULONG);
+	PCHAR ldap_dn2ufnA(PCHAR);
+	PWCHAR ldap_dn2ufnW(PWCHAR);
+	ULONG ldap_ufn2dnA(PCHAR, PCHAR*);
+	ULONG ldap_ufn2dnW(PWCHAR, PWCHAR*);
+	ULONG ldap_parse_referenceA(LDAP*, LDAPMessage*, PCHAR**);
+	ULONG ldap_parse_referenceW(LDAP*, LDAPMessage*, PWCHAR**);
+	ULONG ldap_check_filterA(LDAP*, PCHAR);
+	ULONG ldap_check_filterW(LDAP*, PWCHAR);
+	ULONG ldap_create_page_controlA(PLDAP, ULONG, BerValue*, UCHAR,
+	  PLDAPControlA*);
+	ULONG ldap_create_page_controlW(PLDAP, ULONG, BerValue*, UCHAR,
+	  PLDAPControlW*);
+	ULONG ldap_create_sort_controlA(PLDAP, PLDAPSortKeyA*, UCHAR,
+	  PLDAPControlA*);
+	ULONG ldap_create_sort_controlW(PLDAP, PLDAPSortKeyW*, UCHAR,
+	PLDAPControlW*);
+	INT ldap_create_vlv_controlA(LDAP*, LDAPVLVInfo*, UCHAR, LDAPControlA**);
+	INT ldap_create_vlv_controlW(LDAP*, LDAPVLVInfo*, UCHAR, LDAPControlW**);
+	ULONG ldap_encode_sort_controlA(PLDAP, PLDAPSortKeyA*, PLDAPControlA,
+	  BOOLEAN);
+	ULONG ldap_encode_sort_controlW(PLDAP, PLDAPSortKeyW*, PLDAPControlW,
+	  BOOLEAN);
+	ULONG ldap_escape_filter_elementA(PCHAR, ULONG, PCHAR, ULONG);
+	ULONG ldap_escape_filter_elementW(PWCHAR, ULONG, PWCHAR, ULONG);
+	ULONG ldap_get_next_page(PLDAP, PLDAPSearch, ULONG, ULONG*);
+	ULONG ldap_get_next_page_s(PLDAP, PLDAPSearch, LDAP_TIMEVAL*, ULONG,
+	  ULONG*, LDAPMessage**);
+	ULONG ldap_get_paged_count(PLDAP, PLDAPSearch, ULONG*, PLDAPMessage);
+	ULONG ldap_parse_page_controlA(PLDAP, PLDAPControlA*, ULONG*, BerValue**);
+	ULONG ldap_parse_page_controlW(PLDAP, PLDAPControlW*, ULONG*, BerValue**);
+	ULONG ldap_parse_sort_controlA(PLDAP, PLDAPControlA*, ULONG*, PCHAR*);
+	ULONG ldap_parse_sort_controlW(PLDAP, PLDAPControlW*, ULONG*, PWCHAR*);
+	INT ldap_parse_vlv_controlA(LDAP*, LDAPControlA**, uint*, uint*,
+	  BerValue**, int*);
+	INT ldap_parse_vlv_controlW(LDAP*, LDAPControlW**, uint*, uint*,
+	  BerValue**, int*);
+	PLDAPSearch ldap_search_init_pageA(PLDAP, PCHAR, ULONG, PCHAR, PCHAR[],
+	  ULONG, PLDAPControlA*, PLDAPControlA*, ULONG, ULONG, PLDAPSortKeyA*);
+	PLDAPSearch ldap_search_init_pageW(PLDAP, PWCHAR, ULONG, PWCHAR, PWCHAR[],
+	  ULONG, PLDAPControlW*, PLDAPControlW*, ULONG, ULONG, PLDAPSortKeyW*);
+	ULONG ldap_search_abandon_page(PLDAP, PLDAPSearch);
+	LDAP ldap_conn_from_msg(LDAP*, LDAPMessage*);
+	INT LdapUnicodeToUTF8(LPCWSTR, int, LPSTR, int);
+	INT LdapUTF8ToUnicode(LPCSTR, int, LPWSTR, int);
+	deprecated {
+		ULONG ldap_bindA(LDAP*, PCHAR, PCHAR, ULONG);
+		ULONG ldap_bindW(LDAP*, PWCHAR, PWCHAR, ULONG);
+		ULONG ldap_bind_sA(LDAP*, PCHAR, PCHAR, ULONG);
+		ULONG ldap_bind_sW(LDAP*, PWCHAR, PWCHAR, ULONG);
+		ULONG ldap_modrdnA(LDAP*, PCHAR, PCHAR);
+		ULONG ldap_modrdnW(LDAP*, PWCHAR, PWCHAR);
+		ULONG ldap_modrdn_sA(LDAP*, PCHAR, PCHAR);
+		ULONG ldap_modrdn_sW(LDAP*, PWCHAR, PWCHAR);
+		ULONG ldap_modrdn2A(LDAP*, PCHAR, PCHAR, INT);
+		ULONG ldap_modrdn2W(LDAP*, PWCHAR, PWCHAR, INT);
+		ULONG ldap_modrdn2_sA(LDAP*, PCHAR, PCHAR, INT);
+		ULONG ldap_modrdn2_sW(LDAP*, PWCHAR, PWCHAR, INT);
+	}
+}
+
+version (Unicode) {
+	alias LDAPControlW LDAPControl;
+	alias PLDAPControlW PLDAPControl;
+	alias LDAPModW LDAPMod;
+	alias LDAPModW PLDAPMod;
+	alias LDAPSortKeyW LDAPSortKey;
+	alias PLDAPSortKeyW PLDAPSortKey;
+	alias LDAPAPIInfoW LDAPAPIInfo;
+	alias PLDAPAPIInfoW PLDAPAPIInfo;
+	alias LDAPAPIFeatureInfoW LDAPAPIFeatureInfo;
+	alias PLDAPAPIFeatureInfoW PLDAPAPIFeatureInfo;
+	alias cldap_openW cldap_open;
+	alias ldap_openW ldap_open;
+	alias ldap_simple_bindW ldap_simple_bind;
+	alias ldap_simple_bind_sW ldap_simple_bind_s;
+	alias ldap_sasl_bindW ldap_sasl_bind;
+	alias ldap_sasl_bind_sW ldap_sasl_bind_s;
+	alias ldap_initW ldap_init;
+	alias ldap_sslinitW ldap_sslinit;
+	alias ldap_get_optionW ldap_get_option;
+	alias ldap_set_optionW ldap_set_option;
+	alias ldap_start_tls_sW ldap_start_tls_s;
+	alias ldap_addW ldap_add;
+	alias ldap_add_extW ldap_add_ext;
+	alias ldap_add_sW ldap_add_s;
+	alias ldap_add_ext_sW ldap_add_ext_s;
+	alias ldap_compareW ldap_compare;
+	alias ldap_compare_extW ldap_compare_ext;
+	alias ldap_compare_sW ldap_compare_s;
+	alias ldap_compare_ext_sW ldap_compare_ext_s;
+	alias ldap_deleteW ldap_delete;
+	alias ldap_delete_extW ldap_delete_ext;
+	alias ldap_delete_sW ldap_delete_s;
+	alias ldap_delete_ext_sW ldap_delete_ext_s;
+	alias ldap_extended_operation_sW ldap_extended_operation_s;
+	alias ldap_extended_operationW ldap_extended_operation;
+	alias ldap_modifyW ldap_modify;
+	alias ldap_modify_extW ldap_modify_ext;
+	alias ldap_modify_sW ldap_modify_s;
+	alias ldap_modify_ext_sW ldap_modify_ext_s;
+	alias ldap_check_filterW ldap_check_filter;
+	alias ldap_count_valuesW ldap_count_values;
+	alias ldap_create_page_controlW ldap_create_page_control;
+	alias ldap_create_sort_controlW ldap_create_sort_control;
+	alias ldap_create_vlv_controlW ldap_create_vlv_control;
+	alias ldap_encode_sort_controlW ldap_encode_sort_control;
+	alias ldap_escape_filter_elementW ldap_escape_filter_element;
+	alias ldap_first_attributeW ldap_first_attribute;
+	alias ldap_next_attributeW ldap_next_attribute;
+	alias ldap_get_valuesW ldap_get_values;
+	alias ldap_get_values_lenW ldap_get_values_len;
+	alias ldap_parse_extended_resultW ldap_parse_extended_result;
+	alias ldap_parse_page_controlW ldap_parse_page_control;
+	alias ldap_parse_referenceW ldap_parse_reference;
+	alias ldap_parse_resultW ldap_parse_result;
+	alias ldap_parse_sort_controlW ldap_parse_sort_control;
+	alias ldap_parse_vlv_controlW ldap_parse_vlv_control;
+	alias ldap_searchW ldap_search;
+	alias ldap_search_sW ldap_search_s;
+	alias ldap_search_stW ldap_search_st;
+	alias ldap_search_extW ldap_search_ext;
+	alias ldap_search_ext_sW ldap_search_ext_s;
+	alias ldap_search_init_pageW ldap_search_init_page;
+	alias ldap_err2stringW ldap_err2string;
+	alias ldap_control_freeW ldap_control_free;
+	alias ldap_controls_freeW ldap_controls_free;
+	alias ldap_free_controlsW ldap_free_controls;
+	alias ldap_memfreeW ldap_memfree;
+	alias ldap_value_freeW ldap_value_free;
+	alias ldap_dn2ufnW ldap_dn2ufn;
+	alias ldap_ufn2dnW ldap_ufn2dn;
+	alias ldap_explode_dnW ldap_explode_dn;
+	alias ldap_get_dnW ldap_get_dn;
+	alias ldap_rename_extW ldap_rename;
+	alias ldap_rename_ext_sW ldap_rename_s;
+	alias ldap_rename_extW ldap_rename_ext;
+	alias ldap_rename_ext_sW ldap_rename_ext_s;
+	deprecated {
+		alias ldap_bindW ldap_bind;
+		alias ldap_bind_sW ldap_bind_s;
+		alias ldap_modrdnW ldap_modrdn;
+		alias ldap_modrdn_sW ldap_modrdn_s;
+		alias ldap_modrdn2W ldap_modrdn2;
+		alias ldap_modrdn2_sW ldap_modrdn2_s;
+	}
+} else {
+	alias LDAPControlA LDAPControl;
+	alias PLDAPControlA PLDAPControl;
+	alias LDAPModA LDAPMod;
+	alias LDAPModA PLDAPMod;
+	alias LDAPSortKeyA LDAPSortKey;
+	alias PLDAPSortKeyA PLDAPSortKey;
+	alias LDAPAPIInfoA LDAPAPIInfo;
+	alias PLDAPAPIInfoA PLDAPAPIInfo;
+	alias LDAPAPIFeatureInfoA LDAPAPIFeatureInfo;
+	alias PLDAPAPIFeatureInfoA PLDAPAPIFeatureInfo;
+	alias cldap_openA cldap_open;
+	alias ldap_openA ldap_open;
+	alias ldap_simple_bindA ldap_simple_bind;
+	alias ldap_simple_bind_sA ldap_simple_bind_s;
+	alias ldap_sasl_bindA ldap_sasl_bind;
+	alias ldap_sasl_bind_sA ldap_sasl_bind_s;
+	alias ldap_initA ldap_init;
+	alias ldap_sslinitA ldap_sslinit;
+	alias ldap_get_optionA ldap_get_option;
+	alias ldap_set_optionA ldap_set_option;
+	alias ldap_start_tls_sA ldap_start_tls_s;
+	alias ldap_addA ldap_add;
+	alias ldap_add_extA ldap_add_ext;
+	alias ldap_add_sA ldap_add_s;
+	alias ldap_add_ext_sA ldap_add_ext_s;
+	alias ldap_compareA ldap_compare;
+	alias ldap_compare_extA ldap_compare_ext;
+	alias ldap_compare_sA ldap_compare_s;
+	alias ldap_compare_ext_sA ldap_compare_ext_s;
+	alias ldap_deleteA ldap_delete;
+	alias ldap_delete_extA ldap_delete_ext;
+	alias ldap_delete_sA ldap_delete_s;
+	alias ldap_delete_ext_sA ldap_delete_ext_s;
+	alias ldap_extended_operation_sA ldap_extended_operation_s;
+	alias ldap_extended_operationA ldap_extended_operation;
+	alias ldap_modifyA ldap_modify;
+	alias ldap_modify_extA ldap_modify_ext;
+	alias ldap_modify_sA ldap_modify_s;
+	alias ldap_modify_ext_sA ldap_modify_ext_s;
+	alias ldap_check_filterA ldap_check_filter;
+	alias ldap_count_valuesA ldap_count_values;
+	alias ldap_create_page_controlA ldap_create_page_control;
+	alias ldap_create_sort_controlA ldap_create_sort_control;
+	alias ldap_create_vlv_controlA ldap_create_vlv_control;
+	alias ldap_encode_sort_controlA ldap_encode_sort_control;
+	alias ldap_escape_filter_elementA ldap_escape_filter_element;
+	alias ldap_first_attributeA ldap_first_attribute;
+	alias ldap_next_attributeA ldap_next_attribute;
+	alias ldap_get_valuesA ldap_get_values;
+	alias ldap_get_values_lenA ldap_get_values_len;
+	alias ldap_parse_extended_resultA ldap_parse_extended_result;
+	alias ldap_parse_page_controlA ldap_parse_page_control;
+	alias ldap_parse_referenceA ldap_parse_reference;
+	alias ldap_parse_resultA ldap_parse_result;
+	alias ldap_parse_sort_controlA ldap_parse_sort_control;
+	alias ldap_parse_vlv_controlA ldap_parse_vlv_control;
+	alias ldap_searchA ldap_search;
+	alias ldap_search_sA ldap_search_s;
+	alias ldap_search_stA ldap_search_st;
+	alias ldap_search_extA ldap_search_ext;
+	alias ldap_search_ext_sA ldap_search_ext_s;
+	alias ldap_search_init_pageA ldap_search_init_page;
+	alias ldap_err2stringA ldap_err2string;
+	alias ldap_control_freeA ldap_control_free;
+	alias ldap_controls_freeA ldap_controls_free;
+	alias ldap_free_controlsA ldap_free_controls;
+	alias ldap_memfreeA ldap_memfree;
+	alias ldap_value_freeA ldap_value_free;
+	alias ldap_dn2ufnA ldap_dn2ufn;
+	alias ldap_ufn2dnA ldap_ufn2dn;
+	alias ldap_explode_dnA ldap_explode_dn;
+	alias ldap_get_dnA ldap_get_dn;
+	alias ldap_rename_extA ldap_rename;
+	alias ldap_rename_ext_sA ldap_rename_s;
+	alias ldap_rename_extA ldap_rename_ext;
+	alias ldap_rename_ext_sA ldap_rename_ext_s;
+	deprecated {
+		alias ldap_bindA ldap_bind;
+		alias ldap_bind_sA ldap_bind_s;
+		alias ldap_modrdnA ldap_modrdn;
+		alias ldap_modrdn_sA ldap_modrdn_s;
+		alias ldap_modrdn2A ldap_modrdn2;
+		alias ldap_modrdn2_sA ldap_modrdn2_s;
+	}
+}