/* CL closes CD-ROM disk tray */

#include <stdio.h>
#include <stdlib.h>
#include <dos.h>
#include <string.h>
#include <alloc.h>

#define MULTIPLEX_INT   0x2f
#define INIT_MP_INT     0x1500
#define CDREQ_MP_INT    0x1510

#define STAT_HAS_AN_ERROR 0x8000
#define STAT_BUSY         0x0200
#define STAT_DONE         0x0100

int CDRomLoaded,CDRomDrive;

#define WRITE_IOCTL_COMMAND   12

struct ReqHdrStruc {
       unsigned char ParamLength;
       unsigned char SubUnit;
       unsigned char CommandCode;
       unsigned int  Status;
       unsigned long Reserved1;
       unsigned long Reserved2;
};

struct IOCTLStruc {
  struct ReqHdrStruc ReqHdr;
  unsigned char Meddescr;
  unsigned long Transfaddr;
  unsigned int  Numbytes;
  unsigned int  Startsec;
  unsigned long volID;
};

struct CloseStruc {
       unsigned char CntrlCode;
};

struct IOCTLStruc IOCTLBlock;
struct CloseStruc CloseBlock;

main()
{
       if (!CheckCD2F()){
               printf("MSCDEX NOT LOADED\n");
               exit(1);
       }
       Close();
}


CheckCD2F()
{
union REGS regs;

       regs.x.ax = INIT_MP_INT;
       int86(MULTIPLEX_INT,&regs,&regs);
       CDRomLoaded = regs.x.bx;
       CDRomDrive = regs.x.cx;
}

Close()
{
union REGS regs;
struct SREGS sregs;

       CloseBlock.CntrlCode = 5;

       IOCTLBlock.ReqHdr.ParamLength = 13;
       IOCTLBlock.ReqHdr.SubUnit     = 0;
       IOCTLBlock.ReqHdr.CommandCode = WRITE_IOCTL_COMMAND;
       IOCTLBlock.ReqHdr.Status      = 0;

       IOCTLBlock.Meddescr = 0;
       IOCTLBlock.Transfaddr =  (unsigned long)&CloseBlock;
       IOCTLBlock.Numbytes = 1;
       IOCTLBlock.Startsec = 0;
       IOCTLBlock.volID = 0;

       regs.x.ax = CDREQ_MP_INT;
       regs.x.bx = FP_OFF(&IOCTLBlock);
       regs.x.cx = CDRomDrive;
       sregs.es  = FP_SEG(&IOCTLBlock);

       int86x(MULTIPLEX_INT,&regs,&regs,&sregs);

       return(IOCTLBlock.ReqHdr.Status);
}