尝试解决拷贝覆盖的问题。
1. 让根目录区可写
const uint8_t mscRootDir[ROOT_SIZE * FAT_SECTOR_SIZE]
在写里面添加写跟目录区
else if(gScsiInfo.offset >= (FAT_RESERVE_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE)
{//Root Area
uint32_t i;
offset = gScsiInfo.offset - (FAT_RESERVE_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE;
for(i = 0; i < count; i++)
mscRootDir[offset + i] = gMscBotData.dat[i];
}
无效
2. 让FAT表可写
直接拷贝无效,删掉旧文件后再拷贝是可以的。删除文件可以看到系统有写入的地址:
Write: 0x1600
Write: 0x1640
Write: 0x1680
Write: 0x16c0
Write: 0x1700
Write: 0x1740
Write: 0x1780
Write: 0x17c0
Write: 0x1200
Write: 0x1240
Write: 0x1280
Write: 0x12c0
Write: 0x1300
Write: 0x1340
Write: 0x1380
Write: 0x13c0
Write: 0x1400
Write: 0x1440
Write: 0x1480
Write: 0x14c0
Write: 0x1500
Write: 0x1540
Write: 0x1580
Write: 0x15c0
其中0x1600-0x17FF是根目录区,似乎只改了0x16A0这个地址(从0x54改为0xE5).
0x1200-0x15FF是FAT1和FAT2,将TEXT.txt的簇链去掉了。
再写入2KB的TEXT.txt文件,可以发现更新的地址范围多了0x1800-0x1FFF, 根目录区和FAT的内容如下
3. 将电脑硬盘中的文件改为1KB字节,删除U盘中的2KB文件,拷贝1KB文件进U盘,根目录和FAT内的文件长度都变为一半。
修改硬盘中文件的内容,覆盖U盘中的文件,这时是可以覆盖写入的。可以看到系统更新了一遍0x1600-0x17FF根目录区和0x1200-0x15FF FAT表区,然后又更新了一遍0x1600-0x17FF根目录区和0x1200-0x15FF FAT表区,接着再次更新了2遍0x1600-0x17FF根目录区,最后更新了0x1800-0x1BFF文件内容区。
看起来系统并不需要更多的空间覆盖,奇怪为什么U盘满的情况就不行。
3. 改为内部Flash做U盘,看系统格式化后是否可以覆盖。内部Flash的方式U盘的容量为9KB,所以需要一个9KB大小的文件。测试结果相同。Windows这个规格好奇怪,居然不让覆盖,bug?
4. 将文件大小改2倍大小试试是否可以骗过系统。
#define MSC_MEMORY_SIZE ((FAT_RESERVE_SIZE/*DBR*/ + FAT_SIZE * 2/*FAT*/ + ROOT_SIZE/*Root*/) * FAT_SECTOR_SIZE + FILE_SIZE * 2)
写文件那里就不再对后面假的2KB空间写入
if(gScsiInfo.offset >= (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE)
{//RAM Area
if(gScsiInfo.offset < (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE + FILE_SIZE)
{
uint32_t i;
offset = gScsiInfo.offset - (FAT_RESERVE_SIZE + ROOT_SIZE + FAT_SIZE * 2) * FAT_SECTOR_SIZE;
for(i = 0; i < count; i++)
gUDiskRam[offset + i] = gMscBotData.dat[i];
}
}
测试发现是可行的。
5. 试试是否可以拷贝小于2KB字节任意大小的TEXT.txt文件,也是可行的。
6. 试试拷贝4KB字节大小的文件,可以正常拷贝。
注意事项:
1. 根目录项中的8+3文件名必须采用大写的方式,否则会提示找不到文件。