170 lines
6.2 KiB
C++
170 lines
6.2 KiB
C++
|
|
#pragma unmanaged
|
||
|
|
#include "pch.h"
|
||
|
|
#include "Device.h"
|
||
|
|
|
||
|
|
HDEVINFO hi;
|
||
|
|
HDEVINFO DeviceInfoSet;
|
||
|
|
int DeviceIndex;
|
||
|
|
SP_DEVINFO_DATA DeviceInfoData;
|
||
|
|
|
||
|
|
TCHAR szDeviceInstanceID[MAX_DEVICE_ID_LEN];
|
||
|
|
TCHAR szDesc[1024], szHardwareIDs[4096];
|
||
|
|
|
||
|
|
WCHAR BusReportedDeviceDesc[255];
|
||
|
|
DWORD cbBusReportedDeviceDesc;
|
||
|
|
WCHAR Device_Manufacturer[255];
|
||
|
|
DWORD cbDevice_Manufacturer;
|
||
|
|
WCHAR Device_FriendlyName[255];
|
||
|
|
DWORD cbDevice_FriendlyName;
|
||
|
|
WCHAR DeviceDisplay_Category[255];
|
||
|
|
DWORD cbDeviceDisplay_Category;
|
||
|
|
WCHAR Hardware_ID[255];
|
||
|
|
DWORD cbHARDWAREID;
|
||
|
|
WCHAR PortName[255];
|
||
|
|
DWORD cbPortName;
|
||
|
|
CHAR Device_Exclusive;
|
||
|
|
DWORD cbDevice_Exclusive;
|
||
|
|
|
||
|
|
std::vector<const wchar_t* > filters;
|
||
|
|
|
||
|
|
|
||
|
|
CONFIGRET eject(DEVINST dnDevInst)
|
||
|
|
{
|
||
|
|
TCHAR szVetoName[512];
|
||
|
|
PNP_VETO_TYPE vt;
|
||
|
|
CONFIGRET status =
|
||
|
|
CM_Request_Device_EjectW(
|
||
|
|
dnDevInst,
|
||
|
|
&vt, szVetoName, 512, 0);
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
static BOOL Reset(HDEVINFO hDevInfo, SP_DEVINFO_DATA* pDeviceInfoData)
|
||
|
|
{
|
||
|
|
DWORD err = 0;
|
||
|
|
bool rv = true;
|
||
|
|
//https://forums.codeguru.com/showthread.php?418183-Reset-USB-connection
|
||
|
|
SP_CLASSINSTALL_HEADER classInstallParams;
|
||
|
|
SP_PROPCHANGE_PARAMS propChangeParams;
|
||
|
|
|
||
|
|
classInstallParams.cbSize = sizeof(SP_CLASSINSTALL_HEADER);
|
||
|
|
classInstallParams.InstallFunction = DIF_PROPERTYCHANGE;
|
||
|
|
propChangeParams.ClassInstallHeader = classInstallParams;
|
||
|
|
propChangeParams.StateChange = DICS_DISABLE; //DICS_PROPCHANGE
|
||
|
|
propChangeParams.Scope = DICS_FLAG_GLOBAL;
|
||
|
|
propChangeParams.HwProfile = 0;
|
||
|
|
|
||
|
|
if (SetupDiSetClassInstallParams(hDevInfo, pDeviceInfoData, (PSP_CLASSINSTALL_HEADER)&propChangeParams, sizeof(SP_PROPCHANGE_PARAMS)))
|
||
|
|
{
|
||
|
|
rv = SetupDiCallClassInstaller(DIF_PROPERTYCHANGE, hDevInfo, pDeviceInfoData);
|
||
|
|
if (!rv) err = GetLastError();
|
||
|
|
}
|
||
|
|
return rv;
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL DeviceScanStart(int type)
|
||
|
|
{
|
||
|
|
const GUID* gClass;
|
||
|
|
filters.clear();
|
||
|
|
switch (type)
|
||
|
|
{
|
||
|
|
case 1: gClass = &GUID_DEVCLASS_SMARTCARDREADER; break; //smartcard
|
||
|
|
default: gClass = &GUID_DEVCLASS_PORTS; break;
|
||
|
|
}
|
||
|
|
DeviceInfoSet = SetupDiGetClassDevsExA( gClass, 0, nullptr, DIGCF_PRESENT, NULL, NULL, NULL);
|
||
|
|
ZeroMemory(&DeviceInfoData, sizeof(SP_DEVINFO_DATA));
|
||
|
|
DeviceInfoData.cbSize = sizeof(SP_DEVINFO_DATA);
|
||
|
|
DeviceIndex = 0;
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL DeviceScanEnd()
|
||
|
|
{
|
||
|
|
SetupDiDestroyDeviceInfoList(DeviceInfoSet);
|
||
|
|
|
||
|
|
|
||
|
|
return true;
|
||
|
|
}
|
||
|
|
|
||
|
|
BOOL DeviceScan()
|
||
|
|
{
|
||
|
|
int rv = true; //1=found 2=end
|
||
|
|
CONFIGRET status;
|
||
|
|
DWORD dwSize, dwPropertyRegDataType;
|
||
|
|
DEVPROPTYPE ulPropertyType;
|
||
|
|
DWORD err;
|
||
|
|
|
||
|
|
//class __declspec(uuid(portGuid)) cRoot;
|
||
|
|
//const GUID root = __uuidof(cRoot);
|
||
|
|
//const static LPCTSTR arPrefix[3] = { TEXT("VID_"), TEXT("PID_"), TEXT("MI_") };
|
||
|
|
//WCHAR szBuffer[4096];
|
||
|
|
//GUID_DEVCLASS_PORTS
|
||
|
|
|
||
|
|
if (SetupDiEnumDeviceInfo(
|
||
|
|
DeviceInfoSet,
|
||
|
|
DeviceIndex,
|
||
|
|
&DeviceInfoData))
|
||
|
|
{
|
||
|
|
szDesc[0] = 0;
|
||
|
|
status = CM_Get_Device_ID(DeviceInfoData.DevInst, szDeviceInstanceID, MAX_DEVICE_ID_LEN, 0);
|
||
|
|
if (status != CR_SUCCESS)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
if (SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_HARDWAREID, &ulPropertyType, (BYTE*)Hardware_ID, sizeof(Hardware_ID), &cbHARDWAREID)) {};
|
||
|
|
if (filters.size() > 0) {
|
||
|
|
rv = 0;
|
||
|
|
int filterIdx = 1; //vanaf 1
|
||
|
|
for (LPCTSTR f : filters) {
|
||
|
|
if (!_tcsncmp(Hardware_ID, f, _tcslen(f))) {
|
||
|
|
rv = filterIdx;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
filterIdx++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
else
|
||
|
|
rv = 0;
|
||
|
|
|
||
|
|
|
||
|
|
if (SetupDiGetDeviceRegistryProperty(DeviceInfoSet, &DeviceInfoData, SPDRP_DEVICEDESC, &dwPropertyRegDataType, (BYTE*)szDesc, sizeof(szDesc), &dwSize)) {}
|
||
|
|
|
||
|
|
if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_BusReportedDeviceDesc, &ulPropertyType, (BYTE*)BusReportedDeviceDesc, sizeof(BusReportedDeviceDesc), &cbBusReportedDeviceDesc, 0)) {};
|
||
|
|
if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_Manufacturer, &ulPropertyType, (BYTE*)Device_Manufacturer, sizeof(Device_Manufacturer), &cbDevice_Manufacturer, 0)) {};
|
||
|
|
if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_FriendlyName, &ulPropertyType, (BYTE*)Device_FriendlyName, sizeof(Device_FriendlyName), &cbDevice_FriendlyName, 0)) {
|
||
|
|
int s = 0;
|
||
|
|
};
|
||
|
|
//if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_LocationInfo,&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {};
|
||
|
|
//if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_SecuritySDS,&ulPropertyType, (BYTE*)szBuffer, sizeof(szBuffer), &dwSize, 0)) {};
|
||
|
|
// // (http://msdn.microsoft.com/en-us/library/windows/desktop/aa379567(v=vs.85).aspx)
|
||
|
|
//if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_ContainerId,&ulPropertyType, (BYTE*)szDesc, sizeof(szDesc), &dwSize, 0)) {
|
||
|
|
// StringFromGUID2((REFGUID)szDesc, szBuffer, ARRAY_SIZE(szBuffer));
|
||
|
|
//}
|
||
|
|
if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_DeviceDisplay_Category, &ulPropertyType, (BYTE*)DeviceDisplay_Category, sizeof(DeviceDisplay_Category), &cbDeviceDisplay_Category, 0))
|
||
|
|
{
|
||
|
|
err = 0;
|
||
|
|
}
|
||
|
|
else {
|
||
|
|
err = GetLastError();
|
||
|
|
DeviceDisplay_Category[0] = 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (SetupDiGetDevicePropertyW(DeviceInfoSet, &DeviceInfoData, &DEVPKEY_Device_Exclusive, &ulPropertyType, (BYTE*)&Device_Exclusive, sizeof(Device_Exclusive), &cbDevice_Exclusive, 0))
|
||
|
|
{
|
||
|
|
LSTATUS s = 0;
|
||
|
|
};
|
||
|
|
|
||
|
|
|
||
|
|
HKEY hkey = SetupDiOpenDevRegKey(DeviceInfoSet, &DeviceInfoData, DICS_FLAG_GLOBAL, 0, DIREG_DEV, KEY_QUERY_VALUE | KEY_READ | KEY_ENUMERATE_SUB_KEYS);
|
||
|
|
if (hkey != INVALID_HANDLE_VALUE) {
|
||
|
|
LSTATUS s = 0;
|
||
|
|
cbPortName = sizeof(PortName);
|
||
|
|
s = RegGetValueW(hkey, 0, L"PortName", RRF_RT_REG_SZ, nullptr, (PVOID)PortName, &cbPortName);
|
||
|
|
RegCloseKey(hkey);
|
||
|
|
}
|
||
|
|
|
||
|
|
|
||
|
|
}
|
||
|
|
else rv = -1; //error
|
||
|
|
return rv;
|
||
|
|
}
|