Forum: PC-Programmierung AVR USB DriverHELL


von Kahn P. (Gast)


Lesenswert?

Hallo,

ich habe eine von ZDiag.exe erstellte *.inf Datei und diese enthält die 
GeräteGUID (MultiSerial)  und die DriverGUID.

Ausschnitt der Infdatei
1
;DigiUSB.inf
2
; Copyright (c) 2010-2014 libusb (GNU LGPL)
3
[Strings]
4
DeviceName = "DigiUSB"
5
VendorName = "Van Ooijen Technische Informatica"
6
SourceName = "DigiUSB Install Disk"
7
DeviceID   = "VID_16C0&PID_05DF"
8
DeviceGUID = "{23F89E5D-616F-4DA0-AA2B-D08123AFDF2C}"
9
10
[Version]
11
Signature   = "$Windows NT$"
12
Class       = "Universal Serial Bus devices"
13
ClassGuid   = {88bae032-5a81-49f0-bc3d-a4ff138216d6}
14
Provider    = "libusb.info"
15
CatalogFile = DigiUSB.cat
16
DriverVer   = 06/18/2013, 6.1.7600.16385

Nach der Installation des Treibers  kann ich manuel den Key zum öffnen 
verwenden:

AVROPENGUID {0x23F89E5D, 0x616F, 0x4DA0, {0xAA, 0x2B, 0xD0, 0x81, 0x23, 
0xAF, 0xDF, 0x2C}}

und erhalte unten den Path für den Treiber das Gerät kann dann verwendet 
werden.
1
bool CAvrCtrl::RetrieveDevicePath(GUID avrguid)
2
{
3
  SP_DEVICE_INTERFACE_DATA         interfaceData = { 0 };
4
  PSP_DEVICE_INTERFACE_DETAIL_DATA detailData = NULL;
5
  ULONG                            requiredLength = 0;
6
7
  HDEVINFO deviceInfoSet(0);
8
  interfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
9
10
  if ((deviceInfoSet = SetupDiGetClassDevs(&avrguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)) == INVALID_HANDLE_VALUE)
11
    return false;
12
13
  if (!SetupDiEnumDeviceInterfaces(deviceInfoSet, NULL, &avrguid, 0, &interfaceData))
14
  {
15
    SetupDiDestroyDeviceInfoList(deviceInfoSet);
16
    return false;
17
  }
18
  
19
  //Retrive the size
20
  if(!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, NULL, 0, &requiredLength, NULL))
21
  {
22
    DWORD dwError = GetLastError();
23
    if (dwError == ERROR_INSUFFICIENT_BUFFER || requiredLength == 0)
24
    {
25
      SetupDiDestroyDeviceInfoList(deviceInfoSet);
26
      return false;
27
    }
28
  }
29
30
  if (!(detailData = (PSP_DEVICE_INTERFACE_DETAIL_DATA)LocalAlloc(LMEM_FIXED, requiredLength)))
31
  {
32
    SetupDiDestroyDeviceInfoList(deviceInfoSet);
33
    return false;
34
  }
35
36
  detailData->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
37
38
  if (!SetupDiGetDeviceInterfaceDetail(deviceInfoSet, &interfaceData, detailData, requiredLength, &requiredLength, NULL))
39
  {
40
    LocalFree(detailData);
41
    SetupDiDestroyDeviceInfoList(deviceInfoSet);
42
    return false;
43
  }
44
45
  strcpy(&m_DevicePath[0], detailData->DevicePath);
46
  
47
  LocalFree(detailData);
48
  SetupDiDestroyDeviceInfoList(deviceInfoSet);
49
50
    return true;
51
}

Es ist so, das sich die DeviceGUID verändern kann in der *.inf Datei was 
immer bleibt ist die Product und Vendor ID.
Also möchte ich über PID und VID den Treiber-Path finden, dazu verwende 
ich eine konforme getestete Deviceiteration von MicroSoft TechExample
1
bool CAvrCtrl::EnumDriver(char *pVid, char *pPid)
2
{
3
  HDEVINFO        hDevInfo = 0L;
4
  SP_DEVINFO_DATA spDevInfoData = { 0 };
5
  short           wIndex = 0;
6
7
  hDevInfo = SetupDiGetClassDevs(0L, 0L, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_PROFILE);
8
  if (hDevInfo == INVALID_HANDLE_VALUE)
9
    return false;
10
11
  spDevInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
12
  
13
  while (SetupDiEnumDeviceInfo(hDevInfo, wIndex, &spDevInfoData))
14
  {
15
    char   szBuf[MAX_PATH] = { 0 };
16
    char   szID[LINE_LEN]  = { 0 };
17
    int    wImageIdx       = 0;
18
    DWORD  dwRequireSize   = 0;
19
    
20
    if (!SetupDiGetDeviceRegistryProperty(hDevInfo,&spDevInfoData,SPDRP_CLASS, 0L,(PBYTE)szBuf,2048,0))
21
    {
22
      wIndex++;
23
      continue;
24
    }
25
    
26
    if (!SetupDiGetClassDescription(&spDevInfoData.ClassGuid,szBuf,MAX_PATH,&dwRequireSize))
27
    {
28
      wIndex++;
29
      continue;
30
    }
31
32
    if (!SetupDiGetDeviceInstanceId(hDevInfo, &spDevInfoData, szID, LINE_LEN, 0))
33
      ;
34
        
35
    SP_DEVICE_INTERFACE_DATA spDevInterfaceData = { 0 };
36
37
    spDevInterfaceData.cbSize = sizeof(SP_DEVICE_INTERFACE_DATA);
38
    if (SetupDiCreateDeviceInterface(hDevInfo, &spDevInfoData, &spDevInfoData.ClassGuid, 0L, 0L, &spDevInterfaceData))
39
    {
40
      SP_DEVICE_INTERFACE_DETAIL_DATA *pspDevInterfaceDetail = 0L;
41
      DWORD                           dwRequire = 0L;
42
43
      if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &spDevInterfaceData, 0L, 0, &dwRequire, 0L))
44
      {
45
        DWORD dwError = GetLastError();
46
        if (dwError != ERROR_INSUFFICIENT_BUFFER)
47
          return false;
48
      }
49
        
50
      pspDevInterfaceDetail = (SP_DEVICE_INTERFACE_DETAIL_DATA*)LocalAlloc(LPTR, sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA)*dwRequire);
51
      pspDevInterfaceDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA);
52
      if (!SetupDiGetDeviceInterfaceDetail(hDevInfo, &spDevInterfaceData, pspDevInterfaceDetail, dwRequire, &dwRequire, 0L))
53
      {
54
        DWORD dwError = GetLastError();
55
        if (dwError != ERROR_INSUFFICIENT_BUFFER)
56
          ;
57
      }
58
      else
59
      {
60
        if (strstr(pspDevInterfaceDetail->DevicePath, pVid) && strstr(pspDevInterfaceDetail->DevicePath, pPid))
61
        {
62
          strcpy(&m_DevicePath[0], pspDevInterfaceDetail->DevicePath);
63
          puts(&m_DevicePath[0]);
64
        }
65
      }
66
67
      if (pspDevInterfaceDetail)
68
        LocalFree(pspDevInterfaceDetail);
69
    }
70
71
    wIndex++;
72
  }
73
74
  SetupDiDestroyDeviceInfoList(hDevInfo);
75
76
  return true;
77
}

Hier erhalte ich über PID und VID einen Path auf das Gerät, auch die 
Anschlussnummern stimmen.

Was aber nicht stimmt ist die GeräteGUID am Ende des Pathe's diese 
unterscheidet sich zu der aus der *.inf Datei was zur Folge hat,
das dieses Gerät mit CreateFile nicht geöffnet wird.

Der über die GeräteGUID erzeugte Path :
"\\\\?\\usb#vid_16c0&pid_05df#5&1257636a&0&3#{23f89e5d-616f-4da0-aa2b-d0 
8123afdf2c}"

Der über die Iteration erzugte Path:
"\\\\?\\usb#vid_16c0&pid_05df#5&1257636a&0&3#{88bae032-5a81-49f0-bc3d-a4 
ff138216d6}"

Warum ist die über die Iteration erzeugte GeräteGUID mit einem Key 
versehen den ich nicht kenne, und das System auch nicht ?


Vielen Dank für Hinweise ich lege mir bereits die Karten...
 Karsten aus Berlin

: Verschoben durch User
von Potter (Gast)


Lesenswert?

Karsten S. schrieb:
> Warum ist die über die Iteration erzeugte GeräteGUID mit einem Key
> versehen den ich nicht kenne, und das System auch nicht ?

Deine Suche basiert auf unterschiedlichen Teilmengen der USB-Geräte:
1
SetupDiGetClassDevs(0L, 0L, NULL, DIGCF_PRESENT | DIGCF_ALLCLASSES | DIGCF_PROFILE);
2
3
SetupDiGetClassDevs(&avrguid, NULL, NULL, DIGCF_PRESENT | DIGCF_DEVICEINTERFACE)

https://msdn.microsoft.com/en-us/library/windows/hardware/ff551069%28v=vs.85%29.aspx

Gruß Potter

von Kahn P. (Gast)


Lesenswert?

Hallo ,

danke für deine Antwort, auch das verändern/ersetzen der 
Iterationsmethode
Mit einer Guid z.b. der vom Windows "Universal Serial Bus Device"

GUID devclass = GUID_DEVCLASS_MULTIPORTSERIAL;// GUID_DEVCLASS_USB;
hDevInfo = SetupDiGetClassDevs(&devclass, 0L, NULL, DIGCF_PRESENT | 
DIGCF_ALLCLASSES | DIGCF_PROFILE | DIGCF_DEVICEINTERFACE);

Liefert am ende des Pathes immer die ClassGUID des in der *inf 
befindlichen
DeviceClass eintrages, ich benötige jedoch die DeviceGUID aus der
*.inf Mit der kann ich das Gerät öffnen, weil der Path am ende diese 
GUID
enthält und nicht die von der ClassGuid.

Ich wünschte ich könnte diese Guid irgendwie erlangen, bisher sind alle 
Versuche fehlgeschlagen diese GUID Konform durch die Iteration zu 
bekommen.

Diese DeviceGUID Wird insbesondere von libusb über den ZDiag in die Inf 
eingetragen. Ich habe *inf Dateien gesehen die diesen Eintrag garnicht 
haben.

Ich würde lieber ohne libusb auskommen zum größten Teil ist das ja schon 
gelungen da ich WinUsb.dll dynamisch lade und CreateFile erfolgrteich 
ist, auch die Kommunikation mit dem Atiny85 ist tadellos.

Hast Du einen Rat wie meine *.inf aussehen muss um ein:
 "Universal Serial Bus devices"

zu öffnen.

Mein Versuch mit einer eigene Inf ergibt kein Ergebnis:
1
; DigiUSB.inf
2
; Copyright (c) 2010-2014 libusb (GNU LGPL)
3
[Strings]
4
DeviceName = "DigiUSB"
5
VendorName = "Van Ooijen Technische Informatica"
6
SourceName = "DigiUSB Install Disk"
7
DeviceID   = "VID_16C0&PID_05DF"
8
DeviceGUID = "{23F89E5D-616F-4DA0-AA2B-D08123AFDF2C}"
9
10
[Version]
11
Signature   = "$Windows NT$"
12
Class       = "Universal Serial Bus devices"
13
ClassGuid   = {88bae032-5a81-49f0-bc3d-a4ff138216d6}
14
Provider    = "libusb.info"
15
CatalogFile = DigiUSB.cat
16
DriverVer   = 06/18/2013, 6.1.7600.16385
17
18
[ClassInstall32]
19
Addreg = WinUSBDeviceClassReg
20
21
[WinUSBDeviceClassReg]
22
HKR,,,0,"Universal Serial Bus devices"
23
HKR,,Icon,,-20
24
25
[Manufacturer]
26
%VendorName% = libusbDevice_WinUSB,NTx86,NTamd64,NTia64
27
28
[libusbDevice_WinUSB.NTx86]
29
%DeviceName% = USB_Install, USB\%DeviceID%
30
31
[libusbDevice_WinUSB.NTamd64]
32
%DeviceName% = USB_Install, USB\%DeviceID%
33
34
[libusbDevice_WinUSB.NTia64]
35
%DeviceName% = USB_Install, USB\%DeviceID%
36
37
[USB_Install]
38
Include = winusb.inf
39
Needs   = WINUSB.NT
40
41
[USB_Install.Services]
42
Include    = winusb.inf
43
AddService = WinUSB,0x00000002,WinUSB_ServiceInstall
44
45
[WinUSB_ServiceInstall]
46
DisplayName   = "WinUSB - Kernel Driver 06/18/2013 6.1.7600.16385"
47
ServiceType   = 1
48
StartType     = 3
49
ErrorControl  = 1
50
ServiceBinary = %12%\WinUSB.sys
51
52
[USB_Install.Wdf]
53
KmdfService = WINUSB, WinUsb_Install
54
55
[WinUSB_Install]
56
KmdfLibraryVersion = 1.9
57
58
[USB_Install.HW]
59
AddReg = AddDeviceInterfaceGUID
60
61
[NoDeviceInterfaceGUID]
62
; Avoids adding a DeviceInterfaceGUID for generic driver
63
64
[AddDeviceInterfaceGUID]
65
HKR,,DeviceInterfaceGUIDs,0x10000,%DeviceGUID%
66
67
[USB_Install.CoInstallers]
68
AddReg    = CoInstallers_AddReg
69
CopyFiles = CoInstallers_CopyFiles
70
71
[CoInstallers_AddReg]
72
HKR,,CoInstallers32,0x00010000,"WdfCoInstaller01009.dll,WdfCoInstaller","WinUSBCoInstaller2.dll"
73
74
[CoInstallers_CopyFiles]
75
WinUSBCoInstaller2.dll
76
WdfCoInstaller01009.dll
77
78
[DestinationDirs]
79
CoInstallers_CopyFiles = 11
80
81
[SourceDisksNames]
82
1 = %SourceName%
83
84
[SourceDisksFiles.x86]
85
WinUSBCoInstaller2.dll  = 1,x86
86
WdfCoInstaller01009.dll = 1,x86
87
88
[SourceDisksFiles.amd64]
89
WinUSBCoInstaller2.dll  = 1,amd64
90
WdfCoInstaller01009.dll = 1,amd64
91
92
[SourceDisksFiles.ia64]
93
WinUSBCoInstaller2.dll  = 1,ia64
94
WdfCoInstaller01009.dll = 1,ia64


Vielen Dank für eine Hilfestellung .
 Grüße Karsten aus Berlin

--

Fehlerhafte Tags ersetzt
-rufus

: Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.