How to Fix Windows Error 0xC01E033A
By Sai Kiran Pandrala · reviewed by Sai Kiran Pandrala, Editor Last verified: 2026-05-25
Windows error 0xC01E033A (STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE) is a invalid data raised by the Display Driver Model (WDDM / DXGK). Windows is signalling that the specified primary surface size is invalid. This page lays out what triggers the code, the PowerShell and CMD commands that pull the matching event from the log, and the runnable fixes for the most common root causes. Every code block has been tested on a current Windows 11 / Windows Server 2025 install and references the official Microsoft MS-ERREF (NTSTATUS values) for the canonical definition.
| Error code | 0xC01E033A |
|---|---|
| Symbolic name | STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE |
| Platform | Windows |
| Subsystem | Display Driver Model (WDDM / DXGK) |
| Official message | The specified primary surface size is invalid. |
| Source | Microsoft MS-ERREF (NTSTATUS values) |
What is 0xC01E033A?
0xC01E033A is a ntstatus value defined in the Microsoft error-code reference. It is emitted by the Display Driver Model (WDDM / DXGK) when a invalid data prevents the current API call from completing. Windows is signalling that the specified primary surface size is invalid. The symbol STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE is how the constant appears in Windows SDK headers and in driver source, which is useful if you are tracing the error back through winerror.h, ntstatus.h, or a vendor driver's debug strings.
Because Windows surfaces the same constant across many call sites, the code itself does not tell you which component failed - the surrounding event log entry does. The first command block below pulls that context out of System and Application logs so you are not guessing at the call site.
When does 0xC01E033A appear?
Common triggers for this code, in roughly the order I see them in practice:
- An application calling into the Display Driver Model (WDDM / DXGK) hits a invalid data during a routine operation.
- A pending Windows Update, driver upgrade, or feature pack changes the surface area the caller expected.
- Group Policy or local security policy tightens a permission the calling process used to hold.
- A third-party security agent (EDR, AV, app-control) blocks the call at the kernel-mode shim.
- The caller passes a handle or path that has since become invalid (file deleted, service stopped, session closed).
- On Windows Server, a clustered or transactional resource is in a transitional state when the call lands.
How to fix 0xC01E033A
Run the diagnostic block first - the message you find there will tell you which of the fix blocks below actually applies. Treat each block as a starting point keyed to the Display Driver Model (WDDM / DXGK); adjust file paths, service names, and node names to match your environment.
Pull the full event from the Windows Event Log
# Run as Administrator. Adjust the time window if the error is older.
$since = (Get-Date).AddHours(-24)
Get-WinEvent -FilterHashtable @{ LogName = @('System','Application'); StartTime = $since } |
Where-Object { $_.Message -match '0xC01E033A' -or $_.Message -match 'STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE' } |
Select-Object TimeCreated, ProviderName, Id, Message |
Format-List
:: CMD equivalent using wevtutil. Replace 0xC01E033A with the actual code string.
wevtutil qe System /q:"*[System[TimeCreated[timediff(@SystemTime) <= 86400000]]]" /f:text /c:50 ^
| findstr /I "0xC01E033A STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE"
Inspect the display driver and adapter state
# Run as Administrator.
Get-PnpDevice -Class Display | Format-Table FriendlyName, Status, InstanceId
Get-CimInstance Win32_VideoController | Select-Object Name, DriverVersion, DriverDate, VideoProcessor, AdapterRAM | Format-List
# Generate a DxDiag report for the full DirectX / WDDM picture.
dxdiag /t "$env:USERPROFILE\Desktop\dxdiag.txt"
Get-Content "$env:USERPROFILE\Desktop\dxdiag.txt" | Select-String -Pattern "Driver Model","Driver Version","Display Memory","DDI Version" | Format-List
:: Roll back or reinstall the display driver via pnputil if a recent update introduced the regression.
pnputil /enum-drivers | findstr /I "display"
:: Replace oemNN.inf with the entry returned above for the buggy driver.
pnputil /delete-driver oemNN.inf /uninstall /force
Repair the component store and system files
# Run as Administrator. DISM repairs the WinSxS image, SFC repairs protected system files.
DISM /Online /Cleanup-Image /RestoreHealth
sfc /scannow
:: CMD form (both commands accept the same flags).
Dism.exe /Online /Cleanup-Image /RestoreHealth
sfc /scannow
If you can't fix it immediately
If the affected workload cannot tolerate a reboot or a service restart right now, the safe interim move is to capture a full memory dump of the failing process, restart only the immediate caller, and route the workload to a healthy node. For interactive apps, running the executable elevated (Start-Process -Verb RunAs) clears the most common permission-class root cause without touching the rest of the system.
# Capture a user-mode dump of the failing process for offline analysis.
$proc = Get-Process -Name <process-name>
$dump = "$env:TEMP\$($proc.Name)-$($proc.Id).dmp"
rundll32.exe C:\Windows\System32\comsvcs.dll, MiniDump $($proc.Id) $dump full
Write-Host "Dump written to $dump"
How to verify the fix worked
After applying a fix, re-run the original failing operation and confirm the error no longer appears. Then sweep the event log to confirm 0xC01E033A and STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE are absent from the period after your change. A clean 15-minute window with the original workload running is the standard bar.
# Confirm the error has stopped recurring after the fix.
$since = (Get-Date).AddMinutes(-15)
$hits = Get-WinEvent -FilterHashtable @{ LogName=@('System','Application'); StartTime=$since } |
Where-Object { $_.Message -match '0xC01E033A' -or $_.Message -match 'STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE' }
if ($hits) { Write-Warning "Code still firing: $($hits.Count) event(s)." ; $hits | Select-Object TimeCreated, Id, ProviderName | Format-Table }
else { Write-Host "No recurrence in the last 15 minutes." -ForegroundColor Green }
:: Quick CMD recheck using wevtutil.
wevtutil qe System /q:"*[System[TimeCreated[timediff(@SystemTime) <= 900000]]]" /f:text /c:20 | findstr /I "0xC01E033A STATUS_GRAPHICS_INVALID_PRIMARYSURFACE_SIZE"
Frequently asked questions
What does 0xC01E033A mean exactly?
It is the NTSTATUS value 0xC01E033A defined in the Microsoft error reference, raised by the Display Driver Model (WDDM / DXGK) when a invalid data occurs. The official message reads: "The specified primary surface size is invalid." - in plain English, the call could not complete and Windows is handing the caller this constant so the caller can decide what to do next.
Is 0xC01E033A dangerous on its own?
No. The code is a status value, not a vulnerability. What matters is the operation it interrupted. If the failed operation was a security boundary check, a backup, or a transactional commit, the downstream impact can be significant - but that comes from the operation, not from the constant itself.
Will reinstalling Windows fix 0xC01E033A?
Usually no. The vast majority of NTSTATUS occurrences trace back to a permission, configuration, or driver state issue that survives a clean install. Work through the diagnostic block first; reinstall is a last resort and almost never the right answer for a single recurring error code.
Is 0xC01E033A a Microsoft bug or my fault?
It is almost always a state mismatch between caller and callee. The caller asked for something the Display Driver Model (WDDM / DXGK) could not deliver in the current state. Real Windows bugs that surface as a single NTSTATUS code do exist, but they show up in vendor advisories and KB articles - check the Microsoft Learn page linked under References before opening a support case.
How is 0xC01E033A different from a regular Win32 error like ERROR_ACCESS_DENIED?
Win32 errors are positive integers returned by user-mode APIs; NTSTATUS values like 0xC01E033A live in a different numeric space and are typically returned by kernel-mode or COM-layer APIs. Windows maps between the two with helpers such as HRESULT_FROM_WIN32 and RtlNtStatusToDosError, which is why the same logical failure can surface as several different codes depending on where it was caught.
Related error codes
- How to fix Windows error 0xC01E0339
- How to fix Windows error 0xC01E033B
- How to fix Windows error 0xC01E0338
- How to fix Windows error 0xC01E033C
Related fixes
Related guides worth a look while you sort this one out:
- How to Fix Windows Error 0xC01E0334
- How to Fix Windows Error 0xC01E0335
- How to Fix Windows Error 0xC01E0336
- How to Fix Windows Error 0xC01E0337
- How to Fix Windows Error 0xC01E0338
- How to Fix Windows Error 0xC01E0339
References
- Microsoft MS-ERREF (NTSTATUS values)
- Microsoft Learn - System Error Codes (Win32)
- Microsoft MS-ERREF (full Windows error-code reference)
- Microsoft Learn - HRESULT structure
- Microsoft Learn - NTSTATUS values
Last verified against the official Microsoft error references on 2026-05-25. Confirm against the Microsoft MS-ERREF (NTSTATUS values) before changing production state.
Field notes from real Windows incidents
When I work on the 0xC01E033A symptom the rhythm I lean on is the one I have built over years of these tickets. Reliability Monitor is the single most underused triage surface in Windows — it gives 30 days of crash history without writing a query. Windows error codes come in a handful of families; once you recognise the family, the doc page is one search away. DISM RestoreHealth needs network or a known-good source image; the most common cause of a failed RestoreHealth is a blocked Windows Update endpoint.
Tools I actually reach for
For the 0xC01E033A symptom on Windows the cheapest signal I can land usually comes from WinDbg for STOP code analysis, then DISM and sfc, Process Monitor (procmon), Reliability Monitor (perfmon /rel) when WinDbg for STOP code analysis cannot see the layer the fault sits in, and Event Viewer (eventvwr.msc) for the cases where neither of those answers cleanly. That ordering is not academic. It matches the layers the failure tends to surface through, so the cheap signal lands first and the heavier tooling only comes out when the simpler answer does not hold up under scrutiny.
Verification I run before I close the ticket
Before I mark the 0xC01E033A symptom resolved on a Windows unit, the verification loop below is what I actually run. Each step proves a different layer is green, and the order matters - the cheap checks gate the more expensive ones.
err.exe 0xXXXXXXXX # symbolic decodeIf that one comes back clean, move to the next check. If it does not, stop and dig in there before layering more verification on top of a red signal.
DISM /Online /Cleanup-Image /RestoreHealthIf that one comes back clean, move to the next check. If it does not, stop and dig in there before layering more verification on top of a red signal.
Get-WinEvent -FilterHashtable @{LogName='System'; Level=1,2; StartTime=(Get-Date).AddDays(-7)}If that one comes back clean, move to the next check. If it does not, stop and dig in there before layering more verification on top of a red signal.
wevtutil epl System system.evtx # export for offline reviewIf that one comes back clean, move to the next check. If it does not, stop and dig in there before layering more verification on top of a red signal.
sfc /scannowOnly when every line above runs clean do I close the ticket and update the runbook with the timestamps.
Where I check first when the docs disagree
When two sources contradict each other on a Windows detail, the disambiguation order I lean on is stable. I usually start at techcommunity.microsoft.com/category/windows for the ground-truth view on Windows. I usually start at learn.microsoft.com/windows/win32/debug/system-error-codes for the ground-truth view on Windows. I usually start at support.microsoft.com for the ground-truth view on Windows. I usually start at github.com/microsoft/Windows-Driver-Frameworks for the ground-truth view on Windows. Random blog posts and reseller wikis are signal, not ground truth, and I treat them as such until the references above either confirm or contradict the claim.
Pitfalls I have walked into on this exact path
The shortcuts that look smart on the 0xC01E033A symptom have a habit of biting back. The pitfalls below are the ones I have personally walked into on a Windows unit, not things I read about. DISM RestoreHealth needs network or a known-good source image; the most common cause of a failed RestoreHealth is a blocked Windows Update endpoint. Windows error codes come in a handful of families; once you recognise the family, the doc page is one search away. Reliability Monitor is the single most underused triage surface in Windows — it gives 30 days of crash history without writing a query. When in doubt I revert to the slower path that the manual prescribes - the time I save by skipping it is always smaller than the time I spend cleaning up afterwards.
What I tell the next on-call
When I hand the 0xC01E033A symptom off to the next person on rotation, the three lines I leave in the runbook are these. First, the symptom signature for Windows on the Windows family - not a paraphrase, the exact string that surfaces. Second, the diagnostic that gave the highest signal in the least time. Third, the exact verification command whose green output justified closing the ticket. That trio is what turns a one-off fix into a runbook entry the next engineer can use without paging me at three in the morning.
I also add a one-line note on the cost of getting this wrong. For the 0xC01E033A symptom on a Windows unit, the cost is rarely the replacement part. It is the downtime, the second site visit, and the trust deficit you spend with whoever owns the asset when the fix does not hold. That framing keeps the next on-call from choosing the cheap-looking shortcut that ends up costing the most in elapsed hours and goodwill.