{\r
int rc = EXIT_SUCCESS;\r
NTSTATUS Status = STATUS_SUCCESS;\r
- SM_BASIC_INFORMATION bi = {0,};\r
- ULONG ReturnDataLength = sizeof bi;\r
+ SM_INFORMATION_CLASS InformationClass = SmBasicInformation;\r
+ union {\r
+ SM_BASIC_INFORMATION bi;\r
+ SM_SUBSYSTEM_INFORMATION ssi;\r
+ } Info;\r
+ ULONG DataLength = 0;\r
+ ULONG ReturnDataLength = 0;\r
+ INT i = 0;\r
\r
+ RtlZeroMemory (& Info, sizeof Info);\r
+ switch (argc)\r
+ {\r
+ case 2: /* sm info */\r
+ InformationClass = SmBasicInformation;\r
+ DataLength = sizeof Info.bi;\r
+ break;\r
+ case 3: /* sm info id */\r
+ InformationClass = SmSubSystemInformation;\r
+ DataLength = sizeof Info.ssi;\r
+ Info.ssi.SubSystemId = atol(argv[2]);\r
+ break;\r
+ default:\r
+ return EXIT_FAILURE;\r
+ break;\r
+ }\r
Status = SmQueryInformation (hSmApiPort,\r
- SmBasicInformation,\r
- & bi,\r
- sizeof bi,\r
+ InformationClass,\r
+ & Info,\r
+ DataLength,\r
& ReturnDataLength);\r
- if (STATUS_SUCCESS == Status)\r
+ if (STATUS_SUCCESS != Status)\r
{\r
- int i = 0;\r
-\r
+ printf ("Status 0x%08lx\n", Status);\r
+ return EXIT_FAILURE;\r
+ }\r
+ switch (argc)\r
+ {\r
+ case 2:\r
+ printf ("SM SubSystem Directory\n\n");\r
printf ("SSID PID Flags\n");\r
- for (i = 0; i < bi.SubSystemCount; i ++)\r
+ printf ("---- -------- ------------\n");\r
+ for (i = 0; i < Info.bi.SubSystemCount; i ++)\r
{\r
printf ("%04x %08lx %04x\n",\r
- bi.SubSystem[i].Id,\r
- bi.SubSystem[i].ProcessId,\r
- bi.SubSystem[i].Flags);\r
+ Info.bi.SubSystem[i].Id,\r
+ Info.bi.SubSystem[i].ProcessId,\r
+ Info.bi.SubSystem[i].Flags);\r
}\r
- }\r
- else\r
- {\r
- printf ("Status 0x%08lx\n", Status);\r
- rc = EXIT_FAILURE;\r
+ break;\r
+ case 3:\r
+ printf ("SubSystem ID: %d\n", Info.ssi.SubSystemId);\r
+ printf (" Flags: %04x\n", Info.ssi.Flags);\r
+ printf (" Process ID: %ld\n", Info.ssi.ProcessId);\r
+ wprintf(L" NSRootNode: '%s'\n", Info.ssi.NameSpaceRootNode);\r
+ break;\r
+ default:\r
+ break;\r
}\r
return rc;\r
}\r