You hit print, the job sits in the queue, and then a dialog pops up with 0x8009301F next to OSS_REAL_DLL_NOT_LINKED. Nine times out of ten this shows up right after a Windows cumulative update, or right after you swapped a Brother, HP, or Ricoh printer for a slightly different model without removing the old driver first. The OSS ASN component is the scanner/print helper that Brother and a few other vendors bundle, and it's the piece that's complaining — not Windows itself.
What's actually happening here
"OSS" in this context means the vendor's own driver stack, not open-source software. ASN is the add-on service layer the vendor ships to handle network discovery, scan-to-folder, and some status reporting. That layer is made of several DLLs, and one of them has a hard link to another DLL that should be sitting next to it in the same folder.
When Windows loads the driver, it walks the import table of the OSS module and looks for each linked DLL by name in a specific order: the app folder, then System32, then the PATH. If the DLL it wants is a different version than what the module was compiled against — or it's simply missing — the loader refuses to link and returns STATUS_DLL_NOT_FOUND wrapped as 0x8009301F.
The reason this usually follows a Windows update is that the update replaces a shared runtime (often a VC++ redistributable or a .NET assembly) that the OSS DLL was linked against. The old DLL name is still there, but the export signature changed, so the loader marks it as "not linked" instead of "not found." Same symptom, slightly different cause, same fix path.
The tell that you're dealing with a version mismatch rather than a truly missing file: Device Manager shows the printer fine, but the OSS utility tray icon has a yellow bang, or the scan button does nothing while printing still works.
The fix, in order
Don't start by running SFC or DISM. Those almost never help here because the missing link is in the vendor's folder, not in Windows. Do these steps in order and stop as soon as printing works.
- Remove the OSS software and the driver, not just the printer. Open Settings → Apps → Installed apps and uninstall anything from the vendor: "Brother Utilities," "HP Smart," "OSS ASN," "Scanner and Printer software" — all of it. Then in Printers & scanners, select the printer and choose Remove device. A printer entry left behind is what keeps loading the broken DLL on next boot.
- Wipe the leftover driver package. This is the step most people skip, and it's the one that makes the fix stick. Open an elevated Command Prompt and run:
That launches the Print Server Properties driver tab. Select any driver from the vendor and click Remove → Remove driver and driver package. If Windows complains that a driver is in use, stop the spooler first:printui.exe /s /t2
Then try again. Reboot when it's clean.net stop spooler net start spooler - Delete the vendor folders that survive uninstall. Vendors are notorious for leaving DLL graveyards behind. Remove these if they exist:
If a folder won't delete, something is still holding a handle. Reboot and try again before forcing it.C:\Program Files (x86)\Brother C:\Program Files\Brother C:\Program Files (x86)\HP C:\Program Files\HP C:\ProgramData\Brother C:\ProgramData\HP - Clear the spool folder. Pending stuck jobs can re-trigger the same load attempt with the old cached driver. Delete everything inside
C:\Windows\System32\spool\PRINTERSwhile the spooler is stopped, then start the spooler back up. - Reinstall using the full vendor package, not Windows Update's driver. Go to the vendor's support site, download the full feature installer for your exact model (e.g. MFC-L3770CDW or OfficeJet Pro 9015), and run it as administrator. Windows Update's "Add printer" path installs a generic class driver that doesn't include the OSS ASN layer at all — you'll get basic printing but scanning and the status monitor will keep failing with 0x8009301F.
- Install the VC++ redistributable the installer asks for. If the vendor installer slipped past the runtime check, grab the latest Microsoft Visual C++ Redistributable (both x86 and x64) from Microsoft's site and install before rebooting. The OSS DLLs link against these at load time.
If it still fails after all that
Check two things. First, open Event Viewer → Windows Logs → Application and look for a SideBySide entry around the same timestamp as the failure. A SideBySide error with a public key token in it means the DLL is present but the manifest is wrong — you'll need the exact VC++ runtime version the vendor compiled against, which is usually listed in the vendor's release notes.
Second, check whether some other software is shadowing the DLL. Antivirus suites with DLL injection (older McAfee, some Kaspersky builds) and RDP wrapper tools can hijack the load order. Temporarily disable the AV's printer protection module and retry — if it works, whitelist the vendor folder.
If the error only appears on one PC in a fleet, compare the DLL version in the vendor folder against a working machine. Nine times out of ten you'll find the broken machine has an older copy left over from a partial upgrade. Copying DLLs by hand is tempting but breaks signing — reinstall instead.