sm info ssid - implemented
[reactos.git] / reactos / subsys / system / sm / sm.c
index fed4247..507da33 100644 (file)
@@ -148,31 +148,63 @@ SM_CMD_DECL(info)
 {\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