eDosStationFull/LSWDevices/Device.cpp
2026-08-18 12:15:26 +02:00

169 lines
6.1 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;
}