So I’m deploying an NVidia video driver through a Fixlet. I have a good handle on the installation logic, but the detection is rather complex and I was hoping the community could improve the relevance. And if there’s not a better way, maybe this will help out others. And if someone else has a better way it would certainly help me.
What I’ve observed is that the device driver .INF files contain a list of PCI devices for which the driver can be applied. In the Fixlet Debugger, I built a query to retrieve the device list from the .INFs and I’m going to use that device list when I search the system registry.
> Q: concatenation ";" of ("%22pci\" & it & "%22") of unique values of (following texts of firsts "PCI\" of lines of find files "*.inf" of folder "c:\temp\Display.Driver" as trimmed string as lowercase)
> A: "pci\ven_10de&dev_0ffd";"pci\ven_10de&dev_019e";"pci\ven_10de&dev_040a";"pci\ven_10de&dev_040b&subsys_30c3103c";"pci\ven_10de&dev_040c&subsys_142310cf";"pci\ven_10de&dev_040c&subsys_20d917aa";"pci\ven_10de&dev_040c&subsys_30c5103c";"pci\ven_10de&dev_040d";"pci\ven_10de&dev_040d&subsys_019b1028";"pci\ven_10de&dev_040d&subsys_04811558";"pci\ven_10de&dev_040d&subsys_05731558";"pci\ven_10de&dev_040d&subsys_0770152d";"pci\ven_10de&dev_040d&subsys_08601558";"pci\ven_10de&dev_040d&subsys_09021558";"pci\ven_10de&dev_040d&subsys_2052161f";"pci\ven_10de&dev_040d&subsys_30c3103c";"pci\ven_10de&dev_040e";"pci\ven_10de&dev_040f";"pci\ven_10de&dev_0429&subsys_01fe1028";"pci\ven_10de&dev_0429&subsys_20d817aa";"pci\ven_10de&dev_042a&subsys_00011179";"pci\ven_10de&dev_042a&subsys_00021179";"pci\ven_10de&dev_042b&subsys_019c1028";"pci\ven_10de&dev_042b&subsys_01f91028";"pci\ven_10de&dev_042b&subsys_01fe1028";"pci\ven_10de&dev_042d&subsys_019b1028";"pci\ven_10de&dev_042d&subsys_01ff1028";"pci\ven_10de&dev_042d&subsys_024a1028";"pci\ven_10de&dev_042d&subsys_024b1028";"pci\ven_10de&dev_042f";"pci\ven_10de&dev_05e7";"pci\ven_10de&dev_05e7&subsys_059510de";"pci\ven_10de&dev_05e7&subsys_066a10de";"pci\ven_10de&dev_05e7&subsys_068f10de";"pci\ven_10de&dev_05e7&subsys_069710de";"pci\ven_10de&dev_05e7&subsys_071410de";"pci\ven_10de&dev_05e7&subsys_074310de";"pci\ven_10de&dev_05f9";"pci\ven_10de&dev_05fd";"pci\ven_10de&dev_05fe";"pci\ven_10de&dev_05ff";"pci\ven_10de&dev_0619";"pci\ven_10de&dev_061a";"pci\ven_10de&dev_061b";"pci\ven_10de&dev_061c";"pci\ven_10de&dev_061c&subsys_019b1028";"pci\ven_10de&dev_061c&subsys_051810de";"pci\ven_10de&dev_061c&subsys_0770152d";"pci\ven_10de&dev_061c&subsys_16d91043";"pci\ven_10de&dev_061c&subsys_211a17aa";"pci\ven_10de&dev_061d";"pci\ven_10de&dev_061d&subsys_02ef1028";"pci\ven_10de&dev_061d&subsys_09031558";"pci\ven_10de&dev_061d&subsys_1520103c";"pci\ven_10de&dev_061d&subsys_214f17aa";"pci\ven_10de&dev_061d&subsys_219f17aa";"pci\ven_10de&dev_061d&subsys_51021558";"pci\ven_10de&dev_061d&subsys_71001558";"pci\ven_10de&dev_061d&subsys_72001558";"pci\ven_10de&dev_061d&subsys_81001558";"pci\ven_10de&dev_061d&subsys_86871558";"pci\ven_10de&dev_061d&subsys_86891558";"pci\ven_10de&dev_061e&subsys_019c1028";"pci\ven_10de&dev_061e&subsys_02511028";"pci\ven_10de&dev_061e&subsys_02ef1028";"pci\ven_10de&dev_061e&subsys_04811558";"pci\ven_10de&dev_061e&subsys_0539103c";"pci\ven_10de&dev_061e&subsys_05731558";"pci\ven_10de&dev_061e&subsys_08601558";"pci\ven_10de&dev_061e&subsys_09021558";"pci\ven_10de&dev_061e&subsys_211817aa";"pci\ven_10de&dev_061e&subsys_212517aa";"pci\ven_10de&dev_061f&subsys_02ef1028";"pci\ven_10de&dev_061f&subsys_09031558";"pci\ven_10de&dev_061f&subsys_1520103c";"pci\ven_10de&dev_061f&subsys_214e17aa";"pci\ven_10de&dev_061f&subsys_214f17aa";"pci\ven_10de&dev_061f&subsys_219f17aa";"pci\ven_10de&dev_061f&subsys_21a017aa";"pci\ven_10de&dev_061f&subsys_72001558";"pci\ven_10de&dev_061f&subsys_81001558";"pci\ven_10de&dev_061f&subsys_86871558";"pci\ven_10de&dev_061f&subsys_86891558";"pci\ven_10de&dev_0638";"pci\ven_10de&dev_063a&subsys_019b1028";"pci\ven_10de&dev_063a&subsys_02511028";"pci\ven_10de&dev_063a&subsys_02ef1028";"pci\ven_10de&dev_063a&subsys_04811558";"pci\ven_10de&dev_063a&subsys_08601558";"pci\ven_10de&dev_063a&subsys_09021558";"pci\ven_10de&dev_063a&subsys_211917aa";"pci\ven_10de&dev_063a&subsys_212417aa";"pci\ven_10de&dev_063a&subsys_30ec103c";"pci\ven_10de&dev_0658";"pci\ven_10de&dev_0659";"pci\ven_10de&dev_065a&subsys_02501028";"pci\ven_10de&dev_065c";"pci\ven_10de&dev_065c&subsys_02501028";"pci\ven_10de&dev_065c&subsys_11471734";"pci\ven_10de&dev_065c&subsys_30e7103c";"pci\ven_10de&dev_06d1";"pci\ven_10de&dev_06d1&subsys_077110de";"pci\ven_10de&dev_06d1&subsys_077210de";"pci\ven_10de&dev_06d2";"pci\ven_10de&dev_06d2&subsys_077410de";"pci\ven_10de&dev_06d2&subsys_083010de";"pci\ven_10de&dev_06d2&subsys_084210de";"pci\ven_10de&dev_06d2&subsys_088f10de";"pci\ven_10de&dev_06d2&subsys_090810de";"pci\ven_10de&dev_06d8";"pci\ven_10de&dev_06d9";"pci\ven_10de&dev_06da&subsys_081a1028";"pci\ven_10de&dev_06da&subsys_1520103c";"pci\ven_10de&dev_06dc";"pci\ven_10de&dev_06dd";"pci\ven_10de&dev_06de";"pci\ven_10de&dev_06de&subsys_077310de";"pci\ven_10de&dev_06de&subsys_082f10de";"pci\ven_10de&dev_06de&subsys_084010de";"pci\ven_10de&dev_06de&subsys_084210de";"pci\ven_10de&dev_06de&subsys_084610de";"pci\ven_10de&dev_06de&subsys_086610de";"pci\ven_10de&dev_06de&subsys_090710de";"pci\ven_10de&dev_06de&subsys_091e10de";"pci\ven_10de&dev_06df";"pci\ven_10de&dev_06df&subsys_084d10de";"pci\ven_10de&dev_06df&subsys_087f10de";"pci\ven_10de&dev_06ea&subsys_00011179";"pci\ven_10de&dev_06ea&subsys_00021179";"pci\ven_10de&dev_06eb&subsys_00011179";"pci\ven_10de&dev_06eb&subsys_02331028";"pci\ven_10de&dev_06eb&subsys_024f1028";"pci\ven_10de&dev_06eb&subsys_3a2517aa";"pci\ven_10de&dev_06f8";"pci\ven_10de&dev_06f9";"pci\ven_10de&dev_06fa";"pci\ven_10de&dev_06fb";"pci\ven_10de&dev_06fb&subsys_02341028";"pci\ven_10de&dev_06fd";"pci\ven_10de&dev_06ff";"pci\ven_10de&dev_06ff&subsys_071110de";"pci\ven_10de&dev_087a";"pci\ven_10de&dev_0a2c&subsys_1521103c";"pci\ven_10de&dev_0a2c&subsys_214417aa";"pci\ven_10de&dev_0a38";"pci\ven_10de&dev_0a3c";"pci\ven_10de&dev_0a3c&subsys_040c1028";"pci\ven_10de&dev_0a3c&subsys_05111558";"pci\ven_10de&dev_0a3c&subsys_05121558";"pci\ven_10de&dev_0a3c&subsys_1521103c";"pci\ven_10de&dev_0a3c&subsys_158410cf";"pci\ven_10de&dev_0a3c&subsys_214517aa";"pci\ven_10de&dev_0a6a&subsys_00011179";"pci\ven_10de&dev_0a6a&subsys_00021179";"pci\ven_10de&dev_0a6c&subsys_040a1028";"pci\ven_10de&dev_0a6c&subsys_040b1028";"pci\ven_10de&dev_0a6c&subsys_172b103c";"pci\ven_10de&dev_0a6c&subsys_214217aa";"pci\ven_10de&dev_0a6c&subsys_215c17aa";"pci\ven_10de&dev_0a6c&subsys_21c017aa";"pci\ven_10de&dev_0a6c&subsys_21cc17aa";"pci\ven_10de&dev_0a6c&subsys_21cd17aa";"pci\ven_10de&dev_0a6c&subsys_21d417aa";"pci\ven_10de&dev_0a6c&subsys_21d517aa";"pci\ven_10de&dev_0a6c&subsys_21d717aa";"pci\ven_10de&dev_0a6c&subsys_21d817aa";"pci\ven_10de&dev_0a6c&subsys_38a417aa";"pci\ven_10de&dev_0a6c&subsys_391a17aa";"pci\ven_10de&dev_0a78";"pci\ven_10de&dev_0a7c&subsys_172b103c";"pci\ven_10de&dev_0cbc&subsys_040c1028";"pci\ven_10de&dev_0cbc&subsys_1521103c";"pci\ven_10de&dev_0dd8";"pci\ven_10de&dev_0dd8&subsys_091410de";"pci\ven_10de&dev_0dda&subsys_04a31028";"pci\ven_10de&dev_0dda&subsys_14a31028";"pci\ven_10de&dev_0dda&subsys_1631103c";"pci\ven_10de&dev_0dda&subsys_21cf17aa";"pci\ven_10de&dev_0dda&subsys_21d117aa";"pci\ven_10de&dev_0def&subsys_21f317aa";"pci\ven_10de&dev_0def&subsys_21f417aa";"pci\ven_10de&dev_0def&subsys_21f517aa";"pci\ven_10de&dev_0def&subsys_21f617aa";"pci\ven_10de&dev_0def&subsys_21f817aa";"pci\ven_10de&dev_0def&subsys_500517aa";"pci\ven_10de&dev_0df8";"pci\ven_10de&dev_0df9";"pci\ven_10de&dev_0dfa";"pci\ven_10de&dev_0dfa&subsys_04a31028";"pci\ven_10de&dev_0dfa&subsys_14a31028";"pci\ven_10de&dev_0dfa&subsys_1631103c";"pci\ven_10de&dev_0dfa&subsys_163210cf";"pci\ven_10de&dev_0dfa&subsys_21cf17aa";"pci\ven_10de&dev_0dfa&subsys_21d117aa";"pci\ven_10de&dev_0dfc&subsys_05341028";"pci\ven_10de&dev_0dfc&subsys_05351028";"pci\ven_10de&dev_0dfc&subsys_15341028";"pci\ven_10de&dev_0dfc&subsys_15351028";"pci\ven_10de&dev_0e3a";"pci\ven_10de&dev_0e3a&subsys_04a41028";"pci\ven_10de&dev_0e3a&subsys_14a41028";"pci\ven_10de&dev_0e3a&subsys_1630103c";"pci\ven_10de&dev_0e3a&subsys_163310cf";"pci\ven_10de&dev_0e3b";"pci\ven_10de&dev_0e3b&subsys_04a41028";"pci\ven_10de&dev_0e3b&subsys_14a41028";"pci\ven_10de&dev_0e3b&subsys_1630103c";"pci\ven_10de&dev_0e3b&subsys_163410cf";"pci\ven_10de&dev_0ff2";"pci\ven_10de&dev_0ff3";"pci\ven_10de&dev_0ff6&subsys_05cc1028";"pci\ven_10de&dev_0ff6&subsys_060d1028";"pci\ven_10de&dev_0ff6&subsys_15cc1028";"pci\ven_10de&dev_0ff6&subsys_17ee10cf";"pci\ven_10de&dev_0ff6&subsys_1909103c";"pci\ven_10de&dev_0ff6&subsys_190a103c";"pci\ven_10de&dev_0ff6&subsys_197a103c";"pci\ven_10de&dev_0ff6&subsys_197b103c";"pci\ven_10de&dev_0ff6&subsys_221017aa";"pci\ven_10de&dev_0ff6&subsys_221117aa";"pci\ven_10de&dev_0ff6&subsys_221a17aa";"pci\ven_10de&dev_0ff6&subsys_221e17aa";"pci\ven_10de&dev_0ff6&subsys_2253103c";"pci\ven_10de&dev_0ff6&subsys_2254103c";"pci\ven_10de&dev_0ff6&subsys_2255103c";"pci\ven_10de&dev_0ff6&subsys_2256103c";"pci\ven_10de&dev_0ff6&subsys_51061558";"pci\ven_10de&dev_0ff6&subsys_52811558";"pci\ven_10de&dev_0ff6&subsys_71041558";"pci\ven_10de&dev_0ff6&subsys_74811558";"pci\ven_10de&dev_0ff8&subsys_176a10cf";"pci\ven_10de&dev_0ff9";"pci\ven_10de&dev_0ffa";"pci\ven_10de&dev_0ffb&subsys_053e1028";"pci\ven_10de&dev_0ffb&subsys_10db1462";"pci\ven_10de&dev_0ffb&subsys_153e1028";"pci\ven_10de&dev_0ffb&subsys_175e10cf";"pci\ven_10de&dev_0ffb&subsys_175f10cf";"pci\ven_10de&dev_0ffb&subsys_176b103c";"pci\ven_10de&dev_0ffb&subsys_21f517aa";"pci\ven_10de&dev_0ffb&subsys_21f617aa";"pci\ven_10de&dev_0ffc&subsys_053e1028";"pci\ven_10de&dev_0ffc&subsys_10db1462";"pci\ven_10de&dev_0ffc&subsys_153e1028";"pci\ven_10de&dev_0ffc&subsys_175e10cf";"pci\ven_10de&dev_0ffc&subsys_176b103c";"pci\ven_10de&dev_0ffc&subsys_21f517aa";"pci\ven_10de&dev_0ffc&subsys_21f617aa";"pci\ven_10de&dev_0ffc&subsys_51061558";"pci\ven_10de&dev_0ffc&subsys_71041558";"pci\ven_10de&dev_0ffd";"pci\ven_10de&dev_0ffe";"pci\ven_10de&dev_0fff";"pci\ven_10de&dev_1021";"pci\ven_10de&dev_1022";"pci\ven_10de&dev_1023";"pci\ven_10de&dev_1024";"pci\ven_10de&dev_1027";"pci\ven_10de&dev_1028";"pci\ven_10de&dev_1029";"pci\ven_10de&dev_102a";"pci\ven_10de&dev_102d";"pci\ven_10de&dev_103a";"pci\ven_10de&dev_103c";"pci\ven_10de&dev_1056&subsys_04931028";"pci\ven_10de&dev_1056&subsys_04941028";"pci\ven_10de&dev_1056&subsys_04e41028";"pci\ven_10de&dev_1056&subsys_14931028";"pci\ven_10de&dev_1056&subsys_14941028";"pci\ven_10de&dev_1056&subsys_14e41028";"pci\ven_10de&dev_1056&subsys_163610cf";"pci\ven_10de&dev_1056&subsys_21d217aa";"pci\ven_10de&dev_1056&subsys_21d317aa";"pci\ven_10de&dev_1057&subsys_21ce17aa";"pci\ven_10de&dev_1057&subsys_21cf17aa";"pci\ven_10de&dev_1057&subsys_21d017aa";"pci\ven_10de&dev_1057&subsys_21d117aa";"pci\ven_10de&dev_1057&subsys_c0a6144d";"pci\ven_10de&dev_1057&subsys_c0af144d";"pci\ven_10de&dev_1057&subsys_c0b0144d";"pci\ven_10de&dev_107c";"pci\ven_10de&dev_107d";"pci\ven_10de&dev_1091";"pci\ven_10de&dev_1091&subsys_088710de";"pci\ven_10de&dev_1091&subsys_088e10de";"pci\ven_10de&dev_1091&subsys_089110de";"pci\ven_10de&dev_1094";"pci\ven_10de&dev_1094&subsys_088810de";"pci\ven_10de&dev_1096";"pci\ven_10de&dev_1096&subsys_091010de";"pci\ven_10de&dev_1096&subsys_091110de";"pci\ven_10de&dev_109a&subsys_02701558";"pci\ven_10de&dev_109a&subsys_04a41028";"pci\ven_10de&dev_109a&subsys_14a41028";"pci\ven_10de&dev_109a&subsys_1630103c";"pci\ven_10de&dev_109a&subsys_175410cf";"pci\ven_10de&dev_109a&subsys_51021558";"pci\ven_10de&dev_109a&subsys_51051558";"pci\ven_10de&dev_109a&subsys_71001558";"pci\ven_10de&dev_109a&subsys_71021558";"pci\ven_10de&dev_109a&subsys_72001558";"pci\ven_10de&dev_109b";"pci\ven_10de&dev_109b&subsys_091810de";"pci\ven_10de&dev_10d8";"pci\ven_10de&dev_1140&subsys_220017aa";"pci\ven_10de&dev_118f";"pci\ven_10de&dev_1194";"pci\ven_10de&dev_11b4";"pci\ven_10de&dev_11b6";"pci\ven_10de&dev_11b6&subsys_05cd1028";"pci\ven_10de&dev_11b6&subsys_10fc1462";"pci\ven_10de&dev_11b6&subsys_10fd1462";"pci\ven_10de&dev_11b6&subsys_15cd1028";"pci\ven_10de&dev_11b6&subsys_190a103c";"pci\ven_10de&dev_11b6&subsys_197a103c";"pci\ven_10de&dev_11b6&subsys_2255103c";"pci\ven_10de&dev_11b6&subsys_2256103c";"pci\ven_10de&dev_11b6&subsys_51061558";"pci\ven_10de&dev_11b6&subsys_52811558";"pci\ven_10de&dev_11b6&subsys_71041558";"pci\ven_10de&dev_11b6&subsys_74811558";"pci\ven_10de&dev_11b7";"pci\ven_10de&dev_11b7&subsys_05cd1028";"pci\ven_10de&dev_11b7&subsys_11001462";"pci\ven_10de&dev_11b7&subsys_15cd1028";"pci\ven_10de&dev_11b7&subsys_190a103c";"pci\ven_10de&dev_11b7&subsys_197a103c";"pci\ven_10de&dev_11b7&subsys_2255103c";"pci\ven_10de&dev_11b7&subsys_2256103c";"pci\ven_10de&dev_11b8&subsys_02701558";"pci\ven_10de&dev_11b8&subsys_03761558";"pci\ven_10de&dev_11b8&subsys_05cd1028";"pci\ven_10de&dev_11b8&subsys_15cd1028";"pci\ven_10de&dev_11b8&subsys_190a103c";"pci\ven_10de&dev_11b8&subsys_197a103c";"pci\ven_10de&dev_11b8&subsys_2255103c";"pci\ven_10de&dev_11b8&subsys_2256103c";"pci\ven_10de&dev_11ba";"pci\ven_10de&dev_11bc";"pci\ven_10de&dev_11bc&subsys_02701558";"pci\ven_10de&dev_11bc&subsys_03711558";"pci\ven_10de&dev_11bc&subsys_03761558";"pci\ven_10de&dev_11bc&subsys_053f1028";"pci\ven_10de&dev_11bc&subsys_153f1028";"pci\ven_10de&dev_11bc&subsys_176210cf";"pci\ven_10de&dev_11bc&subsys_176c103c";"pci\ven_10de&dev_11bd";"pci\ven_10de&dev_11bd&subsys_053f1028";"pci\ven_10de&dev_11bd&subsys_10db1462";"pci\ven_10de&dev_11bd&subsys_153f1028";"pci\ven_10de&dev_11bd&subsys_176110cf";"pci\ven_10de&dev_11bd&subsys_176c103c";"pci\ven_10de&dev_11be";"pci\ven_10de&dev_11be&subsys_053f1028";"pci\ven_10de&dev_11be&subsys_10db1462";"pci\ven_10de&dev_11be&subsys_10eb1462";"pci\ven_10de&dev_11be&subsys_153f1028";"pci\ven_10de&dev_11be&subsys_176010cf";"pci\ven_10de&dev_11be&subsys_176c103c";"pci\ven_10de&dev_11be&subsys_51051558";"pci\ven_10de&dev_11be&subsys_51061558";"pci\ven_10de&dev_11be&subsys_71021558";"pci\ven_10de&dev_11be&subsys_71041558";"pci\ven_10de&dev_11bf";"pci\ven_10de&dev_11fa";"pci\ven_10de&dev_11fc";"pci\ven_10de&dev_11fc&subsys_00011179";"pci\ven_10de&dev_11fc&subsys_05cc1028";"pci\ven_10de&dev_11fc&subsys_10fb1462";"pci\ven_10de&dev_11fc&subsys_111d1462";"pci\ven_10de&dev_11fc&subsys_111e1462";"pci\ven_10de&dev_11fc&subsys_15cc1028";"pci\ven_10de&dev_11fc&subsys_1708172f";"pci\ven_10de&dev_11fc&subsys_17ef10cf";"pci\ven_10de&dev_11fc&subsys_1909103c";"pci\ven_10de&dev_11fc&subsys_197b103c";"pci\ven_10de&dev_11fc&subsys_221017aa";"pci\ven_10de&dev_11fc&subsys_221117aa";"pci\ven_10de&dev_11fc&subsys_221a17aa";"pci\ven_10de&dev_11fc&subsys_221e17aa";"pci\ven_10de&dev_11fc&subsys_2253103c";"pci\ven_10de&dev_11fc&subsys_2254103c";"pci\ven_10de&dev_12b9";"pci\ven_10de&dev_12b9&subsys_1909103c";"pci\ven_10de&dev_12b9&subsys_190a103c";"pci\ven_10de&dev_12b9&subsys_197a103c";"pci\ven_10de&dev_12b9&subsys_197b103c";"pci\ven_10de&dev_12b9&subsys_2253103c";"pci\ven_10de&dev_12b9&subsys_2254103c";"pci\ven_10de&dev_12ba&subsys_17ed10cf";"pci\ven_10de&dev_13b3&subsys_05cd1028";"pci\ven_10de&dev_13b3&subsys_15cd1028";"pci\ven_10de&dev_13b3&subsys_2255103c";"pci\ven_10de&dev_13b3&subsys_2256103c";"pci\ven_10de&dev_13ba";"pci\ven_10de&dev_13bb"
I’ve observed that the Registry contains a list of all PCI devices detected in the system as subkeys of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI
(note - varies by device type; for example when adapting for RealTex devices search HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\HDAUDIO
instead)
q: pathnames of keys of keys of key "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI" of native registry
A: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_104C&DEV_8241&SUBSYS_1589103C&REV_02\4&27cbe021&0&00E7
A: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_10DE&DEV_0E1B&SUBSYS_0967103C&REV_A1\4&3a58d9f6&0&0110
A: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI\VEN_10DE&DEV_0E1B&SUBSYS_0967103C&REV_A1\4&57c889b&0&0118
<snip>
T: 0.769 ms
These keys have values for “HardwareID” and “CompatibleIDs” that include PCI Vendor and Device codes that can be used to identify the proper driver.
These keys may also have a “Driver” key, if a driver has already been loaded. The value for the “Driver” key would be “[Class GUID]\[index]”, for example
{4d36e968-e325-11ce-bfc1-08002be10318}\0001. If a driver is loaded, there should also be a “ClassGUID” value that we can use to speed up the query (by discarding any non-matching ClassGUID values, if present)
The installed drivers in a system are stored at HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Class<CLASS GUID><INDEX>.
Once we know the installed driver for a given PCI device (if there is a driver installed), we can check the driver Provider and Version to see if it matches
So the basic logic is
- Identify the devices covered by the driver. Use that to build the device set I’m trying to match and paste that into “set of()” below.
- Search HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI for subkeys that have HardwareID or CompatibleIDs values matching the driver
- Of the keys that have a matching device, determine whether there is already a driver loaded.
3a) If no driver is loaded, the Fixlet is relevant; if a driver is loaded, check whether the driver’s ProviderName matches my driver and the version is equal to or higher. If so, the fixlet is Relevant, else Not Relevant.
Based on that, here’s what I’m using now. It seems to be fast/efficient enough, but is certainly difficult to read
q: /* Check for the presence of the NVidia cards (by Enum\PCI); matched to the right Class; with no driver or an earlier version of the driver; with a CompatibleID matching our PCI device list */ exists (keys of keys of key "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Enum\PCI" of native registry) whose ( /* if class is defined then class matches expectation (in this case, "Video"); if no class is listed then its an unknown device and may still be relevant */(if exists (value "ClassGUID" of it) then (/* SUBST CLASS HERE */ value "ClassGUID" of it as string = "{4d36e968-e325-11ce-bfc1-08002be10318}") else true) AND /* if there is no "Driver" key then true (no driver is installed), else check the driver present in the "Driver" key is the correct provider & version */ (if not exists value "Driver" of it then true else (exists (it, /* SUBST CLASS HERE */ keys of key "{4d36e968-e325-11ce-bfc1-08002be10318}" of key "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class" of native registry) whose (pathname of item 1 of it as lowercase ends with value "Driver" of item 0 of it as string as lowercase AND ( /* wrong Provider */ not exists (value "ProviderName" of item 1 of it) whose (it = "NVIDIA") or ( /* version too low */ not exists (value "DriverVersion" of item 1 of it) whose (it as string as version >= version "10.18.13.5456")))) )) AND ( /* exists a hardware ID matching our expected list from INF*/ exists (substrings separated by "%00" of ((values "CompatibleIDs" of it; values "HardwareID" of it) as string as lowercase as trimmed string)) whose (it != "" and it is contained by set of ("pci\ven_10de&dev_06d1";"pci\ven_10de&dev_06d1&subsys_077110de";"pci\ven_10de&dev_06d1&subsys_077210de";"pci\ven_10de&dev_06d2";"pci\ven_10de&dev_06d2&subsys_077410de";"<rest of list snipped>"))) )
A: False
T: 3.875 ms
I: singular boolean
I don’t like that all of the Registry inspectors have “of registry” as part of the property name. The File inspectors make that a lot easier, i.e. I can query for file (it) of value "X" of key "Y" of native registry as string
, but cannot look for key (it) of value "X" of key "Y" of native registry as string
. That limitation makes this query considerably less efficient than it could be, if I didn’t have to scan all the keys of HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\GUID
to find one with a pathname matching a Driver value.
I’m also not (yet) handling the ExcludeFromSelect that could be present in a driver INF file (but didn’t exist in this particular driver, thankfully).