-- Device I/O handler script
--
-- Variables (all are zero based):
-- %CONFIRM%  - 1 if Confirm pressed, 0 if Cancel pressed
-- %DISKNUM%  - disk number in RAID array
-- %TRYNUM%   - i/o retry number
-- %LBA%      - first i/o sector number
-- %SECNUM%   - number of i/o sectors
-- %ERROR%    - i/o error
-- %ATASTATUS% - DOS ATA only ATA status register value (defined if not busy)
-- %ATAERROR%  - DOS ATA only ATA error register (defined if ERR bit set in %ATASTATUS%)
-- %LINE%     - current line number in script
-- %SERVICE%  - i/o service number:
--   0-ATA      1-ATAPI    3-BIOSINT13OLD 4-BIOSINT13
--   5-DOSINT25 6-DOSINT73 8-DOSMSCDEX    9-DOSFILE 
--  11-WINFILE 12-WINSCSI 14-WIN9XINT13  20-LINUXFILE

-- %LASTRES%  - result of the previous command
-- %LASTERR%  - error of the previous command
--
-- After a colon there may be a format specifier for output:
-- x = hexadecimal
-- %LBA:10x%
-- 
-- Commands:
-- SHOWDLG          - force device i/o dialog box
-- WAIT             - wait for user choice
-- DELAY N          - delay for N msec
-- EXECCMD CMDLINE  - execute external command CMDLINE using Command interpreter 
                    -- (equals "cmd CMDLINE" in Windows)
-- EXECCMDQ CMDLINE - execute without creating new console window (quiet)
-- EXEC "FILENAME" CMDLINE  - call external programm FILENAME with parameter CMDLINE
-- EXECQ "FILENAME" CMDLINE - call without creating new console window (quiet)
-- MSDOS            - call Command processor (not supported in Linux)
-- GOTO LABELNAME   - jump to label LABELNAME in script (to the string ":LABELNAME")
-- RETURN           - break script, handle error according to device I/O params
-- RETRETRY         - break script as Retry button pressed 
-- RETIGNORE        - break script as Ignore button pressed 
-- RETABORT         - break script as Abort button pressed 
-- ADDLOG "FILENAME" LOGLINE - write LOGLINE to file FILENAME (LOGLINE may contain variables)
-- CANCELIO         - Call CancelIO (WinNT+ only)
                    -- (available if a device is opened with "overlapped" option)
-- OVLRESLT N       - Check Overlapped result (N=1 wait; 0:not wait) (WinNT+ only)
                    -- (must be used if a device is opened with "overlapped" option)
-- RESETHANDLE      - Reopen disk (WinNT+ only)
-- ATARESET         - DOS ATA only software reset
-- ATARESETDET      - DOS ATA only software reset followed by ATA device detection

-- Script example:
IF %ERROR%=0 RETURN  -- return if no error on last i/o
IF %ERROR%=128 GOTO LABEL1
IF %ERROR%=5 GOTO LABEL1
RETURN

:LABEL1
IF %CONFIRM%=0 RETRETRY -- retry if Cancel button is pressed 
                        -- continue script execution if Confirm is pressed
EXECCMD /K ECHO error %ERROR% at LBA: %LBA% (%SECNUM%) try: %TRYNUM%. Type EXIT to return.
IF %TRYNUM%<2 RETRETRY
DELAY 500
ADDLOG "C:\ERRORS.LOG" error %ERROR% at LBA: %LBA:10% (%SECNUM%) try: %TRYNUM%
RETIGNORE
