mirror of
https://github.com/alfishe/amiga-bootcamp.git
synced 2026-06-12 16:16:28 +00:00
94 lines
3.2 KiB
Markdown
94 lines
3.2 KiB
Markdown
|
|
[← Home](../README.md) · [AmigaDOS](README.md)
|
||
|
|
|
||
|
|
# Packet System — DosPacket, ACTION_* Codes
|
||
|
|
|
||
|
|
## Overview
|
||
|
|
|
||
|
|
AmigaDOS filesystem handlers communicate via **DosPackets** — messages sent to the handler's `MsgPort`. Every file operation (`Open`, `Read`, `Lock`, etc.) is internally translated into an `ACTION_*` packet. Understanding packets is essential for writing custom handlers or intercepting filesystem calls.
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## struct DosPacket
|
||
|
|
|
||
|
|
```c
|
||
|
|
/* dos/dosextens.h — NDK39 */
|
||
|
|
struct DosPacket {
|
||
|
|
struct Message *dp_Link; /* exec message (backlink) */
|
||
|
|
struct MsgPort *dp_Port; /* reply port */
|
||
|
|
LONG dp_Type; /* ACTION_* code */
|
||
|
|
LONG dp_Res1; /* primary result */
|
||
|
|
LONG dp_Res2; /* secondary result (error code) */
|
||
|
|
LONG dp_Arg1; /* argument 1 — type depends on dp_Type */
|
||
|
|
LONG dp_Arg2;
|
||
|
|
LONG dp_Arg3;
|
||
|
|
LONG dp_Arg4;
|
||
|
|
LONG dp_Arg5;
|
||
|
|
LONG dp_Arg6;
|
||
|
|
LONG dp_Arg7;
|
||
|
|
};
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Common ACTION_* Codes
|
||
|
|
|
||
|
|
| Code | Dec | Action | Args |
|
||
|
|
|---|---|---|---|
|
||
|
|
| `ACTION_FINDINPUT` | 1005 | Open for reading | Arg1=FileHandle, Arg2=Lock, Arg3=name(BSTR) |
|
||
|
|
| `ACTION_FINDOUTPUT` | 1006 | Open for writing (create) | same |
|
||
|
|
| `ACTION_FINDUPDATE` | 1004 | Open for r/w | same |
|
||
|
|
| `ACTION_READ` | 82 | Read bytes | Arg1=FH_Arg1, Arg2=buf, Arg3=len |
|
||
|
|
| `ACTION_WRITE` | 87 | Write bytes | Arg1=FH_Arg1, Arg2=buf, Arg3=len |
|
||
|
|
| `ACTION_SEEK` | 1008 | Seek | Arg1=FH_Arg1, Arg2=pos, Arg3=mode |
|
||
|
|
| `ACTION_END` | 1007 | Close file | Arg1=FH_Arg1 |
|
||
|
|
| `ACTION_LOCATE_OBJECT` | 8 | Lock (obtain) | Arg1=dirLock, Arg2=name(BSTR), Arg3=mode |
|
||
|
|
| `ACTION_FREE_LOCK` | 15 | UnLock | Arg1=lock |
|
||
|
|
| `ACTION_EXAMINE_OBJECT` | 23 | Examine (stat) | Arg1=lock, Arg2=FIB(BPTR) |
|
||
|
|
| `ACTION_EXAMINE_NEXT` | 24 | ExNext | Arg1=lock, Arg2=FIB(BPTR) |
|
||
|
|
| `ACTION_PARENT` | 29 | ParentDir | Arg1=lock |
|
||
|
|
| `ACTION_DELETE_OBJECT` | 16 | Delete | Arg1=lock, Arg2=name(BSTR) |
|
||
|
|
| `ACTION_RENAME_OBJECT` | 17 | Rename | Arg1=fromLock, Arg2=fromName, Arg3=toLock, Arg4=toName |
|
||
|
|
| `ACTION_CREATE_DIR` | 22 | CreateDir | Arg1=lock, Arg2=name(BSTR) |
|
||
|
|
| `ACTION_SET_PROTECT` | 21 | SetProtection | Arg1=0, Arg2=lock, Arg3=name(BSTR), Arg4=bits |
|
||
|
|
| `ACTION_DISK_INFO` | 25 | Info | Arg1=InfoData(BPTR) |
|
||
|
|
| `ACTION_IS_FILESYSTEM` | 1027 | Query | (none) → Res1=DOSTRUE if filesystem |
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## Sending a Packet Manually
|
||
|
|
|
||
|
|
```c
|
||
|
|
struct MsgPort *handler = ((struct FileLock *)BADDR(lock))->fl_Task;
|
||
|
|
struct StandardPacket sp;
|
||
|
|
sp.sp_Msg.mn_Node.ln_Name = (char *)&sp.sp_Pkt;
|
||
|
|
sp.sp_Pkt.dp_Link = &sp.sp_Msg;
|
||
|
|
sp.sp_Pkt.dp_Port = CreateMsgPort();
|
||
|
|
sp.sp_Pkt.dp_Type = ACTION_DISK_INFO;
|
||
|
|
sp.sp_Pkt.dp_Arg1 = MKBADDR(infodata);
|
||
|
|
PutMsg(handler, &sp.sp_Msg);
|
||
|
|
WaitPort(sp.sp_Pkt.dp_Port);
|
||
|
|
GetMsg(sp.sp_Pkt.dp_Port);
|
||
|
|
/* sp.sp_Pkt.dp_Res1 = result */
|
||
|
|
DeleteMsgPort(sp.sp_Pkt.dp_Port);
|
||
|
|
```
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## BSTR — BCPL Strings
|
||
|
|
|
||
|
|
Handler packets use **BSTR** for filenames: a BPTR to a length-prefixed string:
|
||
|
|
```
|
||
|
|
[len_byte][char_0][char_1]...[char_n]
|
||
|
|
```
|
||
|
|
- `len_byte` = string length (max 255)
|
||
|
|
- No null terminator
|
||
|
|
- Convert: `UBYTE *bstr = (UBYTE *)BADDR(bstr_bptr); int len = bstr[0]; char *name = &bstr[1];`
|
||
|
|
|
||
|
|
---
|
||
|
|
|
||
|
|
## References
|
||
|
|
|
||
|
|
- NDK39: `dos/dosextens.h`, `dos/dos.h`
|
||
|
|
- ADCD 2.1: `DoPkt`, packet system
|
||
|
|
- *Amiga ROM Kernel Reference Manual: Devices* — filesystem handler chapter
|