1 ////////////////////////////////////////////////////////////////////
2 // Copyright (C) Alexander Telyatnikov, Ivan Keliukh, Yegor Anchishkin, SKIF Software, 1999-2013. Kiev, Ukraine
4 ////////////////////////////////////////////////////////////////////
6 /// Initial drive selection from command line.
10 /// Return CD-RW device type
18 CHAR szDeviceName
[256];
29 // Make string representing full path
30 sprintf(szDeviceName
, "\\\\.\\%s", m_szFile
);
31 if (szDeviceName
[strlen(szDeviceName
)-1] == '\\') szDeviceName
[strlen(szDeviceName
)-1] = '\0';
34 hDevice
= OpenOurVolume(szDeviceName
);
36 if (hDevice
== ((HANDLE
)-1)) {
41 // Get our cdrw.sys signature
42 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_SIGNATURE
,hDevice
,
43 &ioBuf
,sizeof(GET_SIGNATURE_USER_OUT
),
44 &ioBuf
,sizeof(GET_SIGNATURE_USER_OUT
),FALSE
,NULL
);
47 // Get device information
48 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_DEVICE_INFO
,hDevice
,
49 &ioBuf
,sizeof(GET_DEVICE_INFO_USER_OUT
),
50 &ioBuf
,sizeof(GET_DEVICE_INFO_USER_OUT
),FALSE
,NULL
);
52 strcpy(VendorId
,"Unknown Vendor");
54 if(((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features
& CDRW_FEATURE_CHANGER
)
56 strcpy(VendorId
,(PCHAR
)&(((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->VendorId
[0]));
57 if (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features
& CDRW_FEATURE_GET_CFG
) {
58 DvdRW
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDRW_RESTRICTED_OVERWRITE
) & 1;
59 DvdRAM
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDRAM
) & 1;
60 DvdpRW
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDpRW
) & 1;
61 DvdR
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDR
) & 1;
62 DvdpR
= (((PGET_DEVICE_INFO_USER_OUT
)&ioBuf
)->Features2
[0] >> PFNUM_DVDpR
) & 1;
66 // Get device capabilities
67 RC
= UDFPhSendIOCTL(IOCTL_CDRW_GET_CAPABILITIES
,hDevice
,
68 &ioBuf
,sizeof(GET_CAPABILITIES_USER_OUT
),
69 &ioBuf
,sizeof(GET_CAPABILITIES_USER_OUT
),FALSE
,NULL
);
76 if(((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& (DevCap_write_cd_r
| DevCap_write_cd_rw
| DevCap_write_dvd_ram
| DevCap_write_dvd_r
) ||
77 DvdRW
|| DvdpRW
|| DvdRAM
) {
79 if (DvdRAM
|| ((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_dvd_ram
) {
99 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_dvd_r
) {
100 CloseHandle(hDevice
);
103 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_cd_rw
) {
104 CloseHandle(hDevice
);
107 if (((PGET_CAPABILITIES_USER_OUT
)&ioBuf
)->WriteCap
& DevCap_write_cd_r
) {
108 CloseHandle(hDevice
);
113 CloseHandle(hDevice
);
117 strcpy(VendorId
,"Unknown Vendor");
119 CloseHandle(hDevice
);
123 } // end CheckCDType()
125 /** Intialize asbtract device list via calls to CallBack function.
126 \param hDlg Not used.
127 \param hwndControl Passed to the CallBack function. See #PADD_DEVICE.
128 \param CallBack Callback function. Called on each CD device in system.
137 char Buffer
[MAX_PATH
] = "";
142 bool add_drive
= false;
144 JS_DEVICE_TYPE drive_type
;
146 // Get all device letter in system
147 GetLogicalDriveStrings((DWORD
)MAX_PATH
,(LPTSTR
)&Buffer
);
148 token
= (char *)&Buffer
;
149 // Replace all zeroes with comma.
150 while (token
!= NULL
) {
151 token
= (char *)memchr(Buffer
,'\0',MAX_PATH
);
153 if (*(token
-1) == ',') {
160 // Parse string of drive letters separated by comma
161 token
= strtok((char *)&Buffer
,seps
);
162 while (token
!= NULL
) {
164 switch (GetDriveType(token
)) {
171 // Determine CD/DVD-ROM type (R,RW,RAM,other)
172 drive_type
= CheckCDType(token
,&VendorId
[0]);
178 // Append to drive letter VendorId
179 strncpy(info
,token
,strlen(token
)-1);
180 info
[strlen(token
)-1]='\0';
182 strcat(info
,VendorId
);
184 BOOL bSelect
= !strcmp(strupr(szDisc
),strupr(token
));
185 if (drive_type
!= OTHER
) {
186 CallBack(hwndControl
,token
,info
,MediaTypeStrings
[drive_type
],bSelect
);
188 CallBack(hwndControl
,token
,info
,"[Unsupported]",FALSE
);
192 // Move to the next drive letter in string
193 token
= strtok(NULL
,seps
);
195 } // end InitDeviceList()
207 Drive
[0] = _Drive
[0] & ~('a' ^ 'A');
209 swprintf(LockName
, L
"DwFmtLock_%1.1S%d", Drive
, Level
);
210 evt
= CreatePublicEvent(LockName
);
214 if(GetLastError() == ERROR_ALREADY_EXISTS
) {
216 return INVALID_HANDLE_VALUE
;
219 } // end FmtAcquireDrive_()
229 evt
= FmtAcquireDrive_(Drive
, Level
);
230 if(!evt
|| evt
== INVALID_HANDLE_VALUE
) {
234 } // end FmtAcquireDrive()
244 evt
= FmtAcquireDrive_(Drive
, Level
);
245 if(evt
== INVALID_HANDLE_VALUE
) {
252 } // end FmtIsDriveAcquired()
262 } // end FmtReleaseDrive()