| Previous | Next |
| hrTermInProgress | hrInvalidName |
hrFeatureNotAvailable
The object and state that matter
For hrFeatureNotAvailable, read this result as a boundary in the ESE state machine, not as a generic Windows failure. The decisive boundary is an API or option is recognized but absent from the engine build or operating mode in use.
This result is the legacy Directory Service backup/restore HRESULT form of the ESE condition normally written as JET_errFeatureNotAvailable. Preserve the original value 0xC80003E9 when a wrapper also exposes a signed JET_ERR.
The key comparison is: unlike hrInvalidParameter, the request can be structurally valid while the feature is unavailable. The first useful observation is to capture the exact function, grbit set, ESENT.dll version, and instance mode. This evidence shows whether startup, normal operation, shutdown, or restore ordering is the actual boundary.
Minimum useful trace
A useful trace should preserve the first failing operation and the state of the ESE instance state and call ordering.
- Code-specific observation: capture the exact function, grbit set, ESENT.dll version, and instance mode.
- the successful or failed JetInit/JetTerm sequence and the component that owns it; associate it with this result rather than with a later generic exception.
- all still-live sessions and child handles at the transition; associate it with it rather than with a later generic exception.
- the first request accepted after shutdown or before initialization completed; associate it with it rather than with a later generic exception.
Log lengths, hashes, IDs, flags, and redacted samples where appropriate.
How to avoid a false diagnosis
Unlike hrInvalidParameter, the request can be structurally valid while the feature is unavailable. The following neighboring results belong to the same broad subsystem but mark different boundaries:
hrAlreadyInitialized | initialization-only work was attempted after the instance had already entered the running state |
|---|---|
hrInvalidOperation | the engine state, object type, or call ordering makes the requested operation invalid |
hrAfterInitialization | restore processing was requested after the ESE instance had already initialized |
Keep it in the incident record; replacing it with “database error” hides whether the next step is handle renewal, schema correction, lock reconciliation, or file preservation.
The ESE objects in play
| Diagnostic layer | ESE instance state and call ordering |
|---|---|
| Typical API surface | JetCreateInstance, JetSetSystemParameter, JetInit, JetTerm, and restore entry points |
| Code-specific boundary | an API or option is recognized but absent from the engine build or operating mode in use |
| First corrective direction | select a supported API path or version-gate the feature rather than retrying unchanged |
Initialization parameters are generally established before JetInit. Handles derived from an instance are not reusable after teardown.
Safe recovery sequence
- Freeze the failing request context and record it,
0xC80003E9, the Jet API name, and the current instance/session ownership. - Verify the code-specific precondition: capture the exact function, grbit set, ESENT.dll version, and instance mode.
- Apply the narrow correction: select a supported API path or version-gate the feature rather than retrying unchanged.
- Before retrying it, reconcile instance state, admission control, and child-handle cleanup.
- Repeat the smallest read-only or disposable test that exercises the corrected precondition; then confirm both the returned HRESULT and the resulting database, cursor, or file state.
Developer-facing acceptance test
Build a focused test that reproduces it at the ESE instance state and call ordering layer. Record the precondition, execute one API call, and assert the HRESULT plus the resulting handle and transaction state. The corrected test should change only the decisive condition—an API or option is recognized but absent from the engine build or operating mode in use—and should prove that cleanup is safe if the call still fails.
Actions that can hide or worsen the problem
- Do not reuse instance-derived handles after the lifecycle transition.
- Do not start a second initializer to work around an ordering defect.
Technical references
- ESE API functions — used to verify the ESE object model, API ordering, or error family relevant to it.
- Using ESE and esent.h
- JET error codes
- Microsoft: JET_ERR enumeration
Looking for a different code? Search another status or error code.