After upgrading my work PC to the latest version of Windows 10, Internet Information Service (IIS) no longer worked.

Specifically, the only Application Pool that could start was DefaultAppPool. All other worker processes failed to start.

The only clue was this error message, logged to the Windows Application log in Event Viewer:

The worker process for application pool 'MyCustomAppPool' encountered an error 'Cannot read configuration file
' trying to read configuration data from file '\?<EMPTY>', line number '0'. The data field contains the error code.

The actual error log data was:

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event">
  <System>
    <Provider Name="Microsoft-Windows-IIS-W3SVC-WP" Guid="{670080D9-742A-4187-8D16-41143D1290BD}" EventSourceName="W3SVC-WP" />
    <EventID Qualifiers="49152">2307</EventID>
    <Version>0</Version>
    <Level>2</Level>
    <Task>0</Task>
    <Opcode>0</Opcode>
    <Keywords>0x80000000000000</Keywords>
    <TimeCreated SystemTime="2017-10-24T05:51:59.413380200Z" />
    <EventRecordID>131062</EventRecordID>
    <Correlation />
    <Execution ProcessID="0" ThreadID="0" />
    <Channel>Application</Channel>
    <Computer>MyWorkPC</Computer>
    <Security />
  </System>
  <EventData>
    <Data Name="ApplicationPool">MyCustomAppPool</Data>
    <Data Name="ConfigException">Cannot read configuration file</Data>
    <Data Name="FileName">\\?\<EMPTY></Data>
    <Data Name="LineNumber">0</Data>
    <Binary>02000000</Binary>
  </EventData>
</Event>

To get to the bottom of this, I basically banged my head against the keyboard for a bit and poked around the IIS internals. I had no idea what I was doing, but just stumbled across it.

The long and short of it is that each application pool has it's own profile data in C:\inetpub\temp\appPools.

For some reason, the Windows upgrade process had replaced some of these folders with symbolic links to themselves, so that the 'MyCustomAppPool' folder pointed to 'MyCustomAppPool', which was itself the symbolic link... I didn't even know that was possible.

By deleting the symbolic links, IIS automatically recreated them, and starting working properly again.

I still have no idea why it happened or why that fixed it, but ¯\_(ツ)_/¯.