On Mon Sep 22 08:35:28 2025 +0000, Rémi Bernon wrote:
I don't think it works, for instance this test asserts:
memset( filters, 0, sizeof( filters ) ); filters[len++].Operator = DEVPROP_OPERATOR_OR_OPEN; filters[len++].Operator = DEVPROP_OPERATOR_AND_OPEN; filters[len++].Operator = DEVPROP_OPERATOR_NONE; filters[len++].Operator = DEVPROP_OPERATOR_AND_OPEN; filters[len++].Operator = DEVPROP_OPERATOR_NONE; filters[len++].Operator = DEVPROP_OPERATOR_AND_CLOSE; filters[len++].Operator = DEVPROP_OPERATOR_AND_CLOSE; filters[len++].Operator = DEVPROP_OPERATOR_NOT_OPEN; filters[len++].Operator = DEVPROP_OPERATOR_NONE; filters[len++].Operator = DEVPROP_OPERATOR_NOT_CLOSE; filters[len++].Operator = DEVPROP_OPERATOR_OR_CLOSE; objects = NULL; hr = pDevGetObjects( DevObjectTypeDeviceInterface, DevQueryFlagNone, 0, NULL, len, filters, &len, &objects ); ok( hr == S_OK, "got hr %#lx\n", hr ); pDevFreeObjects( len, objects );
IMO you should implement this by calling the function recursively on the proper pre-computed filters range. The range would be found before its evaluation by simply looking for the matching closing op using a depth counter variable to ignore nested blocks.