/* 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,®s,®s);
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,®s,®s,&sregs);
return(IOCTLBlock.ReqHdr.Status);
}