Next Page > Hide TOC

Legacy Documentclose button

Important: The Device Manager is deprecated as of Mac OS X v10.5. You should use the I/O Kit or the File Manager instead.

Device Manager Reference (Legacy)

Framework
CoreServices/CoreServices.h
Declared in
Devices.h
Files.h
IOMacOSTypes.h

Overview

Important: The Device Manager is deprecated as of Mac OS X v10.5. You should use the I/O Kit or the File Manager instead.

In Mac OS 9 and earlier, applications used the Device Manager to open, close, and exchange information with device drivers. In addition, device drivers used the Device Manager when they needed to supply a user interface. In Mac OS X, applications that need to communicate directly with hardware devices must use the I/O Kit. For more information about the I/O Kit, see I/O Kit Fundamentals.

Mac OS X applications can access serial devices through the device file system. You can use the I/O Kit to obtain a path to a device file in the /dev directory, and then use traditional UNIX serial port access through the POSIX termios API. For more information, see Accessing Hardware From Applications.

Other software products that relied on the Device Manager in the past, such as desk accessories, should be converted into Mac OS X applications.

Note: The Device Manager header file Devices.h has been removed in Mac OS X v10.5 and later. The functions previously declared in this header file are now declared in Files.h. Documentation for these deprecated functions is available in File Manager Reference.

Data Types

AddressSpaceID

typedef MPAddressSpaceID AddressSpaceID;

Availability
Declared In
IOMacOSTypes.h

AuxDCE

struct AuxDCE {
   Ptr dCtlDriver;
   volatile SInt16 dCtlFlags;
   QHdr dCtlQHdr;
   SInt32 dCtlPosition;
   Handle dCtlStorage;
   SInt16 dCtlRefNum;
   SInt32 dCtlCurTicks;
   GrafPtr dCtlWindow;
   SInt16 dCtlDelay;
   SInt16 dCtlEMask;
   SInt16 dCtlMenu;
   SInt8 dCtlSlot;
   SInt8 dCtlSlotId;
   SInt32 dCtlDevBase;
   Ptr dCtlOwner;
   SInt8 dCtlExtDev;
   SInt8 fillByte;
   UInt32 dCtlNodeID;
};
typedef AuxDCE* AuxDCEPtr;
typedef AuxDCEPtr* AuxDCEHandle;

DCtlEntry

struct DCtlEntry {
   Ptr dCtlDriver;
   volatile SInt16 dCtlFlags;
   QHdr dCtlQHdr;
   volatile SInt32 dCtlPosition;
   Handle dCtlStorage;
   SInt16 dCtlRefNum;
   SInt32 dCtlCurTicks;
   GrafPtr dCtlWindow;
   SInt16 dCtlDelay;
   SInt16 dCtlEMask;
   SInt16 dCtlMenu;
};
typedef DCtlEntry* DCtlPtr;
typedef DCtlPtr* DCtlHandle;

DriverFinalInfo

struct DriverFinalInfo {
   DriverRefNum refNum;
   RegEntryID deviceEntry;
};
typedef DriverFinalInfo* DriverFinalInfoPtr;

DriverInitInfo

struct DriverInitInfo {
   DriverRefNum refNum;
   RegEntryID deviceEntry;
};
typedef DriverInitInfo* DriverInitInfoPtr;

DriverOpenCount

typedef UInt32 DriverOpenCount;

Availability
Declared In
Devices.h

DriverRefNum

typedef SInt16 DriverRefNum;

Availability
Declared In
Devices.h

DriverReplaceInfo

typedef DriverInitInfo DriverReplaceInfo;
typedef DriverInitInfo* DriverReplaceInfoPtr;

DriverSupersededInfo

typedef DriverFinalInfo DriverSupersededInfo;
typedef DriverFinalInfo* DriverSupersededInfoPtr;

DRVRHeader

struct DRVRHeader {
   short drvrFlags;
   short drvrDelay;
   short drvrEMask;
   short drvrMenu;
   short drvrOpen;
   short drvrPrime;
   short drvrCtl;
   short drvrStatus;
   short drvrClose;
   unsigned char drvrName[1];
};
typedef struct DRVRHeader DRVRHeader;
typedef DRVRHeader * DRVRHeaderPtr;

Availability
Declared In
Devices.h

FileBasedDriverDetailed

struct FileBasedDriverDetailed {
   FileBasedDriverRecord fileBasedDriver;
   Str63 fragName;
};
typedef FileBasedDriverDetailed* FileBasedDriverDetailedPtr;

FileBasedDriverRecord

struct FileBasedDriverRecord {
   FSSpec theSpec;
   MacDriverType theType;
   Boolean compatibleProp;
   UInt8 pad[3];
};
typedef FileBasedDriverRecord* FileBasedDriverRecordPtr;

IOCommandContents

union IOCommandContents {
   ParmBlkPtr pb;
   DriverInitInfoPtr initialInfo;
   DriverFinalInfoPtr finalInfo;
   DriverReplaceInfoPtr replaceInfo;
   DriverSupersededInfoPtr supersededInfo;
};

IOCommandID

typedef struct OpaqueIOCommandID * IOCommandID;

Availability
Declared In
Devices.h

UnitNumber

typedef UInt16 UnitNumber;

Availability
Declared In
Devices.h

Constants

chooserID

Defines the value of the caller parameter to a Chooser device package.

enum {
   chooserID = 1
};

chooserInitMsg

Define values of the message parameter to a Chooser device package.

enum {
   chooserInitMsg = 11,
   newSelMsg = 12,
   fillListMsg = 13,
   getSelMsg = 14,
   selectMsg = 15,
   deselectMsg = 16,
   terminateMsg = 17,
   buttonMsg = 19
};

Constants
chooserInitMsg

The user selected this device package.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

newSelMsg

The user made new device selections.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

fillListMsg

Fill the device list with choices.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

getSelMsg

Mark one or more choices as selected.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

selectMsg

The user made a selection.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

deselectMsg

The user canceled a selection.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

terminateMsg

Allows device package to clean up.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

buttonMsg

The user selected a button.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedLockMask

enum {
   dNeedLockMask = 0x4000,
   dNeedTimeMask = 0x2000,
   dNeedGoodByeMask = 0x1000,
   dStatEnableMask = 0x0800,
   dCtlEnableMask = 0x0400,
   dWritEnableMask = 0x0200,
   dReadEnableMask = 0x0100
};

Constants
dNeedLockMask

Set if driver must be locked in memory as soon as it is opened.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedTimeMask

Set if driver needs time for performing periodic tasks.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedGoodByeMask

Set if driver needs to be called before the application heap is initialized.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dStatEnableMask

Set if driver responds to status requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dCtlEnableMask

Set if driver responds to control requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dWritEnableMask

Set if driver responds to write requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dReadEnableMask

Set if driver responds to read requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

Driver Header and Device Control Entry Flags

Define flags used in the driver header and device control entry.

enum {
   dReadEnable = 0,
   dWritEnable = 1,
   dCtlEnable = 2,
   dStatEnable = 3,
   dNeedGoodBye = 4,
   dNeedTime = 5,
   dNeedLock = 6
};

Constants
dReadEnable

Set if driver responds to read requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dWritEnable

Set if driver responds to write requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dCtlEnable

Set if driver responds to control requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dStatEnable

Set if driver responds to status requests.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedGoodBye

Set if driver needs time for performing periodic tasks.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedTime

Set if driver needs time for performing periodic tasks.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dNeedLock

Set if driver must be locked in memory as soon as it is opened.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dVMImmuneBit

Define run-time flags used in the device control entry.

enum {
   dVMImmuneBit = 0,
   dOpened = 5,
   dRAMBased = 6,
   drvrActive = 7
};

Constants
dVMImmuneBit

Driver does not need VM protection.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dOpened

Driver is open.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dRAMBased

dCtlDriver is a handle (1) or pointer (0).

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

drvrActive

Driver is currently processing a request.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dVMImmuneMask

enum {
   dVMImmuneMask = 0x0001,
   dOpenedMask = 0x0020,
   dRAMBasedMask = 0x0040,
   drvrActiveMask = 0x0080
};

Constants
dVMImmuneMask

Driver does not need VM protection.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dOpenedMask

Driver is open.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

dRAMBasedMask

dCtlDriver is a handle (1) or pointer (0).

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

drvrActiveMask

Driver is currently processing a request.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

goodbye

Define control codes for DeskAccessories.

enum {
   goodbye = -1,
   killCode = 1,
   accEvent = 64,
   accRun = 65,
   accCursor = 66,
   accMenu = 67,
   accUndo = 68,
   accCut = 70,
   accCopy = 71,
   accPaste = 72,
   accClear = 73
};

Constants
goodbye

Heap being reinitialized.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

killCode

KillIO requested.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accEvent

Handle an event.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accRun

Time for periodic action.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accCursor

Change cursor shape.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accMenu

Handle menu item.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accUndo

Handle undo command.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accCut

Handle cut command.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accCopy

Handle copy command.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accPaste

Handle paste command.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

accClear

Handle clear command.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

initMsg

Define values of the message parameter to a Monitor 'mntr'.

enum {
   initMsg = 1,
   okMsg = 2,
   cancelMsg = 3,
   hitMsg = 4,
   nulMsg = 5,
   updateMsg = 6,
   activateMsg = 7,
   deactivateMsg = 8,
   keyEvtMsg = 9,
   superMsg = 10,
   normalMsg = 11,
   startupMsg = 12
};

Constants
initMsg

Initialization.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

okMsg

User clicked OK button.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

cancelMsg

User clicked Cancel button.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

hitMsg

User clicked control in Options dialog.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

nulMsg

Periodic event.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

updateMsg

Update event.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

activateMsg

Not used.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

deactivateMsg

Not used.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

keyEvtMsg

Keyboard event.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

superMsg

Show superuser controls.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

normalMsg

Show only normal controls.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

startupMsg

Code has been loaded.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

Miscellaneous Device Manager constants

enum {
   ioInProgress = 1,
   aRdCmd = 2,
   aWrCmd = 3,
   asyncTrpBit = 10,
   noQueueBit = 9
};

Constants
ioInProgress

Predefined value of ioResult while I/O is pending.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

aRdCmd

Low byte of ioTrap for Read calls.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

aWrCmd

Low byte of ioTrap for Write calls.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

asyncTrpBit

Trap word modifier.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

noQueueBit

Trap word modifier.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kOpenCommand

enum {
   kOpenCommand = 0,
   kCloseCommand = 1,
   kReadCommand = 2,
   kWriteCommand = 3,
   kControlCommand = 4,
   kStatusCommand = 5,
   kKillIOCommand = 6,
   kInitializeCommand = 7,
   kFinalizeCommand = 8,
   kReplaceCommand = 9,
   kSupersededCommand = 10,
   kSuspendCommand = 11,
   kResumeCommand = 12
   kPowerManagementCommand = 13
};

Constants
kOpenCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kCloseCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kReadCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kWriteCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kControlCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kStatusCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kKillIOCommand

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kInitializeCommand

Init driver and device.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kFinalizeCommand

Shutdown driver and device.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kReplaceCommand

Replace an old driver.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kSupersededCommand

Prepare to be replaced by a new driver.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kSuspendCommand

Prepare driver to go to sleep.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kResumeCommand

Wake up sleeping driver.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

kPowerManagementCommand

Power management command, supercedes kSuspendCommand and kResumeCommand.

Available in Mac OS X v10.0 through Mac OS X v10.4.

Declared in Devices.h.

Result Codes

The table below shows the most common result codes returned by the Device Manager.

Result CodeValueDescription
controlErr -17

Driver does not respond to this control request

Available in Mac OS X v10.0 and later.

statusErr -18

Driver does not respond to this status request

Available in Mac OS X v10.0 and later.

readErr -19

Driver does not respond to read requests

Available in Mac OS X v10.0 and later.

writErr -20

Driver does not respond to write requests

Available in Mac OS X v10.0 and later.

badUnitErr -21

Driver reference number does not match unit table

Available in Mac OS X v10.0 and later.

unitEmptyErr -22

Driver reference number specifies a nil handle in unit table

Available in Mac OS X v10.0 and later.

openErr -23

Requested read/write permission does not match driver's open permission

Available in Mac OS X v10.0 and later.

closErr -24

Driver unable to complete close request

Available in Mac OS X v10.0 and later.

dRemovErr -25

Tried to remove an open driver

Available in Mac OS X v10.0 and later.

dInstErr -26

DrvrInstall couldn't find driver in resources

Available in Mac OS X v10.0 and later.

abortErr -27

IO call aborted by KillIO

Available in Mac OS X v10.0 and later.

iIOAbort -27

Available in Mac OS X v10.0 and later.

iIOAbortErr -27

IO abort error (Printing Manager)

Available in Mac OS X v10.0 and later.

notOpenErr -28

Driver not open

Available in Mac OS X v10.0 and later.

unitTblFullErr -29

Unit table has no more entries

Available in Mac OS X v10.0 and later.

dceExtErr -30

dce extension error

Available in Mac OS X v10.0 and later.

offLinErr -65

r/w requested for an off-line drive

Available in Mac OS X v10.0 and later.

fontSubErr -66

Font substitution occurred

Available in Mac OS X v10.0 and later.

noNybErr -66

Couldn't find 5 nybbles in 200 tries

Available in Mac OS X v10.0 and later.

noAdrMkErr -67

Couldn't find valid addr mark

Available in Mac OS X v10.0 and later.

dataVerErr -68

Read verify compare failed

Available in Mac OS X v10.0 and later.

badCksmErr -69

addr mark checksum didn't check

Available in Mac OS X v10.0 and later.

badBtSlpErr -70

bad addr mark bit slip nibbles

Available in Mac OS X v10.0 and later.

noDtaMkErr -71

couldn't find a data mark header

Available in Mac OS X v10.0 and later.

badDCksum -72

bad data mark checksum

Available in Mac OS X v10.0 and later.

badDBtSlp -73

bad data mark bit slip nibbles

Available in Mac OS X v10.0 and later.

wrUnderrun -74

write underrun occurred

Available in Mac OS X v10.0 and later.

cantStepErr -75

step handshake failed

Available in Mac OS X v10.0 and later.

tk0BadErr -76

track 0 detect doesn't change

Available in Mac OS X v10.0 and later.

initIWMErr -77

unable to initialize IWM

Available in Mac OS X v10.0 and later.

twoSideErr -78

tried to read 2nd side on a 1-sided drive

Available in Mac OS X v10.0 and later.

spdAdjErr -79

unable to correctly adjust disk speed

Available in Mac OS X v10.0 and later.

seekErr -80

track number wrong on address mark

Available in Mac OS X v10.0 and later.

sectNFErr -81

sector number never found on a track

Available in Mac OS X v10.0 and later.

fmt1Err -82

can't find sector 0 after track format

Available in Mac OS X v10.0 and later.

fmt2Err -83

can't get enough sync

Available in Mac OS X v10.0 and later.

clkRdErr -85

unable to read same clock value twice

Available in Mac OS X v10.0 and later.

clkWrErr -86

time written did not verify

Available in Mac OS X v10.0 and later.

prWrErr -87

parameter ram written didn't read-verify

Available in Mac OS X v10.0 and later.

prInitErr -88

InitUtil found the parameter ram uninitialized

Available in Mac OS X v10.0 and later.

rcvrErr -89

SCC receiver error (framing; parity; OR)

Available in Mac OS X v10.0 and later.

breakRecd -90

Break received (SCC)

Available in Mac OS X v10.0 and later.

ddpSktErr -91

error in soket number

Available in Mac OS X v10.0 and later.

eMultiErr -91

Multicast address error ddpSktErr

Available in Mac OS X v10.0 and later.

ddpLenErr -92

data length too big

Available in Mac OS X v10.0 and later.

eLenErr -92

Length error ddpLenErr

Available in Mac OS X v10.0 and later.

noBridgeErr -93

no network bridge for non-local send

Available in Mac OS X v10.0 and later.

lapProtErr -94

error in attaching/detaching protocol

Available in Mac OS X v10.0 and later.

excessCollsns -95

excessive collisions on write

Available in Mac OS X v10.0 and later.

portNotPwr -96

serial port not currently powered

Available in Mac OS X v10.0 and later.

portInUse -97

driver Open error code (port is in use)

Available in Mac OS X v10.0 and later.

portNotCf -98

driver Open error code (parameter RAM not configured for this connection)

Available in Mac OS X v10.0 and later.

nrLockedErr -2536

Available in Mac OS X v10.0 and later.

nrNotEnoughMemoryErr -2537

Available in Mac OS X v10.0 and later.

nrInvalidNodeErr -2538

Available in Mac OS X v10.0 and later.

nrNotFoundErr -2539

Available in Mac OS X v10.0 and later.

nrNotCreatedErr -2540

Available in Mac OS X v10.0 and later.

nrNameErr -2541

Available in Mac OS X v10.0 and later.

nrNotSlotDeviceErr -2542

Available in Mac OS X v10.0 and later.

nrDataTruncatedErr -2543

Available in Mac OS X v10.0 and later.

nrPowerErr -2544

Available in Mac OS X v10.0 and later.

nrPowerSwitchAbortErr -2545

Available in Mac OS X v10.0 and later.

nrTypeMismatchErr -2546

Available in Mac OS X v10.0 and later.

nrNotModifiedErr -2547

Available in Mac OS X v10.0 and later.

nrOverrunErr -2548

Available in Mac OS X v10.0 and later.

nrResultCodeBase -2549

Available in Mac OS X v10.0 and later.

nrPathNotFound -2550

a path component lookup failed

Available in Mac OS X v10.0 and later.

nrPathBufferTooSmall -2551

buffer for path is too small

Available in Mac OS X v10.0 and later.

nrInvalidEntryIterationOp -2552

invalid entry iteration operation

Available in Mac OS X v10.0 and later.

nrPropertyAlreadyExists -2553

property already exists

Available in Mac OS X v10.0 and later.

nrIterationDone -2554

iteration operation is done

Available in Mac OS X v10.0 and later.

nrExitedIteratorScope -2555

outer scope of iterator was exited

Available in Mac OS X v10.0 and later.

nrTransactionAborted -2556

transaction was aborted

Available in Mac OS X v10.0 and later.

nrCallNotSupported -2557

This call is not available or supported on this machine

Available in Mac OS X v10.0 and later.



Next Page > Hide TOC


© 2003, 2007 Apple Inc. All Rights Reserved. (Last updated: 2007-07-10)


Did this document help you?
Yes: Tell us what works for you.
It’s good, but: Report typos, inaccuracies, and so forth.
It wasn’t helpful: Tell us what would have helped.