Le altre risposte a questa domanda sono sbagliate perché confondono le limitazioni di un sottosistema di programmazione (Win32) con ciò che il sistema operativo permette.
La complicazione aggiuntiva a questo è che specifici file system possono imporre ulteriori restrizioni. Tuttavia, NTFS permette l'uso di ? come carattere del nome del file. Questo perché NTFS ha sempre supportato la denominazione compatibile con POSIX e ? è considerato un carattere valido sotto POSIX.
FAT è più restrittivo e si può vedere la lista definitiva dei caratteri che FAT non permette (routine FsRtlIsFatDbcsLegal). Non è ragionevole confondere le restrizioni della FAT con restrizioni più ampie del sistema operativo - dopo tutto, Linux supporta la FAT e non si può sostenere che Linux sia limitato semplicemente da un file system.
Se volete usare ? per nominare un file su Windows, potete farlo tramite le API Win32 (funzione CreateFile) usando l'opzione FILE_FLAG_POSIX_SEMANTICS - documentata nella stessa pagina a cui ho fatto riferimento in precedenza.
L'altro modo (e quello che faccio di solito) è usare la chiamata API nativa. NtCreateFile. Se volete anche avere la sensibilità alle maiuscole e alle minuscole, non impostate il bit OBJ_CASE_INSENSITIVE quando chiamate la macro InitializeObjectAttributes per impostare la struttura degli attributi dell'oggetto.
C'è un fastidioso trucco riguardo a questa chiamata - c'è un parametro globale di sistema che sovrascrive la sensibilità alle maiuscole e fa da default all'insensibilità alle maiuscole. C'è un buon articolo qui su come cambiare questo comportamento.
Può anche essere abilitato all'interno del kernel tramite un driver di filtro del file system. Non sono sicuro di quale di questi approcci sia usato da WSL. In questo momento, il modo più semplice per creare un file da una linea di comando per dimostrare che è possibile creare file con il ? è semplicemente avviare bash e crearne uno. Poi puoi andare a cercarlo nella sottodirectory AppDatalocallxss sotto la tua home directory (che è dove WSL memorizza la sua roba).
Se vuoi vedere come FAT gestisce le cose, il codice è qui. Il codice di NTFS non è disponibile pubblicamente, ma non ha l'eredità DOS da supportare e la conformità a POSIX era un requisito del primo giorno.