#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 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; }