Fehlercode 87 in _doserrno



  • Hallo,

    hat einer von euch schon mal diesen Fehlercode in der globalen Variable _doserrno gehabt? Oder weiß irgendjemand was dieser Fehlercode bedeutet?

    Hab schon mit Google gesucht. Bin aber leider bisher nicht fündig geworden :(.



  • Hmm meiner Ansicht nach gibts da ja sogar nur die Nummern 1-18 :D. Wo tritt den der Fehler genau auf? Wo könnte er entstehen?

    MfG SideWinder



  • @Side
    In der errno.h hab ich auch nicht mehr Nummern gefunden 😉

    Der Fehler tritt nach einem Interruptaufruf auf. Entstehen kann der Fehler also nur beim Aufruf des Interrupts (funktion int86()) oder im Programmablauf des Interrupts.



  • 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.htm

    MfG 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:

    1. Carry-Flag ist gesetzt um einen Fehler anzuzeigen
    2. 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.


Anmelden zum Antworten