//+-------------------------------------------------------------------------- // // Microsoft Windows // Copyright (C) Microsoft Corporation, 1996 - 1999 // // File: csbjet.h // // Contents: Cert Server database backup/restore APIs // //--------------------------------------------------------------------------- #ifndef __CSBJET_H__ #define __CSBJET_H__ //#include #ifndef MIDL_PASS //#include #endif //#include // MIDL 2.0 switched the names of the generated server interface globals (why!?). // This hack so that we only have to change one place. // Parameters are interface name, major and minor version numbers. #if (_MSC_VER > 800) #define ServerInterface(s, vMaj, vMin) s##_v##vMaj##_##vMin##_s_ifspec #define ClientInterface(s, vMaj, vMin) s##_v##vMaj##_##vMin##_c_ifspec #else #define ServerInterface(s, vMaj, vMin) s##_ServerIfHandle #define ClientInterface(s, vMaj, vMin) s##_ClientIfHandle #endif #define JetBack_ClientIfHandle ClientInterface(ICertDBBackup, 1, 0) #define JetBack_ServerIfHandle ServerInterface(s_ICertDBBackup, 1, 0) #define JetRest_ClientIfHandle ClientInterface(ICertDBRestore, 1, 0) #define JetRest_ServerIfHandle ServerInterface(s_ICertDBRestore, 1, 0) #define MAX_SOCKETS 10 #define wszRESTORE_IN_PROGRESS L"\\Restore in Progress" #define wszRESTORE_STATUS L"RestoreStatus" #define wszBACKUP_LOG_PATH L"BackupLogPath" #define wszCHECKPOINT_FILE_PATH L"CheckpointFilePath" #define wszLOG_PATH L"LogPath" #define wszHIGH_LOG_NUMBER L"HighLog Number" #define wszLOW_LOG_NUMBER L"LowLog Number" #define wszJET_RSTMAP_NAME L"Certificate_Server_NTDS_RstMap" #define wszJET_RSTMAP_SIZE L"Certificate_Server_NTDS_RstMap Size" #define wszJET_DATABASE_RECOVERED L"Certificate_Server_NTDS Database recovered" #define wszBACKUP_INFO L"SYSTEM\\CurrentControlSet\\Services\\CertSvc\\Configuration\\BackupInformation\\" #define wszLAST_BACKUP_LOG L"Last Backup Log" #define wszDISABLE_LOOPBACK L"DisableLoopback" #define wszENABLE_TRACE L"Enable Trace" // Sockets protocol value. typedef INT PROTVAL; #define wszLOOPBACKED_READ_EVENT_NAME L"Certificate Server Backup Loopbacked Read Event - %d" #define wszLOOPBACKED_WRITE_EVENT_NAME L"Certificate Server Backup Loopbacked Write Event - %d" #define wszLOOPBACKED_CRITSEC_MUTEX_NAME L"Certificate Server Backup Loopbacked Critical Section - %d" #define wszLOOPBACKED_SHARED_REGION L"Certificate Server Backup Shared Memory Region - %d" #define READAHEAD_MULTIPLIER 5 #ifdef DEBUG #define BACKUP_WAIT_TIMEOUT 10*60*1000 #else #define BACKUP_WAIT_TIMEOUT 2*60*1000 #endif typedef volatile struct { DWORD cbSharedBuffer; DWORD cbPage; // Convenient place to store page size DWORD dwReadPointer; // Read offset within shared buffer. DWORD dwWritePointer; // Write offset within buffer. LONG cbReadDataAvailable; // Number of bytes of data available. HRESULT hrApi; // Status of API - used to communicate to server if client fails. BOOLEAN fReadBlocked; // Read operation is blocked BOOLEAN fWriteBlocked; // Write operation is blocked } JETBACK_SHARED_HEADER; typedef struct { HANDLE hSharedMemoryMapping; HANDLE heventRead; HANDLE heventWrite; HANDLE hmutexSection; JETBACK_SHARED_HEADER *pjshSection; } JETBACK_SHARED_CONTROL; // Client side context. typedef struct _CSBACKUPCONTEXT { handle_t hBinding; HCSCTX csctx; BOOLEAN fLoopbacked; BOOLEAN fUseSockets; BOOLEAN fUseSharedMemory; // Socket support. SOCKET rgsockSocketHandles[MAX_SOCKETS]; PROTVAL rgprotvalProtocolsUsed[MAX_SOCKETS]; LONG cSockets; SOCKET sock; HANDLE hReadThread; DWORD tidThreadId; HANDLE hPingThread; // Keep alive thread for loopbacked backups. DWORD tidThreadIdPing; // And thread ID for that thread. HRESULT hrApiStatus; // Shared memory support. JETBACK_SHARED_CONTROL jsc; } CSBACKUPCONTEXT; #if 0 typedef DWORD (*PRESTORE_DATABASE_LOCATIONS)( OUT CHAR rgLocationBuffer[], OUT PULONG pulLocationSize, OUT char rgRegistryBase[], OUT ULONG cbRegistryBase, OUT BOOL *pfCircularLogging); typedef DWORD (*PRESTORE_PERFORM_RESTORE)( CHAR *pszLogPath, CHAR *pszBackupLogPath, LONG crstmap, JET_RSTMAP rgrstmap[]); #endif // Server side context binding - the server context handle points to a // structure containing this information. typedef struct _JETBACK_SERVER_CONTEXT { BOOL fRestoreOperation; union { struct { //JET_HANDLE hFile; HANDLE hFile; BOOL fHandleIsValid; LONG cbReadHint; SOCKET sockClient; LARGE_INTEGER liFileSize; DWORD dwHighestLogNumber; WCHAR *pwszBackupAnnotation; DWORD dwFileSystemGranularity; BOOLEAN fUseSockets; BOOLEAN fUseSharedMemory; BOOLEAN fBackupIsRegistered; // Client identifer used to identify the client to the server - we // use this when opening the shared memory segment on local backup. DWORD dwClientIdentifier; JETBACK_SHARED_CONTROL jsc; } Backup; struct { BOOL fJetCompleted; LONG cUnitDone; LONG cUnitTotal; } Restore; } u; } JETBACK_SERVER_CONTEXT; // Server side private routines. VOID GetCurrentSid( PSID *ppsid); BOOL FBackupServerAccessCheck( BOOL fRestoreOperation); DWORD ErrAdjustRestorePrivelege( BOOL fEnable, PTOKEN_PRIVILEGES ptpPrevious, DWORD *pcbptpPrevious); #if 0 HRESULT HrFromJetErr( JET_ERR jetError); #endif HRESULT HrDestroyCxh( HCSCTX csctx); BOOL FIsAbsoluteFileName( CHAR *pszFileName); HRESULT HrAnnotateMungedFileList( JETBACK_SERVER_CONTEXT *pjsc, WCHAR *wszFileList, LONG cbFileList, WCHAR **pwszAnnotatedList, LONG *pcbAnnotatedList); HRESULT HrMungedFileNamesFromJetFileNames( WCHAR **ppwszMungedList, LONG *pcbSize, CHAR *pszJetAttachmentList, LONG cbJetSize, BOOL fAnnotated); HRESULT HrMungedFileNameFromJetFileName( CHAR *pszJetFileName, WCHAR **ppwszMungedFileName); HRESULT HrJetFileNameFromMungedFileName( WCHAR *pwszMungedList, CHAR **ppszJetFileName); VOID RestoreRundown( JETBACK_SERVER_CONTEXT *pjsc); // Client side private routines. HRESULT HrCreateRpcBinding( IN LONG iszProtoseq, IN WCHAR const *pwszServer, OUT handle_t *phBinding); HRESULT HrJetbpConnectToBackupServer( WCHAR *pwszBackupServer, WCHAR *pwszBackupAnnotation, RPC_IF_HANDLE rifHandle, RPC_BINDING_HANDLE *prbhBinding); BOOL FBackupClientAccessCheck( BOOL fRestoreOperation); BOOL FIsInBackupGroup( BOOL fRestoreOperation); extern WCHAR *g_apszProtSeq[]; extern long g_cProtSeq; BOOL FInitializeRestore(); BOOL FUninitializeRestore(); // Sockets related APIs and prototypes. HRESULT HrCreateBackupSockets( SOCKET rgsockSocketHandles[], PROTVAL rgprotvalProtocolsUsed[], LONG *pcSocketHandles); SOCKET SockWaitForConnections( SOCKET rgsockSocketHandles[], LONG cSocketMax); SOCKET SockConnectToRemote( SOCKADDR rgsockaddrClient[], LONG cSocketMax); HRESULT HrSockAddrsFromSocket( OUT SOCKADDR sockaddr[], OUT LONG *pcSockets, IN SOCKET sock, IN PROTVAL protval); BOOL FInitializeSocketClient(); BOOL FInitializeSocketServer(); BOOL FUninitializeSocketClient(); BOOL FUninitializeSocketServer(); HRESULT I_HrRestoreW( HCSBC hcsbc, WCHAR *pwszCheckpointFilePath, WCHAR *pwszLogPath, CSEDB_RSTMAPW __RPC_FAR rgrstmap[], LONG crstmap, WCHAR *pwszBackupLogPath, unsigned long genLow, unsigned long genHigh, BOOLEAN *pfRecoverJetDatabase); HRESULT I_HrCheckBackupLogs( WCHAR *wszBackupAnnotation); BOOLEAN FIsLoopbackedBinding( RPC_BINDING_HANDLE hBinding); BOOLEAN FCreateSharedMemorySection( JETBACK_SHARED_CONTROL *pjsc, DWORD dwClientIdentifier, BOOLEAN fClientOperation, LONG cbSharedMemory); VOID CloseSharedControl( JETBACK_SHARED_CONTROL *pjsc); #if DBG BOOL GetTextualSid( PSID pSid, // binary Sid LPTSTR TextualSid, // buffer for Textual representaion of Sid LPDWORD dwBufferLen); // required/provided TextualSid buffersize VOID OpenTraceLogFile(VOID); BOOL FInitializeTraceLog(VOID); VOID UninitializeTraceLog(VOID); NET_API_STATUS TruncateLog(VOID); #endif // DBG #define hrCommunicationError CO_E_REMOTE_COMMUNICATION_FAILURE #define hrCouldNotConnect HRESULT_FROM_WIN32(ERROR_CONNECTION_REFUSED) #endif // __CSBJET_H__