-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGetCDROMListThreadUnit.pas
More file actions
249 lines (223 loc) · 7.4 KB
/
Copy pathGetCDROMListThreadUnit.pas
File metadata and controls
249 lines (223 loc) · 7.4 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
unit GetCDROMListThreadUnit;
interface
uses
SCSIUnit,
Classes,
SysUtils,
Tools_Unit,
SPC_Unit,
MMC1Unit;
Type
T_p_byte=^byte;
T_P_CDROM_rec=^T_CDROM_rec;
T_CDROM_rec=Record
Name : String;
HA_ID : Byte;
Dev_ID : Byte;
LUN : Byte;
Res_supp : Boolean;
Max_buf_len : LongWord;
End;
T_P_CDROM_SPT_rec=^T_CDROM_SPT_rec;
T_CDROM_SPT_rec=Record
Drive_letter : Char;
Vendor : String;
Product : String;
Revision : String;
End;
T_Method=procedure(s : String) of object;
type
T_GetCDROMListThread = class(TThread)
private
{ Private declarations }
sender_method : T_Method;
A_CDROM : T_P_CDROM_rec;
A_CDROM_SPT : T_P_CDROM_SPT_rec;
err_msg : String;
is_writers_only : Boolean;
Procedure ShowErrMsg;
protected
procedure Execute; override;
public
Function Find_CDROM(is_find_first_device : Boolean) : Boolean;
Function Find_CDRW(is_find_first_device : Boolean) : Boolean;
Procedure Add_found_CDROM_to_list;
Procedure SCSI_init_Get_CDROM_list;
Constructor Create(thread_done_proc : TNotifyEvent;
in_method : T_Method;
in_is_writers_only : Boolean);
end;
implementation
Uses
MainFormUnit;
Constructor T_GetCDROMListThread.Create(thread_done_proc : TNotifyEvent;
in_method : T_Method;
in_is_writers_only : Boolean);
Begin
is_writers_only:=in_is_writers_only;
sender_method:=in_method;
OnTerminate:=thread_done_proc;
FreeOnTerminate := True;
Inherited Create(False);
End;
Procedure T_GetCDROMListThread.ShowErrMsg;
Begin
sender_method(err_msg);
End;
Function T_GetCDROMListThread.Find_CDROM(is_find_first_device : Boolean) : Boolean;
Var
Found_CDROM : Boolean;
Begin
If is_find_first_device Then
Begin
Found_CDROM:=Form1.SCSI.SPC_any_link.Find_first_CDROM;
End
Else
Begin
Found_CDROM:=Form1.SCSI.SPC_any_link.Find_next_CDROM;
End;
Case Form1.SCSI.interface_method Of
U_METHOD_WNASPI:
Begin
If Form1.SCSI.SPC_any_link.Get_is_sendcmd_OK Then
Begin
If Found_CDROM Then
Begin
Form1.SCSI.SPC_any_link.Set_found_CDROM_active;
End;
End
Else
Begin
err_msg:='Scanning for CDROM error.' + Chr(10) + Chr(13) +
Form1.SCSI.SPC_any_link.Get_sendcmd_err_msg;
Synchronize(ShowErrMsg);
End;
End;
U_METHOD_SCSI_PASS_THRU,
U_METHOD_SCSI_PASS_THRU_D:
Begin
If Found_CDROM Then
Begin
Form1.SCSI.SPC_any_link.Set_found_CDROM_active;
End;
End;
End;
Find_CDROM:=Found_CDROM;
End;
Function T_GetCDROMListThread.Find_CDRW(is_find_first_device : Boolean) : Boolean;
Var
Found_CDROM : Boolean;
Found_CDRW : Boolean;
Out_CD_cap_mech_st : T_pub_CD_cap_mech_st;
Begin
Found_CDRW:=False;
Found_CDROM:=Find_CDROM(is_find_first_device);
If Found_CDROM Then
Begin
Repeat
Form1.SCSI.MMC1_any_link.Do_sense10_CD_cap_mech_st_out(Out_CD_cap_mech_st);
//Form1.SCSI.MMC1_any_link.Do_sense10_CD_cap_mech_st_sub6_out(Out_CD_cap_mech_st);
If Form1.SCSI.SPC_any_link.Get_is_sendcmd_OK Then
Begin
If (Out_CD_cap_mech_st.TestWR_WRCDRW_WRCDR And 1)=1 Then
Begin
Found_CDRW:=True;
End
Else
Found_CDROM:=Find_CDROM(False);
End
Else
Found_CDROM:=Find_CDROM(False);
Until(Found_CDRW Or (Not Found_CDROM));
End;
Find_CDRW:=Found_CDRW;
End;
Procedure T_GetCDROMListThread.Add_found_CDROM_to_list;
Var Str_msg : String;
p : T_p_byte;
Begin
Form1.SCSI.SPC_any_link.Get_dev_inquiry_CDB6;
If Not Form1.SCSI.SPC_any_link.Get_is_sendcmd_OK Then
Begin
err_msg:='Get device inquiry error.' + Chr(10) + Chr(13) +
Form1.SCSI.SPC_any_link.Get_sendcmd_err_msg;
Synchronize(ShowErrMsg);
End
Else
Begin
Case Form1.SCSI.interface_method Of
U_METHOD_WNASPI:
Begin
With T_dev_inq_std_data(Form1.SCSI.SPC_any_link.Get_data_buf^) Do
Begin
PStrMLCopy(Str_msg, @VendorID, 8);
Str_msg:=TrimRight(Str_msg) + ' / ';
PStrMLCopyAppend(Str_msg, @ProdID, 16);
Str_msg:=TrimRight(Str_msg) + ' / ';
PStrMLCopyAppend(Str_msg, @ProdRev, 4);
Str_msg:=TrimRight(Str_msg);
End;
New(A_CDROM);
A_CDROM.Name:=Str_msg;
A_CDROM.HA_ID:=Form1.SCSI.SPC_any_link.WNASPI32.Get_Found_HA_ID;
A_CDROM.Dev_ID:=Form1.SCSI.SPC_any_link.WNASPI32.Get_Found_Dev_ID;
A_CDROM.LUN:=Form1.SCSI.SPC_any_link.WNASPI32.Get_Found_LUN;
A_CDROM.Res_supp:=Form1.SCSI.SPC_any_link.WNASPI32.Get_Found_Res_supp;
A_CDROM.Max_buf_len:=Form1.SCSI.SPC_any_link.WNASPI32.Get_Found_Max_buf_len;
Form1.CommonCDSettings.CDROM_list.Add(A_CDROM);
End;
U_METHOD_SCSI_PASS_THRU,
U_METHOD_SCSI_PASS_THRU_D:
Begin
New(A_CDROM_SPT);
p:=Form1.SCSI.SPC_any_link.SPT.Get_data_buf;
inc(p, 8);
PStrMLCopy(Str_msg, p, 8); //Vendor string
A_CDROM_SPT.Vendor:=Str_msg;
inc(p, 8);
PStrMLCopy(Str_msg, p, 16); //Product string
A_CDROM_SPT.Product:=Str_msg;
inc(p, 16);
PStrMLCopy(Str_msg, p, 4); //Rev string
A_CDROM_SPT.Revision:=Str_msg;
A_CDROM_SPT.Drive_letter:=Form1.SCSI.SPC_any_link.SPT.drive_letter_found;
Form1.CommonCDSettings.CDROM_list.Add(A_CDROM_SPT);
End;
End;
End;
End;
Procedure T_GetCDROMListThread.SCSI_init_Get_CDROM_list;
Begin
{ Checks if we allocated WNASPI32 buffer first. }
If Form1.SCSI.SPC_any_link.Get_data_buf_size>0 Then
Begin
Form1.CommonCDSettings.Del_CDROM_list_items;
If is_writers_only Then
Begin
If Find_CDRW(True) Then
Begin
Add_found_CDROM_to_list;
While (Find_CDRW(False)=True) Do
Begin
Add_found_CDROM_to_list;
End;
End;
End
Else
Begin
If Find_CDROM(True) Then
Begin
Add_found_CDROM_to_list;
While (Find_CDROM(False)=True) Do
Begin
Add_found_CDROM_to_list;
End;
End;
End;
End;
End;
procedure T_GetCDROMListThread.Execute;
begin
SCSI_init_Get_CDROM_list;
end;
end.