views:

228

answers:

1

I have an application that looks for a specific FTDI serial port with customised USB descriptors. My current code uses the example from Code Project, which searches the MSSerial_PortName WMI table under root\WMI, and pulls out extra USB information from root\CIMV2\WIN32_PnPEntity.

This worked well under XP, but the application must also run under a standard user onWindows 7. In this environment access of root\WMI results in an "Access Denied" ManagementException.

Can anybody suggest a way to cross reference the DOS device name of a serial port to the USB information, while running as a standard user? So far I've looked at the root\CIMV2\WIN32_SerialPort* tables, but they only contain motherboard ports. I've also considered using SetupAPI, but I haven't found a complete and working PInvoke template for this.

A: 

I've discovered an answer suitable for our case, though not a generic one. Our USB converters are all FTDI, and FTDI provide a DLL that handles this. My code using the DLL is below:

            UInt32 count = 0;
            FTDI.FT_STATUS status = ftdi.GetNumberOfDevices(ref count);
            if (status != FTDI.FT_STATUS.FT_OK)
            {
                log.Warn("Unable to access FTDI");
                return ports;
            }
            FTDI.FT_DEVICE_INFO_NODE[] list = new FTDI.FT_DEVICE_INFO_NODE[count];
            status = ftdi.GetDeviceList(list);
            if (status != FTDI.FT_STATUS.FT_OK)
            {
                log.Warn("Unable to access FTDI");
                return ports;
            }
            foreach (FTDI.FT_DEVICE_INFO_NODE node in list)
            {
                if ((status = ftdi.OpenByLocation(node.LocId)) == FTDI.FT_STATUS.FT_OK)
                {
                    try
                    {
                        string comport;
                        ftdi.GetCOMPort(out comport);
                        ports.Add(new Port(comport, node.Description, node.SerialNumber));
                    }
                    finally
                    {
                        ftdi.Close();
                    }
                }
            }
Adrian Cox