/* -*- tab-width: 8; c-basic-offset: 4 -*- */
/*
 * DOS interrupt 2fh handler
 *
 *  Cdrom - device driver emulation - Audio features.
 *     Copyright (c) 1998 Petr Tomasek <tomasek@etf.cuni.cz>
 *     Copyright (c) 1999,2002 Eric Pouech
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

#include "config.h"

#include <string.h>

#define NONAMELESSUNION
#define NONAMELESSSTRUCT
#include "ntstatus.h"
#define WIN32_NO_STATUS
#include "wine/winbase16.h"
#include "wine/debug.h"
#include "winternl.h"
#include "winioctl.h"
#include "ntddstor.h"
#include "ntddcdrm.h"
#include "dosexe.h"

WINE_DEFAULT_DEBUG_CHANNEL(int);

/* base WPROCS.DLL ordinal number for VxDs */
#define VXD_BASE 400

static void do_int2f_16( CONTEXT86 *context );
static void MSCDEX_Handler( CONTEXT86 *context );

/**********************************************************************
 *          DOSVM_Int2fHandler (WINEDOS16.147)
 *
 * Handler for int 2fh (multiplex).
 */
void WINAPI DOSVM_Int2fHandler( CONTEXT86 *context )
{
    TRACE("Subfunction 0x%X\n", AX_reg(context));

    switch(AH_reg(context))
    {
    case 0x10:
        SET_AL( context, 0xff ); /* share is installed */
        break;

    case 0x11:  /* Network Redirector / IFSFUNC */
        switch (LOBYTE(context->Eax))
        {
        case 0x00:  /* Install check */
            /* not installed */
            break;
        case 0x80:  /* Enhanced services - Install check */
            /* not installed */
            break;
        default:
           INT_BARF( context, 0x2f );
            break;
        }
        break;

    case 0x12:
        switch (LOBYTE(context->Eax))
        {
        case 0x2e: /* get or set DOS error table address */
            switch (DL_reg(context))
            {
            /* Four tables: even commands are 'get', odd are 'set' */
            /* DOS 5.0+ ignores "set" commands */
            case 0x01:
            case 0x03:
            case 0x05:
            case 0x07:
            case 0x09:
                break;
            /* Instead of having a message table in DOS-space, */
            /* we can use a special case for MS-DOS to force   */
            /* the secondary interface.                               */
            case 0x00:
            case 0x02:
            case 0x04:
            case 0x06:
                context->SegEs = 0x0001;
                SET_DI( context, 0x0000 );
                break;
            case 0x08:
                FIXME("No real-mode handler for errors yet! (bye!)\n");
                break;
            default:
                INT_BARF(context, 0x2f);
            }
            break;
        default:
           INT_BARF(context, 0x2f);
        }
        break;

    case 0x15: /* mscdex */
        MSCDEX_Handler(context);
        break;

    case 0x16:
        do_int2f_16( context );
        break;

    case 0x1a: /* ANSI.SYS / AVATAR.SYS Install Check */
        /* Not supported yet, do nothing */
        break;

    case 0x43:
#if 1
       switch (LOBYTE(context->Eax))
       {
       case 0x00:   /* XMS v2+ installation check */
           WARN("XMS is not fully implemented\n");
           SET_AL( context, 0x80 );
           break;
       case 0x10:   /* XMS v2+ get driver address */
       {
            context->SegEs = DOSVM_dpmi_segments->xms_seg;
            SET_BX( context, 0 );
            break;
       }
       default:
           INT_BARF( context, 0x2f );
       }
#else
       FIXME("check for XMS (not supported)\n");
       SET_AL( context, 0x42 ); /* != 0x80 */
#endif
       break;

    case 0x45:
       switch (LOBYTE(context->Eax))
       {
       case 0x00:
       case 0x01:
       case 0x02:
       case 0x03:
       case 0x04:
       case 0x05:
       case 0x06:
       case 0x07:
       case 0x08:
           /* Microsoft Profiler - not installed */
           break;
       default:
            INT_BARF( context, 0x2f );
       }
       break;

    case 0x4a:
        switch(LOBYTE(context->Eax))
        {
       case 0x10:  /* smartdrv */
           break;  /* not installed */
        case 0x11:  /* dblspace */
            break;  /* not installed */
        case 0x12:  /* realtime compression interface */
            break;  /* not installed */
        case 0x32:  /* patch IO.SYS (???) */
            break;  /* we have no IO.SYS, so we can't patch it :-/ */
        default:
            INT_BARF( context, 0x2f );
        }
        break;
    case 0x4b:
       switch(LOBYTE(context->Eax))
       {
       case 0x01:
       case 0x02:
       case 0x03:
       case 0x04:
       case 0x05:
           FIXME("Task Switcher - not implemented\n");
           break;
       default:
           INT_BARF( context, 0x2f );
       }
       break;
    case 0x56:  /* INTERLNK */
       switch(LOBYTE(context->Eax))
       {
       case 0x01:  /* check if redirected drive */
           SET_AL( context, 0 ); /* not redirected */
           break;
       default:
           INT_BARF( context, 0x2f );
       }
       break;
    case 0x7a:  /* NOVELL NetWare */
        switch (LOBYTE(context->Eax))
        {
       case 0x0:  /* Low-level Netware installation check AL=0 not installed.*/
            SET_AL( context, 0 );
            break;
        case 0x20:  /* Get VLM Call Address */
            /* return nothing -> NetWare not installed */
            break;
        default:
           INT_BARF( context, 0x2f );
            break;
        }
        break;
    case 0xb7:  /* append */
        SET_AL( context, 0 ); /* not installed */
        break;
    case 0xb8:  /* network */
        switch (LOBYTE(context->Eax))
        {
        case 0x00:  /* Install check */
            /* not installed */
            break;
        default:
           INT_BARF( context, 0x2f );
            break;
        }
        break;
    case 0xbc:
	if (AL_reg(context) == 0x00 && BX_reg(context) == 0x3f3f) {
	    /* MVSOUND.SYS - Install check: not installed */
	} else { 
	    INT_BARF( context, 0x2f );
	}
       break;
    case 0xbd:  /* some Novell network install check ??? */
        SET_AX( context, 0xa5a5 ); /* pretend to have Novell IPX installed */
       break;
    case 0xbf:  /* REDIRIFS.EXE */
        switch (LOBYTE(context->Eax))
        {
        case 0x00:  /* Install check */
            /* not installed */
            break;
        default:
           INT_BARF( context, 0x2f );
            break;
        }
        break;
    case 0xd2:
       switch(LOBYTE(context->Eax))
       {
       case 0x01: /* Quarterdeck RPCI - QEMM/QRAM - PCL-838.EXE functions */
           if(BX_reg(context) == 0x5145 && CX_reg(context) == 0x4D4D
             && DX_reg(context) == 0x3432)
               TRACE("Check for QEMM v5.0+ (not installed)\n");
               break;
       default:
           INT_BARF( context, 0x2f );
           break;
       }
       break;
    case 0xd7:  /* Banyan Vines */
        switch (LOBYTE(context->Eax))
        {
        case 0x01:  /* Install check - Get Int Number */
            /* not installed */
            break;
        default:
           INT_BARF( context, 0x2f );
            break;
        }
        break;
    case 0xde:
       switch(LOBYTE(context->Eax))
       {
       case 0x01:   /* Quarterdeck QDPMI.SYS - DESQview */
           if(BX_reg(context) == 0x4450 && CX_reg(context) == 0x4d49
             && DX_reg(context) == 0x8f4f)
               TRACE("Check for QDPMI.SYS (not installed)\n");
               break;
       default:
           INT_BARF( context, 0x2f );
           break;
       }
       break;
    case 0xfa:  /* Watcom debugger check, returns 0x666 if installed */
        break;
    default:
        INT_BARF( context, 0x2f );
        break;
    }
}


/**********************************************************************
 *         do_int2f_16
 */
static void do_int2f_16( CONTEXT86 *context )
{
    DWORD addr;

    switch(LOBYTE(context->Eax))
    {
    case 0x00:  /* Windows enhanced mode installation check */
        SET_AX( context, (GetWinFlags16() & WF_ENHANCED) ? LOWORD(GetVersion16()) : 0 );
        break;

    case 0x0a:  /* Get Windows version and type */
        SET_AX( context, 0 );
        SET_BX( context, (LOWORD(GetVersion16()) << 8) | (LOWORD(GetVersion16()) >> 8) );
        SET_CX( context, (GetWinFlags16() & WF_ENHANCED) ? 3 : 2 );
        break;

    case 0x0b:  /* Identify Windows-aware TSRs */
        /* we don't have any pre-Windows TSRs */
        break;

    case 0x11:  /* Get Shell Parameters - (SHELL= in CONFIG.SYS) */
        /* We can mock this up. But not today... */
        FIXME("Get Shell Parameters\n");
        break;

    case 0x80:  /* Release time-slice */
       /* Linux sched_yield() still keeps burning CPU cycles
        * if the current process is the only one in highest priority list
        * (as Linux will immediately return to this process to waste
        * more CPU cycles), so sched_yield() is essentially useless for us
        * (poor API, if you ask me: its return code should indicate
        * whether other processes did run in between, in order for us
        * to be able to decide whether to do an additional Sleep() or not...)
        * Thus we better unconditionally use a well-balanced Sleep()
        * instead to really make sure the process calling int 0x2f/0x1680
        * *doesn't* use 100% CPU...
        */
       Sleep(55); /* just wait 55ms (one "timer tick") for now. */
       SET_AL( context, 0 );
        break;

    case 0x81: /* Begin critical section.  */
        /* FIXME? */
        break;

    case 0x82: /* End critical section.  */
        /* FIXME? */
        break;

    case 0x83:  /* Return Current Virtual Machine ID */
        /* Virtual Machines are usually created/destroyed when Windows runs
         * DOS programs. Since we never do, we are always in the System VM.
         * According to Ralf Brown's Interrupt List, never return 0. But it
         * seems to work okay (returning 0), just to be sure we return 1.
         */
       SET_BX( context, 1 ); /* VM 1 is probably the System VM */
       break;

    case 0x84:  /* Get device API entry point */
        {
            HMODULE16 mod = GetModuleHandle16("wprocs");
            if (mod < 32) mod = LoadLibrary16( "wprocs" );
            addr = (DWORD)GetProcAddress16( mod, (LPCSTR)(VXD_BASE + BX_reg(context)) );
            if (!addr)  /* not supported */
                ERR("Accessing unknown VxD %04x - Expect a failure now.\n", BX_reg(context) );
            context->SegEs = SELECTOROF(addr);
            SET_DI( context, OFFSETOF(addr) );
        }
       break;

    case 0x86:  /* DPMI detect mode */
        SET_AX( context, 0 );  /* Running under DPMI */
        break;

    case 0x87: /* DPMI installation check */
        {
           SYSTEM_INFO si;
           GetSystemInfo(&si);
           SET_AX( context, 0x0000 ); /* DPMI Installed */
            SET_BX( context, 0x0001 ); /* 32bits available */
            SET_CL( context, si.wProcessorLevel );
            SET_DX( context, 0x005a ); /* DPMI major/minor 0.90 */
            SET_SI( context, 0 );      /* # of para. of DOS extended private data */
            context->SegEs = DOSVM_dpmi_segments->dpmi_seg;
            SET_DI( context, 0 );      /* ES:DI is DPMI switch entry point */
            break;
        }
    case 0x8a:  /* DPMI get vendor-specific API entry point. */
       /* The 1.0 specs say this should work with all 0.9 hosts.  */
       break;

    default:
        INT_BARF( context, 0x2f );
    }
}

/* FIXME: this macro may have to be changed on architectures where <size> reads/writes
 * must be <size> aligned
 * <size> could be WORD, DWORD...
 * in this case, we would need two macros, one for read, the other one for write
 * Note: PTR_AT can be used as an l-value
 */
#define        PTR_AT(_ptr, _ofs, _typ)        (*((_typ*)(((char*)_ptr)+(_ofs))))

/* Use #if 1 if you want full int 2f debug... normal users can leave it at 0 */
#if 0
/**********************************************************************
 *         MSCDEX_Dump                                 [internal]
 *
 * Dumps mscdex requests to int debug channel.
 */
static void    MSCDEX_Dump(char* pfx, BYTE* req, int dorealmode)
{
    int        i;
    BYTE       buf[2048];
    BYTE*      ptr;
    BYTE*      ios;

    ptr = buf;
    ptr += sprintf(ptr, "%s\tCommand => ", pfx);
    for (i = 0; i < req[0]; i++) {
       ptr += sprintf(ptr, "%02x ", req[i]);
    }

    switch (req[2]) {
    case 3:
    case 12:
       ptr += sprintf(ptr, "\n\t\t\t\tIO_struct => ");
       ios = (dorealmode) ? PTR_REAL_TO_LIN( PTR_AT(req, 16, WORD), PTR_AT(req, 14, WORD)) :
                             MapSL(MAKESEGPTR(PTR_AT(req, 16, WORD), PTR_AT(req, 14, WORD)));

       for (i = 0; i < PTR_AT(req, 18, WORD); i++) {
           ptr += sprintf(ptr, "%02x ", ios[i]);
           if ((i & 0x1F) == 0x1F) {
               *ptr++ = '\n';
               *ptr = 0;
           }
       }
       break;
    }
    TRACE("%s\n", buf);
}
#else
#define MSCDEX_Dump(pfx, req, drm)
#endif

#define CDFRAMES_PERSEC                 75
#define CDFRAMES_PERMIN                 (CDFRAMES_PERSEC * 60)
#define FRAME_OF_ADDR(a)        ((a)[1] * CDFRAMES_PERMIN + (a)[2] * CDFRAMES_PERSEC + (a)[3])
#define FRAME_OF_TOC(toc, idx)  FRAME_OF_ADDR((toc).TrackData[idx - (toc).FirstTrack].Address)
#define CTRL_OF_TOC(toc, idx)   (((toc).TrackData[idx - (toc).FirstTrack].Control << 4) | \
                                  (toc).TrackData[idx - (toc).FirstTrack].Adr)

static void    MSCDEX_StoreMSF(DWORD frame, BYTE* val)
{
    val[3] = 0;        /* zero */
    val[2] = frame / CDFRAMES_PERMIN; /* minutes */
    val[1] = (frame / CDFRAMES_PERSEC) % 60; /* seconds */
    val[0] = frame % CDFRAMES_PERSEC; /* frames */
}

static int is_cdrom( int drive)
{
    char root[] = "A:\\";
    root[0] += drive;
    return (GetDriveTypeA(root) == DRIVE_CDROM);
}

static void MSCDEX_Handler(CONTEXT86* context)
{
    int        drive, count;
    char*      p;

    switch (LOBYTE(context->Eax)) {
    case 0x00: /* Installation check */
       /* Count the number of contiguous CDROM drives
        */
       for (drive = count = 0; drive < 26; drive++) {
           if (is_cdrom(drive)) {
               while (is_cdrom(drive + count)) count++;
               break;
           }
       }
       TRACE("Installation check: %d cdroms, starting at %d\n", count, drive);
       SET_BX( context, count );
       SET_CX( context, (drive < 26) ? drive : 0 );
       break;

    case 0x0B: /* drive check */
       SET_AX( context, is_cdrom(CX_reg(context)) );
       SET_BX( context, 0xADAD );
       break;

    case 0x0C: /* get version */
       SET_BX( context, 0x020a );
       TRACE("Version number => %04x\n", BX_reg(context));
       break;

    case 0x0D: /* get drive letters */
       p = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx);
       memset(p, 0, 26);
       for (drive = 0; drive < 26; drive++) {
           if (is_cdrom(drive)) *p++ = drive;
       }
       TRACE("Get drive letters\n");
       break;

    case 0x10: /* direct driver access */
       {
           BYTE*       driver_request;
           BYTE*       io_stru;
           BYTE        Error = 255; /* No Error */
           int         dorealmode = ISV86(context);
            char        devName[] = "\\\\.\\@:";
           HANDLE      h;
            CDROM_TOC                   toc;
            CDROM_SUB_Q_DATA_FORMAT     fmt;
            SUB_Q_CHANNEL_DATA          data;
            DWORD                       br;
            DWORD                       present = TRUE;

           driver_request = CTX_SEG_OFF_TO_LIN(context, context->SegEs, context->Ebx);

           if (!driver_request) {
               /* FIXME - to be deleted ?? */
               ERR("ES:BX==0 ! SEGFAULT ?\n");
               ERR("-->BX=0x%04x, ES=0x%04lx, DS=0x%04lx, CX=0x%04x\n",
                   BX_reg(context), context->SegEs, context->SegDs, CX_reg(context));
               driver_request[4] |= 0x80;
               driver_request[3] = 5;  /* bad request length */
               return;
           }
           /* FIXME
             * the following tests are wrong because lots of functions don't require the
             * tray to be closed with a CD inside
            */
           TRACE("CDROM device driver -> command <%d>\n", (unsigned char)driver_request[2]);

           if (!is_cdrom(CX_reg(context))) {
               WARN("Request made doesn't match a CD ROM drive (%d)\n", CX_reg(context));
               driver_request[4] |= 0x80;
               driver_request[3] = 1;  /* unknown unit */
               return;
           }

           MSCDEX_Dump("Beg", driver_request, dorealmode);

           /* set status to 0 */
           PTR_AT(driver_request, 3, WORD) = 0;
            devName[4] = 'A' + CX_reg(context);
            h = CreateFileA(devName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, 0);
            if (!h) {
               WARN("Couldn't open cdrom handle\n");
               driver_request[4] |= 0x80;
               driver_request[3] = 1;  /* unknown unit */
               return;
           }

            fmt.Format = IOCTL_CDROM_CURRENT_POSITION;
            if (!DeviceIoControl(h, IOCTL_CDROM_READ_TOC, NULL, 0, &toc, sizeof(toc), &br, NULL) ||
                !DeviceIoControl(h, IOCTL_CDROM_READ_Q_CHANNEL, &fmt, sizeof(fmt),
                                 &data, sizeof(data), &br, NULL)) {
                if (GetLastError() == STATUS_NO_MEDIA_IN_DEVICE)
                {
                    if (driver_request[2] != 6 && driver_request[2] != 15)
                    {
                        driver_request[4] |= 0x80;
                        driver_request[3] = 2; /* drive not ready */
                        CloseHandle(h);
                        return;
                    }
                    present = FALSE;
                }
                else
                {
                    driver_request[4] |= 0x80;
                    driver_request[3] = 1;     /* unknown unit */
                    CloseHandle(h);
                    return;
                }
            }

           switch (driver_request[2]) {
           case 3:
               io_stru = (dorealmode) ?
                    PTR_REAL_TO_LIN( PTR_AT(driver_request, 16, WORD), PTR_AT(driver_request, 14, WORD) ) :
                       MapSL( MAKESEGPTR(PTR_AT(driver_request, 16, WORD), PTR_AT(driver_request, 14, WORD)));

               TRACE(" --> IOCTL INPUT <%d>\n", io_stru[0]);
               switch (io_stru[0]) {
#if 0
               case 0: /* Get device Header */
                   {
                       static  LPSTR ptr = 0;
                       if (ptr == 0)   {
                           ptr = SEGPTR_ALLOC(22);
                           PTR_AT(ptr,  0, DWORD) = ~1;        /* Next Device Driver */
                           PTR_AT(ptr,  4,  WORD) = 0xC800;    /* Device attributes  */
                           PTR_AT(ptr,  6,  WORD) = 0x1234;    /* Pointer to device strategy routine: FIXME */
                           PTR_AT(ptr,  8,  WORD) = 0x3142;    /* Pointer to device interrupt routine: FIXME */
                           PTR_AT(ptr, 10,  char) = 'W';       /* 8-byte character device name field */
                           PTR_AT(ptr, 11,  char) = 'I';
                           PTR_AT(ptr, 12,  char) = 'N';
                           PTR_AT(ptr, 13,  char) = 'E';
                           PTR_AT(ptr, 14,  char) = '_';
                           PTR_AT(ptr, 15,  char) = 'C';
                           PTR_AT(ptr, 16,  char) = 'D';
                           PTR_AT(ptr, 17,  char) = '_';
                           PTR_AT(ptr, 18,  WORD) = 0;         /* Reserved (must be zero) */
                           PTR_AT(ptr, 20,  BYTE) = 0;         /* Drive letter (must be zero) */
                           PTR_AT(ptr, 21,  BYTE) = 1;         /* Number of units supported (one or more) FIXME*/
                       }
                       PTR_AT(io_stru, DWORD,  0) = SEGPTR_GET(ptr);
                   }
                   break;
#endif

               case 1: /* location of head */
                   switch (io_stru[1]) {
                   case 0:
                       PTR_AT(io_stru, 2, DWORD) =
                            FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress);
                       break;
                   case 1:
                       MSCDEX_StoreMSF(FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress),
                                        io_stru + 2);
                       break;
                   default:
                       ERR("CD-ROM driver: unsupported addressing mode !!\n");
                       Error = 0x0c;
                   }
                   TRACE(" ----> HEAD LOCATION <%ld>\n", PTR_AT(io_stru, 2, DWORD));
                   break;

               case 4: /* Audio channel info */
                   io_stru[1] = 0;
                   io_stru[2] = 0xff;
                   io_stru[3] = 1;
                   io_stru[4] = 0xff;
                   io_stru[5] = 2;
                   io_stru[6] = 0;
                   io_stru[7] = 3;
                   io_stru[8] = 0;
                   TRACE(" ----> AUDIO CHANNEL INFO\n");
                   break;

               case 6: /* device status */
                   PTR_AT(io_stru, 1, DWORD) = 0x00000290;
                   /* 290 =>
                    * 1        Supports HSG and Red Book addressing modes
                    * 0        Supports audio channel manipulation
                    *
                    * 1        Supports prefetching requests
                    * 0        Reserved
                    * 0        No interleaving
                    * 1        Data read and plays audio/video tracks
                    *
                    * 0        Read only
                    * 0        Supports only cooked reading
                    * 0        Door locked
                    * 0        see below (Door closed/opened)
                    */
                   if (!present) PTR_AT(io_stru, 1, DWORD) |= 1;
                   TRACE(" ----> DEVICE STATUS <0x%08lx>\n", PTR_AT(io_stru, 1, DWORD));
                   break;

               case 8: /* Volume size */
                   PTR_AT(io_stru, 1, DWORD) = FRAME_OF_TOC(toc, toc.LastTrack + 1) -
                        FRAME_OF_TOC(toc, toc.FirstTrack) - 1;
                   TRACE(" ----> VOLUME SIZE <%ld>\n", PTR_AT(io_stru, 1, DWORD));
                   break;

               case 9: /* media changed ? */
                   /* answers don't know... -1/1 for yes/no would be better */
                   io_stru[1] = 0; /* FIXME? 1? */
                   TRACE(" ----> MEDIA CHANGED <%d>\n", io_stru[1]);
                   break;

               case 10: /* audio disk info */
                   io_stru[1] = toc.FirstTrack; /* starting track of the disc */
                   io_stru[2] = toc.LastTrack;  /* ending track */
                   MSCDEX_StoreMSF(FRAME_OF_TOC(toc, toc.LastTrack + 1) -
                                    FRAME_OF_TOC(toc, toc.FirstTrack) - 1, io_stru + 3);

                   TRACE(" ----> AUDIO DISK INFO <%d-%d/%08lx>\n",
                         io_stru[1], io_stru[2], PTR_AT(io_stru, 3, DWORD));
                   break;

               case 11: /* audio track info */
                   if (io_stru[1] >= toc.FirstTrack && io_stru[1] <= toc.LastTrack) {
                       MSCDEX_StoreMSF(FRAME_OF_TOC(toc, io_stru[1]), io_stru + 2);
                       /* starting point if the track */
                       io_stru[6] = CTRL_OF_TOC(toc, io_stru[1]);
                   } else {
                       PTR_AT(io_stru, 2, DWORD) = 0;
                       io_stru[6] = 0;
                   }
                   TRACE(" ----> AUDIO TRACK INFO[%d] = [%08lx:%d]\n",
                         io_stru[1], PTR_AT(io_stru, 2, DWORD), io_stru[6]);
                   break;

               case 12: /* get Q-Channel info */
                   io_stru[1] = CTRL_OF_TOC(toc, data.CurrentPosition.TrackNumber);
                   io_stru[2] = data.CurrentPosition.TrackNumber;
                   io_stru[3] = 0; /* FIXME ?? */

                   /* why the heck did MS use another format for 0MSF information... sigh */
                   {
                       BYTE    bTmp[4];

                       MSCDEX_StoreMSF(FRAME_OF_ADDR(data.CurrentPosition.TrackRelativeAddress), bTmp);
                       io_stru[ 4] = bTmp[2];
                       io_stru[ 5] = bTmp[1];
                       io_stru[ 6] = bTmp[0];
                       io_stru[ 7] = 0;

                       MSCDEX_StoreMSF(FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress), bTmp);
                       io_stru[ 8] = bTmp[2];
                       io_stru[ 9] = bTmp[1];
                       io_stru[10] = bTmp[0];
                       io_stru[11] = 0;
                   }
                   TRACE("Q-Channel info: Ctrl/adr=%02x TNO=%02x X=%02x rtt=%02x:%02x:%02x rtd=%02x:%02x:%02x (cf=%08x, tp=%08x)\n",
                         io_stru[ 1], io_stru[ 2], io_stru[ 3],
                         io_stru[ 4], io_stru[ 5], io_stru[ 6],
                         io_stru[ 8], io_stru[ 9], io_stru[10],
                         FRAME_OF_ADDR(data.CurrentPosition.AbsoluteAddress),
                          FRAME_OF_TOC(toc, data.CurrentPosition.TrackNumber));
                   break;

               case 15: /* Audio status info */
                   /* !!!! FIXME FIXME FIXME !! */
                   PTR_AT(io_stru, 1,  WORD) = 2 | ((data.CurrentPosition.Header.AudioStatus == AUDIO_STATUS_PAUSED) ? 1 : 0);
                   if (!present) {
                       PTR_AT(io_stru, 3, DWORD) = 0;
                       PTR_AT(io_stru, 7, DWORD) = 0;
                   } else {
                       PTR_AT(io_stru, 3, DWORD) = FRAME_OF_TOC(toc, toc.FirstTrack);
                       PTR_AT(io_stru, 7, DWORD) = FRAME_OF_TOC(toc, toc.LastTrack + 1);
                   }
                   TRACE("Audio status info: status=%04x startLoc=%ld endLoc=%ld\n",
                         PTR_AT(io_stru, 1, WORD), PTR_AT(io_stru, 3, DWORD), PTR_AT(io_stru, 7, DWORD));
                   break;

               default:
                   FIXME("IOCTL INPUT: Unimplemented <%d>!!\n", io_stru[0]);
                   Error = 0x0c;
                   break;
               }
               break;

           case 12:
               io_stru = (dorealmode) ?
                   PTR_REAL_TO_LIN( PTR_AT(driver_request, 16, WORD), PTR_AT(driver_request, 14, WORD)) :
                       MapSL( MAKESEGPTR(PTR_AT(driver_request, 16, WORD), PTR_AT(driver_request, 14, WORD)));

               TRACE(" --> IOCTL OUTPUT <%d>\n", io_stru[0]);
               switch (io_stru[0]) {
               case 0: /* eject */
                    DeviceIoControl(h, IOCTL_STORAGE_EJECT_MEDIA, NULL, 0, NULL, 0, &br, NULL);
                   TRACE(" ----> EJECT\n");
                   break;
               case 2: /* reset drive */
                   DeviceIoControl(h, IOCTL_STORAGE_RESET_DEVICE, NULL, 0, NULL, 0, &br, NULL);
                   TRACE(" ----> RESET\n");
                   break;
               case 3: /* Audio Channel Control */
                   FIXME(" ----> AUDIO CHANNEL CONTROL (NIY)\n");
                   break;
               case 5: /* close tray */
                    DeviceIoControl(h, IOCTL_STORAGE_LOAD_MEDIA, NULL, 0, NULL, 0, &br, NULL);
                   TRACE(" ----> CLOSE TRAY\n");
                   break;
               default:
                   FIXME(" IOCTL OUTPUT: Unimplemented <%d>!!\n", io_stru[0]);
                   Error = 0x0c;
                   break;
               }
               break;

            case 128: /* read long */
                {
                    LPVOID              dst = MapSL(MAKESEGPTR(PTR_AT(driver_request, 16, WORD),
                                                               PTR_AT(driver_request, 14, WORD)));
                    DWORD               at = PTR_AT(driver_request, 20, DWORD);
                    WORD                num = PTR_AT(driver_request, 18, WORD);
                    RAW_READ_INFO       rri;

                   switch (driver_request[13]) {
                   case 1: /* Red book addressing mode = 0:m:s:f */
                       /* FIXME : frame <=> msf conversion routines could be shared
                        * between mscdex and mcicda
                        */
                       at = LOBYTE(HIWORD(at)) * CDFRAMES_PERMIN +
                           HIBYTE(LOWORD(at)) * CDFRAMES_PERSEC +
                           LOBYTE(LOWORD(at));
                       /* fall through */
                   case 0: /* HSG addressing mode */
                        switch (PTR_AT(driver_request, 24, BYTE))
                        {
                        case 0: /* cooked */
                            ReadFile(h, dst, num * 2048, &br, NULL);
                            break;
                        case 1:
                            /* FIXME: computation is wrong */
                            rri.DiskOffset.u.HighPart = 0;
                            rri.DiskOffset.u.LowPart = at << 11;
                            rri.TrackMode = YellowMode2;
                            rri.SectorCount = num;
                            DeviceIoControl(h, IOCTL_CDROM_RAW_READ, &rri, sizeof(rri),
                                            dst, num * 2352, &br, NULL);
                       break;
                        default:
                            ERR("Unsupported read mode !!\n");
                            Error = 0x0c;
                            break;
                        }
                        break;
                   default:
                       ERR("Unsupported address mode !!\n");
                       Error = 0x0c;
                       break;
                   }
                }
                break;

           case 131: /* seek */
               {
                   DWORD                       at;
                    CDROM_SEEK_AUDIO_MSF        seek;

                   at = PTR_AT(driver_request, 20, DWORD);

                   TRACE(" --> SEEK AUDIO mode :<0x%02X>, [%ld]\n",
                         (BYTE)driver_request[13], at);

                   switch (driver_request[13]) {
                   case 1: /* Red book addressing mode = 0:m:s:f */
                       /* FIXME : frame <=> msf conversion routines could be shared
                        * between mscdex and mcicda
                        */
                       at = LOBYTE(HIWORD(at)) * CDFRAMES_PERMIN +
                           HIBYTE(LOWORD(at)) * CDFRAMES_PERSEC +
                           LOBYTE(LOWORD(at));
                       /* fall through */
                   case 0: /* HSG addressing mode */
                        seek.M = at / CDFRAMES_PERMIN;
                        seek.S = (at / CDFRAMES_PERSEC) % 60;
                        seek.F = at % CDFRAMES_PERSEC;
                        DeviceIoControl(h, IOCTL_CDROM_SEEK_AUDIO_MSF, &seek, sizeof(seek),
                                        NULL, 0, &br, NULL);
                       break;
                   default:
                       ERR("Unsupported address mode !!\n");
                       Error = 0x0c;
                       break;
                   }
               }
               break;

           case 132: /* play */
               {
                   DWORD                       beg, end;
                    CDROM_PLAY_AUDIO_MSF        play;

                   beg = end = PTR_AT(driver_request, 14, DWORD);
                   end += PTR_AT(driver_request, 18, DWORD);

                   TRACE(" --> PLAY AUDIO mode :<0x%02X>, [%ld-%ld]\n",
                         (BYTE)driver_request[13], beg, end);

                   switch (driver_request[13]) {
                   case 1:
                       /* Red book addressing mode = 0:m:s:f */
                       /* FIXME : frame <=> msf conversion routines could be shared
                        * between mscdex and mcicda
                        */
                       beg = LOBYTE(LOWORD(beg)) * CDFRAMES_PERMIN +
                           HIBYTE(LOWORD(beg)) * CDFRAMES_PERSEC +
                           LOBYTE(HIWORD(beg));
                       end = LOBYTE(LOWORD(end)) * CDFRAMES_PERMIN +
                           HIBYTE(LOWORD(end)) * CDFRAMES_PERSEC +
                           LOBYTE(HIWORD(end));
                       /* fall through */
                   case 0: /* HSG addressing mode */
                        play.StartingM = beg / CDFRAMES_PERMIN;
                        play.StartingS = (beg / CDFRAMES_PERSEC) % 60;
                        play.StartingF = beg % CDFRAMES_PERSEC;
                        play.EndingM   = end / CDFRAMES_PERMIN;
                        play.EndingS   = (end / CDFRAMES_PERSEC) % 60;
                        play.EndingF   = end % CDFRAMES_PERSEC;
                        DeviceIoControl(h, IOCTL_CDROM_PLAY_AUDIO_MSF, &play, sizeof(play),
                                        NULL, 0, &br, NULL);
                       break;
                   default:
                       ERR("Unsupported address mode !!\n");
                       Error = 0x0c;
                       break;
                   }
               }
               break;

           case 133:
               if (data.CurrentPosition.Header.AudioStatus == AUDIO_STATUS_IN_PROGRESS) {
                    DeviceIoControl(h, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0, &br, NULL);
                   TRACE(" --> STOP AUDIO (Paused)\n");
               } else {
                    DeviceIoControl(h, IOCTL_CDROM_STOP_AUDIO, NULL, 0, NULL, 0, &br, NULL);
                   TRACE(" --> STOP AUDIO (Stopped)\n");
               }
               break;

           case 136:
               TRACE(" --> RESUME AUDIO\n");
                DeviceIoControl(h, IOCTL_CDROM_PAUSE_AUDIO, NULL, 0, NULL, 0, &br, NULL);
               break;

           default:
               FIXME(" ioctl unimplemented <%d>\n", driver_request[2]);
               Error = 0x0c;
           }

           /* setting error codes if any */
           if (Error < 255) {
               driver_request[4] |= 0x80;
               driver_request[3] = Error;
           }

           CloseHandle(h);
           /* setting status bits
            * 3 == playing && done
            * 1 == done
            */
           driver_request[4] |=
                (data.CurrentPosition.Header.AudioStatus == AUDIO_STATUS_IN_PROGRESS) ? 3 : 1;

           MSCDEX_Dump("End", driver_request, dorealmode);
       }
       break;
    default:
       FIXME("Unimplemented MSCDEX function 0x%02X.\n", LOBYTE(context->Eax));
       break;
    }
}
