From 404b1a0889ab769bd220410aa00ef8e5762ad172 Mon Sep 17 00:00:00 2001 From: "SND\\kernelnet_cp" <SND\kernelnet_cp@9b283d60-5439-405e-af05-b73fd8c4d996> Date: Fri, 17 Aug 2012 11:49:35 +0000 Subject: [PATCH] [0.2.x] added : dbgio.h/cpp git-svn-id: https://pykd.svn.codeplex.com/svn@78902 9b283d60-5439-405e-af05-b73fd8c4d996 --- pykd/win/dbgio.cpp | 87 ++++++++++++++++++++++++++++++++++++++++++++++ pykd/win/dbgio.h | 49 ++++++++++++++++++++++++++ 2 files changed, 136 insertions(+) create mode 100644 pykd/win/dbgio.cpp create mode 100644 pykd/win/dbgio.h diff --git a/pykd/win/dbgio.cpp b/pykd/win/dbgio.cpp new file mode 100644 index 0000000..d8c85d8 --- /dev/null +++ b/pykd/win/dbgio.cpp @@ -0,0 +1,87 @@ +#include "stdafx.h" +#include "dbgio.h" +#include "win/dbgeng.h" +#include "win/windbg.h" + + +namespace pykd { + +///////////////////////////////////////////////////////////////////////////////// + +void dprint( const std::wstring &str, bool dml ) +{ + if ( WindbgGlobalSession::isInit() ) + { + PyThread_StateRestore pyThreadRestore( g_dbgEng->pystate ); + + for ( size_t i = 0; i < str.size() / 100 + 1; ++i ) + { + g_dbgEng->control->ControlledOutputWide( + dml ? DEBUG_OUTCTL_AMBIENT_DML : DEBUG_OUTCTL_AMBIENT_TEXT, DEBUG_OUTPUT_NORMAL, + L"%ws", + str.substr( i*100, min( str.size() - i*100, 100 ) ).c_str() + ); + } + } + else + { + python::object sys = python::import("sys"); + sys.attr("stdout").attr("write")( str ); + } +} + +/////////////////////////////////////////////////////////////////////////////////// + +void dprintln( const std::wstring &str, bool dml ) +{ + dprint( str + L"\r\n", dml ); +} + +/////////////////////////////////////////////////////////////////////////////////// + +void eprint( const std::wstring &str ) +{ + if ( WindbgGlobalSession::isInit() ) + { + PyThread_StateRestore pyThreadRestore( g_dbgEng->pystate ); + + for ( size_t i = 0; i < str.size() / 100 + 1; ++i ) + { + g_dbgEng->control->OutputWide( + DEBUG_OUTPUT_ERROR, + L"%ws", + str.substr( i*100, min( str.size() - i*100, 100 ) ).c_str() + ); + } + } + else + { + python::object sys = python::import("sys"); + sys.attr("stderr").attr("write")( str ); + } +} + +/////////////////////////////////////////////////////////////////////////////////// + +void eprintln( const std::wstring &str ) +{ + eprint( str + L"\r\n" ); +} + +/////////////////////////////////////////////////////////////////////////////////// + +std::string dreadline() +{ + PyThread_StateRestore pyThreadRestore( g_dbgEng->pystate ); + + char str[0x100]; + ULONG inputSize = 0; + + g_dbgEng->control->Input( str, sizeof(str), &inputSize ); + + return std::string( str ) + "\n"; +} + +/////////////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace diff --git a/pykd/win/dbgio.h b/pykd/win/dbgio.h new file mode 100644 index 0000000..db11b38 --- /dev/null +++ b/pykd/win/dbgio.h @@ -0,0 +1,49 @@ +#pragma once + +#include "dbgengine.h" + +namespace pykd { + +/////////////////////////////////////////////////////////////////////////////// + +class DbgOut { + +public: + + void + write( const std::wstring &str ) { + dprint( str ); + } + +}; + +/////////////////////////////////////////////////////////////////////////////// + +class DbgErr { + +public: + + void + write( const std::wstring &str ) + { + eprint( str ); + } +}; + +/////////////////////////////////////////////////////////////////////////////// + + +class DbgIn { + +public: + + std::string + readline() { + return dreadline(); + } + +}; + +/////////////////////////////////////////////////////////////////////////////// + +} // end pykd namespace