Something went wrong. Try again.
Reactos
Something went wrong. Try again.
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264////////////////////////////////////////////////////////////////////// Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine// All rights reserved// This file was released under the GPLv2 on June 2015.////////////////////////////////////////////////////////////////////
/// Initial drive selection from command line.CHAR szDisc[4] = "";BOOL bChanger = FALSE;
/// Return CD-RW device typeJS_DEVICE_TYPECheckCDType( PCHAR m_szFile, PCHAR VendorId ){ HANDLE hDevice; CHAR szDeviceName[256]; CHAR ioBuf[4096]; ULONG RC; BOOL DvdRW = false; BOOL DvdpRW = false; BOOL DvdRAM = false; BOOL DvdpR = false; BOOL DvdR = false;
bChanger = FALSE;
// Make string representing full path sprintf(szDeviceName, "\\\\.\\%s", m_szFile); if (szDeviceName[strlen(szDeviceName)-1] == '\\') szDeviceName[strlen(szDeviceName)-1] = '\0';
// Open device volume hDevice = OpenOurVolume(szDeviceName);
if (hDevice == ((HANDLE)-1)) { strcpy(VendorId,""); return BUSY; } else {
// Get our cdrw.sys signature RC = UDFPhSendIOCTL(IOCTL_CDRW_GET_SIGNATURE,hDevice, &ioBuf,sizeof(GET_SIGNATURE_USER_OUT), &ioBuf,sizeof(GET_SIGNATURE_USER_OUT),FALSE,NULL);
if (RC == 1) { // Get device information RC = UDFPhSendIOCTL(IOCTL_CDRW_GET_DEVICE_INFO,hDevice, &ioBuf,sizeof(GET_DEVICE_INFO_USER_OUT), &ioBuf,sizeof(GET_DEVICE_INFO_USER_OUT),FALSE,NULL); if (RC != 1) { strcpy(VendorId,"Unknown Vendor"); } else { if(((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features & CDRW_FEATURE_CHANGER) bChanger = TRUE; strcpy(VendorId,(PCHAR)&(((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->VendorId[0])); if (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features & CDRW_FEATURE_GET_CFG) { DvdRW = (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features2[0] >> PFNUM_DVDRW_RESTRICTED_OVERWRITE) & 1; DvdRAM = (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features2[0] >> PFNUM_DVDRAM) & 1; DvdpRW = (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features2[0] >> PFNUM_DVDpRW) & 1; DvdR = (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features2[0] >> PFNUM_DVDR) & 1; DvdpR = (((PGET_DEVICE_INFO_USER_OUT)&ioBuf)->Features2[0] >> PFNUM_DVDpR) & 1; } }
// Get device capabilities RC = UDFPhSendIOCTL(IOCTL_CDRW_GET_CAPABILITIES,hDevice, &ioBuf,sizeof(GET_CAPABILITIES_USER_OUT), &ioBuf,sizeof(GET_CAPABILITIES_USER_OUT),FALSE,NULL); if(RC != 1) { CloseHandle(hDevice); return OTHER; }
// Check capabilities if(((PGET_CAPABILITIES_USER_OUT)&ioBuf)->WriteCap & (DevCap_write_cd_r | DevCap_write_cd_rw | DevCap_write_dvd_ram | DevCap_write_dvd_r) || DvdRW || DvdpRW || DvdRAM) {
if (DvdRAM || ((PGET_CAPABILITIES_USER_OUT)&ioBuf)->WriteCap & DevCap_write_dvd_ram) { CloseHandle(hDevice); return DVDRAM; }/* if (DvdR) { CloseHandle(hDevice); return DVDR; }*/ if (DvdRW) { CloseHandle(hDevice); return DVDRW; } if (DvdpRW) { CloseHandle(hDevice); return DVDPRW; }/* if (DvdpR) { CloseHandle(hDevice); return DVDPR; }*/ if (((PGET_CAPABILITIES_USER_OUT)&ioBuf)->WriteCap & DevCap_write_dvd_r) { CloseHandle(hDevice); return DVDR; } if (((PGET_CAPABILITIES_USER_OUT)&ioBuf)->WriteCap & DevCap_write_cd_rw) { CloseHandle(hDevice); return CDRW; } if (((PGET_CAPABILITIES_USER_OUT)&ioBuf)->WriteCap & DevCap_write_cd_r) { CloseHandle(hDevice); return CDR; } } else { CloseHandle(hDevice); return OTHER; } } else { strcpy(VendorId,"Unknown Vendor"); } CloseHandle(hDevice); }
return OTHER;} // end CheckCDType()
/** Intialize asbtract device list via calls to CallBack function. \param hDlg Not used. \param hwndControl Passed to the CallBack function. See #PADD_DEVICE. \param CallBack Callback function. Called on each CD device in system.*/voidInitDeviceList( HWND hDlg, HWND hwndControl, PADD_DEVICE CallBack ){ char Buffer[MAX_PATH] = ""; char VendorId[25]; char seps[] = ","; char* token; char info[MAX_PATH]; bool add_drive = false;
JS_DEVICE_TYPE drive_type;
// Get all device letter in system GetLogicalDriveStrings((DWORD)MAX_PATH,(LPTSTR)&Buffer); token = (char *)&Buffer; // Replace all zeroes with comma. while (token != NULL) { token = (char *)memchr(Buffer,'\0',MAX_PATH); if (token) { if (*(token-1) == ',') { token = NULL; } else { *token=','; } } } // Parse string of drive letters separated by comma token = strtok((char *)&Buffer,seps); while (token != NULL) { add_drive = false; switch (GetDriveType(token)) {/* case DRIVE_FIXED: add_drive = true; break;*/ case DRIVE_CDROM: // Determine CD/DVD-ROM type (R,RW,RAM,other) drive_type = CheckCDType(token,&VendorId[0]); add_drive = true; break; } if (add_drive) {
// Append to drive letter VendorId strncpy(info,token,strlen(token)-1); info[strlen(token)-1]='\0'; strcat(info," "); strcat(info,VendorId);
BOOL bSelect = !strcmp(strupr(szDisc),strupr(token)); if (drive_type != OTHER) { CallBack(hwndControl,token,info,MediaTypeStrings[drive_type],bSelect); } else { CallBack(hwndControl,token,info,"[Unsupported]",FALSE); }
} // Move to the next drive letter in string token = strtok(NULL,seps); }} // end InitDeviceList()
HANDLEFmtAcquireDrive_( PCHAR _Drive, CHAR Level ){ WCHAR LockName[32]; HANDLE evt;
WCHAR Drive[1]; Drive[0] = _Drive[0] & ~('a' ^ 'A');
swprintf(LockName, L"DwFmtLock_%1.1S%d", Drive, Level); evt = CreatePublicEvent(LockName); if(!evt) { return NULL; } if(GetLastError() == ERROR_ALREADY_EXISTS) { CloseHandle(evt); return INVALID_HANDLE_VALUE; } return evt;} // end FmtAcquireDrive_()
HANDLEFmtAcquireDrive( PCHAR Drive, CHAR Level ){ HANDLE evt;
evt = FmtAcquireDrive_(Drive, Level); if(!evt || evt == INVALID_HANDLE_VALUE) { return NULL; } return evt;} // end FmtAcquireDrive()
BOOLEANFmtIsDriveAcquired( PCHAR Drive, CHAR Level ){ HANDLE evt;
evt = FmtAcquireDrive_(Drive, Level); if(evt == INVALID_HANDLE_VALUE) { return TRUE; } if(evt) { CloseHandle(evt); } return FALSE;} // end FmtIsDriveAcquired()
VOIDFmtReleaseDrive( HANDLE evt ){ if(evt) { CloseHandle(evt); }} // end FmtReleaseDrive()