void mount(struct HDTBPartition *table, struct PartitionHandle *ph, STRPTR name, struct DosEnvec *de) { struct ExpansionBase *ExpansionBase; struct DeviceNode *dn; struct DosEnvec *nde; IPTR *params; ULONG i; D(bug("[HDToolBox] mount('%s')\n", name)); #error "TODO: pass DOS device name in params[0] and set handler name manually" #warning "TODO: get filesystem" if ((de->de_DosType & 0xFFFFFF00) == BBNAME_DOS) { ExpansionBase = (struct ExpansionBase *)OpenLibrary("expansion.library",41); if (ExpansionBase) { params = (IPTR *)AllocVec(sizeof(struct DosEnvec)+sizeof(IPTR)*4, MEMF_PUBLIC | MEMF_CLEAR); if (params) { nde = (struct DosEnvec *)¶ms[4]; CopyMem(de, nde, sizeof(struct DosEnvec)); params[0] = (IPTR)"afs.handler"; params[1] = (IPTR)table->hd->devname; params[2] = (IPTR)table->hd->unit; params[3] = 0; i = getOffset(ph->root); nde->de_LowCyl += i; nde->de_HighCyl += i; dn = MakeDosNode(params); if (dn) { dn->dn_Name = MKBADDR(AllocVec(AROS_BSTR_MEMSIZE4LEN(strlen(name)), MEMF_PUBLIC)); dn->dn_Ext.dn_AROS.dn_DevName = AROS_BSTR_ADDR(dn->dn_Name); i = 0; do { AROS_BSTR_putchar(dn->dn_Name, i, name[i]); } while (name[i++]); AROS_BSTR_setstrlen(dn->dn_Name, i-1); AddDosNode(nde->de_BootPri, ADNF_STARTPROC, dn); } else FreeVec(params); } CloseLibrary((struct Library *)ExpansionBase); } } else kprintf("ignored %s: unknown FS (0x%lx)\n", name, de->de_DosType); }
/* Add a bootnode using expansion.library */ BOOL ata_RegisterVolume(ULONG StartCyl, ULONG EndCyl, struct ata_Unit *unit) { struct ExpansionBase *ExpansionBase; struct DeviceNode *devnode; TEXT dosdevname[4] = "HD0"; const ULONG IdDOS = AROS_MAKE_ID('D','O','S','\001'); const ULONG IdCDVD = AROS_MAKE_ID('C','D','V','D'); ExpansionBase = (struct ExpansionBase *)OpenLibrary("expansion.library", 40L); if (ExpansionBase) { IPTR pp[24]; /* This should be dealt with using some sort of volume manager or such. */ switch (unit->au_DevType) { case DG_DIRECT_ACCESS: break; case DG_CDROM: dosdevname[0] = 'C'; break; default: D(bug("[ATA>>]:-ata_RegisterVolume called on unknown devicetype\n")); } if (unit->au_UnitNum < 10) dosdevname[2] += unit->au_UnitNum % 10; else dosdevname[2] = 'A' - 10 + unit->au_UnitNum; pp[0] = (IPTR)dosdevname; pp[1] = (IPTR)MOD_NAME_STRING; pp[2] = unit->au_UnitNum; pp[DE_TABLESIZE + 4] = DE_BOOTBLOCKS; pp[DE_SIZEBLOCK + 4] = 1 << (unit->au_SectorShift - 2); pp[DE_NUMHEADS + 4] = unit->au_Heads; pp[DE_SECSPERBLOCK + 4] = 1; pp[DE_BLKSPERTRACK + 4] = unit->au_Sectors; pp[DE_RESERVEDBLKS + 4] = 2; pp[DE_LOWCYL + 4] = StartCyl; pp[DE_HIGHCYL + 4] = EndCyl; pp[DE_NUMBUFFERS + 4] = 10; pp[DE_BUFMEMTYPE + 4] = MEMF_PUBLIC | MEMF_31BIT; pp[DE_MAXTRANSFER + 4] = 0x00200000; pp[DE_MASK + 4] = 0x7FFFFFFE; pp[DE_BOOTPRI + 4] = ((unit->au_DevType == DG_DIRECT_ACCESS) ? 0 : 10); pp[DE_DOSTYPE + 4] = ((unit->au_DevType == DG_DIRECT_ACCESS) ? IdDOS : IdCDVD); pp[DE_CONTROL + 4] = 0; pp[DE_BOOTBLOCKS + 4] = 2; devnode = MakeDosNode(pp); if (devnode) { D(bug("[ATA>>]:-ata_RegisterVolume: '%b', type=0x%08lx with StartCyl=%d, EndCyl=%d .. ", devnode->dn_Name, pp[DE_DOSTYPE + 4], StartCyl, EndCyl)); AddBootNode(pp[DE_BOOTPRI + 4], ADNF_STARTPROC, devnode, NULL); D(bug("done\n")); return TRUE; } CloseLibrary((struct Library *)ExpansionBase); } return FALSE; }