// // AUTHOR // N. Nielsen // // LICENSE // This software is in the public domain. // // The software is provided "as is", without warranty of any kind, // express or implied, including but not limited to the warranties // of merchantability, fitness for a particular purpose, and // noninfringement. In no event shall the author(s) be liable for any // claim, damages, or other liability, whether in an action of // contract, tort, or otherwise, arising from, out of, or in connection // with the software or the use or other dealings in the software. // // SUPPORT // Send bug reports to: // #define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers #include #include #include // Get first CD-ROM Drive letter TCHAR GetCDROM() { TCHAR buff[4]; TCHAR i; _tcscpy(buff, "X:\\"); for(i = _T('A'); i <= _T('Z'); i++) { buff[0] = i; if(GetDriveType(buff) == DRIVE_CDROM) return i; } return 0; } int Usage() { MessageBox(NULL, _T("usage: eject [-load] [drive] ..."), _T("Eject Usage"), MB_OK | MB_ICONINFORMATION); return 2; } int DoEject(TCHAR drive, int mode) { TCHAR buff[7]; HANDLE hDevice; _tcscpy(buff, "\\\\.\\X:"); if(drive == 0) { // Create a CD-ROM drive string buff[4] = GetCDROM(drive); } else { buff[4] = drive; } if(buff[4] == 0) { MessageBox(NULL, _T("No CD-ROM drives found on system."), _T("Eject"), MB_OK | MB_ICONSTOP); return 1; } // Open the CD device hDevice = CreateFile(buff, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if(hDevice != INVALID_HANDLE_VALUE) { DWORD code = IOCTL_STORAGE_EJECT_MEDIA; DWORD bytesRet = 0; // If specified with the '-load' parameter then load // the drive rather than eject if(mode) code = IOCTL_STORAGE_LOAD_MEDIA; DeviceIoControl(hDevice, code, NULL, 0, NULL, 0, &bytesRet, NULL); } CloseHandle(hDevice); return 0; } int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { int mode = 0; int spec = 0; int i; for(i = 0; i < __argc; i++) { /* Specifying a parameter */ if(__argv[i][0] == '-') { char* arg = __argv[i] + 1; if(strstr(arg, "load")) { mode = 1; continue; } else if(strstr(arg, "eject")) { mode = 0; continue; } else if(strstr(arg, "h")) { return Usage(); } } /* Specifying a drive */ if(strlen(__argv[i]) == 1) { char drive = tolower(__argv[i][0]); if(drive >= 'a' && drive <= 'z') { if(!DoEject(drive, mode)) return 1; spec = 1; continue; } } return Usage(); } if(!spec) { if(!DoEject(0, mode)) return 1; } return 0; }