📄 hpi32.c
字号:
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
{bstop=1;break;}
else if(DBUF[i]==0xE5)
continue;
else
{
item=item+1;
/////////////////////////////////
if(DBUF[i+11]==0x0F)
{
base=((DBUF[i]&0x1F)-1)*26;
if(base<=224)
{
Ncount=0;
for(k=1;k<11;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=14;k<26;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
for(k=28;k<32;k++)
{
ShowFileName[Lcount].LongName[base+Ncount]=DBUF[i+k];
Ncount++;
}
}
}
else
{
for(k=0;k<32;k++)
ShowFileName[Lcount].item[k]=DBUF[i+k];
Lcount++;
}
/////////////////////////////////
}
}
if(bstop==1)break;
}
if(bstop==1)break;
NowCluster32=GetNextClusterNum32(NowCluster32);
}while(NowCluster32<=DeviceInfo.TotCluster);
return TRUE;
}
unsigned char RemoveFile32(char *str)
{
unsigned int sector,i;
unsigned char bStop,j;
unsigned char pBuffer[11];
unsigned char ch;
char k;
unsigned char len=0;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
if (*str == '.')
return FALSE;
i=0;
while (str[i] !=0)
{
ch = str[i];
if(ch == '\\' || ch == '/' || ch == ':' || ch == '*' || ch == '?'
|| ch == '"' || ch == '<' || ch == '>' || ch == '|') return FALSE;
if (islower(ch)) str[i] = toupper(ch);
i++;
}
for (i=0;i<11;i++)
pBuffer[i] = 0x20;
len = 0;
i=0;
while(str[i]!='.')
{
len++;
i++;
}
if (len<8)
{
i = 0;
while(str[i]!='.')
{
pBuffer[i] = str[i];
i++;
}
pBuffer[8] = str[i+1];
pBuffer[9] = str[i+2];
pBuffer[10] = str[i+3];
}
else
{
for (i=0;i<6;i++)
pBuffer[i] = str[i];
pBuffer[6] = '~';
pBuffer[7] = '1';
i=0;
while(str[i]!='.')
i++;
pBuffer[8] = str[i+1];
pBuffer[9] = str[i+2];
pBuffer[10] = str[i+3];
}
////////////// 清除目录/////////////////////////////////////
NowCluster32=DirStartCluster32;
do
{
NowSector=FirstSectorofCluster32(NowCluster32);
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return FALSE;
j=0;
while(DBUF[i+j]==*(pBuffer+j))
{
j=j+1;
if(j>10)
break;
}
if(j>10)
{
DBUF[i]=0xE5;
ThisFile.StartCluster=LSwapINT32(DBUF[i+26],DBUF[i+27],DBUF[i+20],DBUF[i+21]);
for(k=(i-32);k>=0;k=k-32)
{
if(DBUF[k+11]==0x0F)
DBUF[k]=0xE5;
else
break;
}
DelayMs(15);
if(!RBC_Write(NowSector+sector,1,DBUF))
return FALSE;
//////////////////// 清除FAT中的纪录////////////////////////
DelayMs(10);
if(!DeleteClusterLink32(ThisFile.StartCluster))
return FALSE;
bStop=1;
break;
}
}
if(bStop==1)break;
}
if(bStop==1)break;
NowCluster32=GetNextClusterNum32(NowCluster32);
}while(NowCluster32<=DeviceInfo.TotCluster);
if(NowCluster32>DeviceInfo.TotCluster)
return FALSE;
return TRUE;
}
unsigned char CreateDir32(char *str)
{
unsigned int sector,i,j,DirCount;
unsigned long cnum;
unsigned char bstop,InByte,bwrite;
unsigned long ClusterPointer;
unsigned char pBuffer[32]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
unsigned char ch;
unsigned char len=0;
unsigned char *pName;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
if (*str == '.')
return FALSE;
i=0;
while (str[i] !=0)
{
ch = str[i];
if(ch == '\\' || ch == '/' || ch == ':' || ch == '*' || ch == '?'
|| ch == '"' || ch == '<' || ch == '>' || ch == '|') return FALSE;
if (islower(ch)) str[i] = toupper(ch);
i++;
}
for (i=0;i<11;i++)
pBuffer[i] = 0x20;
len = 0;
i=0;
while(str[i]!='.')
{
len++;
i++;
}
if (len<8)
{
i = 0;
while(str[i]!='.')
{
pBuffer[i] = str[i];
i++;
}
// pBuffer[8] = str[i+1];
// pBuffer[9] = str[i+2];
// pBuffer[10] = str[i+3];
len = 0;
}
else
{
for (i=0;i<6;i++)
pBuffer[i] = str[i];
pBuffer[6] = '~';
pBuffer[7] = '1';
i=0;
// while(str[i]!='.')
// i++;
// pBuffer[8] = str[i+1];
// pBuffer[9] = str[i+2];
// pBuffer[10] = str[i+3];
len = 0;
}
ThisFile.bFileOpen=0;
ThisFile.FatSectorPointer=0;
cnum=GetFreeCusterNum32();
if(cnum<0x02)
return FALSE;
pBuffer[11]= 0x10;
pBuffer[21]= cnum>>24;
pBuffer[20]= cnum>>16;
pBuffer[27]= cnum>>8;
pBuffer[26]= cnum;
pBuffer[28]=0;
pBuffer[29]=0;
pBuffer[30]=0;
pBuffer[31]=0;
bstop=0;
NowCluster32=DirStartCluster32;
do
{
NowSector=FirstSectorofCluster32(NowCluster32);
ClusterPointer=NowCluster32;
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
DirCount=0;bwrite=0;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(len==0)
{
if((DBUF[i]==0x00)||(DBUF[i]==0xE5))
{
for(j=0;j<32;j++)
DBUF[i+j]=*(pBuffer+j);
if(!RBC_Write(NowSector+sector,1,DBUF))
return FALSE;
bstop=1;
break;
}
}
else
{
if(DirCount==0)
InByte=i;
if(DBUF[i]==0xE5)
DirCount++;
else if(DBUF[i]==0x00)
{
DirCount++;
DBUF[i]=0xE5;
bwrite=1;
}
else
DirCount=0;
if((DirCount*32)>=(len+32))
{
for(j=0;j<len;j++)
DBUF[InByte+j]=*(pName+j);
for(j=0;j<32;j++)
DBUF[InByte+len+j]=*(pBuffer+j);
if(!RBC_Write(NowSector+sector,1,DBUF))
return FALSE;
bstop=1;
break;
}
}
}
if(bstop==1)break;
if((len!=0)&&(bwrite==1))
{
if(!RBC_Write(NowSector+sector,1,DBUF))
return FALSE;
}
}
if(bstop==1)break;
NowCluster32=GetNextClusterNum32(NowCluster32);
if(NowCluster32>DeviceInfo.TotCluster)
{
NowCluster32=CreateClusterLink32(ClusterPointer);
if(NowCluster32==0x00)
return FALSE;
NowSector=FirstSectorofCluster32(NowCluster32);
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i++) DBUF[i]=0x00;
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Write(NowSector+sector,1,DBUF))
return FALSE;
}
}
}while(NowCluster32<=DeviceInfo.TotCluster);
if(NowCluster32>DeviceInfo.TotCluster)
return FALSE;
////////////////////////////////////////////////////////////////
for(i=64;i<DeviceInfo.BPB_BytesPerSec;i++) DBUF[i]=0x00;
for(i=0;i<43;i++) DBUF[i]=0x20;
DBUF[0]=0x2e;
for(i=11;i<32;i++) DBUF[i]=pBuffer[i];
DBUF[32]=0x2e;DBUF[33]=0x2e;
for(i=43;i<64;i++) DBUF[i]=pBuffer[i-32];
if(DirStartCluster32==DeviceInfo.RootStartCluster) //Root Dir
{
DBUF[53]=0;DBUF[52]=0;DBUF[59]=0;DBUF[58]=0;
}
else
{
DBUF[53]=(unsigned char)(DirStartCluster32>>24);
DBUF[52]=(unsigned char)(DirStartCluster32>>16);
DBUF[59]=(unsigned char)(DirStartCluster32>>8);
DBUF[58]=(unsigned char)(DirStartCluster32);
}
NowSector=FirstSectorofCluster32(cnum);
if(!RBC_Write(NowSector,1,DBUF))
return FALSE;
DirStartCluster32=cnum;
ThisFile.ClusterPointer=0;
return TRUE;
}
unsigned char UpRootDir32()
{
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
ThisFile.bFileOpen=0;
DirStartCluster32=DeviceInfo.RootStartCluster; //Root Dir
return TRUE;
}
unsigned long GetCapacity32(void)
{
unsigned int sectorNum,i;
unsigned long FreeSize,Freesectorcnt;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
////////////////////////////////////////////////////////////////////////
sectorNum=DeviceInfo.FatStartSector;
Freesectorcnt=0;
while(sectorNum<DeviceInfo.BPB_FATSz32+DeviceInfo.FatStartSector)
{
if(RBC_Read(sectorNum,1,DBUF))
{
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+4)
{
if((DBUF[i]||DBUF[i+1]||DBUF[i+2]||DBUF[i+3])==0x00)
{
Freesectorcnt++;
}
}
}
else
return FALSE;
sectorNum++;
}
////////////////////////////////////////////////////////////////////////
FreeSize=DeviceInfo.BPB_BytesPerSec*DeviceInfo.BPB_SecPerClus;
FreeSize=Freesectorcnt*FreeSize;
return FreeSize;
}
unsigned char UpDir32()
{
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
if(DirStartCluster32==DeviceInfo.RootStartCluster) //Root Dir
return TRUE;
ThisFile.bFileOpen=0;
NowSector=FirstSectorofCluster32(DirStartCluster32);
if(!RBC_Read(NowSector,1,DBUF))
return FALSE;
if(DBUF[32]!=0x2e&&DBUF[33]!=0x2e) //..
return FALSE;
DirStartCluster32=LSwapINT32(DBUF[58],DBUF[59],DBUF[52],DBUF[53]);
if(DirStartCluster32==0) //Root Dir
DirStartCluster32=DeviceInfo.RootStartCluster;
ThisFile.ClusterPointer=0;
return TRUE;
}
unsigned char DownDir32(char *str)
{
unsigned int i,len;
unsigned char j,bstop,sector;
char pBuffer[11];
char ch;
if(!bFlags.bits.SLAVE_IS_ATTACHED)
return FALSE;
ThisFile.bFileOpen=0;
bstop=0;
if (*str == '.')
return FALSE;
i=0;
while (str[i] !=0)
{
ch = str[i];
if(ch == '\\' || ch == '/' || ch == ':' || ch == '*' || ch == '?'
|| ch == '"' || ch == '<' || ch == '>' || ch == '|') return FALSE;
if (islower(ch)) str[i] = toupper(ch);
i++;
}
for (i=0;i<11;i++)
pBuffer[i] = 0x20;
len = 0;
i=0;
while(str[i]!='.')
{
len++;
i++;
}
if (len<8)
{
i = 0;
while(str[i]!='.')
{
pBuffer[i] = str[i];
i++;
}
pBuffer[8] = str[i+1];
pBuffer[9] = str[i+2];
pBuffer[10] = str[i+3];
}
else
{
for (i=0;i<6;i++)
pBuffer[i] = str[i];
pBuffer[6] = '~';
pBuffer[7] = '1';
i=0;
while(str[i]!='.')
i++;
pBuffer[8] = str[i+1];
pBuffer[9] = str[i+2];
pBuffer[10] = str[i+3];
}
NowCluster32=DirStartCluster32;
do
{
NowSector=FirstSectorofCluster32(NowCluster32);
for(sector=0;sector<DeviceInfo.BPB_SecPerClus;sector++)
{
if(!RBC_Read(NowSector+sector,1,DBUF))
return FALSE;
for(i=0;i<DeviceInfo.BPB_BytesPerSec;i=i+32)
{
if(DBUF[i]==0x00)
return FALSE;
j=0;
while(DBUF[i+j]==*(pBuffer+j))
{
j=j+1;
if(j>10)
break;
}
if(j>10&&(DBUF[i+11]&0x10))
{bstop=1;break;}
}
if(bstop==1)break;
}
if(bstop==1)break;
NowCluster32=GetNextClusterNum32(NowCluster32);
}while(NowCluster32<=DeviceInfo.TotCluster);
if(NowCluster32>DeviceInfo.TotCluster)
return FALSE;
DirStartCluster32=LSwapINT32(DBUF[i+26],DBUF[i+27],DBUF[i+20],DBUF[i+21]);
ThisFile.ClusterPointer=0;
return TRUE;
}
//============================end======================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -