FindFirstFile only returns the file or subdirectory name. To get recursion to work you need to pass the current full path to your recursive calls.
Also, the current directory (.) and parent directory (..) are both returned by FindFirstFile / FindNextFile, to you need to add logic so these are skipped.
Finally, I don't see any balancing calls to FindClose?
I would rework your function so it calls FindFirstFile then, if successful, FindNextFile (in a loop) and finally FindClose. Without recursion to start with
Once that works, add the recursion.
Andy
P.S. You don't need a separate call to GetFileAttributes; use the dwFileAttributes member of the find data struct.
It's not a special case; it's the way DOS was and Windows is. The DOS FAT file system stores the file name and extension independently. The . is not itself stored.
When long file name support was added, this behaviour was maintained.
If I understand correctly, Linux does not understand what a file extension is. A file name with a dot in is just a file name with a dot in.
As Windows works out what to do with a file based on its extension, though its (naff or otherwise) file association mechanism, the extension is treated specially (not just as a bit of a file name).