@@ -194,52 +194,6 @@ func (DiskAPI) GetDiskNumber(disk syscall.Handle) (uint32, error) {
194
194
return devNum .DeviceNumber , err
195
195
}
196
196
197
- func (DiskAPI ) DiskHasPage83ID (disk syscall.Handle , matchID string ) (bool , error ) {
198
- query := StoragePropertyQuery {}
199
-
200
- bufferSize := uint32 (4 * 1024 )
201
- buffer := make ([]byte , 4 * 1024 )
202
- var size uint32
203
- var n uint32
204
- var m uint16
205
-
206
- query .QueryType = PropertyStandardQuery
207
- query .PropertyID = StorageDeviceIDProperty
208
-
209
- querySize := uint32 (unsafe .Sizeof (query .PropertyID )) + uint32 (unsafe .Sizeof (query .QueryType )) + uint32 (unsafe .Sizeof (query .Byte ))
210
- querySize = uint32 (unsafe .Sizeof (query ))
211
- err := syscall .DeviceIoControl (disk , IOCTL_STORAGE_QUERY_PROPERTY , (* byte )(unsafe .Pointer (& query )), querySize , (* byte )(unsafe .Pointer (& buffer [0 ])), bufferSize , & size , nil )
212
- if err != nil {
213
- return false , fmt .Errorf ("IOCTL_STORAGE_QUERY_PROPERTY failed: %v" , err )
214
- }
215
-
216
- devIDDesc := (* StorageDeviceIDDescriptor )(unsafe .Pointer (& buffer [0 ]))
217
-
218
- pID := (* StorageIdentifier )(unsafe .Pointer (& devIDDesc .Identifiers [0 ]))
219
-
220
- page83ID := []byte {}
221
- byteSize := unsafe .Sizeof (byte (0 ))
222
- for n = 0 ; n < devIDDesc .NumberOfIdentifiers ; n ++ {
223
- if pID .Association == StorageIDAssocDevice && (pID .CodeSet == StorageIDCodeSetBinary || pID .CodeSet == StorageIDCodeSetASCII ) {
224
- for m = 0 ; m < pID .IdentifierSize ; m ++ {
225
- page83ID = append (page83ID , * (* byte )(unsafe .Pointer (uintptr (unsafe .Pointer (& pID .Identifier [0 ])) + byteSize * uintptr (m ))))
226
- }
227
-
228
- var page83IDString string
229
- if pID .CodeSet == StorageIDCodeSetASCII {
230
- page83IDString = string (page83ID )
231
- } else if pID .CodeSet == StorageIDCodeSetBinary {
232
- page83IDString = hex .EncodeToString (page83ID )
233
- }
234
- if strings .Contains (page83IDString , matchID ) {
235
- return true , nil
236
- }
237
- }
238
- pID = (* StorageIdentifier )(unsafe .Pointer (uintptr (unsafe .Pointer (pID )) + byteSize * uintptr (pID .NextOffset )))
239
- }
240
- return false , nil
241
- }
242
-
243
197
func (DiskAPI ) GetDiskPage83ID (disk syscall.Handle ) (string , error ) {
244
198
query := StoragePropertyQuery {}
245
199
@@ -266,7 +220,7 @@ func (DiskAPI) GetDiskPage83ID(disk syscall.Handle) (string, error) {
266
220
page83ID := []byte {}
267
221
byteSize := unsafe .Sizeof (byte (0 ))
268
222
for n = 0 ; n < devIDDesc .NumberOfIdentifiers ; n ++ {
269
- if pID .Association == StorageIDAssocDevice {
223
+ if pID .Association == StorageIDAssocDevice && ( pID . CodeSet == StorageIDCodeSetBinary || pID . CodeSet == StorageIDCodeSetASCII ) {
270
224
for m = 0 ; m < pID .IdentifierSize ; m ++ {
271
225
page83ID = append (page83ID , * (* byte )(unsafe .Pointer (uintptr (unsafe .Pointer (& pID .Identifier [0 ])) + byteSize * uintptr (m ))))
272
226
}
@@ -294,20 +248,39 @@ func (imp DiskAPI) GetDiskNumberWithID(page83ID string) (uint32, error) {
294
248
json .Unmarshal ([]byte (outString ), & disks )
295
249
296
250
for i := range disks {
297
- h , err := syscall . Open (disks [i ].Path , syscall . O_RDONLY , 0 )
251
+ diskNumber , diskPage83ID , err := imp . GetDiskNumberAndPage83ID (disks [i ].Path )
298
252
if err != nil {
299
253
return 0 , err
300
254
}
301
255
302
- found , err := imp .DiskHasPage83ID (h , page83ID )
303
- if found {
304
- return imp .GetDiskNumber (h )
256
+ if diskPage83ID == page83ID {
257
+ return diskNumber , nil
305
258
}
306
259
}
307
260
308
261
return 0 , fmt .Errorf ("Could not find disk with Page83 ID %s" , page83ID )
309
262
}
310
263
264
+ func (imp DiskAPI ) GetDiskNumberAndPage83ID (path string ) (uint32 , string , error ) {
265
+ h , err := syscall .Open (path , syscall .O_RDONLY , 0 )
266
+ defer syscall .Close (h )
267
+ if err != nil {
268
+ return 0 , "" , err
269
+ }
270
+
271
+ diskNumber , err := imp .GetDiskNumber (h )
272
+ if err != nil {
273
+ return 0 , "" , err
274
+ }
275
+
276
+ page83ID , err := imp .GetDiskPage83ID (h )
277
+ if err != nil {
278
+ return 0 , "" , err
279
+ }
280
+
281
+ return diskNumber , page83ID , nil
282
+ }
283
+
311
284
// ListDiskIDs - constructs a map with the disk number as the key and the DiskID structure
312
285
// as the value. The DiskID struct has a field for the page83 ID.
313
286
func (imp DiskAPI ) ListDiskIDs () (map [uint32 ]shared.DiskIDs , error ) {
@@ -334,21 +307,11 @@ func (imp DiskAPI) ListDiskIDs() (map[uint32]shared.DiskIDs, error) {
334
307
m := make (map [uint32 ]shared.DiskIDs )
335
308
336
309
for i := range disks {
337
- h , err := syscall . Open (disks [i ].Path , syscall . O_RDONLY , 0 )
310
+ diskNumber , page83 , err := imp . GetDiskNumberAndPage83ID (disks [i ].Path )
338
311
if err != nil {
339
312
return nil , err
340
313
}
341
314
342
- page83 , err := imp .GetDiskPage83ID (h )
343
- if err != nil {
344
- return m , fmt .Errorf ("Could not get page83 ID: %v" , err )
345
- }
346
-
347
- diskNumber , err := imp .GetDiskNumber (h )
348
- if err != nil {
349
- return m , fmt .Errorf ("Could not get disk number: %v" , err )
350
- }
351
-
352
315
m [diskNumber ] = shared.DiskIDs {
353
316
Page83 : page83 ,
354
317
SerialNumber : disks [i ].SerialNumber ,
0 commit comments