示例#1
0
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 *)&params[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);
}
示例#2
0
文件: ata_init.c 项目: michalsc/AROS
/* 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;
}