[Bug 37724] New: Modern applications won't find COM ports nor HID devices

wine-bugs at winehq.org wine-bugs at winehq.org
Mon Dec 15 03:59:19 CST 2014


https://bugs.winehq.org/show_bug.cgi?id=37724

            Bug ID: 37724
           Summary: Modern applications won't find COM ports nor HID
                    devices
           Product: Wine
           Version: unspecified
          Hardware: x86
                OS: Linux
            Status: UNCONFIRMED
          Severity: normal
          Priority: P2
         Component: setupapi
          Assignee: wine-bugs at winehq.org
          Reporter: heha at hrz.tu-chemnitz.de
      Distribution: ---

While old apps search COM ports use CreateFile("COMx"...) attempts to detect
the presence of serial interfaces, newer apps use SetupDi functions. As a
typical excerpt:

 devs=SetupDiGetClassDevs(&GUID_DEVCLASS_PORTS,NULL,0,DIGCF_PRESENT);
 if (devs!=INVALID_HANDLE_VALUE) {
  SP_DEVINFO_DATA devInfo;
  devInfo.cbSize=sizeof devInfo;
  for (i=0; SetupDiEnumDeviceInfo(devs,i,&devInfo); i++) {
   HKEY hKey;
   TCHAR s[16];
   DWORD slen=sizeof s;
   *s=0;
   if ((hKey=SetupDiOpenDevRegKey(devs,&devInfo,
     DICS_FLAG_GLOBAL,0,DIREG_DEV,KEY_READ))
     ==INVALID_HANDLE_VALUE) continue;
   RegQueryValueEx(hKey,T("PortName"),NULL,NULL,(LPBYTE)s,&slen);
   RegCloseKey(hKey);
   if (*s=='C') {    // filter out LPTx
    int idx=ComboBox_AddString(hCombo,s);
    int num=StrToInt(s+3)-1;
    ComboBox_SetItemData(hCombo,idx,num);
    if (num==Config.SerialNo) ComboBox_SetCurSel(hCombo,idx);
   }
  }
  SetupDiDestroyDeviceInfoList(devs);
 }

The main advantages for this approach are:
* Unlimited COM port numbers
* Much faster than looped CreateFile attempts

Therefore, modern apps use this procedure.


Similarly, apps talking with modern USB HID devices (these devices don't need
an install procedure), do this procedure to find their device:

 GUID hidGuid;
 HidD_GetHidGuid(&hidGuid);
 devs=SetupDiGetClassDevs(&hidGuid,0,0,DIGCF_PRESENT|DIGCF_DEVICEINTERFACE);
 if (devs!=INVALID_HANDLE_VALUE) {
  SP_DEVICE_INTERFACE_DATA devinterface;
  devinterface.cbSize=sizeof devinterface;
  for (i=0;
    SetupDiEnumDeviceInterfaces(devs,NULL,&hidGuid,i,&devinterface);
    i++) {
   THid Hid;
   union{            // save stack space
    SP_DEVICE_INTERFACE_DETAIL_DATA detail;
    TCHAR space[MAX_PATH+4];
    WCHAR ps[128];        // Product String
    HIDD_ATTRIBUTES a;
   }u;
   SP_DEVINFO_DATA info;
   info.cbSize=sizeof info;
   u.detail.cbSize=sizeof u.detail;
   if (!SetupDiGetDeviceInterfaceDetail(devs,&devinterface,
     &u.detail,sizeof u,NULL,&info)) continue;
   Hid.hDev=CreateFile(u.detail.DevicePath,GENERIC_READ|GENERIC_WRITE,
     FILE_SHARE_READ|FILE_SHARE_WRITE,
     NULL,OPEN_EXISTING,FILE_FLAG_OVERLAPPED,NULL);
   if (Hid.hDev!=INVALID_HANDLE_VALUE) {
    HidD_GetAttributes(Hid.hDev,&u.a);
    if (*(DWORD*)&u.a.VendorID==0x27D916C0
    && HidD_GetProductString(Hid.hDev,u.ps,elemof(u.ps))) {
     int l=ComboBox_AddStringW(hCombo,u.ps);
     ComboBox_SetItemData(hCombo,l,i);
     if (i==Config.iUsbHid) ComboBox_SetCurSel(hCombo,l);
    }
    CloseHandle(Hid.hDev);
   }
  }
  SetupDiDestroyDeviceInfoList(devs);
 }

Nice when at least the COM port detection will work in near future.

I can write a small test application to support the bug-fixing process.
Googling for Funkuhr.exe will reveal a source code that contains both routines
already.

-- 
Do not reply to this email, post in Bugzilla using the
above URL to reply.
You are receiving this mail because:
You are watching all bug changes.



More information about the wine-bugs mailing list