Index: fat.c =================================================================== --- fat.c (Revision 131) +++ fat.c (Arbeitskopie) @@ -1566,6 +1566,14 @@ if(raw_entry[i] == ' ') break; long_name[i] = raw_entry[i]; + + /* Windows NT and later versions do not store LFN entries + * for 8.3 names which have a lowercase basename, extension + * or both when everything else is uppercase. They use two + * extra bits to signal a lowercase basename or extension. + */ + if((raw_entry[12] & 0x08) && raw_entry[i] >= 'A' && raw_entry[i] <= 'Z') + long_name[i] += 'a' - 'A'; } if(long_name[0] == 0x05) long_name[0] = (char) FAT_DIRENTRY_DELETED; @@ -1577,14 +1585,17 @@ uint8_t j = 8; for(; j < 11; ++j) { - if(raw_entry[j] != ' ') - { - long_name[i++] = raw_entry[j]; - } - else - { + if(raw_entry[j] == ' ') break; - } + long_name[i] = raw_entry[j]; + + /* See above for the lowercase 8.3 name handling of + * Windows NT and later. + */ + if((raw_entry[12] & 0x10) && raw_entry[j] >= 'A' && raw_entry[j] <= 'Z') + long_name[i] += 'a' - 'A'; + + ++i; } }