1

当我调用 SetupDiEnumDeviceInterfaces 时,我得到了 success = false 并且最后一个错误是 ERROR_INVALID_USER_BUFFER 1784。不确定代码是否可以正常工作。我正在尝试从供应商那里移植 c 和 C++ 中的代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Win32;
using System.Runtime.InteropServices;
using System.Windows;
using System.Management;
using Microsoft.Win32.SafeHandles;
using System.IO;

namespace GPSTester.src.IPParallelHQT
{
class HaveQuick
{

    [DllImport("setupapi.dll", CharSet = CharSet.Auto)]
    static extern IntPtr SetupDiGetClassDevs(
        ref Guid ClassGuid,
        IntPtr Enumerator,
        IntPtr hwndParent,
        uint Flags
        );

    [DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern Boolean SetupDiEnumDeviceInterfaces(
       IntPtr hDevInfo,
       ref DeviceInfoData devInfo,
        //           IntPtr devInfo,
       ref Guid interfaceClassGuid,
       UInt32 memberIndex,
       ref DeviceInterfaceData deviceInterfaceData
    );

    [DllImport(@"setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    public static extern Boolean SetupDiGetDeviceInterfaceDetail(
       IntPtr hDevInfo,
       ref DeviceInterfaceData deviceInterfaceData,
       ref DeviceInterfaceDetailData deviceInterfaceDetailData,
       UInt32 deviceInterfaceDetailDataSize,
       out UInt32 requiredSize,
       ref DeviceInfoData deviceInfoData
    );

    [DllImport("setupapi.dll", CharSet = CharSet.Auto, SetLastError = true)]
    static extern bool SetupDiBuildClassInfoList(
            UInt32 Flags,
            [In, Out] Guid[] ClassGuidList,
            UInt32 ClassGuidListSize,
            out UInt32 RequiredSize);

    [DllImport("setupapi.dll", SetLastError = true)]
    static extern bool SetupDiEnumDeviceInfo(
        IntPtr deviceInfoSet, 
        uint memberIndex, 
        ref DeviceInfoData deviceInfoData);

    [DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
    static extern IntPtr CreateFile(
        string fileName,
        [MarshalAs(UnmanagedType.U4)] FileAccess fileAccess,
        [MarshalAs(UnmanagedType.U4)] FileShare fileShare,
        int securityAttributes,
        [MarshalAs(UnmanagedType.U4)] FileMode creationDisposition,
        int flags,
        IntPtr template);

    [StructLayout(LayoutKind.Sequential)]
    public struct DeviceInterfaceData
    {
        public uint cbSize;
        public Guid interfaceClassGuid;
        public uint flags;
        public IntPtr reserved;
    }

    [StructLayout(LayoutKind.Sequential)]
    public struct DeviceInfoData
    {
        public uint cbSize;
        public Guid ClassGuid;
        public uint DevInst;
        public IntPtr Reserved;
    }

    // Device interface detail data
    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)]
    public struct DeviceInterfaceDetailData
    {
        public UInt32 cbSize;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 256)]
        public string DevicePath;
    }

    private const int ERROR_NO_MORE_ITEMS = 259;

    public enum DeviceFlags 
    {
        Default = 0x00000001, // only valid with DeviceInterface
        Present = 0x00000002,
        AllClasses = 0x00000004,
        Profile = 0x00000008,
        DeviceInterface = 0x00000010,
    }

    public const short INVALID_HANDLE_VALUE = -1;

    int lastError;

    public HaveQuick()
    {
        bool success = true;

        Guid GUID_DEVINTERFACE_IPHQT = new Guid(0x13FF045F, 0xe9D2, 0x479C, 0xB3,   0x90, 0x8C, 0xAE, 0xC7, 0xD1, 0x1C, 0xC4);
        IntPtr hDeviceInfo = SetupDiGetClassDevs(ref GUID_DEVINTERFACE_IPHQT, IntPtr.Zero, IntPtr.Zero, (uint)(DeviceFlags.Present | DeviceFlags.DeviceInterface));
        if (hDeviceInfo == IntPtr.Zero)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't get class info error code = {0}\n");
            return;
        }


        uint devNum = 0x0000;    //Enter board number(starting from zero)
        // Find the interface for device devNum
        DeviceInterfaceData interfaceData = new DeviceInterfaceData();                  // Interface data for this device
        interfaceData.cbSize = (uint)Marshal.SizeOf(interfaceData);
        success = SetupDiEnumDeviceInterfaces(hDeviceInfo, ref deviceInfoData, ref GUID_DEVINTERFACE_IPHQT, devNum, ref interfaceData);
        if (!success)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't enum device error number = {0}\n", lastError);
        }

        // Found our device, get the details data to obtain the symbolic link name

        UInt32 requiredSize;                 // Size of buffer reguired to get the symbolic link name
        DeviceInterfaceDetailData deviceDetailData = new DeviceInterfaceDetailData();
        uint deviceInterfaceDetailDataSize = (uint)Marshal.SizeOf(deviceDetailData);
        success = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref interfaceData, ref deviceDetailData, deviceInterfaceDetailDataSize, out requiredSize, ref deviceInfoData);
        if (!success)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't get interface detail error number = {0}\n", lastError);
        }

        // Get the detail info
        success = SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref interfaceData, ref deviceDetailData, deviceInterfaceDetailDataSize, out requiredSize, ref deviceInfoData);
        if (!success)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't get interface detail(2) error number = {0}\n", lastError);
        }
        string deviceName = deviceDetailData.DevicePath;
        IntPtr  hIpHqt = CreateFile(deviceName, 
                                FileAccess.Read | FileAccess.Write,
                                FileShare.Read | FileShare.Write,
                                0, FileMode.Open, 0, IntPtr.Zero);

        if (hIpHqt == IntPtr.Zero)
        {
            lastError = Marshal.GetLastWin32Error();
            Console.WriteLine("**Error: couldn't open %s, (%d)\n", deviceName, lastError);
        }
    }

}

}
4

0 回答 0