MORE INFORMATION
A Macintosh parameter-block record is a variable record that can take
six basic forms:
- ParamBlockRec -- Used by all routines in the 64K ROM version of
the Macintosh File Manager.
- HParamBlockRec -- Used by the RAM-based version of the File Manager,
which can use the hierarchical file system.
- CInfoPBRec
- CMovePBRec
- WDPBRec -- Used by routines that exclusively use the hierarchical
file directory (128K ROM only).
- FCBPBRec -- Used to gain access to the contents of a file's file
control block (128K ROM only).
HFSDispatch uses all six parameter-block record formats, depending on
the routine that it calls.
The format for QuickBasic's HFSDispatch library call is
HFSDispatch selector%, IOPB%(0)
where selector% is the routine number to call, as follows:
Selector% Routine Name Parameter-Block Record Type
--------- ------------ ---------------------------
1 OpenWD WDPBRec
2 CloseWD WDPBRec
5 CatMove CMovePBRec
6 DirCreate HParamBlockRec
7 GetWDInfo WDPBRec
8 GetFCBInfo FCBPBRec
9 GetCatInfo CInfoPBRec
10 SetCatInfo CInfoPBRec
11 SetVolInfo HParamBlockRec
16 LockRng ParamBlockRec
17 UnlockRng ParamBlockRec
The IOPB% array is used to set up a memory region to be used as the
parameter block. For most uses of HFSDispatch, this array should be
dimensioned to around 60 integer elements.
The first 11 array elements and corresponding parameter-block record
entries are as follows:
Array
Element Element Name Pascal Type Description
------- ------------ ----------- -----------
0-1 qLink QElemPtr Used by File Manager
2 qType Integer Used by File Manager
3 ioTrap Integer Used by File Manager
4-5 ioCmdAddr Ptr Used by File Manager
6-7 ioCompletion ProcPtr Pointer to completion routine
8 ioResult OsErr Returns the result code
9-10 ioNamePtr StringPtr Points to string containing
path/filename
11 ioVRefNum Integer Volume, drive, or working directory
reference number
Note that the above eight fields are identical for all six
parameter-block record types.
The remaining elements of the record vary according to the
parameter-block record type, as well as the type of file access being
done, whether for a file, a volume, a catalog information query, or
other low-level access.
An example of the data structure for the CInfoPBRec, used in the
GetCatInfo and SetCatInfo routines, follows. A similar technique can
be used for breaking down the other parameter-block records.
For Files
Array
Element Element Name Pascal Type Description
------- ------------ ----------- -----------
12 ioFRefNum Integer Path reference number
13(h) ioFVersNum Signed Byte Version number
13(l) filler1 Signed Byte Not used
14 ioFDirIndex Integer Index (see "Inside Macintosh,"
volume 4, pages 155-156 for usage)
15(h) ioFlAttrib Signed Byte File attributes (see below)
15(l) filler2 Signed Byte Not used
16-23 ioFlFndrInfo FInfo
(16 Bytes) Information used by the Finder
(see below)
24-25 ioDirID Long Integer Directory ID or file number
26 ioFlStBlk Integer First allocation block of data fork
27-28 ioFlLgLen Long Integer Logical end-of-file of data fork
29-30 ioFlPyLen Long Integer Physical end-of-file of data fork
31 ioFlRStBlk Integer First allocation block resource fork
32-33 ioFlRLgLen Long Integer Logical end-of-file of resource fork
34-35 ioFlRPyLen Long Integer Physical end-of-file resource fork
36-37 ioFlCrDat Long Integer Date and time of creation
38-39 ioFlMdDat Long Integer Date and time of last modification
40-41 ioFlBkDat Long Integer Date and time of last backup
42-49 ioFlXFndrInfo FXInfo
(16 bytes) Additional information used by the
Finder (see below)
50-51 ioFlParID Long Integer File's parent directory ID
52-53 ioFlClpSiz Long Integer File's clump size
For Directories
Array
Element Element Name Pascal Type Description
------- ------------ ----------- -----------
12 ioFRefNum Integer Path reference number
13(h) ioFVersNum Signed Byte Version number
13(l) filler1 Signed Byte Not used
14 ioFDirIndex Integer Index (see "Inside Macintosh,"
volume 4, pages 155-156 for usage)
15(h) ioFlAttrib Signed Byte File attributes (see below)
15(l) filler2 Signed Byte Not used
16-23 ioDrUsrWds DInfo
(16 Bytes) Information used by the Finder
(see below)
24-25 ioDrDirID Long Integer Directory ID
26 ioDrNmFls Integer Number of files in directory
27-35 filler3 Array [1..9]
of Integer Not used
36-37 ioDrCrDat Long Integer Date and time of creation
38-39 ioDrMdDat Long Integer Date and time of last
modification
40-41 ioDrBkDat Long Integer Date and time of last backup
42-49 ioDrFndrInfo DXInfo
(16 bytes) Additional information used by the
Finder (see below)
50-51 ioFlParID Long Integer Directory's parent directory ID
Note that some of the element names are common to some or all of the
other data structures.
The ioFlAttrib byte contains the following file attributes:
Bit Meaning
--- -------
0 Set if file is locked
2 Set if resource fork is open
3 Set if data fork is open
4 Set if a directory
7 Set if file (either fork) is open
Following are some of the additional data types used by the Finder,
broken down by element:
Type FInfo
Array Element Name Pascal Type Description
----- ------------ ----------- -----------
16-17 fdType OSType (4 Char) File type
18-19 fdCreator OSType (4 Char) File's creator code
20 fdFlags Integer File flags as follows:
Bit 0 - Set if file
is on desktop
Bit 13 - Set if file
has a bundle
Bit 15 - Set if file's
icon is invisible
21-22 fdLocation Point (4 bytes) File's icon location
23 fdFldr Integer File's window as follows:
-3 - File in Trash window
-2 - File is on desktop
0 - File is in disk window
Type FXInfo
Array Element Name Pascal Type Description
----- ------------ ----------- -----------
42 fdIconID Integer Icon ID
43-46 fdUnused Array [1..4]
of Integer Reserved
47 fdComment Integer Comment ID
48-49 fdPutAway Long Integer Home directory ID
Type DInfo
Array Element Name Pascal Type Description
----- ------------ ----------- -----------
16-19 frRect Rect
(8 bytes) Folder's rectangle coordinates
20 frFlags Integer Directory flags (see fdFlags above)
21-22 frLocation Point
(4 bytes) Folder's location
23 frView Integer Folder's view
Type DXInfo
Array Element Name Pascal Type Description
----- ------------ ----------- -----------
42-43 frScroll Point
(4 bytes) Scroll position
44-45 frOpenChain Long Integer Directory ID chain of open folders
46 frUnused Integer Reserved
47 frComment Integer Comment ID
48-49 frPutAway Long Integer Directory ID
One problem with using an integer array for the IOPB structure is that
the element sizes of the parameter block are not all 2 bytes long. For
example, to convert the ioFlPyLen (a long integer value containing the
physical length of the data fork) from two integer values (IOPB%(29)
and IOPB%(30)) to a single, long-integer value, the following formula
must be used:
PhysicalLength& = PEEKL(VARPTR(IOPB%(29)))
To convert a long integer to two integers:
IOPB%(29) = PEEKW(VARPTR(PhysicalLength&)) ' High 2 bytes
IOPB%(30) = PEEKW(2+VARPTR(PhysicalLength&)) ' Low 2 bytes
To extract a single byte from an integer, as is required to get the
ioFVersNum, the following will work:
high% = PEEK(VARPTR(IOPB%(13))) ' Extracts high byte from integer
low% = PEEK(1+VARPTR(IOPB%(13))) ' Extracts low byte from integer
VersNumber% = high%
ioPermission% = low% '(ioPermission is a signed byte in HParamBlockRec)
To combine two bytes into an integer:
POKE VARPTR(IOPB%(13)), high%
POKE VARPTR(IOPB%(13))+1, low%
The preceding information can be applied to all formats of the
parameter block. For more information on the structure and data
elements of the other formats, consult