// Backup.cpp : Defines the entry point for the console
#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include "esebcli2.h"
#include <iostream>
#include <wchar.h>
bool GetProcAddresses( HINSTANCE *hLibrary, LPCSTR lpszLibrary, INT nCount, ... )
{
va_list va;
va_start( va, nCount );
if ( ( *hLibrary = LoadLibrary( lpszLibrary ) ) != NULL )
{
FARPROC * lpfProcFunction = NULL;
LPSTR lpszFuncName = NULL;
INT nIdxCount = 0;
while ( nIdxCount < nCount )
{
lpfProcFunction = va_arg( va, FARPROC* );
lpszFuncName = va_arg( va, LPSTR );
if ( ( *lpfProcFunction =
GetProcAddress( *hLibrary,
lpszFuncName ) ) == NULL )
{
lpfProcFunction = NULL;
return FALSE;
}
nIdxCount++;
}
}
else
{
va_end( va );
return FALSE;
}
va_end( va );
return TRUE;
}
int main(int argc, char* argv[])
{
char lszValue[200];
LONG lRet;
HKEY hKey;
DWORD dwLength=200;
DWORD dwType=REG_SZ;
DWORD dwSize=255;
lRet = RegOpenKeyEx (HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\BackupRestore\\DLLPaths", 0L, KEY_READ , &hKey);
if(lRet == ERROR_SUCCESS)
{
lRet = RegQueryValueEx(hKey, "Esebcli2", NULL, &dwType,(LPBYTE)&lszValue, &dwSize);
}
RegCloseKey(hKey);
typedef HRESULT (ESEBACK_API *HrESEBackupRestoreGetNodes) (
IN WCHAR* wszComputerName,
OUT PBACKUP_NODE_TREE *ppBackupNodeTree);
typedef void (ESEBACK_API *ESEBackupRestoreFreeNodes)(
IN PBACKUP_NODE_TREE pBackupNodeTree
);
typedef HRESULT (ESEBACK_API *HrESEBackupPrepare)(
IN WCHAR * wszBackupServer,
IN WCHAR * wszBackupAnnotation,
OUT unsigned long * pcInstanceInfo,
OUT INSTANCE_BACKUP_INFO ** paInstanceInfo,
OUT HCCX * phccxBackupContext
);
typedef void (ESEBACK_API *ESEBackupFreeInstanceInfo)(
IN unsigned long cInstanceInfo,
IN INSTANCE_BACKUP_INFO * aInstanceInfo
);
typedef HRESULT (ESEBACK_API *HrESEBackupRestoreGetRegistered)(
IN WCHAR * wszServerName,
IN WCHAR * wszDisplayName,
IN unsigned long fFlags,
OUT unsigned long * pcRegisteredInfo,
OUT ESE_REGISTERED_INFO ** paRegisteredInfo
);
typedef void (ESEBACK_API *ESEBackupRestoreFreeRegisteredInfo)(
IN unsigned long cRegisteredInfo,
IN ESE_REGISTERED_INFO * aRegisteredInfo
);
typedef wchar_t WCHAR;
LPVOID lpMsgBuf;
HINSTANCE hMod;
HrESEBackupRestoreGetNodes fnMNUBackupRestoreGetNodes = NULL;
ESEBackupRestoreFreeNodes fnESEBackupRestoreFreeNodes = NULL;
HrESEBackupPrepare fnHrESEBackupPrepare = NULL;
ESEBackupFreeInstanceInfo fnESEBackupFreeInstanceInfo = NULL;
HrESEBackupRestoreGetRegistered fnHrESEBackupRestoreGetRegistered = NULL;
ESEBackupRestoreFreeRegisteredInfo fnESEBackupRestoreFreeRegisteredInfo = NULL;
if (GetProcAddresses( &hMod, lszValue, 6,
&fnMNUBackupRestoreGetNodes, "HrESEBackupRestoreGetNodes",
&fnESEBackupRestoreFreeNodes, "ESEBackupRestoreFreeNodes",
&fnHrESEBackupPrepare, "HrESEBackupPrepare",
&fnESEBackupFreeInstanceInfo, "ESEBackupFreeInstanceInfo",
&fnHrESEBackupRestoreGetRegistered, "HrESEBackupRestoreGetRegistered",
&fnESEBackupRestoreFreeRegisteredInfo, "ESEBackupRestoreFreeRegisteredInfo"
) == FALSE){
printf ("--ERROR LoadLibrary failed\n");
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
printf( (LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf );
return 1;
}
BACKUP_NODE_TREE* pBackupNodeTree = NULL;
HRESULT hr;
hr = fnMNUBackupRestoreGetNodes (L"localhost", &pBackupNodeTree);
if (hr != S_OK)
{
printf("HRESULT GetNodes : %x ,GetLastError : %d\n" , hr,GetLastError());
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
printf( (LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf );
FreeLibrary (hMod);
return -1;
}
WCHAR *Server = pBackupNodeTree->wszName;
WCHAR *ServerName = pBackupNodeTree->pChildNode->wszName;
wprintf(L"Server: %s\n", Server);
wprintf(L"Server Name: %s\n", ServerName);
unsigned long cRegisteredInfo;
ESE_REGISTERED_INFO *paRegisteredInfo;
hr = fnHrESEBackupRestoreGetRegistered(
L"localhost" ,
Server ,
0x00000001 ,
&cRegisteredInfo,
&paRegisteredInfo);
if (hr != S_OK)
{
printf("--ERROR HRESULT GetRegistered : %x ,GetLastError : %d\n" , hr,GetLastError());
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
printf( (LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf );
FreeLibrary (hMod);
return -1;
}
printf("Number Registered: %d\n", cRegisteredInfo );
wprintf(L"Registered: %s\n", paRegisteredInfo->wszEndpointAnnotation );
unsigned long InstanceInfo = 0;
//INSTANCE_BACKUP_INFO *aInstanceInfo;
//INSTANCE_BACKUP_INFO **aInstanceInfo = (INSTANCE_BACKUP_INFO **) malloc ( cRegisteredInfo * sizeof ** aInstanceInfo );
INSTANCE_BACKUP_INFO *aInstanceInfo = malloc( cRegisteredInfo * sizeof * aInstanceInfo );
HCCX Context;
hr = fnHrESEBackupPrepare (
ServerName,
paRegisteredInfo->wszEndpointAnnotation,
&InstanceInfo,
&aInstanceInfo,
&Context);
if (hr != S_OK)
{
printf("--ERROR HRESULT BackupPrepare : %x ,GetLastError : %d\n" , hr,GetLastError());
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
0, // Default language
(LPTSTR) &lpMsgBuf,
0,
NULL
);
printf( (LPCTSTR)lpMsgBuf);
LocalFree( lpMsgBuf );
FreeLibrary (hMod);
return -1;
}
fnESEBackupRestoreFreeNodes(pBackupNodeTree);
fnESEBackupFreeInstanceInfo(InstanceInfo, aInstanceInfo);
printf("\n\n\nThank You!\n");
FreeLibrary (hMod);
return 0;
}