BOOL UsbDeviceList::FindFilterForInterface(LPCUSB_DEVICE lpDevice, LPCUSB_INTERFACE lpInterface, LPDWORD index)
{
	for (DWORD i = 0; i < mNumInterfaceFilters; i++) {
		BOOL match = MatchFilterField(true, lpInterface->Descriptor.bInterfaceClass, &mInterfaceFilters[i].bInterfaceClass);
		match &= MatchFilterField(match, lpInterface->Descriptor.bInterfaceSubClass, &mInterfaceFilters[i].bInterfaceSubClass);
		match &= MatchFilterField(match, lpInterface->Descriptor.bInterfaceProtocol, &mInterfaceFilters[i].bInterfaceProtocol);
		match &= MatchFilterField(match, lpDevice->Descriptor.idVendor, &mInterfaceFilters[i].idVendor);
		match &= MatchFilterField(match, lpDevice->Descriptor.idProduct, &mInterfaceFilters[i].idProduct);

		if (match) {
			(*index) = i;
			return TRUE;
		}
	}

	// No match
	return FALSE;
}
BOOL UsbDeviceList::FindFilterForInterface(LPCUSB_DEVICE lpDevice, LPCUSB_INTERFACE lpInterface, LPINTERFACE_FILTER* filter)
{
	// Filter list is maintained in priority order
	PFILTER_NODE next = mInterfaceFilters;
	while (next) {
		BOOL match = MatchFilterField(true, lpInterface->Descriptor.bInterfaceClass, &next->filter.bInterfaceClass);
		match &= MatchFilterField(match, lpInterface->Descriptor.bInterfaceSubClass, &next->filter.bInterfaceSubClass);
		match &= MatchFilterField(match, lpInterface->Descriptor.bInterfaceProtocol, &next->filter.bInterfaceProtocol);
		match &= MatchFilterField(match, lpDevice->Descriptor.idVendor, &next->filter.idVendor);
		match &= MatchFilterField(match, lpDevice->Descriptor.idProduct, &next->filter.idProduct);

		if (match) {
			(*filter) = &next->filter;
			return TRUE;
		}

		next = next->next;
	}

	// No match
	return FALSE;
}