You'll see STATUS_PORT_ALREADY_HAS_COMPLETION_LIST (0xC000071A) most often when a custom application or driver calls CreateIoCompletionPort on a port that's already got a completion list attached. I've seen it pop up in server apps that try to reuse the same port handle for multiple thread pools, or in legacy drivers that don't check if the port is already bound. The trigger is almost always a race condition — two threads or processes both think they're the first to set up the completion list on the same port object.
Root Cause
The I/O completion port kernel object keeps track of a single completion list per port. That list is the queue that holds completed I/O packets. Windows doesn't let you swap out or add a second list once one's active. The API CreateIoCompletionPort returns STATUS_PORT_ALREADY_HAS_COMPLETION_LIST if you pass in a port handle that's already been configured with a completion list.
The real fix is to stop the race. Either make sure only one thread ever initializes the port, or create a fresh port for each set of completions. Don't try to reuse the same port for different completion strategies — that's what causes this.
Step-by-Step Fix
- Identify the source. Open Event Viewer (press Win + R, type
eventvwr.msc). Look under Windows Logs > Application and System for any events with sourceApplication Erroror0xC000071A. Note the app or driver name. - Check if the app or driver is running multiple instances. Open Task Manager (Ctrl + Shift + Esc) and look for duplicates of the failing process. If you see more than one, kill all of them, then restart just one instance.
- Update the software. Go to the vendor's website and download the latest version. Many developers fixed this by adding proper port allocation logic. For Windows drivers, check Windows Update for optional driver updates.
- If you wrote the code, fix the race. In your app, wrap the
CreateIoCompletionPortcall in a critical section or mutex. Example in C++:HANDLE hPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 1); if (hPort == NULL) { // Handle error } // Then use the same handle for all threads — never call CreateIoCompletionPort again on it.Or better: create a new port for each pool of threads. Don't share ports across unrelated completion lists.
- Restart the service or app. After the fix, stop and restart the app. If it's a driver, disable and re-enable the device in Device Manager, then reboot.
What to Check If It Still Fails
If you're still stuck after the steps above:
- Check for third-party antivirus or sandbox software. Some security tools hook
CreateIoCompletionPortand can mess up the port state. Temporarily disable them to test. - Run a system file check. Open Command Prompt as admin and run
sfc /scannow. This fixes corrupt OS files that might affect kernel-level port handling. - Update the kernel-mode driver. If the error comes from a driver, use
verifier.exeto enable Driver Verifier for that specific driver — it will catch improper port handling. Be careful: Driver Verifier can blue-screen your system if the driver is really broken. - Use Process Monitor. Download it from Microsoft Sysinternals. Filter on
CreateIoCompletionPortand watch which process calls it twice on the same port handle. That's your culprit.
The bottom line: this error means something already claimed the completion list. You can't have two. Find what's racing, and fix the allocation logic.