167 lines
5.9 KiB
C
167 lines
5.9 KiB
C
|
|
||
|
/*******************************************************************************
|
||
|
* *
|
||
|
* M-Systems Confidential *
|
||
|
* Copyright (C) M-Systems Flash Disk Pioneers Ltd. 1995-2001 *
|
||
|
* All Rights Reserved *
|
||
|
* *
|
||
|
*******************************************************************************
|
||
|
* *
|
||
|
* NOTICE OF M-SYSTEMS OEM *
|
||
|
* SOFTWARE LICENSE AGREEMENT *
|
||
|
* *
|
||
|
* THE USE OF THIS SOFTWARE IS GOVERNED BY A SEPARATE LICENSE AGREEMENT *
|
||
|
* BETWEEN THE OEM AND M-SYSTEMS. REFER TO THAT AGREEMENT FOR THE SPECIFIC *
|
||
|
* TERMS AND CONDITIONS OF USE, OR CONTACT M-SYSTEMS FOR LICENSE *
|
||
|
* ASSISTANCE: *
|
||
|
* E-MAIL = info@m-sys.com *
|
||
|
* *
|
||
|
*******************************************************************************
|
||
|
* *
|
||
|
* Module: FATFILT *
|
||
|
* *
|
||
|
* This module implements installable FAT12/16 filters. It supports up to *
|
||
|
* SOCKETS sockets, with up to FL_MAX_DISKS_PER_SOCKET disks per socket. *
|
||
|
* Each disk can contain up to FL_MAX_PARTS_PER_DISK partitions on it, with *
|
||
|
* maximum depth of partition nesting in extended partitions equal to *
|
||
|
* MAX_PARTITION_DEPTH. *
|
||
|
* *
|
||
|
* In order for this module to work, disks must be abs.mounted rather then *
|
||
|
* mounted. In latter case, this module won't detect any of disk's *
|
||
|
* partitions, and won't install FAT filters. *
|
||
|
* *
|
||
|
* This module uses more then 512 bytes of stack space in case if MALLOC is *
|
||
|
* not enabled. *
|
||
|
* *
|
||
|
*******************************************************************************/
|
||
|
|
||
|
/*
|
||
|
* $Log: V:/Flite/archives/TrueFFS5/Src/FATFILT.H_V $
|
||
|
*
|
||
|
* Rev 1.3 Apr 10 2001 23:54:52 oris
|
||
|
* Removed FL_MAX_DISKS_PER_SOCKET definition.
|
||
|
*
|
||
|
* Rev 1.2 Apr 09 2001 15:01:00 oris
|
||
|
* Change static allocation to dynamic allocations.
|
||
|
*
|
||
|
* Rev 1.1 Apr 01 2001 07:51:24 oris
|
||
|
* New implementation of fat filter.
|
||
|
*
|
||
|
* Rev 1.0 19 Feb 2001 21:16:14 andreyk
|
||
|
* Initial revision.
|
||
|
*/
|
||
|
|
||
|
|
||
|
#ifndef FLFF_H
|
||
|
#define FLFF_H
|
||
|
|
||
|
|
||
|
|
||
|
#include "dosformt.h"
|
||
|
#include "flreq.h"
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/* number of entries in disk's partition table */
|
||
|
|
||
|
#define FL_PART_TBL_ENTRIES 4
|
||
|
|
||
|
/* max number of partitions (filesystem volumes) per disk */
|
||
|
|
||
|
#define FL_MAX_PARTS_PER_DISK (FL_PART_TBL_ENTRIES + MAX_PARTITION_DEPTH)
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Generic 'initialization status' type
|
||
|
*/
|
||
|
|
||
|
typedef enum {
|
||
|
|
||
|
flStateNotInitialized = 0,
|
||
|
flStateInitInProgress = 1,
|
||
|
flStateInitialized = 2
|
||
|
|
||
|
} FLState;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Disk partition (filesystem volume). Multiple partitions are allowed
|
||
|
* on the disk.
|
||
|
*/
|
||
|
|
||
|
typedef struct {
|
||
|
|
||
|
int handle; /* disk's TFFS handle */
|
||
|
int type; /* FAT16_PARTIT */
|
||
|
int flags; /* VOLUME_12BIT_FAT etc. */
|
||
|
FLBoolean ffEnabled; /* FAT filter is enabled on that part. */
|
||
|
SectorNo startSecNo; /* sectorNo where partition starts */
|
||
|
SectorNo sectors; /* (info) total sectors in partition */
|
||
|
SectorNo firstFATsecNo; /* sectorNo of 1st sector of 1st FAT */
|
||
|
SectorNo lastFATsecNo; /* sectorNo of last sector of 1st FAT */
|
||
|
SectorNo firstDataSecNo;
|
||
|
unsigned clusterSize; /* Cluster size in sectors */
|
||
|
|
||
|
} FLffVol;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Disk with multiple partitions. Multiple disks are allowed on socket.
|
||
|
*/
|
||
|
|
||
|
typedef struct {
|
||
|
|
||
|
int handle; /* disk's TFFS handle */
|
||
|
FLState ffstate; /* FAT filter init. state */
|
||
|
int parts; /* total FAT12/16 partitions found */
|
||
|
FLffVol * part[FL_MAX_PARTS_PER_DISK];
|
||
|
SectorNo secToWatch; /* used to track disk partitioning */
|
||
|
char * buf; /* scratch buffer */
|
||
|
|
||
|
} FLffDisk;
|
||
|
|
||
|
|
||
|
/*
|
||
|
* Master Boot Record/Extended Boot Record of the disk
|
||
|
*/
|
||
|
|
||
|
typedef struct {
|
||
|
|
||
|
char reserved[0x1be];
|
||
|
|
||
|
struct {
|
||
|
unsigned char activeFlag; /* 80h = bootable */
|
||
|
unsigned char startingHead;
|
||
|
LEushort startingCylinderSector;
|
||
|
char type;
|
||
|
unsigned char endingHead;
|
||
|
LEushort endingCylinderSector;
|
||
|
Unaligned4 startingSectorOfPartition;
|
||
|
Unaligned4 sectorsInPartition;
|
||
|
} parts [FL_PART_TBL_ENTRIES];
|
||
|
|
||
|
LEushort signature; /* = PARTITION_SIGNATURE */
|
||
|
|
||
|
} flMBR;
|
||
|
|
||
|
|
||
|
|
||
|
|
||
|
/*
|
||
|
* FAT Filter API
|
||
|
*/
|
||
|
|
||
|
#if defined(ABS_READ_WRITE) && !defined(FL_READ_ONLY)
|
||
|
|
||
|
extern FLStatus ffCheckBeforeWrite (IOreq FAR2 *ioreq);
|
||
|
extern FLStatus flffControl (int devNo, int partNo, FLState state);
|
||
|
extern FLffDisk* flffInfo (int devNo);
|
||
|
|
||
|
#endif
|
||
|
|
||
|
#endif /* FLFF_H */
|
||
|
|