Fehlercode 87 in _doserrno
-
Na wunderbar - undokumentierte Fehlercodes oder noch besser: Fehler die es eigentlich gar nicht gibt
Zeig mal ein bisschen Code und verheimliche nicht alles so ;). Wo genau tritt der Fehler auf (Codeschnipsel), warum könnte er auftreten (besonderes Aufrufen des Interrupts, etc.)
Fehler zu schreien hilft meistens nichts
MfG SideWinder
-
Ok, hier ist der "Quellcodeschnippsel":
regi.h.ah=0x51; regi.h.al=alwert; errno=0; int86(0x15, ®i, ®o); printf("Error: %d; %d, %s", _doserrno, errno, _sys_errlist[errno]);
Also der Fehler tritt wohl im Aufruf des Interrupts auf. errno liefert übrigens EINVAL. Aber ich wüsste nicht, dass ich ein falsches Argument übergeben hätte
. Möglicherweise liegt der Fehler auch im Code des Interrupts. Den kann ich aber leider nicht ändern oder sonst Einfluss drauf nehmen :(.
-
wird dir nicht viel helfen, aber dennoch eine übersicht über die fehler..
_doserrno Syntax #include <errno.h> extern int _doserrno; Description Whenever a DOS call returns a failure indication, this variable is assigned the value of the error code returned by the failed DOS call. For a list of the error codes and their short descriptions, see section dosexterr---> --------------- dosexterr Syntax #include <dos.h> int dosexterr(struct DOSERROR *p_error); Description This function reads extended error information from DOS and fills p_error structure. struct DOSERROR { int exterror; char class; char action; char locus; }; Values for DOS extended error code (exterr field): ---DOS 2.0+ --- 00h (0) no error 01h (1) function number invalid 02h (2) file not found 03h (3) path not found 04h (4) too many open files (no handles available) 05h (5) access denied 06h (6) invalid handle 07h (7) memory control block destroyed 08h (8) insufficient memory 09h (9) memory block address invalid 0Ah (10) environment invalid (usually >32K in length) 0Bh (11) format invalid 0Ch (12) access code invalid 0Dh (13) data invalid 0Eh (14) reserved 0Eh (14) (PTS-DOS 6.51+, S/DOS 1.0+) fixup overflow 0Fh (15) invalid drive 10h (16) attempted to remove current directory 11h (17) not same device 12h (18) no more files ---DOS 3.0+ (INT 24 errors)--- 13h (19) disk write-protected 14h (20) unknown unit 15h (21) drive not ready 16h (22) unknown command 17h (23) data error (CRC) 18h (24) bad request structure length 19h (25) seek error 1Ah (26) unknown media type (non-DOS disk) 1Bh (27) sector not found 1Ch (28) printer out of paper 1Dh (29) write fault 1Eh (30) read fault 1Fh (31) general failure 20h (32) sharing violation 21h (33) lock violation 22h (34) disk change invalid (ES:DI -> media ID structure)(see #01681) 23h (35) FCB unavailable 23h (35) (PTS-DOS 6.51+, S/DOS 1.0+) bad FAT 24h (36) sharing buffer overflow 25h (37) (DOS 4.0+) code page mismatch 26h (38) (DOS 4.0+) cannot complete file operation (EOF / out of input) 27h (39) (DOS 4.0+) insufficient disk space 28h-31h reserved ---OEM network errors (INT 24)--- 32h (50) network request not supported 33h (51) remote computer not listening 34h (52) duplicate name on network 35h (53) network name not found 36h (54) network busy 37h (55) network device no longer exists 38h (56) network BIOS command limit exceeded 39h (57) network adapter hardware error 3Ah (58) incorrect response from network 3Bh (59) unexpected network error 3Ch (60) incompatible remote adapter 3Dh (61) print queue full 3Eh (62) queue not full 3Fh (63) not enough space to print file 40h (64) network name was deleted 41h (65) network: Access denied (DOS 3.0+ [maybe 3.3+???]) codepage switching not possible (see also INT 21/AX=6602h,INT 2F/AX=AD42h) 42h (66) network device type incorrect 43h (67) network name not found 44h (68) network name limit exceeded 45h (69) network BIOS session limit exceeded 46h (70) temporarily paused 47h (71) network request not accepted 48h (72) network print/disk redirection paused 49h (73) network software not installed (LANtastic) invalid network version 4Ah (74) unexpected adapter close (LANtastic) account expired 4Bh (75) (LANtastic) password expired 4Ch (76) (LANtastic) login attempt invalid at this time 4Dh (77) (LANtastic v3+) disk limit exceeded on network node 4Eh (78) (LANtastic v3+) not logged in to network node 4Fh (79) reserved ---end of errors reportable via INT 24--- 50h (80) file exists 51h (81) (undoc) duplicated FCB 52h (82) cannot make directory 53h (83) fail on INT 24h ---network-related errors (non-INT 24)--- 54h (84) (DOS 3.3+) too many redirections / out of structures 55h (85) (DOS 3.3+) duplicate redirection / already assigned 56h (86) (DOS 3.3+) invalid password 57h (87) (DOS 3.3+) invalid parameter 58h (88) (DOS 3.3+) network write fault 59h (89) (DOS 4.0+) function not supported on network / no process slots available 5Ah (90) (DOS 4.0+) required system component not installed / not frozen 5Bh (91) (DOS 4.0+,NetWare4) timer server table overflowed 5Ch (92) (DOS 4.0+,NetWare4) duplicate in timer service table 5Dh (93) (DOS 4.0+,NetWare4) no items to work on 5Fh (95) (DOS 4.0+,NetWare4) interrupted / invalid system call 64h (100) (MSCDEX) unknown error 64h (100) (DOS 4.0+,NetWare4) open semaphore limit exceeded 65h (101) (MSCDEX) not ready 65h (101) (DOS 4.0+,NetWare4) exclusive semaphore is already owned 66h (102) (MSCDEX) EMS memory no longer valid 66h (102) (DOS 4.0+,NetWare4) semaphore was set when close attempted 67h (103) (MSCDEX) not High Sierra or ISO-9660 format 67h (103) (DOS 4.0+,NetWare4) too many exclusive semaphore requests 68h (104) (MSCDEX) door open 68h (104) (DOS 4.0+,NetWare4) operation invalid from interrupt handler 69h (105) (DOS 4.0+,NetWare4) semaphore owner died 6Ah (106) (DOS 4.0+,NetWare4) semaphore limit exceeded 6Bh (107) (DOS 4.0+,NetWare4) insert drive B: disk into A: / disk changed 6Ch (108) (DOS 4.0+,NetWare4) drive locked by another process 6Dh (109) (DOS 4.0+,NetWare4) broken pipe 6Eh (110) (DOS 5.0+,NetWare4) pipe open/create failed 6Fh (111) (DOS 5.0+,NetWare4) pipe buffer overflowed 70h (112) (DOS 5.0+,NetWare4) disk full 71h (113) (DOS 5.0+,NetWare4) no more search handles 72h (114) (DOS 5.0+,NetWare4) invalid target handle for dup2 73h (115) (DOS 5.0+,NetWare4) bad user virtual address / protection violation 74h (116) (DOS 5.0+) VIOKBD request 74h (116) (NetWare4) error on console I/O 75h (117) (DOS 5.0+,NetWare4) unknown category code for IOCTL 76h (118) (DOS 5.0+,NetWare4) invalid value for verify flag 77h (119) (DOS 5.0+,NetWare4) level four driver not found by DOS IOCTL 78h (120) (DOS 5.0+,NetWare4) invalid / unimplemented function number 79h (121) (DOS 5.0+,NetWare4) semaphore timeout 7Ah (122) (DOS 5.0+,NetWare4) buffer too small to hold return data 7Bh (123) (DOS 5.0+,NetWare4) invalid character or bad file-system name 7Ch (124) (DOS 5.0+,NetWare4) unimplemented information level 7Dh (125) (DOS 5.0+,NetWare4) no volume label found 7Eh (126) (DOS 5.0+,NetWare4) module handle not found 7Fh (127) (DOS 5.0+,NetWare4) procedure address not found 80h (128) (DOS 5.0+,NetWare4) CWait found no children 81h (129) (DOS 5.0+,NetWare4) CWait children still running 82h (130) (DOS 5.0+,NetWare4) invalid operation for direct disk-access handle 83h (131) (DOS 5.0+,NetWare4) attempted seek to negative offset 84h (132) (DOS 5.0+,NetWare4) attempted to seek on device or pipe ---JOIN/SUBST errors--- 85h (133) (DOS 5.0+,NetWare4) drive already has JOINed drives 86h (134) (DOS 5.0+,NetWare4) drive is already JOINed 87h (135) (DOS 5.0+,NetWare4) drive is already SUBSTed 88h (136) (DOS 5.0+,NetWare4) can not delete drive which is not JOINed 89h (137) (DOS 5.0+,NetWare4) can not delete drive which is not SUBSTed 8Ah (138) (DOS 5.0+,NetWare4) can not JOIN to a JOINed drive 8Bh (139) (DOS 5.0+,NetWare4) can not SUBST to a SUBSTed drive 8Ch (140) (DOS 5.0+,NetWare4) can not JOIN to a SUBSTed drive 8Dh (141) (DOS 5.0+,NetWare4) can not SUBST to a JOINed drive 8Eh (142) (DOS 5.0+,NetWare4) drive is busy 8Fh (143) (DOS 5.0+,NetWare4) can not JOIN/SUBST to same drive 90h (144) (DOS 5.0+,NetWare4) directory must not be root directory 91h (145) (DOS 5.0+,NetWare4) can only JOIN to empty directory 92h (146) (DOS 5.0+,NetWare4) path is already in use for SUBST 93h (147) (DOS 5.0+,NetWare4) path is already in use for JOIN 94h (148) (DOS 5.0+,NetWare4) path is in use by another process 95h (149) (DOS 5.0+,NetWare4) directory previously SUBSTituted 96h (150) (DOS 5.0+,NetWare4) system trace error 97h (151) (DOS 5.0+,NetWare4) invalid event count for DosMuxSemWait 98h (152) (DOS 5.0+,NetWare4) too many waiting on mutex 99h (153) (DOS 5.0+,NetWare4) invalid list format 9Ah (154) (DOS 5.0+,NetWare4) volume label too large 9Bh (155) (DOS 5.0+,NetWare4) unable to create another TCB 9Ch (156) (DOS 5.0+,NetWare4) signal refused 9Dh (157) (DOS 5.0+,NetWare4) segment discarded 9Eh (158) (DOS 5.0+,NetWare4) segment not locked 9Fh (159) (DOS 5.0+,NetWare4) invalid thread-ID address ----- A0h (160) (DOS 5.0+) bad arguments A0h (160) (NetWare4) bad environment pointer A1h (161) (DOS 5.0+,NetWare4) invalid pathname passed to EXEC A2h (162) (DOS 5.0+,NetWare4) signal already pending A3h (163) (DOS 5.0+) uncertain media A3h (163) (NetWare4) ERROR_124 mapping A4h (164) (DOS 5.0+) maximum number of threads reached A4h (164) (NetWare4) no more process slots A5h (165) (NetWare4) ERROR_124 mapping B0h (176) (MS-DOS 7.0) volume is not locked B1h (177) (MS-DOS 7.0) volume is locked in drive B2h (178) (MS-DOS 7.0) volume is not removable B4h (180) (MS-DOS 7.0) lock count has been exceeded B4h (180) (NetWare4) invalid segment number B5h (181) (MS-DOS 7.0) a valid eject request failed B5h (181) (DOS 5.0-6.0,NetWare4) invalid call gate B6h (182) (DOS 5.0+,NetWare4) invalid ordinal B7h (183) (DOS 5.0+,NetWare4) shared segment already exists B8h (184) (DOS 5.0+,NetWare4) no child process to wait for B9h (185) (DOS 5.0+,NetWare4) NoWait specified and child still running BAh (186) (DOS 5.0+,NetWare4) invalid flag number BBh (187) (DOS 5.0+,NetWare4) semaphore does not exist BCh (188) (DOS 5.0+,NetWare4) invalid starting code segment BDh (189) (DOS 5.0+,NetWare4) invalid stack segment BEh (190) (DOS 5.0+,NetWare4) invalid module type (DLL can not be used as application) BFh (191) (DOS 5.0+,NetWare4) invalid EXE signature C0h (192) (DOS 5.0+,NetWare4) EXE marked invalid C1h (193) (DOS 5.0+,NetWare4) bad EXE format (e.g. DOS-mode program) C2h (194) (DOS 5.0+,NetWare4) iterated data exceeds 64K C3h (195) (DOS 5.0+,NetWare4) invalid minimum allocation size C4h (196) (DOS 5.0+,NetWare4) dynamic link from invalid Ring C5h (197) (DOS 5.0+,NetWare4) IOPL not enabled C6h (198) (DOS 5.0+,NetWare4) invalid segment descriptor privilege level C7h (199) (DOS 5.0+,NetWare4) automatic data segment exceeds 64K C8h (200) (DOS 5.0+,NetWare4) Ring2 segment must be moveable C9h (201) (DOS 5.0+,NetWare4) relocation chain exceeds segment limit CAh (202) (DOS 5.0+,NetWare4) infinite loop in relocation chain CBh (203) (NetWare4) environment variable not found CCh (204) (NetWare4) not current country CDh (205) (NetWare4) no signal sent CEh (206) (NetWare4) file name not 8.3 CFh (207) (NetWare4) Ring2 stack in use D0h (208) (NetWare4) meta expansion is too long D1h (209) (NetWare4) invalid signal number D2h (210) (NetWare4) inactive thread D3h (211) (NetWare4) file system information not available D4h (212) (NetWare4) locked error D5h (213) (NetWare4) attempted to execute non-family API call in DOS mode D6h (214) (NetWare4) too many modules D7h (215) (NetWare4) nesting not allowed E6h (230) (NetWare4) non-existent pipe, or bad operation E7h (231) (NetWare4) pipe is busy E8h (232) (NetWare4) no data available for nonblocking read E9h (233) (NetWare4) pipe disconnected by server EAh (234) (NetWare4) more data available FFh (255) (NetWare4) invalid drive Values for error class (class field): 01h (1) out of resource (storage space or I/O channels) 02h (2) temporary situation (file or record lock) 03h (3) authorization / permission problem (denied access) 04h (4) internal system error (system software bug) 05h (5) hardware failure 06h (6) system failure (configuration file missing or incorrect) 07h (7) application program error 08h (8) not found 09h (9) bad format 0Ah (10) locked 0Bh (11) media error 0Ch (12) already exists / collision with existing item 0Dh (13) unknown / other 0Eh (14) (undoc) cannot 0Fh (15) (undoc) time Values for suggested action (action field): 01h retry 02h delayed retry (after pause) 03h prompt user to reenter input 04h abort after cleanup 05h immediate abort ("panic") 06h ignore 07h retry after user intervention Values for error locus (locus field): 01h unknown or not appropriate 02h block device (disk error) 03h network related 04h serial device (timeout) 04h (PTS-DOS 6.51+ & S/DOS 1.0+) character device 05h memory related Return Value Returns with the extended error code.
-
Laut MSDN:
EINVAL Invalid argument 22
Was ist zB rego? Stimmen alle zugewiesenen Werte?
MfG SideWinder
-
Ehrlich gesagt zweifle ich daran, dass int86 überhaupt errno und so belegt. Der Fehlerstatus ist nämlich bei jedem Interrupt anders codiert, und Int 15h ist nichtmal ein DOS-Interrupt.
Was für eine Funktion soll das denn genau sein?
-
15h sind AT-Funktionen.
http://www.datasource.de/programmierung/tab12_biosint15h.htmMfG SideWinder
-
Da ist aber keine mit AH=0x51 dabei. In Ralf Brown's (sp?) Interruptliste sind zwei mit 0x51 dabei, aber eine davon wertet AL nicht aus, und die andere braucht AL=0x1.
Anyway, int86 setzt höchstwahrscheinlich errno und _doserrno nicht.
-
aber er setzt doch extra errno auf 0
-
Sehe ich auch so. Wenn er vorher errno auf 0 setzt und nachher einen Fehler erhält und in errno eine Fehlerkonstante steht muss die irgendjemand gesetzt haben!
Allerdings glaube ich auch, dass mit den Werten die an int86() übergeben werden irgendetwas nicht stimmen kann (deswegen auch Fehlerkonstante EINVAL). Da wird Bashar schon recht haben. Kontrolliere das nochmal alles AJ!
MfG SideWinder
-
DOS liefert den Fehlercode normalerweise so zurück:
- Carry-Flag ist gesetzt um einen Fehler anzuzeigen
- AX-Register enthält den Fehlercode
Nun ist nicht jeder Interrupt auf dieser Welt von DOS, auch wenn sich vielleicht einige andere an die gleiche Konvention halten. Auf jeden Fall setzt int86 die Variable _doserrno, wenn das Carry-Flag gesetzt ist, auf den Inhalt von AX. Unabhängig davon, ob die Funktion tatsächlich so den Fehlerstatus anzeigt, das kann int86 ja nicht wissen.
Die dort aufgerufene Funktion ist definitiv nicht "well-known", daher müßte man mal die Doku der entsprechenden API sehen, was die Fehlercodes bedeuten.
-
Der Interrupt soll auf einem Gerät den Comport ändern. Ist jetzt etwas zu kompliziert zu erklären und eigenltich unwichtig.
Wichtig ist, dass das kein Standard-Interrupt ist. Anscheinend ist da noch ein Fehler in den BIOS-Routinen des Herrstellers des Geräts, wo der Interrupt greifen soll.
Jetzt weiß ich wenigstens warum in _doserrno so eine komische Fehlernummer steht.
Verstehe nur nicht, warum nicht das richtige zurückgeliefert wird. Die Auswirkung des Interruptaufrufs kann man ja erkennen. Manchmal klappts, manchmal nicht und im cflag steht immer ein Fehler. Irgendwie hab ich das Gefühl, dass noch ein Parameter in BX fehlt, aber leider gibts da keine Angaben dazu :(.
Ich danke euch auf jeden Fall.