55import java .io .BufferedReader ;
66import java .io .IOException ;
77import java .io .InputStreamReader ;
8+ import java .util .ArrayList ;
9+ import java .util .Arrays ;
10+ import java .util .List ;
11+ import java .util .concurrent .TimeUnit ;
812
913/**
1014 * Displays a list of all installed device drivers.
@@ -23,22 +27,66 @@ public void execute(String[] args, ShellContext context) throws IOException {
2327 }
2428
2529 try {
26- StringBuilder cmdBuilder = new StringBuilder ("driverquery" );
27- for (String arg : args ) {
28- cmdBuilder .append (" " ).append (arg );
30+
31+ List <String > command = new ArrayList <>();
32+ command .add ("cmd.exe" );
33+ command .add ("/c" );
34+ command .add ("driverquery" );
35+ if (args != null && args .length > 0 ) {
36+ command .addAll (Arrays .asList (args ));
37+ }
38+
39+ ProcessBuilder pb = new ProcessBuilder (command );
40+ Process process = pb .start ();
41+
42+ Thread errorGobbler =
43+ new Thread (
44+ () -> {
45+ try (BufferedReader errReader =
46+ new BufferedReader (new InputStreamReader (process .getErrorStream ()))) {
47+ String errLine ;
48+ while ((errLine = errReader .readLine ()) != null ) {
49+ System .err .println (errLine );
50+ }
51+ } catch (IOException e ) {
52+ System .err .println ("Error reading process error stream: " + e .getMessage ());
53+ }
54+ },
55+ "driverquery-error-gobbler" );
56+ errorGobbler .setDaemon (true );
57+ errorGobbler .start ();
58+
59+ try (BufferedReader reader =
60+ new BufferedReader (new InputStreamReader (process .getInputStream ()))) {
61+ String line ;
62+ while ((line = reader .readLine ()) != null ) {
63+ System .out .println (line );
64+ }
2965 }
3066
31- Process process = Runtime .getRuntime ().exec (cmdBuilder .toString ());
32- BufferedReader reader = new BufferedReader (new InputStreamReader (process .getInputStream ()));
67+ boolean finished ;
68+ try {
69+ finished = process .waitFor (30 , TimeUnit .SECONDS );
70+ } catch (InterruptedException ie ) {
71+ Thread .currentThread ().interrupt ();
72+ process .destroyForcibly ();
73+ throw new IOException ("Interrupted while waiting for driverquery process" , ie );
74+ }
3375
34- String line ;
35- while ((line = reader .readLine ()) != null ) {
36- System .out .println (line );
76+ if (!finished ) {
77+ process .destroyForcibly ();
78+ System .out .println ("Command timed out." );
79+ } else {
80+ int exitCode = process .exitValue ();
81+ if (exitCode != 0 ) {
82+ System .out .println ("Command exited with code: " + exitCode );
83+ }
3784 }
3885
39- int exitCode = process .waitFor ();
40- if (exitCode != 0 ) {
41- System .out .println ("Command exited with code: " + exitCode );
86+ try {
87+ errorGobbler .join (1000 );
88+ } catch (InterruptedException ie ) {
89+ Thread .currentThread ().interrupt ();
4290 }
4391
4492 } catch (Exception e ) {
0 commit comments