From 7b3710b487974d4eaf6ae9951efd904a82bd8672 Mon Sep 17 00:00:00 2001
From: "SND\\kernelnet_cp"
 <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996>
Date: Thu, 15 Sep 2016 10:49:08 +0000
Subject: [PATCH] [pykd_ext_2.0] fixed : issue #13983 (  !pykd.info throws
 unhandled exception )

git-svn-id: https://pykd.svn.codeplex.com/svn@91044 9b283d60-5439-405e-af05-b73fd8c4d996
---
 pykd_ext/version.h     |  2 +-
 pykd_ext/windbgext.cpp | 87 ++++++++++++++++++++++++------------------
 2 files changed, 51 insertions(+), 38 deletions(-)

diff --git a/pykd_ext/version.h b/pykd_ext/version.h
index 18bf1c9..a1805fa 100644
--- a/pykd_ext/version.h
+++ b/pykd_ext/version.h
@@ -3,7 +3,7 @@
 #define PYKDEXT_VERSION_MAJOR      2
 #define PYKDEXT_VERSION_MINOR      0
 #define PYKDEXT_VERSION_SUBVERSION 0
-#define PYKDEXT_VERSION_BUILDNO    4
+#define PYKDEXT_VERSION_BUILDNO    5
 
 #define __VER_STR2__(x) #x
 #define __VER_STR1__(x) __VER_STR2__(x)
diff --git a/pykd_ext/windbgext.cpp b/pykd_ext/windbgext.cpp
index 31dcba7..d404778 100644
--- a/pykd_ext/windbgext.cpp
+++ b/pykd_ext/windbgext.cpp
@@ -133,52 +133,65 @@ info(
     PCSTR args
 )
 {
-    std::stringstream   sstr;
-
-    sstr <<std::endl << "pykd bootstrapper version: " << PYKDEXT_VERSION_MAJOR << '.' << PYKDEXT_VERSION_MINOR << '.' 
-        << PYKDEXT_VERSION_SUBVERSION << '.' << PYKDEXT_VERSION_BUILDNO << std::endl;
-
-    std::list<InterpreterDesc>   interpreterList = getInstalledInterpreter();
-
-    int defaultMajor;
-    int defaultMinor;
-
-    getDefaultPythonVersion(defaultMajor, defaultMinor);
-
-    sstr << std::endl << "Installed python:" << std::endl << std::endl;
-    sstr << std::setw(16) << std::left << "Version:" << std::setw(12) << std::left << "Status: " << std::left << "Image:" <<  std::endl;
-    sstr << "------------------------------------------------------------------------------" << std::endl;
-    if (interpreterList.size() > 0)
+    try 
     {
-        for (const InterpreterDesc& desc : interpreterList)
+        std::stringstream   sstr;
+
+        sstr <<std::endl << "pykd bootstrapper version: " << PYKDEXT_VERSION_MAJOR << '.' << PYKDEXT_VERSION_MINOR << '.' 
+            << PYKDEXT_VERSION_SUBVERSION << '.' << PYKDEXT_VERSION_BUILDNO << std::endl;
+
+        std::list<InterpreterDesc>   interpreterList = getInstalledInterpreter();
+
+        int defaultMajor;
+        int defaultMinor;
+
+        getDefaultPythonVersion(defaultMajor, defaultMinor);
+
+        sstr << std::endl << "Installed python:" << std::endl << std::endl;
+        sstr << std::setw(16) << std::left << "Version:" << std::setw(12) << std::left << "Status: " << std::left << "Image:" <<  std::endl;
+        sstr << "------------------------------------------------------------------------------" << std::endl;
+        if (interpreterList.size() > 0)
         {
-            if ( defaultMajor == desc.majorVersion && defaultMinor == desc.minorVersion)
-                sstr << "* ";
-            else
-                sstr << "  ";
+            for (const InterpreterDesc& desc : interpreterList)
+            {
+                if ( defaultMajor == desc.majorVersion && defaultMinor == desc.minorVersion)
+                    sstr << "* ";
+                else
+                    sstr << "  ";
 
-            sstr << std::setw(14) << std::left << make_version(desc.majorVersion, desc.minorVersion);
+                sstr << std::setw(14) << std::left << make_version(desc.majorVersion, desc.minorVersion);
             
-            sstr << std::setw(12) << std::left << (isInterpreterLoaded(desc.majorVersion, desc.minorVersion) ? "Loaded" : "Unloaded");
+                sstr << std::setw(12) << std::left << (isInterpreterLoaded(desc.majorVersion, desc.minorVersion) ? "Loaded" : "Unloaded");
 
-            sstr << desc.imagePath << std::endl;
+                sstr << desc.imagePath << std::endl;
+            }
         }
-    }
-    else
+        else
+        {
+            sstr << "No python interpreter found" << std::endl; 
+        }
+
+        sstr << std::endl;
+
+        CComQIPtr<IDebugControl>  control = client;
+
+        control->ControlledOutput(
+            DEBUG_OUTCTL_THIS_CLIENT,
+            DEBUG_OUTPUT_NORMAL,
+            sstr.str().c_str()
+            );
+    } 
+    catch(std::exception &e)
     {
-        sstr << "No python interpreter found" << std::endl; 
+        CComQIPtr<IDebugControl>  control = client;
+
+        control->ControlledOutput(
+            DEBUG_OUTCTL_THIS_CLIENT,
+            DEBUG_OUTPUT_ERROR,
+            e.what()
+            );
     }
 
-    sstr << std::endl;
-
-    CComQIPtr<IDebugControl>  control = client;
-
-    control->ControlledOutput(
-        DEBUG_OUTCTL_THIS_CLIENT,
-        DEBUG_OUTPUT_NORMAL,
-        sstr.str().c_str()
-        );
-
     return S_OK;
 }