Fix wrong LVO offsets in the exec and dos tables

exec.library: Forbid, Permit, Disable and Enable were in the wrong
slots. Forbid/Permit move to -132/-138 and Disable/Enable to -120/-126.

dos.library: the table left out six private vectors but kept counting
as though they were not there, so every row after a missing one was
shifted, ending 36 bytes out. Restores ClearVec (-162), NoReqLoadSeg
(-168), Cli (-492), DosNameFromAnchor (-852), PathPart (-876) and
CliInit (-924) and realigns the rest.

Also fixes copies of the same wrong exec values, plus several wrong dos
offsets, in api_call_identification.md and setfunction_patching.md.

Checked against ADCD 2.1 References/Function.offs. V39 names in the
exec table (CreatePool, CachePreDMA, AddMemHandler and so on) are left
as they were, since they are more current than ADCD 2.0.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Duncan Bowring 2026-09-20 10:29:12 -04:00
parent c6f6253ea0
commit ebb2dbeef7
No known key found for this signature in database
GPG key ID: 6D5A1BFAD252A5B4
4 changed files with 190 additions and 182 deletions

View file

@ -53,7 +53,7 @@ APTR SetFunction(struct Library *library, LONG funcOffset, APTR newFunction);
; Example: hook dos.library Write() at LVO -48 ; Example: hook dos.library Write() at LVO -48
MOVEA.L _SysBase, A6 MOVEA.L _SysBase, A6
JSR (-120,A6) ; Forbid() — prevent preemption during patch JSR (-132,A6) ; Forbid() — prevent preemption during patch
MOVEA.L _DOSBase, A1 MOVEA.L _DOSBase, A1
MOVE.L #-48, A0 ; LVO for Write MOVE.L #-48, A0 ; LVO for Write
@ -61,7 +61,7 @@ APTR SetFunction(struct Library *library, LONG funcOffset, APTR newFunction);
JSR (-420,A6) ; SetFunction(DOSBase, -48, &my_write) JSR (-420,A6) ; SetFunction(DOSBase, -48, &my_write)
MOVE.L D0, _orig_write ; save original function pointer MOVE.L D0, _orig_write ; save original function pointer
JSR (-126,A6) ; Permit() JSR (-138,A6) ; Permit()
``` ```
### C equivalent: ### C equivalent:

View file

@ -216,45 +216,49 @@ So immediately before the JSR:
| −48 | 48 | `Write` | D1=handle, D2=buf, D3=len | D0=actual | | −48 | 48 | `Write` | D1=handle, D2=buf, D3=len | D0=actual |
| −54 | 54 | `Input` | — | D0=stdin handle | | −54 | 54 | `Input` | — | D0=stdin handle |
| −60 | 60 | `Output` | — | D0=stdout handle | | −60 | 60 | `Output` | — | D0=stdout handle |
| −66 | 66 | `IoErr` | — | D0=last error code | | −66 | 66 | `Seek` | D1=file, D2=pos, D3=mode | D0=old pos |
| −78 | 78 | `CreateDir` | D1=name | D0=lock | | −72 | 72 | `DeleteFile` | D1=name | D0=bool |
| −84 | 84 | `CurrentDir` | D1=lock | D0=old lock | | −78 | 78 | `Rename` | D1=old, D2=new | D0=bool |
| −90 | 90 | `Lock` | D1=name, D2=mode | D0=lock | | −84 | 84 | `Lock` | D1=name, D2=mode | D0=lock |
| −96 | 96 | `UnLock` | D1=lock | — | | −90 | 90 | `UnLock` | D1=lock | — |
| −102 | 102 | `DupLock` | D1=lock | D0=new lock | | −96 | 96 | `DupLock` | D1=lock | D0=new lock |
| −108 | 108 | `Examine` | D1=lock, D2=fib | D0=bool | | −102 | 102 | `Examine` | D1=lock, D2=fib | D0=bool |
| −120 | 120 | `ExNext` | D1=lock, D2=fib | D0=bool | | −108 | 108 | `ExNext` | D1=lock, D2=fib | D0=bool |
| −126 | 126 | `Info` | D1=lock, D2=infoblock | D0=bool | | −114 | 114 | `Info` | D1=lock, D2=infoblock | D0=bool |
| −132 | 132 | `Execute` | D1=string, D2=input, D3=output | D0=bool | | −120 | 120 | `CreateDir` | D1=name | D0=lock |
| −138 | 138 | `Delay` | D1=ticks | — | | −126 | 126 | `CurrentDir` | D1=lock | D0=old lock |
| −144 | 144 | `DateStamp` | D1=datestamp | D0=datestamp | | −132 | 132 | `IoErr` | — | D0=last error code |
| −150 | 150 | `Exit` | D1=returnCode | — | | −138 | 138 | `CreateProc` | D1=name, D2=pri, D3=seglist, D4=stack | D0=port |
| −156 | 156 | `LoadSeg` | D1=name | D0=seglist | | −144 | 144 | `Exit` | D1=returnCode | — |
| −162 | 162 | `UnLoadSeg` | D1=seglist | — | | −150 | 150 | `LoadSeg` | D1=name | D0=seglist |
| −156 | 156 | `UnLoadSeg` | D1=seglist | — |
| −192 | 192 | `DateStamp` | D1=datestamp | D0=datestamp |
| −198 | 198 | `Delay` | D1=ticks | — |
| −222 | 222 | `Execute` | D1=string, D2=input, D3=output | D0=bool |
## Quick LVO Reference: exec.library (selected) ## Quick LVO Reference: exec.library (selected)
| LVO | Bias | Function | Args | Return | | LVO | Bias | Function | Args | Return |
|---|---|---|---|---| |---|---|---|---|---|
| −6 | 6 | `Supervisor` | A5=func | — | | −30 | 30 | `Supervisor` | A5=func | — |
| −120 | 120 | `Forbid` | — | — | | −120 | 120 | `Disable` | — | — |
| −126 | 126 | `Permit` | — | — | | −126 | 126 | `Enable` | — | — |
| −132 | 132 | `Disable` | — | — | | −132 | 132 | `Forbid` | — | — |
| −138 | 138 | `Enable` | — | — | | −138 | 138 | `Permit` | — | — |
| −168 | 168 | `FindTask` | A1=name | D0=task |
| −174 | 174 | `SetTaskPri` | A1=task, D0=pri | D0=old |
| −192 | 192 | `Signal` | A1=task, D0=signals | — |
| −198 | 198 | `AllocMem` | D0=size, D1=attrs | D0=ptr | | −198 | 198 | `AllocMem` | D0=size, D1=attrs | D0=ptr |
| −210 | 210 | `FreeMem` | A1=ptr, D0=size | — | | −210 | 210 | `FreeMem` | A1=ptr, D0=size | — |
| −234 | 234 | `Wait` | D0=signals | D0=set |
| −270 | 270 | `AddPort` | A1=port | — |
| −276 | 276 | `FindName` | A0=list, A1=name | D0=node | | −276 | 276 | `FindName` | A0=list, A1=name | D0=node |
| −378 | 378 | `PutMsg` | A0=port, A1=msg | — | | −294 | 294 | `FindTask` | A1=name | D0=task |
| −384 | 384 | `GetMsg` | A0=port | D0=msg | | −300 | 300 | `SetTaskPri` | A1=task, D0=pri | D0=old |
| −408 | 408 | `WaitPort` | A0=port | D0=msg | | −318 | 318 | `Wait` | D0=signals | D0=set |
| −324 | 324 | `Signal` | A1=task, D0=signals | — |
| −354 | 354 | `AddPort` | A1=port | — |
| −366 | 366 | `PutMsg` | A0=port, A1=msg | — |
| −372 | 372 | `GetMsg` | A0=port | D0=msg |
| −384 | 384 | `WaitPort` | A0=port | D0=msg |
| −414 | 414 | `CloseLibrary` | A1=lib | — |
| −420 | 420 | `SetFunction` | A1=lib, A0=lvo, D0=func | D0=old | | −420 | 420 | `SetFunction` | A1=lib, A0=lvo, D0=func | D0=old |
| −552 | 552 | `OpenLibrary` | A1=name, D0=ver | D0=base | | −552 | 552 | `OpenLibrary` | A1=name, D0=ver | D0=base |
| −558 | 558 | `CloseLibrary` | A1=lib | — |
Full tables: [[lvo_table.md](../../04_linking_and_libraries/lvo_table.md)](../../../04_linking_and_libraries/lvo_table.md) Full tables: [[lvo_table.md](../../04_linking_and_libraries/lvo_table.md)](../../../04_linking_and_libraries/lvo_table.md)
@ -267,16 +271,17 @@ Full tables: [[lvo_table.md](../../04_linking_and_libraries/lvo_table.md)](../..
import idaapi, idc, idautils import idaapi, idc, idautils
DOS_LVO = { DOS_LVO = {
-30: "Open", -36: "Close", -42: "Read", -48: "Write", -30: "Open", -36: "Close", -42: "Read", -48: "Write",
-54: "Input", -60: "Output", -66: "IoErr", -132: "Execute", -54: "Input", -60: "Output", -66: "Seek", -132: "IoErr",
-138: "Delay", -156: "LoadSeg",-162: "UnLoadSeg", -138: "CreateProc", -150: "LoadSeg", -156: "UnLoadSeg",
-198: "Delay", -222: "Execute",
} }
EXEC_LVO = { EXEC_LVO = {
-120: "Forbid", -126: "Permit", -132: "Disable", -138: "Enable", -120: "Disable", -126: "Enable", -132: "Forbid", -138: "Permit",
-198: "AllocMem", -210: "FreeMem",-234: "Wait", -198: "AllocMem",-210: "FreeMem", -318: "Wait",
-378: "PutMsg", -384: "GetMsg", -408: "WaitPort", -366: "PutMsg", -372: "GetMsg", -378: "ReplyMsg", -384: "WaitPort",
-420: "SetFunction", -552: "OpenLibrary", -558: "CloseLibrary", -414: "CloseLibrary", -420: "SetFunction", -552: "OpenLibrary",
} }
def apply_lvos(lib_global_name, lvo_map): def apply_lvos(lib_global_name, lvo_map):
@ -369,17 +374,17 @@ elif get_name(global_ptr) == "_GfxBase":
MOVEA.L 4.W, A6 ; exec base — but this is never used MOVEA.L 4.W, A6 ; exec base — but this is never used
MOVEA.L (_DOSBase).L, A6 ; A6 overwritten with DOS base MOVEA.L (_DOSBase).L, A6 ; A6 overwritten with DOS base
JSR (-552,A6) ; WRONG assumption: this is NOT exec OpenLibrary JSR (-552,A6) ; WRONG assumption: this is NOT exec OpenLibrary
; Correct: LVO -552 for dos.library is ExAll ; Correct: LVO -552 for dos.library is MaxCli
``` ```
**Why it fails:** The disassembler shows `JSR (-552,A6)` and annotates it as `exec.library OpenLibrary()` because that's the most common match. But A6 was reloaded with `_DOSBase` — the actual call is `dos.library ExAll()` at LVO `-552`. Same LVO, different library, completely different behavior. **Why it fails:** The disassembler shows `JSR (-552,A6)` and annotates it as `exec.library OpenLibrary()` because that's the most common match. But A6 was reloaded with `_DOSBase` — the actual call is `dos.library MaxCli()` at LVO `-552`. Same LVO, different library, completely different behavior.
**Correct:** Track A6's value at every `JSR`. Never assume A6 is static across a function. **Correct:** Track A6's value at every `JSR`. Never assume A6 is static across a function.
```asm ```asm
MOVEA.L 4.W, A6 ; A6 = SysBase (verified: exec at $4) MOVEA.L 4.W, A6 ; A6 = SysBase (verified: exec at $4)
MOVEA.L (_DOSBase).L, A6 ; A6 = DOSBase (verified: global labeled) MOVEA.L (_DOSBase).L, A6 ; A6 = DOSBase (verified: global labeled)
JSR (-552,A6) ; LVO -552 in dos.library = ExAll JSR (-552,A6) ; LVO -552 in dos.library = MaxCli
``` ```
### 3. \"The Stale Base\" ### 3. \"The Stale Base\"
@ -393,7 +398,7 @@ if (result)
DOSBase->DoSometime(); // DOSBase is now stale — crash or call into freed memory DOSBase->DoSometime(); // DOSBase is now stale — crash or call into freed memory
``` ```
In disassembly, you see `JSR (-N,A6)` after a `JSR (-558,A6)` (CloseLibrary). A6 becomes a dangling pointer. Any subsequent call through it hits freed memory — a crash or, worse, silent corruption. In disassembly, you see `JSR (-N,A6)` after a `JSR (-414,A6)` (CloseLibrary). A6 becomes a dangling pointer. Any subsequent call through it hits freed memory — a crash or, worse, silent corruption.
**Correct:** After `CloseLibrary`, zero the base pointer. In the disassembly, flag any `JSR` that follows a `CloseLibrary` sequence as suspicious. **Correct:** After `CloseLibrary`, zero the base pointer. In the disassembly, flag any `JSR` that follows a `CloseLibrary` sequence as suspicious.
@ -457,9 +462,9 @@ To identify every file open/read/write/close in a binary:
### Trace an Unknown Message Flow ### Trace an Unknown Message Flow
1. Find `JSR (-378,A6)` (exec PutMsg) — identifies message senders 1. Find `JSR (-366,A6)` (exec PutMsg) — identifies message senders
2. Find `JSR (-384,A6)` (exec GetMsg) — identifies message receivers 2. Find `JSR (-372,A6)` (exec GetMsg) — identifies message receivers
3. Find `JSR (-408,A6)` (exec WaitPort) — identifies blocking receivers 3. Find `JSR (-384,A6)` (exec WaitPort) — identifies blocking receivers
4. Trace `A0` before each `PutMsg` to identify **which port** the message targets 4. Trace `A0` before each `PutMsg` to identify **which port** the message targets
5. Trace `A0` before each `GetMsg` to identify **which port** the receiver listens on 5. Trace `A0` before each `GetMsg` to identify **which port** the receiver listens on
6. If sender and receiver port names match, you've found a communication pair 6. If sender and receiver port names match, you've found a communication pair

View file

@ -28,139 +28,142 @@
| −144 | 144 | Exit | | −144 | 144 | Exit |
| −150 | 150 | LoadSeg | | −150 | 150 | LoadSeg |
| −156 | 156 | UnLoadSeg | | −156 | 156 | UnLoadSeg |
| −162 | 162 | DeviceProc (private) | | −162 | 162 | ClearVec (private) |
| −168 | 168 | SetComment | | −168 | 168 | NoReqLoadSeg (private) |
| −174 | 174 | SetProtection | | −174 | 174 | DeviceProc |
| −180 | 180 | DateStamp | | −180 | 180 | SetComment |
| −186 | 186 | Delay | | −186 | 186 | SetProtection |
| −192 | 192 | WaitForChar | | −192 | 192 | DateStamp |
| −198 | 198 | ParentDir | | −198 | 198 | Delay |
| −204 | 204 | IsInteractive | | −204 | 204 | WaitForChar |
| −210 | 210 | Execute | | −210 | 210 | ParentDir |
| −216 | 216 | AllocDosObject | | −216 | 216 | IsInteractive |
| −222 | 222 | FreeDosObject | | −222 | 222 | Execute |
| −228 | 228 | DoPkt | | −228 | 228 | AllocDosObject |
| −234 | 234 | SendPkt | | −234 | 234 | FreeDosObject |
| −240 | 240 | WaitPkt | | −240 | 240 | DoPkt |
| −246 | 246 | ReplyPkt | | −246 | 246 | SendPkt |
| −252 | 252 | AbortPkt | | −252 | 252 | WaitPkt |
| −258 | 258 | LockRecord | | −258 | 258 | ReplyPkt |
| −264 | 264 | LockRecords | | −264 | 264 | AbortPkt |
| −270 | 270 | UnLockRecord | | −270 | 270 | LockRecord |
| −276 | 276 | UnLockRecords | | −276 | 276 | LockRecords |
| −282 | 282 | SelectInput | | −282 | 282 | UnLockRecord |
| −288 | 288 | SelectOutput | | −288 | 288 | UnLockRecords |
| −294 | 294 | FGetC | | −294 | 294 | SelectInput |
| −300 | 300 | FPutC | | −300 | 300 | SelectOutput |
| −306 | 306 | UnGetC | | −306 | 306 | FGetC |
| −312 | 312 | FRead | | −312 | 312 | FPutC |
| −318 | 318 | FWrite | | −318 | 318 | UnGetC |
| −324 | 324 | FGets | | −324 | 324 | FRead |
| −330 | 330 | FPuts | | −330 | 330 | FWrite |
| −336 | 336 | VFWritef | | −336 | 336 | FGets |
| −342 | 342 | VFPrintf | | −342 | 342 | FPuts |
| −348 | 348 | Flush | | −348 | 348 | VFWritef |
| −354 | 354 | SetVBuf | | −354 | 354 | VFPrintf |
| −360 | 360 | DupLockFromFH | | −360 | 360 | Flush |
| −366 | 366 | OpenFromLock | | −366 | 366 | SetVBuf |
| −372 | 372 | ParentOfFH | | −372 | 372 | DupLockFromFH |
| −378 | 378 | ExamineFH | | −378 | 378 | OpenFromLock |
| −384 | 384 | SetFileDate | | −384 | 384 | ParentOfFH |
| −390 | 390 | NameFromLock | | −390 | 390 | ExamineFH |
| −396 | 396 | NameFromFH | | −396 | 396 | SetFileDate |
| −402 | 402 | SplitName | | −402 | 402 | NameFromLock |
| −408 | 408 | SameLock | | −408 | 408 | NameFromFH |
| −414 | 414 | SetMode | | −414 | 414 | SplitName |
| −420 | 420 | ExAll | | −420 | 420 | SameLock |
| −426 | 426 | ReadLink | | −426 | 426 | SetMode |
| −432 | 432 | MakeLink | | −432 | 432 | ExAll |
| −438 | 438 | ChangeMode | | −438 | 438 | ReadLink |
| −444 | 444 | SetFileSize | | −444 | 444 | MakeLink |
| −450 | 450 | SetIoErr | | −450 | 450 | ChangeMode |
| −456 | 456 | Fault | | −456 | 456 | SetFileSize |
| −462 | 462 | PrintFault | | −462 | 462 | SetIoErr |
| −468 | 468 | ErrorReport | | −468 | 468 | Fault |
| −474 | 474 | Cli (private) | | −474 | 474 | PrintFault |
| −480 | 480 | CreateNewProc | | −480 | 480 | ErrorReport |
| −486 | 486 | RunCommand | | −492 | 492 | Cli |
| −492 | 492 | GetConsoleTask | | −498 | 498 | CreateNewProc |
| −498 | 498 | SetConsoleTask | | −504 | 504 | RunCommand |
| −504 | 504 | GetFileSysTask | | −510 | 510 | GetConsoleTask |
| −510 | 510 | SetFileSysTask | | −516 | 516 | SetConsoleTask |
| −516 | 516 | GetArgStr | | −522 | 522 | GetFileSysTask |
| −522 | 522 | SetArgStr | | −528 | 528 | SetFileSysTask |
| −528 | 528 | FindCliProc | | −534 | 534 | GetArgStr |
| −534 | 534 | MaxCli | | −540 | 540 | SetArgStr |
| −540 | 540 | SetCurrentDirName | | −546 | 546 | FindCliProc |
| −546 | 546 | GetCurrentDirName | | −552 | 552 | MaxCli |
| −552 | 552 | SetProgramName | | −558 | 558 | SetCurrentDirName |
| −558 | 558 | GetProgramName | | −564 | 564 | GetCurrentDirName |
| −564 | 564 | SetPrompt | | −570 | 570 | SetProgramName |
| −570 | 570 | GetPrompt | | −576 | 576 | GetProgramName |
| −576 | 576 | SetProgramDir | | −582 | 582 | SetPrompt |
| −582 | 582 | GetProgramDir | | −588 | 588 | GetPrompt |
| −588 | 588 | SystemTagList | | −594 | 594 | SetProgramDir |
| −594 | 594 | AssignLock | | −600 | 600 | GetProgramDir |
| −600 | 600 | AssignLate | | −606 | 606 | SystemTagList |
| −606 | 606 | AssignPath | | −612 | 612 | AssignLock |
| −612 | 612 | AssignAdd | | −618 | 618 | AssignLate |
| −618 | 618 | RemAssignList | | −624 | 624 | AssignPath |
| −624 | 624 | GetDeviceProc | | −630 | 630 | AssignAdd |
| −630 | 630 | FreeDeviceProc | | −636 | 636 | RemAssignList |
| −636 | 636 | LockDosList | | −642 | 642 | GetDeviceProc |
| −642 | 642 | UnLockDosList | | −648 | 648 | FreeDeviceProc |
| −648 | 648 | AttemptLockDosList | | −654 | 654 | LockDosList |
| −654 | 654 | RenameDosEntry | | −660 | 660 | UnLockDosList |
| −660 | 660 | AddDosEntry | | −666 | 666 | AttemptLockDosList |
| −666 | 666 | RemDosEntry | | −672 | 672 | RemDosEntry |
| −672 | 672 | FindDosEntry | | −678 | 678 | AddDosEntry |
| −678 | 678 | NextDosEntry | | −684 | 684 | FindDosEntry |
| −684 | 684 | MakeDosEntry | | −690 | 690 | NextDosEntry |
| −690 | 690 | FreeDosEntry | | −696 | 696 | MakeDosEntry |
| −696 | 696 | IsFileSystem | | −702 | 702 | FreeDosEntry |
| −702 | 702 | Format | | −708 | 708 | IsFileSystem |
| −708 | 708 | Relabel | | −714 | 714 | Format |
| −714 | 714 | Inhibit | | −720 | 720 | Relabel |
| −720 | 720 | AddBuffers | | −726 | 726 | Inhibit |
| −726 | 726 | CompareDates | | −732 | 732 | AddBuffers |
| −732 | 732 | DateToStr | | −738 | 738 | CompareDates |
| −738 | 738 | StrToDate | | −744 | 744 | DateToStr |
| −744 | 744 | InternalLoadSeg | | −750 | 750 | StrToDate |
| −750 | 750 | InternalUnLoadSeg | | −756 | 756 | InternalLoadSeg |
| −756 | 756 | NewLoadSeg | | −762 | 762 | InternalUnLoadSeg |
| −762 | 762 | AddSegment | | −768 | 768 | NewLoadSeg |
| −768 | 768 | FindSegment | | −774 | 774 | AddSegment |
| −774 | 774 | RemSegment | | −780 | 780 | FindSegment |
| −780 | 780 | CheckSignal | | −786 | 786 | RemSegment |
| −786 | 786 | ReadArgs | | −792 | 792 | CheckSignal |
| −792 | 792 | FindArg | | −798 | 798 | ReadArgs |
| −798 | 798 | ReadItem | | −804 | 804 | FindArg |
| −804 | 804 | StrToLong | | −810 | 810 | ReadItem |
| −810 | 810 | MatchFirst | | −816 | 816 | StrToLong |
| −816 | 816 | MatchNext | | −822 | 822 | MatchFirst |
| −822 | 822 | MatchEnd | | −828 | 828 | MatchNext |
| −828 | 828 | ParsePattern | | −834 | 834 | MatchEnd |
| −834 | 834 | MatchPattern | | −840 | 840 | ParsePattern |
| −840 | 840 | FreeArgs | | −846 | 846 | MatchPattern |
| −846 | 846 | FilePart | | −852 | 852 | DosNameFromAnchor (private) |
| −852 | 852 | PathPart | | −858 | 858 | FreeArgs |
| −858 | 858 | AddPart | | −870 | 870 | FilePart |
| −864 | 864 | StartNotify | | −876 | 876 | PathPart |
| −870 | 870 | EndNotify | | −882 | 882 | AddPart |
| −876 | 876 | SetVar | | −888 | 888 | StartNotify |
| −882 | 882 | GetVar | | −894 | 894 | EndNotify |
| −888 | 888 | DeleteVar | | −900 | 900 | SetVar |
| −894 | 894 | FindVar | | −906 | 906 | GetVar |
| −900 | 900 | CliInitNewcli (private) | | −912 | 912 | DeleteVar |
| −906 | 906 | CliInitRun (private) | | −918 | 918 | FindVar |
| −912 | 912 | WriteChars | | −924 | 924 | CliInit |
| −918 | 918 | PutStr | | −930 | 930 | CliInitNewcli |
| −924 | 924 | VPrintf | | −936 | 936 | CliInitRun |
| −930 | 930 | ParsePatternNoCase | | −942 | 942 | WriteChars |
| −936 | 936 | MatchPatternNoCase | | −948 | 948 | PutStr |
| −942 | 942 | SameDevice (private) | | −954 | 954 | VPrintf |
| −948 | 948 | ExAllEnd | | −966 | 966 | ParsePatternNoCase |
| −954 | 954 | SetOwner | | −972 | 972 | MatchPatternNoCase |
| −978 | 978 | DosGetString (private) |
| −984 | 984 | SameDevice |
| −990 | 990 | SetOwner |
--- ---

View file

@ -21,10 +21,10 @@
| −102 | 102 | InitResident | | −102 | 102 | InitResident |
| −108 | 108 | Alert | | −108 | 108 | Alert |
| −114 | 114 | Debug | | −114 | 114 | Debug |
| −120 | 120 | Forbid | | −120 | 120 | Disable |
| −126 | 126 | Permit | | −126 | 126 | Enable |
| −132 | 132 | Disable | | −132 | 132 | Forbid |
| −138 | 138 | Enable | | −138 | 138 | Permit |
| −144 | 144 | SetSR | | −144 | 144 | SetSR |
| −150 | 150 | SuperState | | −150 | 150 | SuperState |
| −156 | 156 | UserState | | −156 | 156 | UserState |