{******************************************************************************}
{                                                                              }
{ Directory Backup and Restore API interface Unit for Object Pascal            }
{                                                                              }
{ Portions created by Microsoft are Copyright (C) 1995-2001 Microsoft          }
{ Corporation. All Rights Reserved.                                            }
{                                                                              }
{ The original file is: ntdsbcli.h, released June 2000. The original Pascal    }
{ code is: NtDsbCli.pas, released December 2000. The initial developer of the  }
{ Pascal code is Marcel van Brakel (brakelm att chello dott nl).               }
{                                                                              }
{ Portions created by Marcel van Brakel are Copyright (C) 1999-2001            }
{ Marcel van Brakel. All Rights Reserved.                                      }
{                                                                              }
{ Obtained through: Joint Endeavour of Delphi Innovators (Project JEDI)        }
{                                                                              }
{ You may retrieve the latest version of this file at the Project JEDI         }
{ APILIB home page, located at http://jedi-apilib.sourceforge.net              }
{                                                                              }
{ The contents of this file are used with permission, subject to the Mozilla   }
{ Public License Version 1.1 (the "License"); you may not use this file except }
{ in compliance with the License. You may obtain a copy of the License at      }
{ http://www.mozilla.org/MPL/MPL-1.1.html                                      }
{                                                                              }
{ Software distributed under the License is distributed on an "AS IS" basis,   }
{ WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License for }
{ the specific language governing rights and limitations under the License.    }
{                                                                              }
{ Alternatively, the contents of this file may be used under the terms of the  }
{ GNU Lesser General Public License (the  "LGPL License"), in which case the   }
{ provisions of the LGPL License are applicable instead of those above.        }
{ If you wish to allow use of your version of this file only under the terms   }
{ of the LGPL License and not to allow others to use your version of this file }
{ under the MPL, indicate your decision by deleting  the provisions above and  }
{ replace  them with the notice and other provisions required by the LGPL      }
{ License.  If you do not delete the provisions above, a recipient may use     }
{ your version of this file under either the MPL or the LGPL License.          }
{                                                                              }
{ For more information about the LGPL: http://www.gnu.org/copyleft/lesser.html }
{                                                                              }
{******************************************************************************}


unit JwaNtDsbCli;

{$WEAKPACKAGEUNIT}

{$HPPEMIT ''}
{$HPPEMIT '#include ":ntdsbcli.h"'}
{$HPPEMIT ''}

{$I jediapilib.inc}

interface

uses
  JwaWinType;

const
  g_wszBackupAnnotation = 'NTDS Backup Interface';
  {$EXTERNALSYM g_wszBackupAnnotation}
  g_aszBackupAnnotation = 'NTDS Backup Interface';
  {$EXTERNALSYM g_aszBackupAnnotation}

  g_wszRestoreAnnotation = 'NTDS Restore Interface';
  {$EXTERNALSYM g_wszRestoreAnnotation}
  g_aszRestoreAnnotation = 'NTDS Restore Interface';
  {$EXTERNALSYM g_aszRestoreAnnotation}

  {$IFDEF UNICODE}
  g_szBackupAnnotation  = g_wszBackupAnnotation;
  {$EXTERNALSYM g_szBackupAnnotation}
  g_szRestoreAnnotation = g_wszRestoreAnnotation;
  {$EXTERNALSYM g_szRestoreAnnotation}
  {$ELSE}
  g_szBackupAnnotation  = g_aszBackupAnnotation;
  {$EXTERNALSYM g_szBackupAnnotation}
  g_szRestoreAnnotation = g_aszRestoreAnnotation;
  {$EXTERNALSYM g_szRestoreAnnotation}
  {$ENDIF UNICODE}

// Type of Backup passed to DsBackupPrepare()
// BACKUP_TYPE_FULL: Requesting backup of the complete DS (DIT, Log files, and Patch files)
// BACKUP_TYPE_LOGS_ONLY: Requesting backup of only the log files
// BACKUP_TYPE_INCREMENTAL: Requesting incremental backup i.e. backing up only changes that happened since last backup

  BACKUP_TYPE_FULL        = $01;
  {$EXTERNALSYM BACKUP_TYPE_FULL}
  BACKUP_TYPE_LOGS_ONLY   = $02;
  {$EXTERNALSYM BACKUP_TYPE_LOGS_ONLY}
  BACKUP_TYPE_INCREMENTAL = $04; // not supported in product1
  {$EXTERNALSYM BACKUP_TYPE_INCREMENTAL}

// Type of Restore passed to DsRestorePrepare()
// RESTORE_TYPE_AUTHORATATIVE: The restored version wins throughout the enterprise
// RESTORE_TYPE_ONLINE: Restoration is done when NTDS is online.
// RESTORE_TYPE_CATCHUP: The restored version is reconciled through the standard reconciliation logic so that the
//                          restored DIT can catchup with the rest of the enterprise.

  RESTORE_TYPE_AUTHORATATIVE = $01;
  {$EXTERNALSYM RESTORE_TYPE_AUTHORATATIVE}
  RESTORE_TYPE_ONLINE        = $02; // not supported in product1
  {$EXTERNALSYM RESTORE_TYPE_ONLINE}
  RESTORE_TYPE_CATCHUP       = $04; // this is the default restore mode
  {$EXTERNALSYM RESTORE_TYPE_CATCHUP}

// Setting the current log # to this value would disable incremental/differential backup

  BACKUP_DISABLE_INCREMENTAL = DWORD($ffffffff);
  {$EXTERNALSYM BACKUP_DISABLE_INCREMENTAL}

// BFT is the bit flag used to represent file types (directory/dit/logfile/etc.)
// We keep them as a character so that we can append/prepend them to the actual file
// path. The code in the Backup API's rely on the fact that values 0-256 in 8 bit ascii
// map to the values 0-256 in unicode.

type
  {$IFDEF UNICODE}
  BFT = WCHAR;
  {$EXTERNALSYM BFT}
  {$ELSE}
  BFT = Char;
  {$EXTERNALSYM BFT}
  {$ENDIF UNICODE}

// Bit flags:
//  BFT_DIRECTORY               - indicates path specified is a directory
//  BFT_DATABASE_DIRECTORY      - indicates that file goes into database directory
//  BFT_LOG_DIRECTORY           - indicates that the file goes into log directory

const
  BFT_DIRECTORY          = $80;
  {$EXTERNALSYM BFT_DIRECTORY}
  BFT_DATABASE_DIRECTORY = $40;
  {$EXTERNALSYM BFT_DATABASE_DIRECTORY}
  BFT_LOG_DIRECTORY      = $20;
  {$EXTERNALSYM BFT_LOG_DIRECTORY}

// Following combinations are defined for easy use of the filetype and the directory into
// into which it goes

  BFT_LOG            = BFT($01 or BFT_LOG_DIRECTORY);
  BFT_LOG_DIR        = BFT($02 or BFT_DIRECTORY);
  BFT_CHECKPOINT_DIR = BFT($03 or BFT_DIRECTORY);
  BFT_NTDS_DATABASE  = BFT($04 or BFT_DATABASE_DIRECTORY);
  BFT_PATCH_FILE     = BFT($05 or BFT_LOG_DIRECTORY);
  BFT_UNKNOWN        = BFT($0F);

// #include <ntdsbmsg.h>

// Backup Context Handle

type
  HBC = Pointer;
  {$EXTERNALSYM HBC}

  PEDB_RSTMAPA = ^EDB_RSTMAPA;
  {$EXTERNALSYM PEDB_RSTMAPA}
  tagEDB_RSTMAPA = record
    szDatabaseName: PChar;
    szNewDtabaseName: PChar;
  end;
  {$EXTERNALSYM tagEDB_RSTMAPA}
  EDB_RSTMAPA = tagEDB_RSTMAPA;
  {$EXTERNALSYM EDB_RSTMAPA}
  TEdbRstMapA = EDB_RSTMAPA;
  PEdbRstMapA = PEDB_RSTMAPA;

// required for NTDS unicode support.
// UNDONE: NYI

  PEDB_RSTMAPW = ^EDB_RSTMAPW;
  {$EXTERNALSYM PEDB_RSTMAPW}
  tagEDB_RSTMAPW = record
    wszDatabaseName: PWCHAR;
    wszNewDatabaseName: PWCHAR;
  end;
  {$EXTERNALSYM tagEDB_RSTMAPW}
  EDB_RSTMAPW = tagEDB_RSTMAPW;
  {$EXTERNALSYM EDB_RSTMAPW}
  TEdbRstMapW = EDB_RSTMAPW;
  PEdbRstMapW = PEDB_RSTMAPW;

  {$IFDEF UNICODE}
  EDB_RSTMAP = EDB_RSTMAPW;
  {$EXTERNALSYM EDB_RSTMAP}
  PEDB_RSTMAP = PEDB_RSTMAPW;
  {$EXTERNALSYM PEDB_RSTMAP}
  TEdbRstMap = TEdbRstMapW;
  PEdbRstMap = PEdbRstMapW;
  {$ELSE}
  EDB_RSTMAP = EDB_RSTMAPA;
  {$EXTERNALSYM EDB_RSTMAP}
  PEDB_RSTMAP = PEDB_RSTMAPA;
  {$EXTERNALSYM PEDB_RSTMAP}
  TEdbRstMap = TEdbRstMapA;
  PEdbRstMap = PEdbRstMapA;
  {$ENDIF UNICODE}

{*************************************************************************************
Routine Description:

      DsIsNTDSOnline
        Checks to see if the NTDS is Online on the given server. This call is
        guaranteed to return quickly.

  Arguments:
    [in] szServerName - UNC name of the server to check
    [out] pfNTDSOnline - pointer to receive the bool result (TRUE if NTDS is
                            online; FALSE, otherwise)

Return Value:

    ERROR_SUCCESS if the call executed successfully;
    Failure code otherwise.
**************************************************************************************}

function DsIsNTDSOnlineA(szServerName: LPCSTR; var pfNTDSOnline: BOOL): HRESULT; stdcall;
{$EXTERNALSYM DsIsNTDSOnlineA}
function DsIsNTDSOnlineW(szServerName: LPCWSTR; var pfNTDSOnline: BOOL): HRESULT; stdcall;
{$EXTERNALSYM DsIsNTDSOnlineW}
function DsIsNTDSOnline(szServerName: LPCTSTR; var pfNTDSOnline: BOOL): HRESULT; stdcall;
{$EXTERNALSYM DsIsNTDSOnline}

{*************************************************************************************
Routine Description:

      DsBackupPrepare
        Prepares the DS for the online backup and returns a Backup Context Handle
        which should be used in the subsequent calls to other backup functions.

  Arguments:
    [in]    szBackupServer - UNC name of the server to be prepared for online backup
    [in]    grbit - flag to be passed to jet while backing up dbs
    [in]    btFlag - BACKUP_TYPE_FULL or BACKUP_TYPE_LOGS_ONLY
    [out]   ppvExpiryToken - pointer that will receive the pointer to the
                Expiry Token associated with this backup; Client should save
                this token and send it back through DsRestorePrepare() when
                attempting a restore; allocated memory should be freed using
                DsBackupFree() API by the caller when it is no longer needed.
    [out]   pcbExpiryTokenSize - pointer to receive the size of the expiry token
                returned.
    [out]   phbc - pointer that will receive the backup context handle

Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupPrepareA(szBackupServer: LPCSTR; grbit: ULONG; btFlag: ULONG;
  var ppvExpiryToken: PVOID; var pcbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupPrepareA}
function DsBackupPrepareW(szBackupServer: LPCWSTR; grbit: ULONG; btFlag: ULONG;
  var ppvExpiryToken: PVOID; var pcbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupPrepareW}
function DsBackupPrepare(szBackupServer: LPCTSTR; grbit: ULONG; btFlag: ULONG;
  var ppvExpiryToken: PVOID; var pcbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupPrepare}

{*************************************************************************************
Routine Description:

      DsBackupGetDatabaseNames
        Gives the list of data bases that need to be backed up for the given
        backup context

  Arguments:
    [in]    hbc - backup context handle
    [out]   pszAttachmentInfo - pointer that will receive the pointer to the attachment
                info; allocated memory should be freed using DsBackupFree() API by the
                caller when it is no longer needed; Attachment info is an array of
                null-terminated filenames and and the list is terminated by two-nulls.
    [out]   pcbSize - will receive the number of bytes returned
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupGetDatabaseNamesA(hbc: HBC; var pszAttachmentInfo: LPSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetDatabaseNamesA}
function DsBackupGetDatabaseNamesW(hbc: HBC; var pszAttachmentInfo: LPWSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetDatabaseNamesW}
function DsBackupGetDatabaseNames(hbc: HBC; var pszAttachmentInfo: LPTSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetDatabaseNames}

{*************************************************************************************
Routine Description:

      DsBackupOpenFile
        Opens the given attachment for read.

  Arguments:
    [in]    hbc - backup context handle
    [in]    szAttachmentName - name of the attachment to be opened for read
    [in]    cbReadHintSize - suggested size in bytes that might be used during the
                subsequent reads on this attachement
    [out]   pliFileSize - pointer to a large integer that would receive the size in
                bytes of the given attachment
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupOpenFileA(hbc: HBC; szAttachmentName: LPCSTR; cbReadHintSize: DWORD;
  var pliFileSize: LARGE_INTEGER): HRESULT; stdcall;
{$EXTERNALSYM DsBackupOpenFileA}
function DsBackupOpenFileW(hbc: HBC; szAttachmentName: LPCWSTR; cbReadHintSize: DWORD;
  var pliFileSize: LARGE_INTEGER): HRESULT; stdcall;
{$EXTERNALSYM DsBackupOpenFileW}
function DsBackupOpenFile(hbc: HBC; szAttachmentName: LPCTSTR; cbReadHintSize: DWORD;
  var pliFileSize: LARGE_INTEGER): HRESULT; stdcall;
{$EXTERNALSYM DsBackupOpenFile}

{*************************************************************************************
Routine Description:

      DsBackupRead
        Reads the currently open attachment bytes into the given buffer. The client
        application is expected to call this function repeatedly until it gets the
        entire file (the application would have received the file size through the
        DsBackupOpenFile() call before.

  Arguments:
    [in]    hbc - backup context handle
    [in]    pvBuffer - pointer to the buffer that would receive the read data.
    [in]    cbBuffer - specifies the size of the above buffer
    [out]   pcbRead - pointer to receive the actual number of bytes read.
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupRead(hbc: HBC; pvBuffer: PVOID; cbBuffer: DWORD; var pcbRead: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupRead}

{*************************************************************************************
Routine Description:

      DsBackupClose
        To be called by the application after it completes reading all the data in
        the currently opened attachement.

  Arguments:
    [in]    hbc - backup context handle
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupClose(hbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupClose}

{*************************************************************************************
Routine Description:

      DsBackupGetBackupLogs
        Gives the list of log files that need to be backed up for the given
        backup context

  Arguments:
    [in]    hbc - backup context handle
    [out]   pszBackupLogFiles - pointer that will receive the pointer to the list of
                log files; allocated memory should be freed using DsBackupFree() API by the
                caller when it is no longer needed; Log files are returned in an array of
                null-terminated filenames and and the list is terminated by two-nulls.
    [out]   pcbSize - will receive the number of bytes returned
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupGetBackupLogsA(hbc: HBC; var pszBackupLogFiles: LPSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetBackupLogsA}
function DsBackupGetBackupLogsW(hbc: HBC; var pszBackupLogFiles: LPWSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetBackupLogsW}
function DsBackupGetBackupLogs(hbc: HBC; var pszBackupLogFiles: LPTSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsBackupGetBackupLogs}

{*************************************************************************************
Routine Description:

      DsBackupTruncateLogs
        Called to truncate the already read backup logs.

  Arguments:
    [in]    hbc - backup context handle
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupTruncateLogs(hbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupTruncateLogs}

{*************************************************************************************
Routine Description:

      DsBackupEnd
        Called to end the current backup session.

  Arguments:
    [in]    hbc - backup context handle of the backup session
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsBackupEnd(hbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsBackupEnd}

{*************************************************************************************
Routine Description:

      DsBackupFree
        Should be used by the application to free any buffer allocated by the
        NTDSBCLI dll.

  Arguments:
    [in]    pvBuffer - pointer to the buffer that is to be freed.

  Return Value:
    None.
**************************************************************************************}

procedure DsBackupFree(pvBuffer: PVOID); stdcall;
{$EXTERNALSYM DsBackupFree}

{*************************************************************************************
Routine Description:

      DsRestoreGetDatabaseLocations
        Called both at backup time as well at restoration time to get the data base
        locations for different types of files.

  Arguments:
    [in]    hbc - backup context handle which would have been obtained through
                    DsBackupPrepare() in the backup case and through DsRestorePrepare()
                    in the restore case.
    [out]   pszDatabaseLocationList - pointer that will receive the pointer to the list of
                database locations; allocated memory should be freed using DsBackupFree() API by the
                caller when it is no longer needed; locations are returned in an array of
                null-terminated names and and the list is terminated by two-nulls.
                The first character of each name is the BFT character that indicates the type
                of the file and the rest of the name tells gives the path into which that
                particular type of file should be restored.
    [out]   pcbSize - will receive the number of bytes returned
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsRestoreGetDatabaseLocationsA(hbc: HBC; var pszDatabaseLocationList: LPSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreGetDatabaseLocationsA}
function DsRestoreGetDatabaseLocationsW(hbc: HBC; var pszDatabaseLocationList: LPWSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreGetDatabaseLocationsW}
function DsRestoreGetDatabaseLocations(hbc: HBC; var pszDatabaseLocationList: LPTSTR;
  var pcbSize: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreGetDatabaseLocations}

{*************************************************************************************
Routine Description:

      DsRestorePrepare
        Called to indicate beginning of a restore session.

  Arguments:
    [in]    szServerName - UNC name of the server into which the restore operation is
                            going to be performed.
    [in]    rtFlag -  Or'ed combination of RESTORE_TYPE_* flags; 0 if no special flags
                            are to be specified
    [in]    pvExpiryToken - pointer to the expiry token associated with this
                            backup. The client would have received this when they backed up the DS.
    [in]    cbExpiryTokenSize - size of the expiry token.
    [out]   phbc - pointer to receive the backup context handle which is to be passed
                            to the subsequent restore APIs

Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsRestorePrepareA(szServerName: LPCSTR; rtFlag: ULONG; pvExpiryToken: PVOID;
  cbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsRestorePrepareA}
function DsRestorePrepareW(szServerName: LPCWSTR; rtFlag: ULONG; pvExpiryToken: PVOID;
  cbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsRestorePrepareW}
function DsRestorePrepare(szServerName: LPCTSTR; rtFlag: ULONG; pvExpiryToken: PVOID;
  cbExpiryTokenSize: DWORD; var phbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsRestorePrepare}

{*************************************************************************************
Routine Description:

      DsRestoreRegister
        This will register a restore operation. It will interlock all sbsequent restore
        operations, and will prevent the restore target from starting until the call
        to DsRestoreRegisterComplete() is made.

  Arguments:
    [in]    hbc - backup context handle for the restore session.
    [in]    szCheckPointFilePath - path where the check point files are restored
    [in]    szLogPath - path where the log files are restored
    [in]    rgrstmap - restore map
    [in]    crstmap - tells if ther is a new restore map
    [in]    szBackupLogPath - path where the backup logs are located
    [in]    genLow - Lowest log# that was restored in this restore session
    [in]    genHigh - Highest log# that was restored in this restore session

  Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsRestoreRegisterA(hbc: HBC; szCheckPointFilePath, szLogPath: LPCSTR;
  rgrstmap: PEDB_RSTMAPA; crstmap: LONG; szBackupLogPath: LPCSTR; genLow, genHigh: ULONG): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreRegisterA}
function DsRestoreRegisterW(hbc: HBC; szCheckPointFilePath, szLogPath: LPCWSTR;
  rgrstmap: PEDB_RSTMAPW; crstmap: LONG; szBackupLogPath: LPCWSTR; genLow, genHigh: ULONG): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreRegisterW}
function DsRestoreRegister(hbc: HBC; szCheckPointFilePath, szLogPath: LPCTSTR;
  rgrstmap: PEDB_RSTMAP; crstmap: LONG; szBackupLogPath: LPCTSTR; genLow, genHigh: ULONG): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreRegister}

{*************************************************************************************
Routine Description:

      DsRestoreRegisterComplete
        Called to indicate that a previously registered restore is complete.

  Arguments:
    [in]    hbc - backup context handle
    [in]    hrRestoreState - success code if the restore was successful
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsRestoreRegisterComplete(hbc: HBC; hrRestoreState: HRESULT): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreRegisterComplete}

{*************************************************************************************
Routine Description:

      DsRestoreEnd
        Called to end a restore session

  Arguments:
    [in]    hbc - backup context handle
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsRestoreEnd(hbc: HBC): HRESULT; stdcall;
{$EXTERNALSYM DsRestoreEnd}

{*************************************************************************************
Routine Description:

      DsSetCurrentBackupLog
        Called to set the current backup log number after a successful restore

  Arguments:
    [in]    szServerName - UNC name of the server for which the current backup log has
                                to be set
    [in]    dwCurrentLog -  current log number
Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsSetCurrentBackupLogA(szServerName: LPCSTR; dwCurrentLog: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsSetCurrentBackupLogA}
function DsSetCurrentBackupLogW(szServerName: LPCWSTR; dwCurrentLog: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsSetCurrentBackupLogW}
function DsSetCurrentBackupLog(szServerName: LPCTSTR; dwCurrentLog: DWORD): HRESULT; stdcall;
{$EXTERNALSYM DsSetCurrentBackupLog}

{*************************************************************************************
Routine Description:

      DsSetAuthIdentity
        Used to set the security context under which the client APIs are to be
        called. If this function is not called, security context of the current
        process is assumed.

  Arguments:
    [in]    szUserName - name of the user
    [in]    szDomainName -  name of the domain the user belongs to
    [in]    szPassword - password of the user in the specified domain

Return Value:

    One of the standard HRESULT success codes;
    Failure code otherwise.
**************************************************************************************}

function DsSetAuthIdentityA(szUserName, szDomainName, szPassword: LPCSTR): HRESULT; stdcall;
{$EXTERNALSYM DsSetAuthIdentityA}
function DsSetAuthIdentityW(szUserName, szDomainName, szPassword: LPCWSTR): HRESULT; stdcall;
{$EXTERNALSYM DsSetAuthIdentityW}
function DsSetAuthIdentity(szUserName, szDomainName, szPassword: LPCTSTR): HRESULT; stdcall;
{$EXTERNALSYM DsSetAuthIdentity}

implementation

const
  ntdsbclilib = 'ntdsbclilib.dll';
  {$IFDEF UNICODE}
  AWSuffix = 'W';
  {$ELSE}
  AWSuffix = 'A';
  {$ENDIF UNICODE}

{$IFDEF DYNAMIC_LINK}

var
  _DsIsNTDSOnlineA: Pointer;

function DsIsNTDSOnlineA;
begin
  GetProcedureAddress(_DsIsNTDSOnlineA, ntdsbclilib, 'DsIsNTDSOnlineA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsIsNTDSOnlineA]
  end;
end;

var
  _DsIsNTDSOnlineW: Pointer;

function DsIsNTDSOnlineW;
begin
  GetProcedureAddress(_DsIsNTDSOnlineW, ntdsbclilib, 'DsIsNTDSOnlineW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsIsNTDSOnlineW]
  end;
end;

var
  _DsIsNTDSOnline: Pointer;

function DsIsNTDSOnline;
begin
  GetProcedureAddress(_DsIsNTDSOnline, ntdsbclilib, 'DsIsNTDSOnline' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsIsNTDSOnline]
  end;
end;

var
  _DsBackupPrepareA: Pointer;

function DsBackupPrepareA;
begin
  GetProcedureAddress(_DsBackupPrepareA, ntdsbclilib, 'DsBackupPrepareA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupPrepareA]
  end;
end;

var
  _DsBackupPrepareW: Pointer;

function DsBackupPrepareW;
begin
  GetProcedureAddress(_DsBackupPrepareW, ntdsbclilib, 'DsBackupPrepareW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupPrepareW]
  end;
end;

var
  _DsBackupPrepare: Pointer;

function DsBackupPrepare;
begin
  GetProcedureAddress(_DsBackupPrepare, ntdsbclilib, 'DsBackupPrepare' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupPrepare]
  end;
end;

var
  _DsBackupGetDatabaseNamesA: Pointer;

function DsBackupGetDatabaseNamesA;
begin
  GetProcedureAddress(_DsBackupGetDatabaseNamesA, ntdsbclilib, 'DsBackupGetDatabaseNamesA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetDatabaseNamesA]
  end;
end;

var
  _DsBackupGetDatabaseNamesW: Pointer;

function DsBackupGetDatabaseNamesW;
begin
  GetProcedureAddress(_DsBackupGetDatabaseNamesW, ntdsbclilib, 'DsBackupGetDatabaseNamesW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetDatabaseNamesW]
  end;
end;

var
  _DsBackupGetDatabaseNames: Pointer;

function DsBackupGetDatabaseNames;
begin
  GetProcedureAddress(_DsBackupGetDatabaseNames, ntdsbclilib, 'DsBackupGetDatabaseNames' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetDatabaseNames]
  end;
end;

var
  _DsBackupOpenFileA: Pointer;

function DsBackupOpenFileA;
begin
  GetProcedureAddress(_DsBackupOpenFileA, ntdsbclilib, 'DsBackupOpenFileA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupOpenFileA]
  end;
end;

var
  _DsBackupOpenFileW: Pointer;

function DsBackupOpenFileW;
begin
  GetProcedureAddress(_DsBackupOpenFileW, ntdsbclilib, 'DsBackupOpenFileW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupOpenFileW]
  end;
end;

var
  _DsBackupOpenFile: Pointer;

function DsBackupOpenFile;
begin
  GetProcedureAddress(_DsBackupOpenFile, ntdsbclilib, 'DsBackupOpenFile' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupOpenFile]
  end;
end;

var
  _DsBackupRead: Pointer;

function DsBackupRead;
begin
  GetProcedureAddress(_DsBackupRead, ntdsbclilib, 'DsBackupRead');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupRead]
  end;
end;

var
  _DsBackupClose: Pointer;

function DsBackupClose;
begin
  GetProcedureAddress(_DsBackupClose, ntdsbclilib, 'DsBackupClose');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupClose]
  end;
end;

var
  _DsBackupGetBackupLogsA: Pointer;

function DsBackupGetBackupLogsA;
begin
  GetProcedureAddress(_DsBackupGetBackupLogsA, ntdsbclilib, 'DsBackupGetBackupLogsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetBackupLogsA]
  end;
end;

var
  _DsBackupGetBackupLogsW: Pointer;

function DsBackupGetBackupLogsW;
begin
  GetProcedureAddress(_DsBackupGetBackupLogsW, ntdsbclilib, 'DsBackupGetBackupLogsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetBackupLogsW]
  end;
end;

var
  _DsBackupGetBackupLogs: Pointer;

function DsBackupGetBackupLogs;
begin
  GetProcedureAddress(_DsBackupGetBackupLogs, ntdsbclilib, 'DsBackupGetBackupLogs' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupGetBackupLogs]
  end;
end;

var
  _DsBackupTruncateLogs: Pointer;

function DsBackupTruncateLogs;
begin
  GetProcedureAddress(_DsBackupTruncateLogs, ntdsbclilib, 'DsBackupTruncateLogs');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupTruncateLogs]
  end;
end;

var
  _DsBackupEnd: Pointer;

function DsBackupEnd;
begin
  GetProcedureAddress(_DsBackupEnd, ntdsbclilib, 'DsBackupEnd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupEnd]
  end;
end;

var
  _DsBackupFree: Pointer;

procedure DsBackupFree;
begin
  GetProcedureAddress(_DsBackupFree, ntdsbclilib, 'DsBackupFree');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsBackupFree]
  end;
end;

var
  _DsRestoreGetDatabaseLocationsA: Pointer;

function DsRestoreGetDatabaseLocationsA;
begin
  GetProcedureAddress(_DsRestoreGetDatabaseLocationsA, ntdsbclilib, 'DsRestoreGetDatabaseLocationsA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreGetDatabaseLocationsA]
  end;
end;

var
  _DsRestoreGetDatabaseLocationsW: Pointer;

function DsRestoreGetDatabaseLocationsW;
begin
  GetProcedureAddress(_DsRestoreGetDatabaseLocationsW, ntdsbclilib, 'DsRestoreGetDatabaseLocationsW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreGetDatabaseLocationsW]
  end;
end;

var
  _DsRestoreGetDatabaseLocations: Pointer;

function DsRestoreGetDatabaseLocations;
begin
  GetProcedureAddress(_DsRestoreGetDatabaseLocations, ntdsbclilib, 'DsRestoreGetDatabaseLocations' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreGetDatabaseLocations]
  end;
end;

var
  _DsRestorePrepareA: Pointer;

function DsRestorePrepareA;
begin
  GetProcedureAddress(_DsRestorePrepareA, ntdsbclilib, 'DsRestorePrepareA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestorePrepareA]
  end;
end;

var
  _DsRestorePrepareW: Pointer;

function DsRestorePrepareW;
begin
  GetProcedureAddress(_DsRestorePrepareW, ntdsbclilib, 'DsRestorePrepareW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestorePrepareW]
  end;
end;

var
  _DsRestorePrepare: Pointer;

function DsRestorePrepare;
begin
  GetProcedureAddress(_DsRestorePrepare, ntdsbclilib, 'DsRestorePrepare' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestorePrepare]
  end;
end;

var
  _DsRestoreRegisterA: Pointer;

function DsRestoreRegisterA;
begin
  GetProcedureAddress(_DsRestoreRegisterA, ntdsbclilib, 'DsRestoreRegisterA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreRegisterA]
  end;
end;

var
  _DsRestoreRegisterW: Pointer;

function DsRestoreRegisterW;
begin
  GetProcedureAddress(_DsRestoreRegisterW, ntdsbclilib, 'DsRestoreRegisterW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreRegisterW]
  end;
end;

var
  _DsRestoreRegister: Pointer;

function DsRestoreRegister;
begin
  GetProcedureAddress(_DsRestoreRegister, ntdsbclilib, 'DsRestoreRegister' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreRegister]
  end;
end;

var
  _DsRestoreRegisterComplete: Pointer;

function DsRestoreRegisterComplete;
begin
  GetProcedureAddress(_DsRestoreRegisterComplete, ntdsbclilib, 'DsRestoreRegisterComplete');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreRegisterComplete]
  end;
end;

var
  _DsRestoreEnd: Pointer;

function DsRestoreEnd;
begin
  GetProcedureAddress(_DsRestoreEnd, ntdsbclilib, 'DsRestoreEnd');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsRestoreEnd]
  end;
end;

var
  _DsSetCurrentBackupLogA: Pointer;

function DsSetCurrentBackupLogA;
begin
  GetProcedureAddress(_DsSetCurrentBackupLogA, ntdsbclilib, 'DsSetCurrentBackupLogA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetCurrentBackupLogA]
  end;
end;

var
  _DsSetCurrentBackupLogW: Pointer;

function DsSetCurrentBackupLogW;
begin
  GetProcedureAddress(_DsSetCurrentBackupLogW, ntdsbclilib, 'DsSetCurrentBackupLogW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetCurrentBackupLogW]
  end;
end;

var
  _DsSetCurrentBackupLog: Pointer;

function DsSetCurrentBackupLog;
begin
  GetProcedureAddress(_DsSetCurrentBackupLog, ntdsbclilib, 'DsSetCurrentBackupLog' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetCurrentBackupLog]
  end;
end;

var
  _DsSetAuthIdentityA: Pointer;

function DsSetAuthIdentityA;
begin
  GetProcedureAddress(_DsSetAuthIdentityA, ntdsbclilib, 'DsSetAuthIdentityA');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetAuthIdentityA]
  end;
end;

var
  _DsSetAuthIdentityW: Pointer;

function DsSetAuthIdentityW;
begin
  GetProcedureAddress(_DsSetAuthIdentityW, ntdsbclilib, 'DsSetAuthIdentityW');
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetAuthIdentityW]
  end;
end;

var
  _DsSetAuthIdentity: Pointer;

function DsSetAuthIdentity;
begin
  GetProcedureAddress(_DsSetAuthIdentity, ntdsbclilib, 'DsSetAuthIdentity' + AWSuffix);
  asm
        MOV     ESP, EBP
        POP     EBP
        JMP     [_DsSetAuthIdentity]
  end;
end;

{$ELSE}

function DsIsNTDSOnlineA; external ntdsbclilib name 'DsIsNTDSOnlineA';
function DsIsNTDSOnlineW; external ntdsbclilib name 'DsIsNTDSOnlineW';
function DsIsNTDSOnline; external ntdsbclilib name 'DsIsNTDSOnline' + AWSuffix;
function DsBackupPrepareA; external ntdsbclilib name 'DsBackupPrepareA';
function DsBackupPrepareW; external ntdsbclilib name 'DsBackupPrepareW';
function DsBackupPrepare; external ntdsbclilib name 'DsBackupPrepare' + AWSuffix;
function DsBackupGetDatabaseNamesA; external ntdsbclilib name 'DsBackupGetDatabaseNamesA';
function DsBackupGetDatabaseNamesW; external ntdsbclilib name 'DsBackupGetDatabaseNamesW';
function DsBackupGetDatabaseNames; external ntdsbclilib name 'DsBackupGetDatabaseNames' + AWSuffix;
function DsBackupOpenFileA; external ntdsbclilib name 'DsBackupOpenFileA';
function DsBackupOpenFileW; external ntdsbclilib name 'DsBackupOpenFileW';
function DsBackupOpenFile; external ntdsbclilib name 'DsBackupOpenFile' + AWSuffix;
function DsBackupRead; external ntdsbclilib name 'DsBackupRead';
function DsBackupClose; external ntdsbclilib name 'DsBackupClose';
function DsBackupGetBackupLogsA; external ntdsbclilib name 'DsBackupGetBackupLogsA';
function DsBackupGetBackupLogsW; external ntdsbclilib name 'DsBackupGetBackupLogsW';
function DsBackupGetBackupLogs; external ntdsbclilib name 'DsBackupGetBackupLogs' + AWSuffix;
function DsBackupTruncateLogs; external ntdsbclilib name 'DsBackupTruncateLogs';
function DsBackupEnd; external ntdsbclilib name 'DsBackupEnd';
procedure DsBackupFree; external ntdsbclilib name 'DsBackupFree';
function DsRestoreGetDatabaseLocationsA; external ntdsbclilib name 'DsRestoreGetDatabaseLocationsA';
function DsRestoreGetDatabaseLocationsW; external ntdsbclilib name 'DsRestoreGetDatabaseLocationsW';
function DsRestoreGetDatabaseLocations; external ntdsbclilib name 'DsRestoreGetDatabaseLocations' + AWSuffix;
function DsRestorePrepareA; external ntdsbclilib name 'DsRestorePrepareA';
function DsRestorePrepareW; external ntdsbclilib name 'DsRestorePrepareW';
function DsRestorePrepare; external ntdsbclilib name 'DsRestorePrepare' + AWSuffix;
function DsRestoreRegisterA; external ntdsbclilib name 'DsRestoreRegisterA';
function DsRestoreRegisterW; external ntdsbclilib name 'DsRestoreRegisterW';
function DsRestoreRegister; external ntdsbclilib name 'DsRestoreRegister' + AWSuffix;
function DsRestoreRegisterComplete; external ntdsbclilib name 'DsRestoreRegisterComplete';
function DsRestoreEnd; external ntdsbclilib name 'DsRestoreEnd';
function DsSetCurrentBackupLogA; external ntdsbclilib name 'DsSetCurrentBackupLogA';
function DsSetCurrentBackupLogW; external ntdsbclilib name 'DsSetCurrentBackupLogW';
function DsSetCurrentBackupLog; external ntdsbclilib name 'DsSetCurrentBackupLog' + AWSuffix;
function DsSetAuthIdentityA; external ntdsbclilib name 'DsSetAuthIdentityA';
function DsSetAuthIdentityW; external ntdsbclilib name 'DsSetAuthIdentityW';
function DsSetAuthIdentity; external ntdsbclilib name 'DsSetAuthIdentity' + AWSuffix;

{$ENDIF DYNAMIC_LINK}

end.
