736 /* EJ ejects CD-ROM disk tray */ #include #include #include #include #include #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 EjectStruc { unsigned char CntrlCode; }; struct IOCTLStruc IOCTLBlock; struct EjectStruc EjectBlock; long LastSector; int NumTracks; int *buffer; main() { if (!CheckCD2F()){ printf("MSCDEX NOT LOADED\n"); exit(1); } Eject(); } CheckCD2F() { union REGS regs; regs.x.ax = INIT_MP_INT; int86(MULTIPLEX_INT,®s,®s); CDRomLoaded = regs.x.bx; CDRomDrive = regs.x.cx; } Eject() { union REGS regs; struct SREGS sregs; EjectBlock.CntrlCode = 0; 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)&EjectBlock; 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); } . 0