diff --git a/UsbDk/ControlDevice.cpp b/UsbDk/ControlDevice.cpp index 2958b7c..a97c847 100644 --- a/UsbDk/ControlDevice.cpp +++ b/UsbDk/ControlDevice.cpp @@ -199,6 +199,7 @@ bool CUsbDkControlDevice::EnumerateDevices(USB_DK_DEVICE_INFO *outBuff, size_t n wcsncpy(outBuff->ID.DeviceID, Child->DeviceID(), MAX_DEVICE_ID_LEN); wcsncpy(outBuff->ID.InstanceID, Child->InstanceID(), MAX_DEVICE_ID_LEN); outBuff->FilterID = Child->ParentID(); + outBuff->Port = Child->Port(); outBuff++; numberExistingDevices++; diff --git a/UsbDk/FilterDevice.cpp b/UsbDk/FilterDevice.cpp index c5cd09d..4a1028b 100644 --- a/UsbDk/FilterDevice.cpp +++ b/UsbDk/FilterDevice.cpp @@ -148,6 +148,15 @@ void CUsbDkHubFilterStrategy::AddNewDevices(const CDeviceRelations &Relations) void CUsbDkHubFilterStrategy::RegisterNewChild(PDEVICE_OBJECT PDO) { CWdmDeviceAccess pdoAccess(PDO); + + auto Port = pdoAccess.GetAddress(); + + if (Port == CWdmDeviceAccess::NO_ADDRESS) + { + TraceEvents(TRACE_LEVEL_ERROR, TRACE_FILTERDEVICE, "%!FUNC! Cannot read device port number"); + return; + } + CObjHolder DevID(pdoAccess.GetDeviceID()); if (!DevID || DevID->empty()) @@ -164,7 +173,7 @@ void CUsbDkHubFilterStrategy::RegisterNewChild(PDEVICE_OBJECT PDO) return; } - CUsbDkChildDevice *Device = new CUsbDkChildDevice(DevID, InstanceID, *m_Owner, PDO); + CUsbDkChildDevice *Device = new CUsbDkChildDevice(DevID, InstanceID, Port, *m_Owner, PDO); if (Device == nullptr) { diff --git a/UsbDk/FilterDevice.h b/UsbDk/FilterDevice.h index ee14c15..32c39c9 100644 --- a/UsbDk/FilterDevice.h +++ b/UsbDk/FilterDevice.h @@ -26,10 +26,12 @@ class CUsbDkChildDevice : public CAllocatable public: CUsbDkChildDevice(CRegText *DeviceID, CRegText *InstanceID, + ULONG Port, const CUsbDkFilterDevice &ParentDevice, PDEVICE_OBJECT PDO) : m_DeviceID(DeviceID) , m_InstanceID(InstanceID) + , m_Port(Port) , m_ParentDevice(ParentDevice) , m_PDO(PDO) {} @@ -37,6 +39,8 @@ public: ULONG ParentID() const; PCWCHAR DeviceID() const { return *m_DeviceID->begin(); } PCWCHAR InstanceID() const { return *m_InstanceID->begin(); } + ULONG Port() const + { return m_Port; } PDEVICE_OBJECT PDO() const { return m_PDO; } bool Match(PCWCHAR deviceID, PCWCHAR instanceID) const @@ -57,6 +61,7 @@ public: private: CObjHolder m_DeviceID; CObjHolder m_InstanceID; + ULONG m_Port; PDEVICE_OBJECT m_PDO; const CUsbDkFilterDevice &m_ParentDevice; diff --git a/UsbDk/UsbDkData.h b/UsbDk/UsbDkData.h index 68645b1..a44f7d9 100644 --- a/UsbDk/UsbDkData.h +++ b/UsbDk/UsbDkData.h @@ -20,4 +20,5 @@ typedef struct tag_USB_DK_DEVICE_INFO { USB_DK_DEVICE_ID ID; ULONG FilterID; + ULONG Port; } USB_DK_DEVICE_INFO, *PUSB_DK_DEVICE_INFO; diff --git a/UsbDkController/UsbDkController.cpp b/UsbDkController/UsbDkController.cpp index 109f8a2..bd9a156 100644 --- a/UsbDkController/UsbDkController.cpp +++ b/UsbDkController/UsbDkController.cpp @@ -70,6 +70,7 @@ void Controller_EnumerateDevices() { tcout << to_tstring(deviceIndex) << TEXT(". ") << TEXT("FilterID: ") << devicesArray[deviceIndex].FilterID << TEXT(", ") + << TEXT("Port: ") << devicesArray[deviceIndex].Port << TEXT(", ") << devicesArray[deviceIndex].ID.DeviceID << TEXT(" ") << devicesArray[deviceIndex].ID.InstanceID << endl;