예제 #1
0
        //---#+************************************************************************
        //---NOTATION:
        //-  int CT_SetupDiEnumDeviceInterfaces(int memberIndex)
        //-
        //--- DESCRIPTION:
        //--    results = 1 iin the second pass of the routine is success
        //-     DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass
        //
        //                                                              Autor:      F.L.
        //-*************************************************************************+#*
        public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref int RequiredSize, int DeviceInterfaceDetailDataSize)
        {
            myPSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA();

            //
            // This part needs some work

            // if I use the following line of code
            // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA);
            // I get the following error
            // !! Cannot take the address or size of a variable of a managed type ('USBSharp.USBSharp.PSP_DEVICE_INTERFACE_DETAIL_DATA')
            //

            // As a result.. this is hard coded for now !!!
            // for the c struct PSP_DEVICE_INTERFACE_DETAIL_DATA dizeof = DWORD cbSize (size 4) + Char[0] (size 1) = Total size 5 ?
            //
            myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;

            int results =
                SetupDiGetDeviceInterfaceDetail(
                    hDevInfo,                               // IN HDEVINFO  DeviceInfoSet,
                    ref mySP_DEVICE_INTERFACE_DATA,         // IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData,
                    ref myPSP_DEVICE_INTERFACE_DETAIL_DATA, // DeviceInterfaceDetailData,  OPTIONAL
                    DeviceInterfaceDetailDataSize,          // IN DWORD  DeviceInterfaceDetailDataSize,
                    ref RequiredSize,                       // OUT PDWORD  RequiredSize,  OPTIONAL
                    null);                                  //

            DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;
            return(results);
        }
예제 #2
0
 private static extern unsafe int SetupDiGetDeviceInterfaceDetail(
     int DeviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,
     ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA,
     int detailSize,
     ref int requiredSize,
     int *bPtr);
예제 #3
0
파일: DllImports.cs 프로젝트: zezo010/acat
 public static extern int SetupDiGetDeviceInterfaceDetail(
     int DeviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,
     ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA,
     int detailSize,
     ref int requiredSize,
     IntPtr bPtr);
예제 #4
0
        private unsafe void _Init(string devicePath, bool throwNotFoundError)
        {
            int result;
            int deviceCount  = 0;
            int size         = 0;
            int requiredSize = 0;

            _guid = new GUID();
            HidD_GetHidGuid(ref _guid);

            _hDeviceInfo = SetupDiGetClassDevs(ref _guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);

            do
            {
                _SP_DEVICE_INTERFACE_DATA        = new SP_DEVICE_INTERFACE_DATA();
                _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA);
                result = SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA);
                SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null);
                size = requiredSize;
                _PSP_DEVICE_INTERFACE_DETAIL_DATA        = new PSP_DEVICE_INTERFACE_DETAIL_DATA();
                _PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;
                SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, ref _PSP_DEVICE_INTERFACE_DETAIL_DATA,
                                                size, ref requiredSize, null);
                _devicePath = _PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;

                if (_devicePath == devicePath)
                {
                    _found = true;
                    _SP_DEVICE_INTERFACE_DATA        = new SP_DEVICE_INTERFACE_DATA();
                    _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA);
                    SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA);
                    size         = 0;
                    requiredSize = 0;
                    SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
                    SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
                    _hidHandle = CreateFile(_devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

                    break;
                }

                deviceCount++;
            } while (result != 0);

            if (!_found)
            {
                if (throwNotFoundError)
                {
                    throw new InvalidOperationException("Device not found");
                }
            }
            else
            {
                _dataReadingThread = new Thread(new ThreadStart(_ReadDataThread));
                _dataReadingThread.Start();
            }
        }
예제 #5
0
파일: USBSharp.cs 프로젝트: Test0222/Test02
        //---#+************************************************************************
        //---NOTATION:
        //-  int CT_SetupDiEnumDeviceInterfaces(int memberIndex)
        //-
        //--- DESCRIPTION:
        //--    results = 1 iin the second pass of the routine is success
        //-     DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass
        //
        //                                                              Autor:      F.L.
        //-*************************************************************************+#*
        public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref string devicePath, ref int RequiredSize, int DeviceInterfaceDetailDataSize)
        {
            myPSP_DEVICE_INTERFACE_DETAIL_DATA        = new PSP_DEVICE_INTERFACE_DETAIL_DATA();
            myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;
            int results =
                SetupDiGetDeviceInterfaceDetail(
                    hDevInfo,                               // IN HDEVINFO  DeviceInfoSet,
                    ref mySP_DEVICE_INTERFACE_DATA,         // IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData,
                    ref myPSP_DEVICE_INTERFACE_DETAIL_DATA, // DeviceInterfaceDetailData,  OPTIONAL
                    DeviceInterfaceDetailDataSize,          // IN DWORD  DeviceInterfaceDetailDataSize,
                    ref RequiredSize,                       // OUT PDWORD  RequiredSize,  OPTIONAL
                    null);                                  //

            DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;
            devicePath     = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;
            return(results);
        }
예제 #6
0
        //---#+************************************************************************
        //---NOTATION:
        //-  int CT_SetupDiEnumDeviceInterfaces(int memberIndex)
        //-
        //--- DESCRIPTION:
        //--    results = 1 iin the second pass of the routine is success
        //-     DeviceInterfaceDetailDataSize parameter (RequiredSize) came from the first pass
        //
        //                                                              Autor:      F.L.
        //-*************************************************************************+#*
        public unsafe int CT_SetupDiGetDeviceInterfaceDetailx(ref int RequiredSize, int DeviceInterfaceDetailDataSize)
        {
            myPSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA();

            //
            // This part needs some work

            // if I use the following line of code 
            // myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = sizeof(PSP_DEVICE_INTERFACE_DETAIL_DATA);
            // I get the following error
            // !! Cannot take the address or size of a variable of a managed type ('USBSharp.USBSharp.PSP_DEVICE_INTERFACE_DETAIL_DATA')
            // 

            // As a result.. this is hard coded for now !!! 
            // for the c struct PSP_DEVICE_INTERFACE_DETAIL_DATA dizeof = DWORD cbSize (size 4) + Char[0] (size 1) = Total size 5 ?
            //
            myPSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;

            int results =
                SetupDiGetDeviceInterfaceDetail(
                hDevInfo,									// IN HDEVINFO  DeviceInfoSet,
                ref mySP_DEVICE_INTERFACE_DATA,				// IN PSP_DEVICE_INTERFACE_DATA  DeviceInterfaceData,
                ref myPSP_DEVICE_INTERFACE_DETAIL_DATA,		// DeviceInterfaceDetailData,  OPTIONAL
                DeviceInterfaceDetailDataSize,				// IN DWORD  DeviceInterfaceDetailDataSize,
                ref RequiredSize,							// OUT PDWORD  RequiredSize,  OPTIONAL
                null); // 
            DevicePathName = myPSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;
            return results;
        }
예제 #7
0
 static extern unsafe int SetupDiGetDeviceInterfaceDetail(
     int DeviceInfoSet,
     ref SP_DEVICE_INTERFACE_DATA lpDeviceInterfaceData,
     ref PSP_DEVICE_INTERFACE_DETAIL_DATA myPSP_DEVICE_INTERFACE_DETAIL_DATA,
     int detailSize,
     ref int requiredSize,
     int* bPtr);
예제 #8
0
        private unsafe void _Init(int vendorId, int productId, bool throwNotFoundError)
        {
            int result;
              int deviceCount = 0;
              int size = 0;
              int requiredSize = 0;

              _guid = new GUID();
              HidD_GetHidGuid(ref _guid);

              _hDeviceInfo = SetupDiGetClassDevs(ref _guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);

              do
              {
            _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA();
            _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA);
            result = SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA);
            SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null);
            size = requiredSize;
            _PSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA();
            _PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;
            SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, ref _PSP_DEVICE_INTERFACE_DETAIL_DATA,
              size, ref requiredSize, null);
            _devicePath = _PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;

            string deviceID = "vid_" + vendorId.ToString("x4") + "&pid_" + productId.ToString("x4");
            if (_devicePath.IndexOf(deviceID) > 0)
            {
              _found = true;
              _SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA();
              _SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(_SP_DEVICE_INTERFACE_DATA);
              SetupDiEnumDeviceInterfaces(_hDeviceInfo, 0, ref _guid, deviceCount, ref _SP_DEVICE_INTERFACE_DATA);
              size = 0;
              requiredSize = 0;
              SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
              SetupDiGetDeviceInterfaceDetail(_hDeviceInfo, ref _SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
              _hidHandle = CreateFile(_devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);

              break;
            }

            deviceCount++;
              } while (result != 0);

              if (!_found)
              {
            if (throwNotFoundError)
              throw new InvalidOperationException("Device not found");
              }
              else
              {
            _dataReadingThread = new Thread(new ThreadStart(_ReadDataThread));
            _dataReadingThread.Start();
              }
        }
예제 #9
0
        public static unsafe List <string> GetAllDevices(int?vendorId, int?productId)
        {
            int result;
            int deviceCount  = 0;
            int size         = 0;
            int requiredSize = 0;
            var ret          = new List <string>();

            var guid = new GUID();

            HidD_GetHidGuid(ref guid);

            var hDeviceInfo = SetupDiGetClassDevs(ref guid, null, null, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT);

            do
            {
                var SP_DEVICE_INTERFACE_DATA = new SP_DEVICE_INTERFACE_DATA();
                SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(SP_DEVICE_INTERFACE_DATA);
                result = SetupDiEnumDeviceInterfaces(hDeviceInfo, 0, ref guid, deviceCount, ref SP_DEVICE_INTERFACE_DATA);
                SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, 0, ref requiredSize, null);
                size = requiredSize;
                var PSP_DEVICE_INTERFACE_DETAIL_DATA = new PSP_DEVICE_INTERFACE_DETAIL_DATA();
                PSP_DEVICE_INTERFACE_DETAIL_DATA.cbSize = 5;
                SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, ref PSP_DEVICE_INTERFACE_DETAIL_DATA,
                                                size, ref requiredSize, null);
                var devicePath = PSP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath;

                string deviceID = String.Empty;
                if (vendorId.HasValue)
                {
                    deviceID += "vid_" + vendorId.Value.ToString("x4");
                }
                if (productId.HasValue)
                {
                    if (!String.IsNullOrEmpty(deviceID))
                    {
                        deviceID += "&";
                    }
                    deviceID += "pid_" + productId.Value.ToString("x4");
                }
                if (String.IsNullOrEmpty(deviceID) || devicePath.IndexOf(deviceID) > 0)
                {
                    SP_DEVICE_INTERFACE_DATA        = new SP_DEVICE_INTERFACE_DATA();
                    SP_DEVICE_INTERFACE_DATA.cbSize = Marshal.SizeOf(SP_DEVICE_INTERFACE_DATA);
                    SetupDiEnumDeviceInterfaces(hDeviceInfo, 0, ref guid, deviceCount, ref SP_DEVICE_INTERFACE_DATA);
                    size         = 0;
                    requiredSize = 0;
                    SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
                    SetupDiGetDeviceInterfaceDetail(hDeviceInfo, ref SP_DEVICE_INTERFACE_DATA, null, size, ref requiredSize, null);
                    //var hidHandle = CreateFile(devicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, OPEN_EXISTING, 0, 0);
                    ret.Add(devicePath);
                    //CloseHandle(hidHandle);
                }

                deviceCount++;
            } while (result != 0);

            SetupDiDestroyDeviceInfoList(hDeviceInfo);

            return(ret);
        }