#ifndef LIBRARIES_HDWRENCH_H
#define LIBRARIES_HDWRENCH_H
/*
** $VER: hdwrench.h 44.3 (29.7.1999)
** Includes Release 44.1
**
** Disk Prep Support Library API includes
**
** (C) Copyright 1999 Joanne B. Dow, Wizardess Designs,
** for license to Amiga, Inc.
**
** All Rights Reserved
*/
/*****************************************************************************/
#ifndef EXEC_LIBRARIES_H
#include <exec/libraries.h>
#endif
#ifndef DEVICES_HARDBLOCKS_H
#include <devices/hardblocks.h>
#endif
/*****************************************************************************/
struct HDWLibrary
{
struct Library ml_Lib;
ULONG ml_SegList;
ULONG ml_Flags;
APTR ml_ExecBase; /* pointer to exec base */
long *ml_relocs; /* pointer to relocs. */
struct HDWLibrary *ml_origbase; /* pointer to original library base */
long ml_numjmps;
};
#define HDWBaseName "hdwrench.library"
/* === General Constant Defines === */
/* Artificial unassigned value for the RDB structures. */
#define UNASSIGNED (ULONG) -131L
/* End block number link within RDB structures */
#define RDBEND (ULONG) -1L
#define DEFAULT_RDBBLOCKSHI 63
/* === Structure & Typedefs === */
typedef struct
{
USHORT ready [ 16 ]; /* Tests ready and first block read */
USHORT there [ 16 ]; /* Tests as "there" but fails other tests */
} ValidIDstruct;
/* Actual disk read write return structure: */
struct rw_return /* Should fit within a ULONG */
{
USHORT success; /* Error code */
USHORT failed_word; /* 0 on reads. */
USHORT block_written; /* 0 on reads. */
};
enum rw_success_val /* Return values for rw_return.success field. */
{
success = 0, /* 0 */
success_on_retry_write, /* 1 */
success_on_retry_read, /* 2 */
failed_on_write, /* 3 */
failed_on_reread, /* 4 */
illegal_command, /* 5 */
io_command_failure, /* 6 */
scsi_command_failure, /* 7 */
out_of_memory, /* 8 */
no_more_disk_blocks, /* 9 */
rdsk_not_located, /* 10 */
io_device_not_open, /* 11 */
invalid_blocksize_found, /* 12 */
no_callback_hook, /* 13 */
user_aborted, /* 14 */
operation_not_permitted /* 15 */
};
/* Internal bootblock structure. Create dummy structures to pass to read
* and write functions as necessary. Be sure that bb_BlockNum is filled in
* and that the actual size of the data area pointed to by the union is
* sufficiently large to contain one disk block.
*/
typedef struct bootblock
{
struct MinNode bb_Node;
LONG allocsize;
LONG bb_BlockNum;
WORD bb_Changed;
LONG unit; /* Unit number for THIS set of RDBs. */
char DeviceName [32]; /* Device name */
struct rw_return bb_RWErrors;
BOOL wflag; /* Written out flag. */
BYTE spares[4-sizeof(BOOL)];/* Fill out short word */
union
{
struct RigidDiskBlock bd_RDB;
struct PartitionBlock bd_PB;
struct FileSysHeaderBlock bd_FHB;
struct LoadSegBlock bd_LSB;
struct BadBlockBlock bd_BB;
UBYTE bd_Bytes[512]; /* NB: This is the MINIMUM size we */
UWORD bd_Words[256]; /* can have here. It MAY be extended */
ULONG bd_Longs[128]; /* if actual block size is larger. */
} bb_Data;
} BootBlock;
/* ==== Error report values for other functions ==== */
#define E_NOERROR 0
#define E_ILLEGAL_SLASH 200
#define E_EOF_IN_COMMENT 201
#define E_ILLEGAL_STAR 202
#define E_TOKEN_TO_LONG 203
#define E_MEMORY_PANIC 204
#define E_PREMATURE_EOF 205
#define E_MISSING_EQUALS 206
#define E_ILLEGAL_T_F 207
#define E_ILLEGAL_TOKEN 208
#define E_DUPLICATE_DISK 209
#define E_NOT_LEGAL_NAME 210
#define E_EXCEEDED_SIZE_LIM 211
#define E_FILE_WRITE_ERROR 212
#define E_TOOMANY_FS 213
#define E_FSAVE_CONFUSION 214
#define E_FS_CANNOT_OPEN 215
#define E_LOST_IN_RDB_SPACE 216
#define E_FS_WRITE_ERROR 217
#define E_MULTIPLE_RDSKS 218
#define E_RDSK_NOT_1ST 219
#define E_NO_RDBS_LOADED 220
#define E_RDBS_ALREADY_IN 221 /* RDBs already loaded. */
#define E_FAILED_FILEOPEN 222
#define E_FILE_READ_FAILED 223
#define E_FILE_NOT_RDBS 224
#define E_NO_BLOCKSIZE_SPEC 225
#define E_FILE_WRITE_FAILED 226
#define E_MEMORYP_NULL 227 /* prospective "memp" is null */
#define E_ILLEGAL_BLOCKSIZE 228
#define E_INSUFFICIENT_MEM 229
#define E_RENUMBER_FAILED 230
#define E_BLOCKS_EXCEEDED 231 /* Too many RDB blocks */
#define E_INCOMPLETE_FSDESC 232
#define E_FS_NOT_FOUND 233
#define E_LIST_SCREWEDUP 234
#define E_NO_SUCH_DIR 235
#define E_EXALL_ERROR 236
#define E_UNIT_DIFFERS 237
#define T_RENUMBER_LEFT 300
#define W_DUPLICATE_FS 100
#define W_FS_NO_WRITE 101
/* Definitions for type field in FileSave */
#define DRIVEINIT 0
#define FILESYSTEM 1
struct DefaultsArray
{
ULONG TotalBlocks;
UWORD BytesPerBlock;
UWORD BlocksPerSurface;
UWORD Surfaces;
UWORD Cylinders; /* note: MaxCyl = Cylinders - 1; */
UWORD UnusedBlocks;
};
/* Defaults Array filling error bit array */
#define DA_NOERRORS 0
#define DA_NO_CAPACITY_REPORT 1
#define DA_NO_OPTIMIZE 2
#define DA_BAD_MODESENSE_4 4
#define DA_BAD_MODESENSE_3 8
#define DA_FAILED 256
#define DA_NO_DRIVE_OPEN DA_FAILED
#define DA_RIDICULOUS_VALUES ( DA_FAILED << 1 )
/* Defaults Array filling "Optimize" Flags */
#define DA_OPTIMIZE 1 /* Optimize storage if possible */
#define DA_HUGE 2 /* Allow partitioning huge disks */
#define DA_HF_WAY 4 /* Use the old HardFrame algorithm */
/* Note: DA_HF_WAY is forces DA_OPTIMIZE and DA_HUGE off. */
/* DA_BAD_MODESENSE_3 and DA_BAD_MODESENSE_4 only happen with DA_HF_WAY */
/* Errors below DA_FAILED are informational. */
/* ==== Mountfile Recognized Strings ==== */
#ifdef DONT_EVER_COMPILE_ME /* This stuff is for reference only, thank you. */
#ifdef FORREAL
#define EXTERN
#else
#define EXTERN extern
#endif
EXTERN const char *_Tokens[]
#ifdef FORREAL
= {
"/", /*0 */
"#",
"=",
"device",
"surfaces",
"blockspertrack",
"reserved",
"prealloc",
"interleave",
"lowcyl",
"highcyl", /* 10 */
"buffers",
"bufmemtype",
"maxtransfer",
"mask",
"bootpri",
"dostype",
"unit",
"flags",
"stacksize",
"priority", /* 20 */
"globvec",
"filesystem",
"mount",
"heads",
"bytesperblock",
"disk",
"rdblow",
"rdbhi",
"reselect",
"hilun", /* 30 */
"hiid",
"hidrive",
"cylinders",
"cylinderblocks",
"mincyl",
"maxcyl",
"hicard",
"blocksize",
"bootable",
"readonly", /* 40 */
"driveinit",
"baud",
"control",
"bootblocks",
"synch",
"sectorsperblock",
"\xff"
}
#endif
;
#define TSLASH 0
#define THACK 1
#define TEQUALS 2
#define TDEVICE 3
#define TSURFACES 4
#define TBLOCKSPERTRACK 5
#define TRESERVED 6
#define TPREALLOC 7
#define TINTERLEAVE 8
#define TLOWCYL 9
#define THICYL 10
#define TBUFFERS 11
#define TBUFMEMTYPE 12
#define TMAXTRANSFER 13
#define TMASK 14
#define TBOOTPRI 15
#define TDOSTYPE 16
#define TUNIT 17
#define TFLAGS 18
#define TSTACKSIZE 19
#define TPRIORITY 20
#define TGLOBVEC 21
#define TFILESYSTEM 22
#define TMOUNT 23
#define THEADS 24
#define TBYTESPERBLOCK 25
#define TDISK 26
#define TRDBLOW 27
#define TRDBHI 28
#define TRESELECT 29
#define THILUN 30
#define THIID 31
#define TLASTDRIVE 32
#define TCYLINDERS 33
#define TCYLINDERBLOCKS 34
#define TMINCYL 35
#define TMAXCYL 36
#define THICARD 37
#define TBLOCKSIZE 38
#define TBOOTABLE 39
#define TREADONLY 40
#define TDRIVEINIT 41
#define TBAUD 42
#define TCONTROL 43
#define TBOOTBLOCKS 44
#define TSYNCH 45
#define TSECSPERBLOCK 46
#define TokenCount 46
#define TNOMATCH TokenCount + 1
#endif /* COMPILEME */
typedef struct
{
STRPTR devicename;
LONG board;
LONG address;
LONG lun;
STRPTR messagestring;
LONG extra;
LONG param1;
LONG param2;
LONG param3;
} HDWCallbackMsg;
#define EXTRA_BEFORE_TEST 0
#define EXTRA_AFTER_TEST 1
#define EXTRA_BEFORE_FORMAT 2 /* with no way to stop once you start.*/
#define EXTRA_BEFORE_VERIFY 3 /* Setup the verify requester and
return "go ahead" */
#define EXTRA_UPDATE_VERIFY 4 /* New string for requester - return
any Abort received */
#define EXTRA_VERIFY_REASSIGN 5 /* New string - return "Yes" or "No" */
#define EXTRA_VERIFY_FINISHED 6 /* Notify user, accept OK, close */
#define INQBUFSIZE 36 /* Standard size of Inquiry buffer */
/****************************************************************************/
/*
* Callback messages for the hdwrench.library tester program.
* These strings are "suggested" English strings for use with
* the hdwrench.library callback hook.
*/
#ifdef USE_SUGGESTED_MESSAGES
/* MESSAGE */ /* .extra usages */
char *callback_messages[] =
{
/* A) FINDVALID_SCANNING_STRING */ /* 0 and 1 */
"Scanning: %s: %d%d%d", /* from message: devicename, board, lun, addr */
/* B) LONGTIME_NOABORT_WARNING */ /* 2 */
"You are about to format LUN %d on\n"
"drive %d attached to board %d\n\n"
"***WARNING WARNING WARNING***\n"
"It can take up to several hours\n"
"to format a hard disk. And there\n"
"is no safe way to abort.\n\n"
"Are you VERY sure you want to do this?\n",
/* C) LONGTIME_VERIFY_WARNING */ /* 3 */
"LUN %d on drive %d on board %d\n"
" Note\n"
"It can take up to several hours\n"
"to verify a hard disk. However,\n"
"you can abort during verify.\n\n"
"No data will be changed on the\n"
"drive.\n\n"
"Do you wish to continue?\n",
/* D) FORMAT_USER_ABORTED_STRING */ /* 6 */
"User Aborted. Your drive is safe!\n",
/* E) FORMAT_MOUNTED_DRIVE */ /* 4 */
"%s\nShould we format a mounted drive?\n",
/* F) FORMAT_NOT_PERMITTED */ /* 6 */
"%s\nFormatting the system disk\nis not permitted. Aborting...\n",
/* G) FORMAT_UNRECOGNIZED_STATUS */ /* 6 */
"Unrecognized SCSI status byte 0x%2.2x returned.\n",
/* H) FORMAT_RESERVATION_CONFLICT */ /* 6 */
"Device is reserved by another initiator.\n",
/* I) FORMAT_DRIVE_BUSY */ /* 6 */
"Drive is busy.\n",
/* J) FORMAT_COMMAND_PROBLEM */ /* 6 */
"Unknown problem issuing SCSI Direct command!\n",
/* K) FORMAT_SUCCESS_STRING */ /* 6 */
"Format completed with no errors.",
/* L) FORMAT_FAILED_STRING */ /* 6 maybe */
"Format failed! Your drive may be dead.\n",
/* M) VERIFY_USER_ABORTED_STRING */ /* 6 */
"User Aborted.\n",
/* N) VERIFY_READCAPACITY_FAILED */ /* 6 */
"ReadCapacity failed! Verify impossible.\n",
/* O) VERIFY_PROGRESS */ /* 4 */
"Verifying blocks %d to %d of %d.\r",
/* P) VERIFY_REASSIGN_Q */ /* 5 */
"Block %d is bad.\n"
"Reassign this bad block?",
/* Q) VERIFY_COMPLETED_STRING */ /* 6 */
"Verify completed:\n"
" %d errors,\n"
" %d successful reassignments,\n"
"and %d failed reassignments\n",
/* R) VERIFY_ERROR_UNKNOWN_LOC */ /* 4 */
"Medium error at unknown location!\n"
"You should back up the drive and low-level format\n",
/* S) VERIFY_HARDWARE_ERROR */ /* 4 */
"Hardware error %ld!\n",
/* T) VERIFY_RECOVERED_ERROR */ /* 4 */
"Recovered read error at block %ld\n",
/* U) VERIFY_RECOVERED_UNKNOWN_LOC */ /* 4 */
"Recovered error at unknown location!\n"
"You should consider backing up the\n"
"drive and reformatting\n",
/* V) VERIFY_ILLEGAL_REQUEST */ /* 4 */
"Drive returned an Illegal Request Error (%ld)\n",
/* W) VERIFY_UNKNOWN_ERROR */
"Unknown error: sense key %ld (more)\n"
"Device returned sense code %ld (more)\n"
"Consult drive documentation\n",
/* X) VERIFY_CONTINUE */ /* 4 */
"Continuing verify at block %d...\n",
/* Y) VERIFY_SEEK_ERROR */ /* 4 */
"seek eror!\n",
/* Z) VERIFY_MEDIUM_ERROR */ /* 4 */
"Medium error at unknown location!\n"
"You should back up the drive and low-level format\n",
/* [) VERIFY_ILLEGAL_COMMAND */ /* 4 */
"Illegal command!\n",
/* \) VERIFY_ILLEGAL_ADDRESS */ /* 4 */
"Illegal address %ld!",
/* ]) VERIFY_BAD_ARGUEMENT */ /* 4 */
"Bad command arguement!\n",
/* ^) VERIFY_CARTRIDGE_CHANGED */ /* 4 */
"Cartridge changed",
/* _) VERIFY_ILLEGAL_LUN */ /* 4 */
"Invalid LUN addressed!",
/* `) VERIFY_UNFORMATTED_DRIVE */ /* 4 */
"Unformatted drive!",
/* a) VERIFY_NONEXTENDED_SENSE */ /* 4 */
"Non-extended sense error is 0x%x",
/* b) VERIFY_NO_SCSI_ERROR_RETURNED */ /* 4 */
"Device didn't return good sense data!",
/* other */
"Illegal callback message %x" /* any */
};
#define MIN_MESSAGE 'A'
#define MAX_MESSAGE 'b'
#endif /* USE_SUGGESTED_MESSAGES */
#endif /* LIBRARIES_HDWRENCH_H */