Index: /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModBallooning.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModBallooning.cpp	(revision 59892)
+++ /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxModBallooning.cpp	(revision 59893)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2016 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -29,5 +29,5 @@
 using namespace com;
 
-#define VBOX_MOD_BALLOONING_NAME "balloonctrl"
+#define VBOX_MOD_BALLOONING_NAME "balloon"
 
 /**
Index: /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdog.cpp
===================================================================
--- /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdog.cpp	(revision 59892)
+++ /trunk/src/VBox/Frontends/VBoxBalloonCtrl/VBoxWatchdog.cpp	(revision 59893)
@@ -5,5 +5,5 @@
 
 /*
- * Copyright (C) 2011-2013 Oracle Corporation
+ * Copyright (C) 2011-2016 Oracle Corporation
  *
  * This file is part of VirtualBox Open Source Edition (OSE), as
@@ -90,5 +90,5 @@
  * The details of the services that has been compiled in.
  */
-static struct
+typedef struct VBOXWATCHDOGMOD
 {
     /** Pointer to the service descriptor. */
@@ -98,5 +98,7 @@
     /** Whether the module is enabled or not. */
     bool            fEnabled;
-} g_aModules[] =
+} VBOXWATCHDOGMOD, *PVBOXWATCHDOGMOD;
+
+static VBOXWATCHDOGMOD g_aModules[] =
 {
     { &g_ModBallooning, false /* Pre-inited */, true /* Enabled */ },
@@ -106,5 +108,6 @@
 enum GETOPTDEF_WATCHDOG
 {
-    GETOPTDEF_WATCHDOG_DRYRUN = 1000
+    GETOPTDEF_WATCHDOG_DISABLE_MODULE = 1000,
+    GETOPTDEF_WATCHDOG_DRYRUN
 };
 
@@ -117,12 +120,13 @@
 #endif
     /** For displayHelp(). */
-    { "--dryrun",               GETOPTDEF_WATCHDOG_DRYRUN,                 RTGETOPT_REQ_NOTHING },
-    { "--help",                 'h',                                       RTGETOPT_REQ_NOTHING },
-    { "--verbose",              'v',                                       RTGETOPT_REQ_NOTHING },
-    { "--pidfile",              'P',                                       RTGETOPT_REQ_STRING },
-    { "--logfile",              'F',                                       RTGETOPT_REQ_STRING },
-    { "--logrotate",            'R',                                       RTGETOPT_REQ_UINT32 },
-    { "--logsize",              'S',                                       RTGETOPT_REQ_UINT64 },
-    { "--loginterval",          'I',                                       RTGETOPT_REQ_UINT32 }
+    { "--disable-<module>",     GETOPTDEF_WATCHDOG_DISABLE_MODULE, RTGETOPT_REQ_NOTHING },
+    { "--dryrun",               GETOPTDEF_WATCHDOG_DRYRUN,         RTGETOPT_REQ_NOTHING },
+    { "--help",                 'h',                               RTGETOPT_REQ_NOTHING },
+    { "--verbose",              'v',                               RTGETOPT_REQ_NOTHING },
+    { "--pidfile",              'P',                               RTGETOPT_REQ_STRING },
+    { "--logfile",              'F',                               RTGETOPT_REQ_STRING },
+    { "--logrotate",            'R',                               RTGETOPT_REQ_UINT32 },
+    { "--logsize",              'S',                               RTGETOPT_REQ_UINT64 },
+    { "--loginterval",          'I',                               RTGETOPT_REQ_UINT32 }
 };
 
@@ -629,21 +633,24 @@
 
     for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
-        if (g_aModules[j].fEnabled)
-        {
-            rc = g_aModules[j].pDesc->pfnInit();
-            if (RT_FAILURE(rc))
+    {
+        const PVBOXWATCHDOGMOD pMod = &g_aModules[j];
+        if (pMod->fEnabled)
+        {
+            int rc2 = pMod->pDesc->pfnInit();
+            if (RT_FAILURE(rc2))
             {
-                if (rc != VERR_SERVICE_DISABLED)
+                if (rc2 != VERR_SERVICE_DISABLED)
                 {
-                    serviceLog("Module '%s' failed to initialize: %Rrc\n",
-                               g_aModules[j].pDesc->pszName, rc);
+                    serviceLog("Module '%s' failed to initialize: %Rrc\n", pMod->pDesc->pszName, rc2);
                     return rc;
                 }
-                g_aModules[j].fEnabled = false;
-                serviceLog(0, "Module '%s' was disabled because of missing functionality\n",
-                           g_aModules[j].pDesc->pszName);
+                pMod->fEnabled = false;
+                serviceLog("Module '%s' was disabled because of missing functionality\n", pMod->pDesc->pszName);
 
             }
         }
+        else
+            serviceLog("Module '%s' disabled, skipping ...\n", pMod->pDesc->pszName);
+    }
 
     return rc;
@@ -847,4 +854,8 @@
         switch (g_aOptions[i].iShort)
         {
+            case GETOPTDEF_WATCHDOG_DISABLE_MODULE:
+                pcszDescr = "Disables a module. See module list for built-in modules.";
+                break;
+
             case GETOPTDEF_WATCHDOG_DRYRUN:
                 pcszDescr = "Dryrun mode -- do not perform any actions.";
@@ -887,9 +898,18 @@
     {
         if (g_aModules[j].pDesc->pszOptions)
-            RTPrintf("%s", g_aModules[j].pDesc->pszOptions);
+            RTStrmPrintf(g_pStdErr, "%s", g_aModules[j].pDesc->pszOptions);
     }
 
     /** @todo Change VBOXBALLOONCTRL_RELEASE_LOG to WATCHDOG*. */
     RTStrmPrintf(g_pStdErr, "\nUse environment variable VBOXBALLOONCTRL_RELEASE_LOG for logging options.\n");
+
+    RTStrmPrintf(g_pStdErr, "\nValid module names are: ");
+    for (unsigned j = 0; j < RT_ELEMENTS(g_aModules); j++)
+    {
+        if (j > 0)
+            RTStrmPrintf(g_pStdErr, ", ");
+        RTStrmPrintf(g_pStdErr, "%s", g_aModules[j].pDesc->pszName);
+    }
+    RTStrmPrintf(g_pStdErr, "\n\n");
 }
 
@@ -1026,5 +1046,16 @@
                 bool fFound = false;
 
-                /** @todo Add "--disable-<module>" etc. here! */
+                char szModDisable[64];
+                for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aModules); j++)
+                {
+                    if (!RTStrPrintf(szModDisable, sizeof(szModDisable), "--disable-%s", g_aModules[j].pDesc->pszName))
+                        continue;
+
+                    if (!RTStrICmp(szModDisable, ValueUnion.psz))
+                    {
+                        g_aModules[j].fEnabled = false;
+                        fFound = true;
+                    }
+                }
 
                 if (!fFound)
@@ -1036,4 +1067,7 @@
                     for (unsigned j = 0; !fFound && j < RT_ELEMENTS(g_aModules); j++)
                     {
+                        if (!g_aModules[j].fEnabled)
+                            continue;
+
                         int iArgCnt = argc - GetState.iNext + 1;
                         int iArgIndex = GetState.iNext - 1;
