WindowsXP-SP1/admin/wizards/addusrw/dapi.h
2020-09-30 16:53:49 +02:00

1323 lines
69 KiB
C

/*******************************************************************
*
* Copyright (c) Microsoft Corp. 1986-1996. All Rights Reserved.
*
*
* DESCRIPTION: This header file defines the functions, structures,
* and macros used to access the Microsoft Exchange
* APIs for modifying entries in the Exchange 4.0 DIT.
* These APIs permit a calling process to create,
* modify, or delete DIT objects by specifying the
* name of a CSV text file containing attributes
* for objects to import into ( or to modify)
* the DIT. See the Directory Access Functions
* section of the Exchange Developer's Kit for
* more detailed description of this interface.
*
* Calling programs must link with DAPI.LIB.
*
* Error and warning codes are defined in DAPIMSG.H
*
*
*******************************************************************/
/** include files **/
#ifndef _WINDOWS_
#include <windows.h>
#endif
/** local definitions **/
#ifndef _DAPI_INCLUDED_
#define _DAPI_INCLUDED_
#ifdef __cplusplus
extern "C"
{
#endif
// Import / Export APIs check for the presence of this signature in
// the dwDAPISignature field in the import parameter blocks.
// This signature will be incremented each time one of the parameter
// blocks is changed so that header synchronization problems can be
// detected.
#define DAPI_SIGNATURE 0x46414400
// Combinable flags used to control the API functions.
// The following flags control filtering of DAPI events
// The default action is DAPI_EVENT_ALL
#define DAPI_EVENT_MASK 0x00000007 /* bit-field containing event-filtering requested
if none of these bits are set, DAPI_EVENT_ALL is assumed */
#define DAPI_EVENT_MIN 0x00000001 /* No warning or error logging.
Log start and stop messages */
#define DAPI_EVENT_SOME 0x00000002 /* Start, Stop, and Error messages will be logged. */
#define DAPI_EVENT_ALL 0x00000004 /* Start, Stop, Error, and Warning messages
will be logged. */
// The following flags control schema read and use of the schema
#define DAPI_FORCE_SCHEMA_LOAD 0x00000010 /* Unload previously loaded schema
and read schema again.
Default action is to re-use
previously loaded schema if read
from the same messaging domain */
#define DAPI_RAW_MODE 0x00000020 /* Import / Export in "Raw" mode. Import
lines are taken literally. No
attributes will be inherited,
constructed, etc. Aliases for
attribute and class names will
not be recognized. */
#define DAPI_OVERRIDE_CONTAINER 0x00000040 /* Container specified in the parameter block
overrides the contents of the container column.
Default behaviour is for the value specified
in the Obj-Container column to override
that specified in the parameter block */
#define DAPI_IMPORT_NO_ERR_FILE 0x00000080 /* Do not create Error File -- BatchImport only */
#define DAPI_IMPORT_WRITE_THROUGH 0x00400000 /* Commit write operations immediately */
// Flags defined for "Batch" operations only -- ignored by DAPIRead, DAPIWrite
#define DAPI_YES_TO_ALL 0x00000100 /* Force "yes" response on any
user-prompt UI
(i.e., continue w/o proxy addresses, etc.) */
#define DAPI_SUPPRESS_PROGRESS 0x00000200 /* Suppress progress thermometer on batch operations.
Default is to display progress */
#define DAPI_SUPPRESS_COMPLETION 0x00000400 /* Suppress completion notification message box on batch operations */
#define DAPI_SUPPRESS_ARCHIVES 0x00000800 /* Suppress creation of "archive" copies
of output files -- BatchImport and BatchExport only*/
// Flags defined for BatchExport
#define DAPI_EXPORT_MAILBOX 0x00001000 /* Export Mailbox recipients */
#define DAPI_EXPORT_CUSTOM 0x00002000 /* Export remote address recipients */
#define DAPI_EXPORT_DIST_LIST 0x00004000 /* Export Distribution Lists */
#define DAPI_EXPORT_RECIPIENTS (DAPI_EXPORT_MAILBOX | DAPI_EXPORT_CUSTOM | DAPI_EXPORT_DIST_LIST)
/* Export all recipient objects */
#define DAPI_EXPORT_ALL_CLASSES 0x00008000 /* If this flag is set, all objects meeting other restrictions
(i.e., USN level, container scope, etc.) will be exported,
regardless of class */
#define DAPI_EXPORT_HIDDEN 0x00010000 /* Include Hidden objects in export.
Default is no export if Hide-From-Address-Book */
#define DAPI_EXPORT_SUBTREE 0x00020000 /* Traverse the Directory Information Tree hierarchy,
exporting objects that meet the export restrictions */
#define DAPI_EXPORT_BASEPOINT_ONLY 0x00040000 /* Export only the requested attributes from
the named BasePoint object. All other
export restrictions are ignored (class flags,
rgpszClasses, pszServerName).
This flag implies DAPI_SUPPRESS_PROGRESS
and DAPI_SUPPRESS_COMPLETION */
// Flags defined only for BatchImport
#define DAPI_OVERRIDE_SYNCH_STATE 0x00080000 /* Override server's synchronization status,
normally checked on BatchImport.
NOTE: This flag should normally NOT be set.
The normal behaviour is to prevent BatchImport
operations from possible conflict with directory
synchronization */
// Flags defined only for DAPIRead
#define DAPI_READ_DEFINED_ATTRIBUTES 0x00100000 /* return all attributes that are set
for the current object.
This flag is ignored if pAttributes is specified. */
#define DAPI_READ_ALL_ATTRIBUTES 0x00200000 /* return all attributes that are defined
for the class of the current object.
This flag is ignored if pAttributes is specified. */
// The following flags control NT Security management
#define DAPI_RESTRICT_ACCESS 0x01000000 /* Apply NT Security Descriptor to
created objects */
#define DAPI_CREATE_NT_ACCOUNT 0x02000000 /* Create NT accounts
(valid only in Create/Modify mode) */
#define DAPI_CREATE_RANDOM_PASSWORD 0x04000000 /* Generate random passwords for
created NT accounts. Ignored if DAPI_CREATE_NT_ACCOUNT
is not set */
#define DAPI_DELETE_NT_ACCOUNT 0x08000000 /* Delete ASSOC-NT-ACCOUNT when
deleting mailbox */
// Flags defined only for DAPIWrite
#define DAPI_MODIFY_REPLACE_PROPERTIES 0x00800000 /* Append values to multi-value attributes when modifying */
#define DAPI_WRITE_UPDATE 0x10000000 /* Modify if object exists, create if it doesn't.
NOTE: This is the default mode */
#define DAPI_WRITE_CREATE 0x20000000 /* Create object -- fail if object exists */
#define DAPI_WRITE_MODIFY 0x30000000 /* Modify object -- fail if object does not exist */
#define DAPI_WRITE_DELETE 0x40000000 /* Delete object */
#define DAPI_WRITE_MODE_MASK 0x70000000
// Callback flags
#define DAPI_CALLBACK_CHAIN 0x00000001 /* If set in dwFlags field of the ERROR_CALLBACK
and the CALLBACKPROGRESS structures, the default
handler will be invoked after calling out to the
caller-supplied handler function, unless the user
function returns FALSE, indicating cancel.
NOTE: This flag is not defined for the EXPORT_CALLBACK
structure.
NOTE: This flag should not be set in the dwFlags
field of the main parameter block */
// default delimiter values used when parsing the import file
#define DAPI_DEFAULT_DELIMA ','
#define DAPI_DEFAULT_QUOTEA '"'
#define DAPI_DEFAULT_MV_SEPA '%'
#define DAPI_DEFAULT_DELIMW L','
#define DAPI_DEFAULT_QUOTEW L'"'
#define DAPI_DEFAULT_MV_SEPW L'%'
#define DAPI_CTRL_FILE_PTRA '='
#define DAPI_CTRL_FILE_PTRW L'='
#define DAPI_CTRL_META_CHARA '~'
#define DAPI_CTRL_META_CHARW L'~'
#define pszSubstServerA "~SERVER"
#define pszSubstServerW L"~SERVER"
#define cchSubstServer ((sizeof (pszSubstServerA) / sizeof(CHAR)) - 1)
#define pszDeleteKeyA "~DEL"
#define pszDeleteKeyW L"~DEL"
#define cchDeleteKey ((sizeof (pszDeleteKeyA) / sizeof(CHAR)) - 1)
#define DAPI_UNICODE_FILE ((UINT)-1)
#ifdef UNICODE
#define DAPI_DEFAULT_DELIM DAPI_DEFAULT_DELIMW
#define DAPI_DEFAULT_QUOTE DAPI_DEFAULT_QUOTEW
#define DAPI_DEFAULT_MV_SEP DAPI_DEFAULT_MV_SEPW
#define DAPI_CTRL_FILE_PTR DAPI_CTRL_FILE_PTRW
#define DAPI_CTRL_META_CHAR DAPI_CTRL_META_CHARW
#define pszSubstServer pszSubstServerW
#define pszDeleteKey pszDeleteKeyW
#else
#define DAPI_DEFAULT_DELIM DAPI_DEFAULT_DELIMA
#define DAPI_DEFAULT_QUOTE DAPI_DEFAULT_QUOTEA
#define DAPI_DEFAULT_MV_SEP DAPI_DEFAULT_MV_SEPA
#define DAPI_CTRL_FILE_PTR DAPI_CTRL_FILE_PTRA
#define DAPI_CTRL_META_CHAR DAPI_CTRL_META_CHARA
#define pszSubstServer pszSubstServerA
#define pszDeleteKey pszDeleteKeyA
#endif
/*******************************************************************************
* Batch Operation Progress Callback Function Definitions
* Pointers to functions of these types are provided by the caller via the
* CALLBACKPROGRESS structure in the Batch function parameter block
*
********************************************************************************
*
* procedure : PDAPI_FInitProgress
*
* purpose : Initialize progress handler (possibly progress display dialog)
*
* parameters : lpvAppDefined value provided in the progress callback structure
* nMac Maximum Anticipated Calls. If non-zero, this indicates
* the number of progress events anticipated.
* If zero, the number of items to process is unknown,
* so the number of calls to UpdateProgress is indeterminate.
*
* returns : TRUE Indicates that all is well
* FALSE Could not initialize progress handler, cancel session.
*
********************************************************************************
*
* procedure : PDAPI_FResetProgress
*
* purpose : Re-initialize progress handler (possibly reset progress bar)
*
* parameters : lpvAppDefined value provided in the progress callback structure
* nMac Maximum Anticipated Calls. If non-zero, this indicates
* the number of progress events anticipated.
* If zero, the number of items to process is unknown,
* so the number of calls to UpdateProgress is indeterminate.
*
* returns : TRUE Indicates that all is well
* FALSE Could not re-initialize progress handler, cancel session.
*
********************************************************************************
*
* procedure : PDAPI_FEndProgress
*
* purpose : Terminate progress handler (possibly progress display dialog)
*
* parameters : lpvAppDefined value provided in the progress callback structure
*
* returns : TRUE Indicates that all is well
* FALSE Could not terminate progress handler, cancel session.
*
********************************************************************************
*
* procedure : PDAPI_FUpdateProgress
*
* purpose : Completed processing item. Called to indicate time to increment
* progress display.
*
* parameters : lpvAppDefined value provided in the progress callback structure
*
* returns : TRUE Indicates that all is well
* FALSE Cancel session (i.e., cancel button pressed).
*
********************************************************************************
*
* procedure : PDAPI_FUpdateProgressText
*
* purpose : Replace progress text area with provided text string
*
* parameters : lpvAppDefined value provided in the progress callback structure
*
* returns : TRUE Indicates that all is well
* FALSE Cancel session (i.e., cancel button pressed).
*
********************************************************************************/
typedef BOOL (PASCAL * PDAPI_FInitProgress)
(LPVOID lpvAppDefined, INT nMac);
typedef BOOL (PASCAL * PDAPI_FUpdateProgress)
(LPVOID lpvAppDefined);
typedef BOOL (PASCAL * PDAPI_FEndProgress)
(LPVOID lpvAppDefined);
typedef BOOL (PASCAL * PDAPI_FResetProgress)
(LPVOID lpvAppDefined, INT nMac);
typedef BOOL (PASCAL * PDAPI_FUpdateProgressText)
(LPVOID lpvAppDefined, LPTSTR pszText);
typedef struct CallBackProgressEntryPoints
{
DWORD dwFlags;
LPVOID lpvAppDefined;
PDAPI_FInitProgress pfnInitProgress;
PDAPI_FUpdateProgress pfnUpdateProgress;
PDAPI_FEndProgress pfnEndProgress;
PDAPI_FResetProgress pfnResetProgress;
PDAPI_FUpdateProgressText pfnUpdateProgressText;
} CALLBACKPROGRESS, *PCALLBACKPROGRESS;
// Values specified in the ulEvalTag field of the
// DAPI_ENTRY and EXPORT_CALLBACK structures
//
typedef enum _DAPI_EVAL
{
VALUE_ARRAY = 0, // Each attribute has an entry in the array
// Text strings and object names exported as text
// Numerical values exported as numbers
// Binary data exported as binary string
TEXT_VALUE_ARRAY, // Each attribute has an entry in the array
// All values converted to text representation
TEXT_LINE // first item in the rgEntryValues array
// is a delimited text line
} DAPI_EVAL, *PDAPI_EVAL;
typedef enum _EXP_TYPE_TAG
{
EXPORT_HEADER = 0, // export item contains column headers
EXPORT_ENTRY // export item contains attribute values
} EXP_TYPE, * PEXP_TYPE;
typedef enum enumDAPI_DATA_TYPE
{
DAPI_NO_VALUE = 0,
DAPI_STRING8,
DAPI_UNICODE,
DAPI_BINARY,
DAPI_INT,
DAPI_BOOL,
} DAPI_DATA_TYPE, * PDAPI_DATA_TYPE;
#ifdef UNICODE
#define DAPI_TEXT DAPI_UNICODE
#else
#define DAPI_TEXT DAPI_STRING8
#endif
typedef union _DAPI_VALUE
{
LPSTR pszA;
LPWSTR pszW;
#ifdef UNICODE
LPWSTR pszValue;
#else
LPSTR pszValue;
#endif
LPBYTE lpBinary;
INT iValue;
BOOL bool;
} DAPI_VALUE, * PDAPI_VALUE;
// The ATT_VALUE structure contains a text representation of an attribute value
// A linked list of these structures is used for a multi-valued attribute
typedef struct _ATT_VALUE
{
DAPI_DATA_TYPE DapiType; // How to evaluate DAPI_VALUE union
DAPI_VALUE Value;
UINT size; // size of the value --
// # chars if string type
// else, # bytes
struct _ATT_VALUE * pNextValue;
} ATT_VALUE, * PATT_VALUE;
typedef struct _DAPI_ENTRY
{
UINT unAttributes; // Number of attributes exported
DAPI_EVAL ulEvalTag; // rgEntryValues is interpreted based on this value
PATT_VALUE rgEntryValues; // if (ulEvalTag == TEXT_LINE)
// There is a single value, w/ delimited line
// else
// unAttributes, each w/ 1 or more value in list
} DAPI_ENTRY, * PDAPI_ENTRY;
// Define type for address of application routine
// for call-back on each exported entry.
// Return value of FALSE indicates that export operation should be cancelled
typedef BOOL (PASCAL DAPI_FNExportEntry) (
EXP_TYPE ExportDataType, // What type of data is being exported
LPVOID lpvAppDefined, // Application-defined parameter,
// passed in EXPORT_CALLBACK structure
// on initialization
PDAPI_ENTRY pExportEntry // pointer to exported entry data
// NOTE: Data in this structure
// will NOT remain valid after return
// from this function
);
typedef DAPI_FNExportEntry * PDAPI_FNExportEntry;
typedef struct _EXPORT_CALLBACK
{
DWORD dwFlags; // Flags defined to control callback functionality
// See flag definitions below
DAPI_EVAL ulEvalTag; // Specifies data format on callback
LPVOID lpvAppDefined; // Application-defined field, passed as parm to callback
PDAPI_FNExportEntry pfnExportEntry; // Pointer to function called to process
// each exported entry
} EXPORT_CALLBACK, * PEXPORT_CALLBACK;
/*******************************************************************************
* procedure : pfnErrorCallback
*
* purpose : The following section defines structures for the error callback
* mechanism of the Batch Import APIs
* Events will be filtered based on the ControlfFlags set in the
* API parameter block
*
********************************************************************************/
// Define flags used for export callback
// Define the maximum number of substitutions in a single event string
#define DAPI_MAX_SUBST 8
typedef struct _DAPI_EVENTA
{
DWORD dwDAPIError; // Message ID for event log
LPSTR rgpszSubst[DAPI_MAX_SUBST]; // Event message substitution array
UINT unSubst; // number of substitution strings
LPSTR pszAttribute; // Name of attribute specifically affected
// Note: may be NULL on some errors
LPSTR pszHoldLine; // point to buffer containing copy
// of current import line
HINSTANCE hinstDAPI; // Instance of DAPI DLL
struct _DAPI_EVENTA * pNextEvent; // Pointer to next event
} DAPI_EVENTA, *PDAPI_EVENTA;
typedef struct _DAPI_EVENTW
{
DWORD dwDAPIError; // Message ID for event log
LPWSTR rgpszSubst[DAPI_MAX_SUBST]; // Event message substitution array
UINT unSubst; // number of substitution strings
LPWSTR pszAttribute; // Name of attribute specifically affected
// Note: may be NULL on some errors
LPWSTR pszHoldLine; // point to buffer containing copy
// of current import line
HINSTANCE hinstDAPI; // Instance of DAPI DLL
struct _DAPI_EVENTW * pNextEvent; // Pointer to next event
} DAPI_EVENTW, *PDAPI_EVENTW;
#ifdef UNICODE
typedef DAPI_EVENTW DAPI_EVENT;
typedef PDAPI_EVENTW PDAPI_EVENT;
#else
typedef DAPI_EVENTA DAPI_EVENT;
typedef PDAPI_EVENTA PDAPI_EVENT;
#endif
// Define type for address of application routine
// for call-back on each error encountered.
// Return value of FALSE indicates that operation should be cancelled
typedef BOOL (PASCAL DAPI_FNErrorCallback) (
LPVOID lpvAppDefined, // Application-defined parameter,
// passed in EXPORT_CALLBACK structure
// on initialization
PDAPI_EVENT pDapiEvent // Event information structure
// NOTE: Data in the event record
// will NOT remain valid after return
// from this function
);
typedef DAPI_FNErrorCallback * PDAPI_FNErrorCallback;
typedef struct tagERROR_CALLBACK
{
DWORD dwFlags; // Flags defined to control callback functionality
// See flag definitions above
LPVOID lpvAppDefined; // Application-defined field, passed back in callback
PDAPI_FNErrorCallback pfnErrorCallback; // Address of function that should be
// called on each error encountered
// If not supplied (NULL), default
// error handler is called, which
// writes the error into the
// NT Application event log
} ERROR_CALLBACK, * PERROR_CALLBACK;
/*******************************************************************************
*
* Batch Directory Import Interface definitions
*
********************************************************************************/
/*******************************************************************************
* procedure : DAPIUninitialize
*
* purpose : Notify DAPI that it is time to terminate background threads
* and such in preparation for process shutdown
*
* parameters : dwFlags combinable bits which may be set to control function
*
* returns : nothing
*
* created : 11/01/95
*
* changes :
*
********************************************************************************/
extern void APIENTRY DAPIUninitialize (
DWORD dwFlags // Flags for call
);
/*******************************************************************************
* procedure : SchemaPreload
*
* purpose : Called to perform asyncronous schema load. This entry point
* spawns a thread that initializes all the attribute and class
* tables for normal import/export operation.
*
* parameters : pSchemaPreloadParms pointer to SchemaPreloadParameter block
*
* returns : nothing
*
* history :
*
********************************************************************************/
extern void APIENTRY SchemaPreloadA (
DWORD dwFlags, // Flags used to control schema load.
LPSTR pszDSA // name of DSA from which to read schema
);
extern void APIENTRY SchemaPreloadW (
DWORD dwFlags, // Flags used to control schema load.
LPWSTR pszDSA // name of DSA from which to read schema
);
#ifdef UNICODE
#define SchemaPreload SchemaPreloadW
#else
#define SchemaPreload SchemaPreloadA
#endif
typedef struct _BIMPORT_PARMSW
{
// NOTE: the order of the first three fields of this structure
// should NOT be changed.
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control import action
HWND hwndParent; // Windows handle to use when displaying message boxes
LPWSTR pszImportFile; // Fully qualified pathname to Import Data file
// On Batch Import, objects are imported into
// the DIT from this file.
UINT uCodePage; // Code page specification for import file.
// The following values are interpreted:
// DAPI_UNICODE_FILE Import file is Unicode
// Will return error if file is ANSI
// 0 Auto-detect file type
// If ANSI, assume CP_ACP
// other File contains text in the
// specified code page
// Will return error if file is Unicode
// Will return error if code page is not
// supported by the system
LPWSTR pszDSAName; // Computer name of DSA to update
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPWSTR pszContainer; // RDN of default container under which
// to perform bulk import operations
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// bulk operations will be performed at
// the level below BaseImportPoint.
// Container names specified in the
// import file will override this value.
WCHAR chColSep; // Column Separator --
// DEFAULT_DELIM is used if this value is zero
WCHAR chQuote; // String enclosing character --
// DEFAULT_QUOTE is used if this value is zero
WCHAR chMVSep; // Multi-value Property Separator --
// DEFAULT_MV_SEP is used if this value is zero
WCHAR creserved; // alignment
CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
LPWSTR pszNTDomain; // Name of NT Domain in which to lookup / create NT accounts.
// Defaults to current logon domain if NULL or empty
LPWSTR pszCreateTemplate; // DN of the Default User (NULL if none) from which
// to draw template values
} BIMPORT_PARMSW, *PBIMPORT_PARMSW, *LPBIMPORT_PARMSW;
typedef struct _BIMPORT_PARMSA
{
// NOTE: the order of the first three fields of this structure
// should NOT be changed.
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control import action
HWND hwndParent; // Windows handle to use when displaying message boxes
LPSTR pszImportFile; // Fully qualified pathname to Import Data file
// On Batch Import, objects are imported into
// the DIT from this file.
UINT uCodePage; // Code page specification for import file.
// The following values are interpreted:
// DAPI_UNICODE_FILE Import file is Unicode
// Will return error if file is ANSI
// 0 Auto-detect file type
// If ANSI, assume CP_ACP
// other File contains text in the
// specified code page
// Will return error if file is Unicode
// Will return error if code page is not
// supported by the system
LPSTR pszDSAName; // Computer name of DSA to update
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPSTR pszContainer; // RDN of default container under which
// to perform bulk import operations
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// bulk operations will be performed at
// the level below BaseImportPoint.
// Container names specified in the
// import file will override this value.
CHAR chColSep; // Column Separator --
// DEFAULT_DELIM is used if this value is zero
CHAR chQuote; // String enclosing character --
// DEFAULT_QUOTE is used if this value is zero
CHAR chMVSep; // Multi-value Property Separator --
// DEFAULT_MV_SEP is used if this value is zero
CHAR creserved; // alignment
CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
LPSTR pszNTDomain; // Name of NT Domain in which to lookup / create NT accounts.
// Defaults to current logon domain if NULL or empty
LPSTR pszCreateTemplate; // DN of the Default User (NULL if none) from which
// to draw template values
} BIMPORT_PARMSA, *PBIMPORT_PARMSA, *LPBIMPORT_PARMSA;
#ifdef UNICODE
typedef BIMPORT_PARMSW BIMPORT_PARMS;
typedef PBIMPORT_PARMSW PBIMPORT_PARMS;
typedef LPBIMPORT_PARMSW LPBIMPORT_PARMS;
#else
typedef BIMPORT_PARMSA BIMPORT_PARMS;
typedef PBIMPORT_PARMSA PBIMPORT_PARMS;
typedef LPBIMPORT_PARMSA LPBIMPORT_PARMS;
#endif
// The BatchImport function provides single-call BatchImport from the
// specified import file. All import parameters are specified in the
// BIMPORT_PARMS structure pointed to by lpBimportParms.
// The return value indicates the number of errors logged in the
// NT Application log. Please note that this does not indicate
// success or failure of the Batch Import.
// UI and Logging of errors and warnings into the Application log
// are controlled through import parameters.
extern DWORD APIENTRY BatchImportW (LPBIMPORT_PARMSW lpBimportParms);
extern DWORD APIENTRY BatchImportA (LPBIMPORT_PARMSA lpBimportParms);
#ifdef UNICODE
#define BatchImport BatchImportW
#else
#define BatchImport BatchImportA
#endif
/*******************************************************************************
*
* Batch Directory Export Interface definitions
*
********************************************************************************/
typedef struct _BEXPORT_PARMSW
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control export action
HWND hwndParent; // Windows handle to use when displaying message boxes
LPWSTR pszExportFile; // Fully qualified pathname of file to export into
// Ignored if ExportCallback is specified
UINT uCodePage; // Code page specification for export file.
// The following values are interpreted:
// DAPI_UNICODE_FILE Export file is Unicode.
// Will return error
// if file exists and is ANSI
// 0 Auto-detect file type
// If file does not exist,
// export file will contain CP_ACP text.
// If file exists and is ANSI
// export file will contain CP_ACP text.
// If file exists and is Unicode,
// export file will contain Unicode
// other Export text to file in the
// specified code page
// Will return error
// if file exists and is Unicode
// Will return error if code page is not
// supported by the system
LPWSTR pszDSAName; // Computer name of DSA from which to export
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPWSTR pszContainer; // RDN of container from which to export objects
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// the contents of all containers below
// the BaseImportPoint will be exported.
WCHAR chColSep; // Column Separator --
// DEFAULT_DELIM is used if this value is zero
WCHAR chQuote; // String enclosing character --
// DEFAULT_QUOTE is used if this value is zero
WCHAR chMVSep; // Multi-value Property Separator --
// DEFAULT_MV_SEP is used if this value is zero
WCHAR cReserved; // alignment
CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with names of attributes to export
// Optional if pszExportFile specified
// Required if ExportCallback specified
LPWSTR pszHomeServer; // Name of server for server-associated export
LPWSTR * rgpszClasses; // array of pointers to zero-terminated object classes to export
// The last entry must be NULL
// NOTE: The Directory will be queried for objects
// of the classes in the specified order.
ULONG ulUSNBase; // Base USN to use for export restriction.
// If non-zero, only items having USN-Changed >= ulUSNBase will be exported
LPVOID pReserved; // Reserved -- Must be zero
} BEXPORT_PARMSW, *PBEXPORT_PARMSW, *LPBEXPORT_PARMSW;
typedef struct _BEXPORT_PARMSA
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control export action
HWND hwndParent; // Windows handle to use when displaying message boxes
LPSTR pszExportFile; // Fully qualified pathname of file to export into
// Ignored if ExportCallback is specified
UINT uCodePage; // Code page specification for export file.
// The following values are interpreted:
// DAPI_UNICODE_FILE Export file is Unicode.
// Will return error
// if file exists and is ANSI
// 0 Auto-detect file type
// If file does not exist,
// export file will contain CP_ACP text.
// If file exists and is ANSI
// export file will contain CP_ACP text.
// If file exists and is Unicode,
// export file will contain Unicode
// other Export text to file in the
// specified code page
// Will return error
// if file exists and is Unicode
// Will return error if code page is not
// supported by the system
LPSTR pszDSAName; // Computer name of DSA from which to export
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPSTR pszContainer; // RDN of container from which to export objects
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// the contents of all containers below
// the BaseImportPoint will be exported.
CHAR chColSep; // Column Separator --
// DEFAULT_DELIM is used if this value is zero
CHAR chQuote; // String enclosing character --
// DEFAULT_QUOTE is used if this value is zero
CHAR chMVSep; // Multi-value Property Separator --
// DEFAULT_MV_SEP is used if this value is zero
CHAR cReserved; // alignment
CALLBACKPROGRESS ProgressCallBacks; // Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with names of attributes to export
// Optional if pszExportFile specified
// Required if ExportCallback specified
LPSTR pszHomeServer; // Name of server for server-associated export
LPSTR * rgpszClasses; // array of pointers to zero-terminated object classes to export
// The last entry must be NULL
// NOTE: The Directory will be queried for objects
// of the classes in the specified order.
ULONG ulUSNBase; // Base USN to use for export restriction.
// If non-zero, only items having USN-Changed >= ulUSNBase will be exported
LPVOID pReserved; // Reserved -- Must be zero
} BEXPORT_PARMSA, *PBEXPORT_PARMSA, *LPBEXPORT_PARMSA;
#ifdef UNICODE
typedef BEXPORT_PARMSW BEXPORT_PARMS;
typedef PBEXPORT_PARMSW PBEXPORT_PARMS;
typedef LPBEXPORT_PARMSW LPBEXPORT_PARMS;
#else
typedef BEXPORT_PARMSA BEXPORT_PARMS;
typedef PBEXPORT_PARMSA PBEXPORT_PARMS;
typedef LPBEXPORT_PARMSA LPBEXPORT_PARMS;
#endif
// Batch Export entry points
// The BatchExport function provides single-call BatchExport from the
// specified import file. All import parameters are specified in the
// BEXPORT_PARMS structure pointed to by lpBexportParms.
// The return value indicates the number of errors logged in the
// NT Application log. Please note that this does not indicate
// success or failure of the Batch Export.
// UI and Logging of errors and warnings into the Application log
// are controlled through import parameters.
extern DWORD APIENTRY BatchExportW (LPBEXPORT_PARMSW lpBexportParms);
extern DWORD APIENTRY BatchExportA (LPBEXPORT_PARMSA lpBexportParms);
#ifdef UNICODE
#define BatchExport BatchExportW
#else
#define BatchExport BatchExportA
#endif
/*******************************************************************************
*
* Single-Object Interface definitions
*
********************************************************************************/
typedef struct _DAPI_PARMSW
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control import action
// See Import Control flags defined above.
LPWSTR pszDSAName; // Computer name of DSA to update
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPWSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPWSTR pszContainer; // RDN of default container under which
// to perform bulk import operations
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// bulk operations will be performed at
// the level below BaseImportPoint.
// Container names specified in the
// import file will override this value.
LPWSTR pszNTDomain; // Name of NT Domain in which to lookup accounts
// and to create NT accounts.
// Current logon domain is used if NULL or empty string.
LPWSTR pszCreateTemplate;// DN of the template object used for default values
PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with default attribute list
} DAPI_PARMSW, *PDAPI_PARMSW, FAR *LPDAPI_PARMSW;
typedef struct _DAPI_PARMSA
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control import action
// See Import Control flags defined above.
LPSTR pszDSAName; // Computer name of DSA to update
// Default: local DSA (if operating)
// if no local DSA, first DSA found
// on network is used
LPSTR pszBasePoint; // DN of base-point in DIT for bulk operations
// Default values:
// if NULL, Messaging Site containing bound server
// if empty string, enterprise containing bound server
LPSTR pszContainer; // RDN of default container under which
// to perform bulk import operations
// NOTE: This container is assumed to be
// at the level below that indicated by
// the pszBasePoint. If NULL,
// bulk operations will be performed at
// the level below BaseImportPoint.
// Container names specified in the
// import file will override this value.
LPSTR pszNTDomain; // Name of NT Domain in which to lookup accounts
// and to create NT accounts.
// Current logon domain is used if NULL or empty string.
LPSTR pszCreateTemplate; // DN of the template object used for default values
PDAPI_ENTRY pAttributes; // DAPI_ENTRY filled with default attribute list
} DAPI_PARMSA, *PDAPI_PARMSA, FAR *LPDAPI_PARMSA;
#ifdef UNICODE
typedef DAPI_PARMSW DAPI_PARMS;
typedef PDAPI_PARMSW PDAPI_PARMS;
typedef LPDAPI_PARMSW LPDAPI_PARMS;
#else
typedef DAPI_PARMSA DAPI_PARMS;
typedef PDAPI_PARMSA PDAPI_PARMS;
typedef LPDAPI_PARMSA LPDAPI_PARMS;
#endif
typedef LPVOID DAPI_HANDLE;
typedef LPVOID * PDAPI_HANDLE;
typedef LPVOID FAR * LPDAPI_HANDLE;
#define DAPI_INVALID_HANDLE ((DAPI_HANDLE) -1)
// DAPIStart initializes a DAPI session.
// for use by DAPIRead and DAPIWrite. The return value is 0 if no errors
// are encountered. A pointer to a DAPI_EVENT structure is returned if an
// error is encountered.
// NOTE: The DAPI_HANDLE must be returned via a call to DAPIEnd.
// If a non-NULL value is returned, its memory must be freed by
// a call to DAPIFreeMemory
extern PDAPI_EVENTW APIENTRY DAPIStartW (LPDAPI_HANDLE lphDAPISession,
LPDAPI_PARMSW lpDAPIParms);
extern PDAPI_EVENTA APIENTRY DAPIStartA (LPDAPI_HANDLE lphDAPISession,
LPDAPI_PARMSA lpDAPIParms);
#ifdef UNICODE
#define DAPIStart DAPIStartW
#else
#define DAPIStart DAPIStartA
#endif
// DAPIEnd invalidates the DAPI_HANDLE obtained by the call to DAPIStart.
// NOTE: There are no separate Unicode / Ansi entry points defined
extern void APIENTRY DAPIEnd (LPDAPI_HANDLE lphDAPISession);
// DAPIRead() Reads indicated attributes from the named Directory Object
// Parameters:
// Returned value: NULL indicates no difficulties encountered.
// Else, pointer to structure containing description of
// error(s) or warning(s) encountered.
// Must be freed by call to DAPIFreeMemory.
// hDAPISession DAPI Session handle obtained via InitDAPISession
// dwFlags control operation
// pszObjectName String containing name of object to read.
// If specified as RDN, combined w/ session's
// pszBasePoint and pszParentContainer.
// If specified w/ prefix of "/cn=", the string
// is concatenated to the session pszBasePoint.
// If specified w/ prefix of "/o=", the string
// is taken to be a fully-qualified DN.
// pAttList Pointer to DAPI_ENTRY structure containing names of
// attributes to read. The session default list is
// overridden for the present call only.
// ppValues Address of variable receiving pointer to DAPI_ENTRY
// structure containing the values read from the DIT entry.
// The pointer returned must be freed by call to
// DAPIFreeMemory.
// ppAttributes Address of variable receiving pointer to DAPI_ENTRY
// structure containing the names of attributes read
// from the DIT IFF DAPI_ALL_ATTRIBUTES or DAPI_LEGAL_ATTRIBUTES
// were set in dwFlags.
// The pointer returned must be freed by call to
// DAPIFreeMemory.
extern PDAPI_EVENTW APIENTRY DAPIReadW (DAPI_HANDLE hDAPISession,
DWORD dwFlags,
LPWSTR pszObjectName,
PDAPI_ENTRY pAttList,
PDAPI_ENTRY * ppValues,
PDAPI_ENTRY * ppAttributes);
extern PDAPI_EVENTA APIENTRY DAPIReadA (DAPI_HANDLE hDAPISession,
DWORD dwFlags,
LPSTR pszObjectName,
PDAPI_ENTRY pAttList,
PDAPI_ENTRY * ppValues,
PDAPI_ENTRY * ppAttributes);
#ifdef UNICODE
#define DAPIRead DAPIReadW
#else
#define DAPIRead DAPIReadA
#endif
// DAPIWrite()
// Perform the indicated write operation on the named object
// Returned value: NULL indicates no difficulties encountered.
// Else, pointer to structure containing description of
// error(s) or warning(s) encountered.
// Must be freed by call to DAPIFreeMemory.
// Parameters:
// hDAPISession DAPI Session handle obtained via InitDAPISession
// dwFlags Operational control
// pAttributes Pointer to DAPI_ENTRY structure containing names of
// attributes to write. The session default list is
// used if this parameter is NULL
// pValues Pointer to DAPI_ENTRY structure containing the values
// to set on the DIT entry.
// lpulUSN Optional: Address of variable receiving USN of updated
// DIT entry. May be specified as NULL to suppress this
// return value.
// lppszCreatedAccount Address receiving pointer to name of created NT account
// lppszPassword Address receiving pointer to password generated if
// NT Account is created.
extern PDAPI_EVENTW APIENTRY DAPIWriteW (DAPI_HANDLE hDAPISession,
DWORD dwFlags,
PDAPI_ENTRY pAttributes,
PDAPI_ENTRY pValues,
PULONG lpulUSN,
LPWSTR * lppszCreatedAccount,
LPWSTR * lppszPassword);
extern PDAPI_EVENTA APIENTRY DAPIWriteA (DAPI_HANDLE hDAPISession,
DWORD dwFlags,
PDAPI_ENTRY pAttributes,
PDAPI_ENTRY pValues,
PULONG lpulUSN,
LPSTR * lppszCreatedAccount,
LPSTR * lppszPassword);
#ifdef UNICODE
#define DAPIWrite DAPIWriteW
#else
#define DAPIWrite DAPIWriteA
#endif
/*******************************************************************************
* procedure : DAPIAllocBuffer
*
* purpose : Allocate buffer, logically linking it to the pvAllocBase
* The first buffer in logically linked set of allocations must be
* freed by call to DAPIFreeMemory
*
* parameters : cbSize dword containing size of allocation request (in bytes)
* pvAllocBase base for logical linking of allocated block
* May be NULL
* If non-NULL, must be a block previously allocated
* by DAPIAllocBuffer or returned by DAPI function
*
* returns : ptr to allocated block
*
* history :
*
********************************************************************************/
extern LPVOID APIENTRY DAPIAllocBuffer (DWORD cbSize, LPVOID pvAllocBase);
/*******************************************************************************
* procedure : DAPIFreeMemory
*
* purpose : Release memory allocated for structures returned by DAPI calls.
*
* parameters : lpVoid pointer to block to free
*
* returns : nothing
*
* history :
*
********************************************************************************/
extern void APIENTRY DAPIFreeMemory (LPVOID lpVoid);
/*
* NetUserList interface definitions
*/
// When getting callbacks from NTExport / NWExport, these indices
// can be used to interpret the value array returned in the callback
// >>>> NOTE: These indices are NOT valid for Bexport callback! <<<<
#define NET_CLASS 0
#define NET_COMMON_NAME 1
#define NET_DISPLAY_NAME 2
#define NET_HOME_SERVER 3
#define NET_COMMENT 4 /* NTExport only */
#define NTEXP_ENTRY_COUNT 5 /* number of parts in NT User export */
#define NWEXP_ENTRY_COUNT 4 /* number of parts in NetWare user export */
/*******************************************************************************
*
* NTIMPORT Interface definitions
*
********************************************************************************/
typedef struct _NTEXPORT_PARMSW
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control the user export
HWND hwndParent; // Windows handle to use when displaying message boxes
LPWSTR pszExportFile; // Name of file to create
// Ignored if using callbacks
CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
LPWSTR pszDCName; // Name of Domain Controller from which to get users
// NOTE: Specification of Domain Controller overrides
// the NTDomain
LPWSTR pszNTDomain; // Name of Domain from which to read users
// If neither pszNTDomain and pszDCName are specified,
// users are extracted from the current login domain
} NTEXPORT_PARMSW, *PNTEXPORT_PARMSW, FAR *LPNTEXPORT_PARMSW;
typedef struct _NTEXPORT_PARMSA
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control the user export
HWND hwndParent; // Windows handle to use when displaying message boxes
LPSTR pszExportFile; // Name of file to create
// Ignored if using callbacks
CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
LPSTR pszDCName; // NOTE: Specification of Domain Controller overrides
// the NTDomain
// Name of Domain from which to read users
LPSTR pszNTDomain; // If neither pszNTDomain and pszDCName are specified,
// users are extracted from the current login domain
} NTEXPORT_PARMSA, *PNTEXPORT_PARMSA, FAR *LPNTEXPORT_PARMSA;
#ifdef UNICODE
typedef NTEXPORT_PARMSW NTEXPORT_PARMS;
typedef PNTEXPORT_PARMSW PNTEXPORT_PARMS;
typedef LPNTEXPORT_PARMSW LPNTEXPORT_PARMS;
#else
typedef NTEXPORT_PARMSA NTEXPORT_PARMS;
typedef PNTEXPORT_PARMSA PNTEXPORT_PARMS;
typedef LPNTEXPORT_PARMSA LPNTEXPORT_PARMS;
#endif
extern DWORD APIENTRY NTExportW (LPNTEXPORT_PARMSW pNTExportParms);
extern DWORD APIENTRY NTExportA (LPNTEXPORT_PARMSA pNTExportParms);
#ifdef UNICODE
#define NTExport NTExportW
#else
#define NTExport NTExportA
#endif
/*******************************************************************************
*
* NWIMPORT Interface definitions
*
********************************************************************************/
typedef struct _NWEXPORT_PARMSW
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control the user export
HWND hwndParent; // Windows handle to use when displaying message boxes
LPWSTR pszExportFile; // Name of file to create
// Ignored if using callbacks
CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
LPWSTR pszFileServer; // Name of the file server to connect to
LPWSTR pszUserName; // User Name -- Must have administrator priviliges
LPWSTR pszPassword; // Password to connect to the server
} NWEXPORT_PARMSW, *PNWEXPORT_PARMSW, *LPNWEXPORT_PARMSW;
typedef struct _NWEXPORT_PARMSA
{
DWORD dwDAPISignature;
DWORD dwFlags; // Bitmapped flags that control the user export
HWND hwndParent; // Windows handle to use when displaying message boxes
LPSTR pszExportFile; // Name of file to create
// Ignored if using callbacks
CALLBACKPROGRESS ProgressCallBacks;// Progress call-back entry points
ERROR_CALLBACK ErrorCallback;
EXPORT_CALLBACK ExportCallback; // Structure filled in by calling app to
// receive callback on each exported item
// NOTE: Callback functions are optional
// The default export function (write to file)
// will be called if these pointers are NULL
LPSTR pszFileServer; // Name of the file server to connect to
LPSTR pszUserName; // User Name -- Must have administrator priviliges
LPSTR pszPassword; // Password to connect to the server
} NWEXPORT_PARMSA, *PNWEXPORT_PARMSA, *LPNWEXPORT_PARMSA;
#ifdef UNICODE
typedef NWEXPORT_PARMSW NWEXPORT_PARMS;
typedef PNWEXPORT_PARMSW PNWEXPORT_PARMS;
typedef LPNWEXPORT_PARMSW LPNWEXPORT_PARMS;
#else
typedef NWEXPORT_PARMSA NWEXPORT_PARMS;
typedef PNWEXPORT_PARMSA PNWEXPORT_PARMS;
typedef LPNWEXPORT_PARMSA LPNWEXPORT_PARMS;
#endif
extern DWORD APIENTRY NWExportW (LPNWEXPORT_PARMSW pNWExportParms);
extern DWORD APIENTRY NWExportA (LPNWEXPORT_PARMSA pNWExportParms);
#ifdef UNICODE
#define NWExport NWExportW
#else
#define NWExport NWExportA
#endif
// Definitions for the DAPIGetSiteInfo call
typedef struct _NAME_INFOA
{
LPSTR pszName; // Simple object name
LPSTR pszDNString; // DN of object
LPSTR pszDisplayName; // Display name of object
} NAME_INFOA, *PNAME_INFOA;
typedef struct _NAME_INFOW
{
LPWSTR pszName; // Simple object name
LPWSTR pszDNString; // DN of object
LPWSTR pszDisplayName; // Display name of object
} NAME_INFOW, *PNAME_INFOW;
typedef struct _PSITE_INFOA
{
LPSTR pszCountry; // Country code
NAME_INFOA objServer; // Name information for server
NAME_INFOA objSite; // Name information for site containing server
NAME_INFOA objEnterprise; // Name information for enterprise containing server
} SITE_INFOA, *PSITE_INFOA;
typedef struct _PSITE_INFOW
{
LPWSTR pszCountry; // Country code
NAME_INFOW objServer; // Name information for server
NAME_INFOW objSite; // Name information for site containing server
NAME_INFOW objEnterprise; // Name information for enterprise containing server
} SITE_INFOW, *PSITE_INFOW;
#ifdef UNICODE
typedef NAME_INFOW NAME_INFO;
typedef PNAME_INFOW PNAME_INFO;
typedef SITE_INFOW SITE_INFO;
typedef PSITE_INFOW PSITE_INFO;
#else
typedef NAME_INFOA NAME_INFO;
typedef PNAME_INFOA PNAME_INFO;
typedef SITE_INFOA SITE_INFO;
typedef PSITE_INFOA PSITE_INFO;
#endif
extern PDAPI_EVENTA APIENTRY DAPIGetSiteInfoA (
DWORD dwFlags, // Flags for request
LPSTR pszDSA, // name of DSA from which to get information
PSITE_INFOA * ppSiteInfo // Address receiving pointer to pSiteInfo structure
// containing return data
);
extern PDAPI_EVENTW APIENTRY DAPIGetSiteInfoW (
DWORD dwFlags, // Flags for request
LPWSTR pszDSA, // name of DSA from which to get information
PSITE_INFOW * ppSiteInfo // Address receiving pointer to pSiteInfo structure
// containing return dataname of DSA from which to read schema
);
#ifdef UNICODE
#define DAPIGetSiteInfo DAPIGetSiteInfoW
#else
#define DAPIGetSiteInfo DAPIGetSiteInfoA
#endif
#ifdef __cplusplus
}
#endif
#endif // _DAPI_INCLUDED