Bonjour,

Depuis quelque temps, je travaille sur un moteur d'accès aux périphréiques cd\dvd.
Mon projet est fonctionnel, et le programme final (freeware) dispo sur le net depuis quelques semaines déjà : http://www.allfirmwares.com/downloads/onlinedetect.exe (version fonctionnelle)
http://www.allfirmwares.com/temp/onlinedetect.exe (version actuelle, avec infos de debug)


Ce moteur utilise les fonctions aspi de base pour w9x, et le SPTI pour les sytèmes W2k/XP/2k3.

La manière de scanner les périphériques, de manière standard, est de récupérer la liste des lecteurs (C à Z) et de tester s'ils sont utilisés et de types CD.
Or certaines personnes ont retiré la letter de lecteur de leur périphérique.
J'ai donc un périphérique de branché, mais inacessible par un utilisateur standard.


Pour cette raison je demande au système de me fournir la liste des lecteurs cd (cf code ci-dessous).

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
 
Procedure TDriverInterfaceSPTI.GetUnitsFromClassDevices;
{--------------------------------------------
  Scanne la classe CD-Rom
  ****
  Sources :
  http://msdn.microsoft.com/library/en-us/devio/base/setupdigetclassdevs.asp
---------------------------------------------}
const
  FuncName : string = 'TDriverInterfaceSPTI.GetUnitsFromClassDevices';
var
  DevList : HDEVINFO;                           // Liste des périphériques de type CD
  DevI : Integer;                               // compteur, pour le Ieme périph de la liste
  Success : Boolean;
  DeviceInterfaceData: TSPDeviceInterfaceData;
  DevData: TSPDevInfoData;
  BytesReturned: DWORD;
  FunctionClassDeviceData: PSPDeviceInterfaceDetailData;
  aUnit : TUnitSPTI;
Begin
  Self.DebugAddMsg(FuncName, '');
 
  Self.Units.Clear;                                                             // Efface la liste des lecteurs
 
  { récupère la liste des périph CD }
  DevList := SetupDiGetClassDevs(@CDROMCLASSGUID, nil, 0, DIGCF_PRESENT or DIGCF_INTERFACEDEVICE);
  if (DevList = Pointer(INVALID_HANDLE_VALUE)) then Begin
    Self.DebugAddMsg(FuncName, 'Impossible d''obtenir le handle sur la liste des cd');
    Exit;
  End;
 
  { information sur un périphérique de la liste }
  DevI := 0;
  Repeat
    DeviceInterfaceData.cbSize := SizeOf(TSPDeviceInterfaceData);
    Success := SetupDiEnumDeviceInterfaces(DevList, nil, CDROMCLASSGUID, DevI, DeviceInterfaceData);
    if Success then begin
      DevData.cbSize := SizeOf(DevData);
      BytesReturned := 0;
      SetupDiGetDeviceInterfaceDetail(DevList, @DeviceInterfaceData, nil, 0, BytesReturned, @DevData);
      if (BytesReturned <> 0) and (GetLastError = ERROR_INSUFFICIENT_BUFFER) then begin
        FunctionClassDeviceData := AllocMem(BytesReturned);
        FunctionClassDeviceData.cbSize := 5;
        if SetupDiGetDeviceInterfaceDetail(DevList, @DeviceInterfaceData, FunctionClassDeviceData, BytesReturned, BytesReturned, @DevData) then Begin
          MessageBox(0, PChar(@FunctionClassDeviceData.DevicePath), '', MB_OK);
          aUnit := TUnitSPTI.Create(Self, PChar(@FunctionClassDeviceData.DevicePath));
          Self.Units.Add(aUnit);
        End;
      End;
      Inc(DevI,1);
    End;
  Until not Success;
End;
j'obtiens sur cette procedure de tests, le message suivant :



Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
 
\\?\ide#cdrommatshita_ujda720_dvd#cdrw_______________1.00____#5&306ef82c&0&0.0.0#{53f56308-b6bf-11d0-94f2-00a0c91efb8b}
Je souhaiterais maintenant pouvoir dire quelle est la lettre de lecteur associée au lien ci-dessus.
Je sais juste que les lettres de lecteurs et périphériques "montés" sont gérés ici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
Si quelqu'un sait comment passer du lien à la lettre de lecteur....


Tant que j'y suis, est ce que quelqu'un sait comment obtenir les informations suivantes : si le lecteur est connecté sur le primary\secondary ide, en master\slave.


Merci d'avance, et s'il y a un spécialiste SCSI\SPTI\ASPI sur le forum et qu'il veuille bien jetter un oeil de temps à autre à mon projet, voir me donner un coup de main plus poussé, je lui en serait très reconnaissant.


Merci d'avance pour votre aide.