1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 // This file was released under the GPLv2 on June 2015.
5 ////////////////////////////////////////////////////////////////////
7 /// Initial drive selection from command line.
11 /// Return CD-RW device type
19 CHAR szDeviceName
[256];
30 // Make string representing full path
31 sprintf(szDeviceName
, "\\\\.\\%s", m_szFile
);
32 if (szDeviceName
[strlen(szDeviceName
)-1] == '\\') szDeviceName
[strlen(szDeviceName
)-1] = '\0';
35 hDevice
= OpenOurVolume(szDeviceName
);
37 if (hDevice
== ((HANDLE
)-1)) {
42 // Get our cdrw.sys signature
43 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_SIGNATURE
,hDevice
,
44 &ioBuf
,sizeof(GET_SIGNATURE_USER_OUT
),
45 &ioBuf
,sizeof(GET_SIGNATURE_USER_OUT
),FALSE
,NULL
);
48 // Get device information
49 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_DEVICE_INFO
,hDevice
,
50 &ioBuf
,sizeof(GET_DEVICE_INFO_USER_OUT
),
51 &ioBuf
,sizeof(GET_DEVICE_INFO_USER_OUT
),FALSE
,NULL
);
53 strcpy(VendorId
,"Unknown Vendor");
55 if(((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features
& CDRW_FEATURE_CHANGER
)
57 strcpy(VendorId
,(PCHAR
)&(((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->VendorId
[0]));
58 if (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features
& CDRW_FEATURE_GET_CFG
) {
59 DvdRW
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDRW_RESTRICTED_OVERWRITE
) & 1;
60 DvdRAM
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDRAM
) & 1;
61 DvdpRW
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDpRW
) & 1;
62 DvdR
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDR
) & 1;
63 DvdpR
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDpR
) & 1;
67 // Get device capabilities
68 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_CAPABILITIES
,hDevice
,
69 &ioBuf
,sizeof(GET_CAPABILITIES_USER_OUT
),
70 &ioBuf
,sizeof(GET_CAPABILITIES_USER_OUT
),FALSE
,NULL
);
77 if(((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& (DevCap_write_cd_r
| DevCap_write_cd_rw
| DevCap_write_dvd_ram
| DevCap_write_dvd_r
) ||
78 DvdRW
|| DvdpRW
|| DvdRAM
) {
80 if (DvdRAM
|| ((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_dvd_ram
) {
100 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_dvd_r
) {
101 CloseHandle(hDevice
);
104 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_cd_rw
) {
105 CloseHandle(hDevice
);
108 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_cd_r
) {
109 CloseHandle(hDevice
);
114 CloseHandle(hDevice
);
118 strcpy(VendorId
,"Unknown Vendor");
120 CloseHandle(hDevice
);
124 } // end CheckCDType()
126 /** Intialize asbtract device list via calls to CallBack function.
127 \param hDlg Not used.
128 \param hwndControl Passed to the CallBack function. See #PADD_DEVICE.
129 \param CallBack Callback function. Called on each CD device in system.
138 char Buffer
[MAX_PATH
] = "";
143 bool add_drive
= false;
145 JS_DEVICE_TYPE drive_type
;
147 // Get all device letter in system
148 GetLogicalDriveStrings((DWORD
)MAX_PATH
,(LPTSTR
)&Buffer
);
149 token
= (char *)&Buffer
;
150 // Replace all zeroes with comma.
151 while (token
!= NULL
) {
152 token
= (char *)memchr(Buffer
,'\0',MAX_PATH
);
154 if (*(token
-1) == ',') {
161 // Parse string of drive letters separated by comma
162 token
= strtok((char *)&Buffer
,seps
);
163 while (token
!= NULL
) {
165 switch (GetDriveType(token
)) {
172 // Determine CD/DVD-ROM type (R,RW,RAM,other)
173 drive_type
= CheckCDType(token
,&VendorId
[0]);
179 // Append to drive letter VendorId
180 strncpy(info
,token
,strlen(token
)-1);
181 info
[strlen(token
)-1]='\0';
183 strcat(info
,VendorId
);
185 BOOL bSelect
= !strcmp(strupr(szDisc
),strupr(token
));
186 if (drive_type
!= OTHER
) {
187 CallBack(hwndControl
,token
,info
,MediaTypeStrings
[drive_type
],bSelect
);
189 CallBack(hwndControl
,token
,info
,"[Unsupported]",FALSE
);
193 // Move to the next drive letter in string
194 token
= strtok(NULL
,seps
);
196 } // end InitDeviceList()
208 Drive
[0] = _Drive
[0] & ~('a' ^ 'A');
210 swprintf(LockName
, L
"DwFmtLock_%1.1S%d", Drive
, Level
);
211 evt
= CreatePublicEvent(LockName
);
215 if(GetLastError() == ERROR_ALREADY_EXISTS
) {
217 return INVALID_HANDLE_VALUE
;
220 } // end FmtAcquireDrive_()
230 evt
= FmtAcquireDrive_(Drive
, Level
);
231 if(!evt
|| evt
== INVALID_HANDLE_VALUE
) {
235 } // end FmtAcquireDrive()
245 evt
= FmtAcquireDrive_(Drive
, Level
);
246 if(evt
== INVALID_HANDLE_VALUE
) {
253 } // end FmtIsDriveAcquired()
263 } // end FmtReleaseDrive()