File System Driver Interface

The interface to the FSD routines are defined as a C language callable interface so that the File System Driver VxD may be written in C, if desired. The FSD routines will only be called by the IFS Manager, either directly or via the filesystem api hookers, if any.

Each FSD routine takes a single pointer as an input parameter. This pointer refers to an I/O request structure that defines input and output parameters for the FSD routines. On entry to an FSD routine, the I/O request structure is filled in by the IFS Manager with the parameters relevant to the specific request.

The FSD routine then performs its function and fills in the required result information in the I/O request structure before returning.

The following are the parameters that exist in the I/O request structure that is passed to the FSD routines. Many of these parameters are overlayed with others to clarify the parameter names and compress the passed structure to a smaller size. For a further description of the basic structures, the reader is referred to the include file ifs.h.

I/O Request Structure Parameters:

unsigned int

ir_length

Length of user buffer for reads/writes. This field is also overlayed with the following fields on other calls:

ir_attr

Attribute information for path-based calls.

ir_pathSkip

Number of path elements consumed by a Connect operation.

unsigned char

ir_flags

Miscellaneous status flags for various operations.

uid_t

ir_user

User ID for a filesystem request. This field is overlayed with the following fields on certain calls:

ir_drivenum

Logical drive number, used for mounting a drive.

sfn_t

ir_sfn

System File Number. This value is provided to the FSD only as a unique identifier for the file. The specific value and its meaning are private to the IFS Manager and should not be interpreted by the FSD. This field can be overlayed with other fields on some calls:

ir_lananum

Lan Address Number.

ir_tuna

Used for tunnelling information.

pid_t

ir_pid

Process ID of requesting task. This value is provided to the FSD only as a unique identifier for the process. The specific value and its meaning are private to the IFS Manager and should not be interpreted by the FSD.

path_t

ir_ppath

Pointer to pathname. Pathnames are not restricted to the DOS 8.3 format, they may be longnames. The pathnames are passed in as unicode strings. The pathnames are also in canonical form that makes it easier for FSDs to walk the path. This format has been described in section 8.3.1.

aux_t

ir_aux1

This structure is used for miscellaneous parameters and is a union of different field types. The field definitions overlayed with this particular field are as follows:


ubuffer_t

ir_data2

Pointer to secondary data buffer used on some apis.

vfunc_t

ir_vfunc

Pointer to volume function table.

hfunc_t

ir_hfunc

Pointer to handle function table.

path_t

ir_ppath2

Pointer to second unicode pathname passed in on some apis. The format is identical to ir_ppath.

unsigned long

ir_volh

Pointer to volume handle on mount calls.


ubuffer_t

ir_data

Pointer to user data buffer. This field is overlayed with the following field:

ir_ptuninfo

Pointer to tunnelling information.

unsigned short

ir_options

Request handling options. This field is overlayed with the following fields:

ir_sectors

Contains sectors per cluster value.

ir_status

Contains status information for named pipes.

unsigned short

ir_error

Error code (0 if OK).

rh_t

ir_rh

FSD Resource Handle. This handle is private to the FSD and is not interpreted by the IFS Manager. It is used to identify the disk volume, or network resource connection where the I/O operation is to be performed.

fh_t

ir_fh

FSD File Handle. This handle is private to the FSD and is not interpreted by the IFS Manager.

pos_t

ir_pos

File position for request. This is an offset into the file relative to the beginning of the file. This field is overlayed with the following other fields:

ir_size

Initial size of file, used on creates and truncates.

ir_conflags

Flags used for connect operations.

ir_attr2

Second set of attributes, used on Rename calls.

aux_t

ir_aux2

This structure is used for miscellaneous parameters and is a union of different field types. The field definitions overlayed with this particular field are as follows:


unsigned long

ir_numfree

Number of free clusters value.

unsigned long

ir_locklen

Record length for region locking.

unsigned int

ir_msglen

Message length value for named pipes and mailslots.

dos_time

ir_dostime

DOS date value.

unsigned long

ir_timeout

Timeout value.

void *

ir_password

Pointer to password data for connect operations.

unsigned short

ir_prtlen

Length of printer setup string.

unsigned short

ir_prtflags

Various printer flags.

unsigned long

ir_firstclus

First cluster of a file.

unsigned long

ir_mntdrv

Driveletter for mount operation.

void *

ir_cregptr

Pointer to client register structure.

string_t

ir_uFName

Pointer to case-preserved filename in unicode.


aux_t

ir_aux3

This structure is used for miscellaneous parameters and is a union of different field types. The field definitions overlayed with this particular field are as follows:


string_t

ir_upath

Pointer to unparsed pathname in unicode.

void *

ir_scratch

Scratch buffer for special calls to network FSDs.


pevent

ir_pev

Pointer to event structure for asynchronous requests.

fsdwork_t

ir_fsd

Available space for FSD use. The structure is 16 dwords in size and may be defined as desired by the FSD.