|
|
This note will explain how code can be written to determine the reference number of a previously installed driver when only the name is known.
You should already be familiar with The Device Manager chapter of Inside Macintosh before reading this technical note.
Updated: [February 01 1986]
|
Obtaining a drive reference number
The Pascal code at the end of this note demonstrates how to obtain the
reference number of a driver that has been installed in the Unit Table. The
reference number may then be used in subsequent calls to the Device Manager
such as Open, Control and Prime.
One thing to note is that the dRAMBased bit really only tells you
whether dCtlDriver is a pointer or a handle, not necessarily whether
the driver is in ROM or RAM. SCSI drivers, for instance, are in RAM but not
relocatable; their DCE entries contain pointers to them.
From MPW Pascal:
PROCEDURE GetDrvrRefNum(driverName: Str255; VAR drvrRefNum: INTEGER);
TYPE
WordPtr = ^INTEGER;
CONST
UTableBase = $11C; {low memory globals}
UnitNtryCnt = $1D2;
dRAMBased = 6; {bit in dCtlFlags that indicates ROM/RAM}
drvrName = $12; {length byte and name of driver [string]}
VAR
negCount : INTEGER;
DCEH : DCtlHandle;
drivePtr : Ptr;
s : Str255;
BEGIN
UprString(driverName, FALSE); {force same case for compare}
negCount := - WordPtr(UnitNtryCnt)^; {get -(table size)}
{Check to see that driver is installed, obtain refNum.}
{Assumes that an Open was done previously -- probably by an INIT.}
{Driver doesn't have to be open now, though.}
drvrRefNum := - 12 + 1; {we'll start with driver refnum = -12,
right after .ATP entry}
{Look through unit table until the driver found or reach the end.}
REPEAT
drvrRefNum := drvrRefNum - 1; {bump to next refnum}
DCEH := GetDCtlEntry(drvrRefNum); {get handle to DCE}
s := ''; {no driver, no name}
IF DCEH <> NIL THEN
WITH DCEH^^ DO BEGIN {this is safe -- no chance of heap
moving before dCtlFlags/dCtlDriver
references}
IF (dCtlDriver <> NIL) THEN BEGIN
IF BTST(dCtlFlags, dRAMBased) THEN
drivePtr := Handle(dCtlDriver)^ {zee derÉference}
ELSE
drivePtr := Ptr(dCtlDriver);
IF drivePtr <> NIL THEN BEGIN
s := StringPtr(ORD4(drivePtr) + drvrName)^;
UprString(s,FALSE); {force same case for compare}
END;
END; {IF}
END; {WITH}
UNTIL (s = driverName) OR (drvrRefNum = negCount);
{Loop until we find it or we've just looked at the last slot.}
IF s <> driverName THEN drvrRefNum := 0; {can't find driver}
END;
|
From MPW C:
short GetDrvrRefNum(driverName)
char *driverName[256];
{ /* GetDrvrRefNum */
#define UnitNtryCnt 0x1d2
/*bit in dCtlFlags that indicates ROM/RAM*/
#define dRAMBased 6
/*length byte and name of driver [string]*/
#define drvrName 0x12
short negCount,dRef;
DCtlHandle DCEH;
char *drivePtr,*s;
negCount = -*(short *)(UnitNtryCnt); /*get -(table size)*/
/*Check to see that driver is installed, obtain refNum.*/
/*Assumes that an Open was done previously -- probably by an INIT.*/
/*Driver doesn't have to be open now, though.*/
dRef = -12 + 1; /*we'll start with driver refnum == -12,
right after .ATP entry*/
/*Look through unit table until we find driver or reach the end.*/
do {
dRef -= 1; /*bump to next refnum*/
DCEH = GetDCtlEntry(dRef); /*get handle to DCE*/
s = "";
if ((DCEH != nil) && ( (**DCEH).dCtlDriver != nil) )
{
if (((**DCEH).dCtlFlags >> dRAMBased) & 1)
/* test dRamBased bit */
drivePtr = *(Handle) (**DCEH).dCtlDriver;
/*zee derÉference*/
else
drivePtr = (**DCEH).dCtlDriver;
if (drivePtr != nil)
s = drivePtr + drvrName;
}
} while (!(EqualString(s,driverName,0,0)) && (dRef != negCount));
/*Loop until we find it or we've just looked at the last slot.*/
if (EqualString(s,driverName,0,0))
return dRef;
else
return 0; /*can't find driver*/
}/* GetDrvrRefNum */
|
That's all there is to locating a driver and picking up the reference number.
Back to top
References
The Device Manager chapter of Inside Macintosh
Back to top
Change History
|
Changes since 01-February-1986
|
Corrected the C sample code specifically for "do...while" loop to continue while the
driverName did not match that of the name of the driver for a unit entry.
|
Back to top
Downloadables
|

|
Acrobat version of this Note (52K)
|
Download
|
Back to top
|