| Previous | Next |
| TPM_E_BAD_COUNTER | TPM_E_CONTEXT_GAP |
TPM_E_NOT_FULLWRITE
Where the failure is raised
TPM_E_NOT_FULLWRITE (0x80280046) belongs to TPM 1.2 nonvolatile-storage policy. The base What Is page already shows the short Windows message; the additional diagnostic value is that this result marks an NV index requiring full-area writes received a partial offset or length.
The first producer to identify for this HRESULT is the TPM 1.2 NV permission and lifecycle checks. TPM 1.2 NV indices combine permissions, authorization mode, locality masks and lock semantics. Two indices of the same size can behave differently because those attributes were fixed when each index was defined.
Evidence that changes the diagnosis
| Question | Evidence for this HRESULT |
|---|---|
| What exact state was rejected? | an NV index requiring full-area writes received a partial offset or length |
| Which layer owns the result? | The TPM 1.2 NV permission and lifecycle checks. |
| What must be correlated? | index size, writeAll attribute, requested offset, payload length, and whether transport or encoding truncated the data |
| What is the controlled comparison? | submit an exact index-sized test payload at offset zero to a disposable index with the same attribute |
A useful this result trace links three code-specific timelines: the application call, the local TBS/provider or firmware event, and the raw command/response exchange. The result timestamps should describe one attempt; combining data from separate retries is particularly misleading for authorization sessions, context counters, DAA stages and lockout state.
A controlled verification
The one-variable check is to submit an exact index-sized test payload at offset zero to a disposable index with the same attribute. Record the before/after state that the result command is allowed to change. If the operation can have side effects, use a disposable key, session, counter or NV index rather than production material.
- Capture this result and
0x80280046at the first code-specific return boundary. - Decode the result state: NV public attributes, locality, authorization form, lock state, offsets and lengths.
- Run the result controlled comparison once and preserve both binary transcripts.
- Verify the expected this result output or state transition instead of relying on absence of a UI message.
Related TPM and TBS results
| Comparison code | Built-in distinction |
|---|---|
TPM_E_MAXNVWRITES | The maximum number of NV writes without an owner has been exceeded — a separate checkpoint when compared with it. |
TPM_E_BAD_ATTRIBUTES | The NV area attributes conflict — a separate checkpoint when compared with it. |
TPM_E_WRITE_LOCKED | The NV area has already been written to — a separate checkpoint when compared with it. |
It specifically answers whether an NV index requiring full-area writes received a partial offset or length. In contrast, TPM_E_BAD_DATASIZE can report malformed size generally; this code ties the mismatch to full-write policy.
Correction and proof
To remediate it, write the complete area atomically or redefine the application’s disposable index without full-write semantics. Do not undefine a production NV index until its public attributes and authorization policy have been recorded. NV policy is established at definition time, and destructive recreation can remove counters, certificates or provisioning state.
After correcting it, start with a fresh caller context where the protocol requires one, replay the original intended operation, and confirm that hardware-backed policy remains enforced.
Authoritative references
- TCG: TPM 1.2 Main Specification — source for the checkpoint.
- TCG: TPM 1.2 Part 2 — NV structures and permissions — source for the checkpoint.
- TCG: TPM 1.2 Part 3 — NV commands — source for the checkpoint.
- Microsoft: Win32_Tpm class — source for the checkpoint.
Looking for a different code? Search another status or error code.
