Las otras respuestas a esta pregunta son erróneas porque confunden las limitaciones de un subsistema de programación (Win32) con lo que permite el sistema operativo.
Añadir una complicación a esto es que los sistemas de archivos específicos pueden imponer restricciones adicionales. Sin embargo, NTFS sí que permite el uso de ? como carácter de nombre de archivo. Esto se debe a que NTFS siempre ha soportado la nomenclatura compatible con POSIX y ? se considera un carácter válido bajo POSIX.
FAT es más restrictivo y se puede ver la lista definitiva de caracteres que FAT no permite (rutina FsRtlIsFatDbcsLegal). No es razonable confundir las restricciones de FAT con las restricciones más amplias del sistema operativo – después de todo, Linux soporta FAT y no argumentaríamos que Linux está restringido basándonos simplemente en un sistema de archivos.
Si quieres usar ? para nombrar un archivo en Windows, puedes hacerlo a través de las APIs de Win32 (función CreateFile) utilizando la opción FILE_FLAG_POSIX_SEMANTICS – documentada en la misma página que he referenciado anteriormente.
La otra forma (y la forma en que yo suelo hacer esto) es utilizar la llamada a la API nativa. Función NtCreateFile. Si también quieres tener sensibilidad a las mayúsculas y minúsculas, no pongas el bit OBJ_CASE_INSENSITIVE cuando llames a la macro InitializeObjectAttributes para configurar la estructura de atributos del objeto.
Hay un truco molesto con respecto a esta llamada – hay un parámetro global del sistema que anula la sensibilidad a las mayúsculas y minúsculas y pone por defecto la insensibilidad a las mismas. Hay un buen artículo aquí sobre cómo cambiar ese comportamiento.
También se puede habilitar dentro del núcleo a través de un controlador de filtro del sistema de archivos. No estoy seguro de cuál de estos enfoques está siendo utilizado por WSL. En este momento, la forma más fácil de crear un archivo desde una línea de comandos para demostrar que se pueden crear archivos con el Bash es simplemente iniciar bash y crear uno. Luego puedes ir a buscarlo en el subdirectorio AppDatalocallxss bajo tu directorio de inicio (ahí es donde WSL almacena sus cosas).
Si quieres ver cómo FAT maneja las cosas, el código está aquí. El código de NTFS no está disponible públicamente, pero no tiene la herencia de DOS para soportar y el cumplimiento de POSIX fue un requisito del primer día para él.