📄 fat32mountpartition.lst
字号:
44 =2 //计算指定簇的开始扇区号
45 =2 #define ClusterToSector(X) FAT32.ClusSec + (X - 2) * FAT32.SecPerClus
46 =2
47 =2 struct BootSecFAT16Str //引导扇区 FAT16 扩展结构
48 =2 {
49 =2 BYTE BS_DrvNum;
50 =2 BYTE BS_Reserved1;
51 =2 BYTE BS_BootSig;
52 =2 DWORD BS_VolID;
53 =2 char BS_VolLab[11];
54 =2 char BS_FilSysType[8];
55 =2 };
56 =2
57 =2 struct BootSecFAT32Str //引导扇区 FAT32 扩展结构
58 =2 {
59 =2 DWORD BPB_FATSz32; //FAT32扇区总数
60 =2 WORD BPB_ExtFlags;
61 =2 WORD BPB_FSVer;
62 =2 DWORD BPB_RootClus; //根目录开始的簇
63 =2 WORD BPB_FSInfo;
64 =2 WORD BPB_BkBootSec;
65 =2 char BPB_Reserved[12];
66 =2 BYTE BS_DrvNum;
67 =2 BYTE BS_Reserved1;
68 =2 BYTE BS_BootSig;
69 =2 DWORD BS_VolID;
70 =2 char BS_VolLab[11];
71 =2 char BS_FilSysType[8];
72 =2 };
73 =2
74 =2 struct BootSecStr //引导扇区结构
75 =2 {
76 =2 BYTE BS_jmpBoot[3];
77 =2 BYTE BS_OEMName[8];
78 =2 WORD BPB_BytesPerSec; //每扇区字节数 512
79 =2 BYTE BPB_SecPerClus; //每簇扇区数 1 2 4 8 16 32 64 128
80 =2 WORD BPB_RsvdSecCnt; //保留扇区数 0x20
81 =2 BYTE BPB_NumFATs; //FAT表个数 2
82 =2 WORD BPB_RootEntCnt;
83 =2 WORD BPB_TotSec16;
84 =2 BYTE BPB_Media;
85 =2 WORD BPB_FATSz16;
86 =2 WORD BPB_SecPerTrk;
87 =2 WORD BPB_NumHeads;
88 =2 DWORD BPB_HiddSec;
89 =2 DWORD BPB_TotSec32;
90 =2 union FATUni
91 =2 {
92 =2 struct BootSecFAT32Str F32;
93 =2 struct BootSecFAT16Str F16;
94 =2 }FAT;
95 =2
96 =2 };
97 =2
98 =2 struct DPTStr //分区表结构
99 =2 {
100 =2 BYTE BootFlag;
101 =2 BYTE CHSBegin[3];
C51 COMPILER V7.50 FAT32MOUNTPARTITION 11/20/2006 15:50:39 PAGE 6
102 =2 BYTE TypeCode;
103 =2 BYTE CHSEnd[3];
104 =2 DWORD LBABegin;
105 =2 DWORD CntSec;
106 =2 };
107 =2
108 =2 struct sDPTStr //简化的分区表
109 =2 {
110 =2 BYTE TypeCode;
111 =2 DWORD LBABegin;
112 =2 DWORD CntSec;
113 =2 };
114 =2
115 =2 struct FAT32FSInfoStr //FAT32扩展信息结构
116 =2 {
117 =2 DWORD LeadSig;
118 =2 BYTE Reserved1[480];
119 =2 DWORD StrucSig;
120 =2 DWORD FreeCount;
121 =2 DWORD NxtFree;
122 =2 BYTE Reserved2[12];
123 =2 DWORD TrailSig;
124 =2 };
125 =2
126 =2 struct FAT32SDirStr //FAT目录结构 短文件名
127 =2 {
128 =2 CHAR Name[11];
129 =2 BYTE Attr;
130 =2 BYTE NTRes;
131 =2 BYTE CrtTimeTenth;
132 =2 WORD CrtTime;
133 =2 WORD CrtDate;
134 =2 WORD LstAccDate;
135 =2 WORD FstClusHI;
136 =2 WORD WrtTime;
137 =2 WORD WrtDate;
138 =2 WORD FstClusLO;
139 =2 DWORD FileSize;
140 =2 };
141 =2
142 =2 struct FAT32LDirStr //FAT目录结构 长文件名
143 =2 {
144 =2 BYTE Ord;
145 =2 BYTE Name1[10];
146 =2 BYTE Attr;
147 =2 BYTE Type;
148 =2 BYTE Chksum;
149 =2 BYTE Name2[12];
150 =2 WORD FstClusLO;
151 =2 BYTE Name3[4];
152 =2 };
153 =2
154 =2 struct FAT32Str //FAT32参数表
155 =2 {
156 =2 BYTE ClusSecCnt; //当前簇扇区计数
157 =2 DWORD CurrentDirectory; //当前目录入口(簇号)
158 =2 BYTE SecPerClus; //每簇扇区数 1 2 4 8 16 32 64 128
159 =2 WORD RsvdSecCnt; //保留扇区数 0x20
160 =2 BYTE NumFATs; //FAT表个数 2
161 =2 DWORD RootClus; //根目录开始的簇
162 =2 DWORD ClusSec; //簇开始的扇区
163 =2 DWORD FATSz; //FAT表大小(扇区)
C51 COMPILER V7.50 FAT32MOUNTPARTITION 11/20/2006 15:50:39 PAGE 7
164 =2 DWORD FATSec; //FAT表开始扇区
165 =2 DWORD FSISec; //FSI所在扇区
166 =2 DWORD FSIFreeCount; //空闲簇数
167 =2 DWORD FSINxtFree; //空闲簇搜索指针
168 =2 };
169 =2
170 =2 struct FCBStr
171 =2 {
172 =2 CHAR FileName[12]; //文件名
173 =2 DWORD Size; //文件大小
174 =2 DWORD FirstCluster; //第一个簇
175 =2 DWORD LastCluster; //最近一次读到的簇号
176 =2 DWORD ClusSecCnt; //当前簇扇区计数
177 =2 DWORD ByteCnt; //当前字节计数
178 =2 };
179 =2
180 =2 struct FATStr
181 =2 {
182 =2 DWORD Sector;
183 =2 DWORD FAT[128];
184 =2 };
185 =2
186 =2 #ifndef _LIBRARY_DEFINE
=2 xdata BYTE DiskBuffer[512];
=2
=2 xdata struct sDPTStr sDPT[4];
=2 xdata struct FAT32Str FAT32;
=2 xdata struct FCBStr FCB[FAT32_MAX_FCB];
=2 xdata CHAR LongFileName[256];
=2 xdata struct FATStr FAT;
=2 xdata struct DPTStr *DPT; //分区表结构指针
=2 xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
=2 xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
=2 xdata struct FAT32SDirStr *sDIR; //FAT目录结构指针
=2 xdata struct FAT32LDirStr *lDIR; //FAT目录结构指针
=2 #endif
200 =2 #endif
201 =2
202 =2 extern xdata BYTE DiskBuffer[512];
203 =2
204 =2 extern xdata struct sDPTStr sDPT[4];
205 =2 extern xdata struct FAT32Str FAT32;
206 =2 extern xdata struct FCBStr FCB[FAT32_MAX_FCB];
207 =2 extern xdata CHAR LongFileName[256];
208 =2 extern xdata struct FATStr FAT;
209 =2 extern xdata struct DPTStr *DPT; //分区表结构指针
210 =2 extern xdata struct BootSecStr *BOOTSEC; //引导扇区结构指针
211 =2 extern xdata struct FAT32FSInfoStr *FSI; //FAT32扩展信息
212 =2 extern xdata struct FAT32SDirStr *sDIR; //FAT目录结构指针
213 =2 extern xdata struct FAT32LDirStr *lDIR; //FAT目录结构指针
214 =2
215 =2 extern void FAT32Init(void);
216 =2 extern BYTE FAT32MountPartition(void);
217 =2 extern BYTE FAT32MountVolumeID(BYTE Partition);
218 =2 extern BYTE FAT32GetDirName(WORD SecNum);
219 =2 extern void FAT32GetPartLongName(struct FAT32LDirStr *ldp,CHAR *name);
220 =2 extern DWORD FAT32DiskSize(void);
221 =2 extern DWORD FAT32DiskFreeSize(void);
222 =2 extern BYTE FAT32FindDIREntry(CHAR *DirName);
223 =2 extern void FAT32ReadCluster(DWORD *Cluster);
224 =2 extern BYTE FAT32ChangeDirectory(CHAR *DirName);
225 =2 extern BYTE FAT32ListDirectory(void);
C51 COMPILER V7.50 FAT32MOUNTPARTITION 11/20/2006 15:50:39 PAGE 8
226 =2 extern DWORD FAT32NextCluster(DWORD CurrentCluster);
227 =2 extern BYTE FAT32OpenFile(CHAR *filename);
228 =2 extern void FAT32CloseFile(BYTE fp);
229 =2 extern WORD FAT32ReadFile(BYTE fp);
11 =1
12 =1
3 #endif
4
5 BYTE FAT32MountPartition(void);
6
7 BYTE FAT32MountPartition(void)
8 {
9 1 register BYTE i,j,k;
10 1 xdata DWORD temp[4]={0,0,0,0};
11 1
12 1 IDEReadSector(0); //读MBR扇区
*** WARNING C206 IN LINE 12 OF FAT32MOUNTPARTITION.C: 'IDEReadSector': missing function-prototype
*** ERROR C267 IN LINE 12 OF FAT32MOUNTPARTITION.C: 'IDEReadSector': requires ANSI-style prototype
13 1
14 1 //检查MBR扇区标记
15 1 if (DiskBuffer[510] != 0x55||DiskBuffer[511] != 0xaa)
16 1 return(FAT32_ERR_MBR_FLAG); //不正常的引导扇区标志
17 1
18 1 //加载分区表
19 1 j=0;k=0;
20 1 for(i=0;i<4;i++)
21 1 {
22 2 DPT[i].LBABegin=MEMSwap32(DPT[i].LBABegin);
23 2 DPT[i].CntSec=MEMSwap32(DPT[i].CntSec);
24 2 if (DPT[i].TypeCode==0x0b) //FAT32 分区
25 2 {
26 3 sDPT[j].TypeCode = DPT[i].TypeCode;
27 3 sDPT[j].LBABegin = DPT[i].LBABegin;
28 3 sDPT[j].CntSec = DPT[i].CntSec;
29 3 j++;
30 3 }
31 2 else if (DPT[i].TypeCode==0x05||DPT[i].TypeCode==0x0f) //扩展分区
32 2 {
33 3 temp[k]=DPT[i].LBABegin;
34 3 k++;
35 3 }
36 2 }
37 1
38 1 for(i=0;i<k&&j<16;i++)
39 1 {
40 2 IDEReadSector(temp[i]);
41 2 DPT[i].LBABegin=MEMSwap32(DPT[i].LBABegin);
42 2 DPT[i].CntSec=MEMSwap32(DPT[i].CntSec);
43 2 if (DPT[i].TypeCode==0x0b) //FAT32 分区
44 2 {
45 3 sDPT[j].TypeCode = DPT[i].TypeCode;
46 3 sDPT[j].LBABegin = temp[i] + DPT[i].LBABegin;
47 3 sDPT[j].CntSec = DPT[i].CntSec;
48 3 j++;
49 3 }
50 2 }
51 1 HDD.TotalPartitions=j;
*** ERROR C202 IN LINE 51 OF FAT32MOUNTPARTITION.C: 'HDD': undefined identifier
52 1 #ifdef DEBUG
printf("Partition Table\n");
printf("PNo.\tType\tLBAStart\tCount\tSize\n");
for(i=0;i<HDD.TotalPartitions;i++)
C51 COMPILER V7.50 FAT32MOUNTPARTITION 11/20/2006 15:50:39 PAGE 9
{
printf("P%bd\t%bx\t%ld\t\t%ld\t%ldMB\n",i,sDPT[i].TypeCode,sDPT[i].LBABegin,sDPT[i].CntSec,sDPT[i].CntS
-ec*512/1024/1024);
}
#endif
60 1 return(0);
61 1 }
C51 COMPILATION COMPLETE. 4 WARNING(S), 2 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -