1
0
Fork 0

some fixes to the fat drive handling (thanks to h-a-l9000)

Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@2665
This commit is contained in:
Sebastian Strohhäcker 2006-06-30 12:47:07 +00:00
parent 7cac8ec376
commit 43d7055361
2 changed files with 18 additions and 6 deletions

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: dos_inc.h,v 1.60 2006-04-21 08:50:30 qbix79 Exp $ */
/* $Id: dos_inc.h,v 1.61 2006-06-30 12:47:06 c2woody Exp $ */
#ifndef DOSBOX_DOS_INC_H
#define DOSBOX_DOS_INC_H
@ -439,8 +439,10 @@ public:
void GetSearchParams(Bit8u & _sattr,char * _spattern);
void GetResult(char * _name,Bit32u & _size,Bit16u & _date,Bit16u & _time,Bit8u & _attr);
void SetDirID(Bit16u entry) { sSave(sDTA,dirID,entry); };
void SetDirID(Bit16u entry) { sSave(sDTA,dirID,entry); };
void SetDirIDCluster(Bit16u entry) { sSave(sDTA,dirCluster,entry); };
Bit16u GetDirID(void) { return sGet(sDTA,dirID); };
Bit16u GetDirIDCluster(void) { return sGet(sDTA,dirCluster); };
private:
#ifdef _MSC_VER
#pragma pack(1)
@ -451,7 +453,8 @@ private:
Bit8u sext[3]; /* The Search pattern for the extenstion */
Bit8u sattr; /* The Attributes that need to be found */
Bit16u dirID; /* custom: dir-search ID for multiple searches at the same time */
Bit8u fill[6];
Bit16u dirCluster; /* custom (drive_fat only): cluster number for multiple searches at the same time */
Bit8u fill[4];
Bit8u attr;
Bit16u time;
Bit16u date;

View file

@ -16,7 +16,7 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
/* $Id: drive_fat.cpp,v 1.16 2006-06-22 13:15:07 qbix79 Exp $ */
/* $Id: drive_fat.cpp,v 1.17 2006-06-30 12:47:07 c2woody Exp $ */
#include <stdio.h>
#include <stdlib.h>
@ -186,6 +186,7 @@ bool fatFile::Write(Bit8u * data, Bit16u *size) {
--sizedec;
sizecount++;
}
if(curSectOff>0 && loadedSector) myDrive->loadedDisk->Write_AbsoluteSector(currentSector, sectorBuffer);
finalizeWrite:
myDrive->directoryBrowse(dirCluster, &tmpentry, dirIndex);
@ -610,6 +611,9 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector,
loadedDisk->Set_Geometry(headscyl, cylinders,cylsector, bytesector);
loadedDisk->Read_Sector(0,0,1,&mbrData);
if(mbrData.magic1!= 0x55 || mbrData.magic2!= 0xaa) LOG_MSG("Possibly invalid partition table in disk image.");
startSector = 63;
int m;
for(m=0;m<4;m++) {
@ -621,6 +625,8 @@ fatDrive::fatDrive(const char *sysFilename, Bit32u bytesector, Bit32u cylsector,
}
}
if(m==4) LOG_MSG("No good partiton found in image.");
partSectOff = startSector;
} else {
/* Floppy disks don't have partitions */
@ -808,6 +814,7 @@ bool fatDrive::FindFirst(char *_dir, DOS_DTA &dta,bool fcb_findfirst) {
return false;
}
dta.SetDirID(0);
dta.SetDirIDCluster((Bit16u)(cwdDirCluster&0xffff));
return FindNextInternal(cwdDirCluster, dta, &dummyClust);
}
@ -879,7 +886,7 @@ nextfile:
memcpy(extension,&sectbuf[entryoffset].entryname[8],3);
trimString(&find_name[0]);
trimString(&extension[0]);
if(!(sectbuf[entryoffset].attrib & DOS_ATTR_DIRECTORY)) {
if(!(sectbuf[entryoffset].attrib & DOS_ATTR_DIRECTORY) || extension[0]!=0) {
strcat(find_name, ".");
strcat(find_name, extension);
}
@ -900,7 +907,7 @@ nextfile:
bool fatDrive::FindNext(DOS_DTA &dta) {
direntry dummyClust;
return FindNextInternal(cwdDirCluster, dta, &dummyClust);
return FindNextInternal(dta.GetDirIDCluster(), dta, &dummyClust);
}
bool fatDrive::GetFileAttr(char *name, Bit16u *attr) {
@ -919,6 +926,7 @@ bool fatDrive::GetFileAttr(char *name, Bit16u *attr) {
/* Find directory entry in parent directory */
Bit32s fileidx = 2;
if (dirClust==0) fileidx = 0; // root directory
while(directoryBrowse(dirClust, &fileEntry, fileidx)) {
if(memcmp(&fileEntry.entryname, &pathName[0], 11) == 0) {
*attr=fileEntry.attrib;
@ -1143,6 +1151,7 @@ bool fatDrive::RemoveDir(char *dir) {
Bit32u filecount = 0;
/* Set to 2 to skip first 2 entries, [.] and [..] */
Bit32s fileidx = 2;
if (dirClust==0) fileidx = 0; // root directory
while(directoryBrowse(dummyClust, &tmpentry, fileidx)) {
/* Check for non-deleted files */
if(tmpentry.entryname[0] != 0xe5) filecount++;