/*++ Copyright (c) 1997-1999 Microsoft Corporation Module Name: frserror.h Abstract: This header defines functions, messages and status codes for error processing. Author: David Orbits (davidor) - 10-Mar-1997 Revision History: --*/ #ifndef _FRSERROR_ #define _FRSERROR_ #define bugbug(_text_) #define bugmor(_text_) // // get the jet (aka ESENT) error codes. // #include // // FRS Error Codes // typedef enum _FRS_ERROR_SEVERITY { FrsSeverityServiceFatal = 0, // FRS Service is crashing. FrsSeverityReplicaFatal, // Service on just this replica set is stopping. FrsSeverityException, // More than a warning but less than fatal FrsSeverityWarning, // Warning errors e.g. Startup check failed doing verification. FrsSeverityInfo, // Informational status only FrsSeverityIgnore, // A way to filter out a class of jet errors. FRS_MAX_ERROR_SEVERITY } FRS_ERROR_SEVERITY; typedef enum _FRS_ERROR_CODE { FrsErrorSuccess = 0, FrsErrorDiskSpace, // out of disk space FrsErrorDatabaseNotFound, // no db or path to db is in error FrsErrorDatabaseCorrupted, // not a db or a scrambled db FrsErrorInternalError, // unexpected error occurred - catchall FrsErrorAccess, // couldn't access a file or the db FrsErrorNotFound, // Record or table not found. FrsErrorConflict, // Record or table create conflict FrsErrorResource, // Resource limit e.g. handles or memory hit. FrsErrorBadParam, // Bad parameter to a function. FrsErrorInfo, // informational error, e.g. JET_errObjectNotFound FrsErrorVvRevision, // Vers Vector revision mismatch FrsErrorVvLength, // vers vector length mismatch FrsErrorVvChecksum, // version vector checksum mismatch. FrsErrorEndOfTable, // No next record, end of table hit. FrsErrorInvalidRegistryParam, // Invalid registry parameter FrsErrorNoPrivileges, // Couldn't get the necessary privileges to run. FrsErrorNoOpenJournals, // Can't start replication because no journals were opened. FrsErrorCmdPktTimeOut, // Command packet timeout. FrsErrorInvalidHandle, // Invalid File Handle. FrsErrorInvalidOperation, // Invalid operation requested. FrsErrorInvalidChangeOrder, // Invalid change order. FrsErrorResourceInUse, // A resource required by this operation is in use. FrsErrorBufferOverflow, // Buffer overflow NTSTATUS. FrsErrorNotInitialized, // Function called without proper initialization FrsErrorReplicaPhase1Failed,// Phase 1 of replica set init failed. FrsErrorReplicaPhase2Failed,// Phase 2 of replica set init failed. FrsErrorJournalStateWrong, // The journal is in an unexpected state. FrsErrorJournalInitFailed, // The NTFS journal failed to initialize. FrsErrorJournalStartFailed, // The NTFS journal failed to start. FrsErrorJournalPauseFailed, // The NTFS journal failed to Pause, could be timeout. FrsErrorJournalReplicaStop, // Failed to detatch the replica from The journal. FrsErrorJournalWrapError, // Initial NTFS journal record not present. Journal has wrapped. FrsErrorChgOrderAbort, // Change order processing has been aborted. FrsErrorQueueIsRundown, // The request queue has been rundown. FrsErrorMoreWork, // There is more work to do on this command / operation. FrsErrorDampened, // This request is suppressed because it has already been seen. FrsErrorStageFileDelFailed, // An attempt to delete the staging file failed. FrsErrorKeyDuplicate, // An attempt to insert a record with a duplicate key FrsErrorBadOutLogPartnerData, // Either the data was corrupt, unavail or was wrong. FrsErrorPartnerActivateFailed, // Failed to activate an outbound partner. FrsErrorDirCreateFailed, // We failed to create a new DIR. This stops repl. FrsErrorSessionNotClosed, // Failed to close all RtCtx's in replica set. FrsErrorRecordLocked, // The record being accessed is locked. FrsErrorDeleteRequested, // Enum function status return to delete entry. FrsErrorTerminateEnum, // Enum function status return to end enumeration. FrsErrorIdtFileIsDeleted, // File is marked deleted in IDTable. FrsErrorVVSlotNotFound, // VVSlot not found on VVretire of Out of Order CO. FrsErrorJetSecIndexCorrupted, // Jet (upgrade, collating, jet err -1414) FrsErrorPreInstallDirectory, // creating preinstall directory FrsErrorUnjoining, // cxtion is still unjoining FrsErrorNameMorphConflict, // File name morph conflict was detected. FrsErrorInvalidGuid, // The generated Guid is missing the net address. FrsErrorDbWriteConflict, // DB update conflict if two sessions try to update the same record. FrsErrorCantMoveOut, // Request for a Moveout of a non-empty directory failed. FrsErrorFoundKey, // The Key being searched by QHashEnumerateTable was found FrsErrorTunnelConflict, // oid conflict with id table entry (resolved) FrsErrorTunnelConflictRejectCO, // oid conflict with id table entry (CO rejected) FrsErrorPrepareRoot, // Could not prepare the root dir for replication, bad path? share viol? FrsErrorCmdSrvFailed, // A command server request failed to get submitted FrsErrorPreinstallCreFail, // Failed to create the pre-install dir. FrsErrorStageDirOpenFail, // Failed to open the staging dir. FrsErrorReplicaRootDirOpenFail, // Failed to open the replica tree root dir. FrsErrorShuttingDown, // Shutdown in progress. FrsErrorReplicaSetTombstoned, // Replica set is marked for deletion. FrsErrorVolumeRootDirOpenFail, // Failed to open the volume root directory for this replica set FrsErrorUnsupportedFileSystem, // The file system on this volume does provide the features required by FRS. FrsErrorBadPathname, // ERROR_BAD_PATHNAME FrsErrorFileExists, // ERROR_FILE_EXISTS FrsErrorSharingViolation, // ERROR_SHARING_VIOLATION FrsErrorDirNotEmpty, // ERROR_DIR_NOT_EMPTY FrsErrorOplockNotGranted, // ERROR_OPLOCK_NOT_GRANTED FrsErrorRetry, // ERROR_RETRY FrsErrorRequestCancelled, // ERROR_OPERATION_ABORTED FRS_ERROR_LISTEN, FRS_ERROR_REGISTEREP, FRS_ERROR_REGISTERIF, FRS_ERROR_INQ_BINDINGS, FRS_ERROR_PROTSEQ, // // New error codes that trigger a non_auth restore. // FrsErrorMismatchedVolumeSerialNumber, // The Volume serial number from DB does not match the one from FileSystem. FrsErrorMismatchedReplicaRootObjectId, // The Replica root's ObjectID from DB does not match the one from FileSystem. FrsErrorMismatchedReplicaRootFileId, // The Replica root's FID from DB does not match the one from FileSystem. FrsErrorMismatchedJournalId, // The Journal ID from DB does not match the one from FileSystem. // Added in QFE after Win2K SP3. FrsErrorIdtFileIsDeleteDef, // File is marked delete deferred in IDTable. FRS_MAX_ERROR_CODE } FRS_ERROR_CODE; // // Useful WIN32 STATUS defines // #define WIN_SUCCESS(_Status) ((_Status) == ERROR_SUCCESS) #define WIN_NOT_IMPLEMENTED(_Status) ((_Status) == ERROR_INVALID_FUNCTION) #define WIN_ACCESS_DENIED(_Status) ((_Status) == ERROR_ACCESS_DENIED) #define WIN_INVALID_PARAMETER(_Status) ((_Status) == ERROR_INVALID_PARAMETER) #define WIN_DIR_NOT_EMPTY(_Status) ((_Status) == ERROR_DIR_NOT_EMPTY) #define WIN_BAD_PATH(_Status) ((_Status) == ERROR_BAD_PATHNAME) #define WIN_BUF_TOO_SMALL(_Status) (((_Status) == ERROR_MORE_DATA) || \ ((_Status) == ERROR_INSUFFICIENT_BUFFER)) #define RPC_SUCCESS(_Status) ((_Status) == RPC_S_OK) // // Returned when rename fails because the target name is taken // #define WIN_ALREADY_EXISTS(_Status) ((_Status) == ERROR_ALREADY_EXISTS) // // Returned when getting the object id // #define WIN_OID_NOT_PRESENT(_Status) ((_Status) == ERROR_FILE_NOT_FOUND) // // Oid, Fid, or relative path not found // // Fid not found is ERROR_INVALID_PARAMETER // Oid not found is ERROR_FILE_NOT_FOUND // Path not found is ERROR_FILE_NOT_FOUND // // A new error ERROR_DELETE_PENDING was added on 11/01/2000. Now STATUS_DELETE_PENDING // maps to this new error. // #define WIN_NOT_FOUND(_Status) ((_Status) == ERROR_FILE_NOT_FOUND || \ (_Status) == ERROR_DELETE_PENDING || \ (_Status) == ERROR_INVALID_PARAMETER) #define NT_NOT_FOUND(_ntstatus_) \ (((_ntstatus_) == STATUS_DELETE_PENDING) || \ ((_ntstatus_) == STATUS_FILE_DELETED) || \ ((_ntstatus_) == STATUS_OBJECT_NAME_NOT_FOUND) || \ ((_ntstatus_) == STATUS_OBJECTID_NOT_FOUND) || \ ((_ntstatus_) == STATUS_FILE_RENAMED) || \ ((_ntstatus_) == STATUS_OBJECT_PATH_NOT_FOUND)) // // Retry the install (staging file) // // Note: remove ERROR_ACCESS_DENIED when FILE_OPEN_FOR_BACKUP_INTENT bug is fixed. // #define WIN_RETRY_INSTALL(_Status) ((_Status) == ERROR_SHARING_VIOLATION || \ (_Status) == ERROR_ACCESS_DENIED || \ (_Status) == ERROR_DISK_FULL || \ (_Status) == ERROR_HANDLE_DISK_FULL || \ (_Status) == ERROR_DIR_NOT_EMPTY || \ (_Status) == ERROR_OPLOCK_NOT_GRANTED || \ (_Status) == ERROR_RETRY) // // Retry the delete // #define WIN_RETRY_DELETE(_Status) WIN_RETRY_INSTALL(_Status) // // Retry the generate (staging file) // #define WIN_RETRY_STAGE(_Status) WIN_RETRY_INSTALL(_Status) // // Retry the fetch (staging file) // #define WIN_RETRY_FETCH(_Status) WIN_RETRY_INSTALL(_Status) // // Retry the creation of the preinstall file // #define WIN_RETRY_PREINSTALL(_Status) WIN_RETRY_INSTALL(_Status) // // Generic !ERROR_SUCCESS status // #define WIN_SET_FAIL(_Status) (_Status = ERROR_GEN_FAILURE) // // Generic "retry operation" error // #define WIN_SET_RETRY(_Status) (_Status = ERROR_RETRY) // // THis macro checks the error returns from WaitForSingleObject. // #define CHECK_WAIT_ERRORS(_Severity_, _WStatus_, _WaitObjectCount_, _Action_) \ \ if ((_WStatus_ == WAIT_TIMEOUT) || (_WStatus_ == ERROR_TIMEOUT)) { \ DPRINT(_Severity_, "++ >>>>>>>>>>>> Wait timeout <<<<<<<<<<<<\n"); \ if (_Action_) return _WStatus_; \ } else \ if (_WStatus_ == WAIT_ABANDONED) { \ DPRINT(_Severity_, "++ >>>>>>>>>>>> Wait abandoned <<<<<<<<<<<<\n"); \ if (_Action_) return _WStatus_; \ } else \ if (_WStatus_ == WAIT_FAILED) { \ _WStatus_ = GetLastError(); \ DPRINT_WS(_Severity_, "++ ERROR: wait failed :", _WStatus_); \ if (_Action_) return _WStatus_; \ } else \ if (_WStatus_ >= _WaitObjectCount_) { \ DPRINT_WS(_Severity_, "++ >>>>>>>>>> Wait failed <<<<<<<<<", _WStatus_);\ if (_Action_) return _WStatus_; \ } #define ACTION_RETURN TRUE #define ACTION_CONTINUE FALSE // // Like above but with no Action arg so it can be used in a finally {} clause. // #define CHECK_WAIT_ERRORS2(_Severity_, _WStatus_, _WaitObjectCount_) \ \ if (_WStatus_ == WAIT_TIMEOUT) { \ DPRINT(_Severity_, "++ >>>>>>>>>>>> Wait timeout <<<<<<<<<<<<\n"); \ } else \ if (_WStatus_ == WAIT_ABANDONED) { \ DPRINT(_Severity_, "++ >>>>>>>>>>>> Wait abandoned <<<<<<<<<<<<\n"); \ } else \ if (_WStatus_ == WAIT_FAILED) { \ _WStatus_ = GetLastError(); \ DPRINT_WS(_Severity_, "++ ERROR: wait failed :", _WStatus_); \ } else \ if (_WStatus_ >= _WaitObjectCount_) { \ DPRINT_WS(_Severity_, "++ >>>>>>>>>>>>>>> Wait failed : %s <<<<<<<<<", _WStatus_);\ } #define GET_EXCEPTION_CODE(_x_) \ { \ (_x_) = GetExceptionCode(); \ DPRINT1_WS(0, "++ ERROR - EXCEPTION (%08x) :", (_x_),(_x_)); \ } #define LDP_SUCCESS(_Status) ((_Status) == LDAP_SUCCESS) // // Translate Jet error codes to an FRS Error code. // FRS_ERROR_CODE DbsTranslateJetError0( IN JET_ERR jerr, IN BOOL BPrint ); #define DbsTranslateJetError(_jerr_, _print_) \ (((_jerr_) == JET_errSuccess) ? FrsErrorSuccess : \ DbsTranslateJetError0(_jerr_, _print_)) FRS_ERROR_CODE FrsTranslateWin32Error( IN DWORD WStatus ); FRS_ERROR_CODE FrsTranslateNtError( IN NTSTATUS Status, IN BOOL BPrint ); ULONG DisplayNTStatusSev( IN ULONG Sev, IN NTSTATUS Status ); ULONG DisplayNTStatus( IN NTSTATUS Status ); ULONG FrsSetLastNTError( NTSTATUS Status ); VOID DisplayErrorMsg( IN ULONG Severity, IN ULONG WindowsErrorCode ); PCHAR ErrLabelW32( ULONG WStatus ); PCHAR ErrLabelNT( NTSTATUS Status ); PCHAR ErrLabelFrs( ULONG FStatus ); PCHAR ErrLabelJet( LONG jerr ); // // FRS Error Handling // #define FRS_SUCCESS(_Status) ((_Status) == FrsErrorSuccess) VOID FrsError( FRS_ERROR_CODE ); VOID FrsErrorCode( FRS_ERROR_CODE, DWORD ); VOID FrsErrorCodeMsg1( FRS_ERROR_CODE, DWORD, PWCHAR ); VOID FrsErrorCodeMsg2( FRS_ERROR_CODE, DWORD, PWCHAR, PWCHAR ); VOID FrsErrorCodeMsg3( FRS_ERROR_CODE, DWORD, PWCHAR, PWCHAR, PWCHAR ); VOID FrsErrorMsg1( FRS_ERROR_CODE, PWCHAR ); VOID FrsErrorMsg2( FRS_ERROR_CODE, PWCHAR, PWCHAR ); VOID FrsErrorMsg3( FRS_ERROR_CODE, PWCHAR, PWCHAR, PWCHAR ); #endif // _FRSERROR_