def _probe_services(self, handle):
        code = 0x2800
        def event_filter_func(event):
            if (event.command_class == 4 and event.command == 2):
                event_handle, = unpack("B", event.payload[0:1])
                return event_handle == handle
            return False
        def end_filter_func(event):
            if (event.command_class == 4 and event.command == 1):
                event_handle, = unpack("B", event.payload[0:1])
                return event_handle == handle
            return False
        payload = struct.pack('<BHHBH', handle, 1, 0xFFFF, 2, code)
        try:
            response = self._send_command(4, 1, payload)
        except InternalTimeoutError:
            return False, {'reason': 'Timeout waiting for command response'}
        handle, result = unpack("<BH", response.payload)
        if result != 0:
            return False, None
        events = self._wait_process_events(0.5, event_filter_func, end_filter_func)
        gatt_events = [x for x in events if event_filter_func(x)]
        end_events = [x for x in events if end_filter_func(x)]
        if len(end_events) == 0:
            return False, None
        end_event = end_events[0]
        _, result, _ = unpack("<BHH", end_event.payload)
        if result != 0:
            self._logger.warn("Error enumerating GATT table, protocol error code = %d (0x%X)" % (result, result))
            return False, None
        services = {}
        for event in gatt_events:
            process_gatt_service(services, event)
        return True, {'services': services}