PageRenderTime 67ms CodeModel.GetById 19ms app.highlight 42ms RepoModel.GetById 1ms app.codeStats 0ms

/branch/0.3.x/pykd_ext/pyinterpret.cpp

#
C++ | 856 lines | 664 code | 184 blank | 8 comment | 56 complexity | 320bae7caac31051ca7799d66a7b5ea1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Unlicense
  1#include "stdafx.h"
  2#include "pyinterpret.h"
  3
  4#include <memory>
  5#include <sstream>
  6#include <map>
  7#include <set>
  8#include <algorithm>
  9
 10#include "pymodule.h"
 11#include "pyclass.h"
 12#include "dbgout.h"
 13
 14class PyModule;
 15class PythonInterpreter;
 16
 17class HKey 
 18{
 19
 20public:
 21
 22    HKey() : m_key(NULL)
 23    {}
 24
 25    ~HKey()
 26    {
 27        if (m_key)
 28            RegCloseKey(m_key);
 29    }
 30
 31    operator HKEY*()
 32    {
 33        return &m_key;
 34    }
 35
 36    operator HKEY() const
 37    {
 38        return m_key;
 39    }
 40
 41private:
 42
 43    HKEY  m_key;
 44};
 45
 46
 47class PyModule
 48{
 49public:
 50
 51    PyModule(int majorVesion, int minorVersion);
 52
 53    ~PyModule();
 54
 55    bool isPy3;
 56
 57    void checkPykd();
 58    void deactivate();
 59
 60    PyObject* PyType_Type;
 61    PyObject* PyProperty_Type;
 62    PyObject* Py_None;
 63    PyObject* PyExc_SystemExit;
 64
 65    void( *Py_Initialize)();
 66    void( *Py_Finalize)();
 67
 68    PyThreadState* ( *Py_NewInterpreter)();
 69    void( *Py_EndInterpreter)(PyThreadState *tstate);
 70    PyObject* ( *PyEval_GetGlobals)();
 71    PyObject* ( *PyImport_Import)(PyObject *name);
 72    PyObject* ( *PyImport_ImportModule)(const char *name);
 73    void( *PyEval_InitThreads)();
 74    PyThreadState* ( *PyEval_SaveThread)();
 75    void( *PyEval_RestoreThread)(PyThreadState *tstate);
 76    PyThreadState* ( *PyThreadState_Swap)(PyThreadState *tstate);
 77    PyObject* ( *PyRun_String)(const char *str, int start, PyObject *globals, PyObject *locals);
 78    int( *PyRun_SimpleString)(const char*  str);
 79    PyObject* ( *PyRun_File)(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals);
 80    PyObject* ( *PyDict_New)();
 81    int( *PyDict_SetItemString)(PyObject *p, const char *key, PyObject *val);
 82    PyObject*( *PyDict_GetItemString)(PyObject *p, const char* key);
 83    void( *Py_IncRef)(PyObject* object);
 84    void( *Py_DecRef)(PyObject* object);
 85    PyObject* ( *PyObject_Call)(PyObject *callable_object, PyObject *args, PyObject *kw);
 86    PyObject* ( *PyObject_GetAttr)(PyObject *object, PyObject *attr_name);
 87    PyObject* ( *PyObject_GetAttrString)(PyObject *object, const char *attr_name);
 88    int( *PyObject_SetAttr)(PyObject *object, PyObject *attr_name, PyObject *value);
 89    PyObject* ( *PyObject_CallObject)(PyObject *callable_object, PyObject *args);
 90    PyObject* ( *PyTuple_New)(size_t len);
 91    int( *PyTuple_SetItem)(PyObject *p, size_t pos, PyObject *o);
 92    PyObject* ( *PyTuple_GetItem)(PyObject *p, size_t pos);
 93    size_t( *PyTuple_Size)(PyObject *p);
 94    PyObject* ( *PyCFunction_NewEx)(PyMethodDef *, PyObject *, PyObject *);
 95    PyObject* ( *PySys_GetObject)(char *name);
 96    int( *PySys_SetObject)(char *name, PyObject *v);
 97    void( *PySys_SetArgv)(int argc, char **argv);
 98    void( *PySys_SetArgv_Py3)(int argc, wchar_t **argv);
 99    PyObject* ( *PyString_FromString)(const char *v);
100    char* ( *PyString_AsString)(PyObject *string);
101    void( *PyErr_Fetch)(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback);
102    void( *PyErr_NormalizeException)(PyObject**exc, PyObject**val, PyObject**tb);
103    void( *PyErr_SetString)(PyObject *type, const char *message);
104    void( *PyErr_Clear)();
105    PyObject* ( *PyImport_AddModule)(const char *name);
106    PyObject* ( *PyClass_New)(PyObject* className, PyObject* classBases, PyObject* classDict);
107    PyObject* ( *PyInstance_New)(PyObject *classobj, PyObject *arg, PyObject *kw);
108    PyObject* ( *PyMethod_New)(PyObject *func, PyObject *self, PyObject *classobj);
109    PyObject* ( *PyCapsule_New)(void *pointer, const char *name, PyCapsule_Destructor destructor);
110    void* ( *PyCapsule_GetPointer)(PyObject *capsule, const char *name);
111    int( *PyObject_SetAttrString)(PyObject *o, const char *attr_name, PyObject *v);
112    PyObject* ( *PyUnicode_FromWideChar)(const wchar_t *w, size_t size);
113    PyObject* ( *PyBool_FromLong)(long v);
114    size_t( *PyList_Size)(PyObject* list);
115    PyObject* ( *PyList_GetItem)(PyObject *list, size_t index);
116    PyObject* ( *PyFile_FromString)(char *filename, char *mode);
117    FILE* ( *PyFile_AsFile)(PyObject *pyfile);
118    PyObject* ( *PyUnicode_FromString)(const char *u);
119    PyObject* ( *PyInstanceMethod_New)(PyObject *func);
120    size_t( *PyUnicode_AsWideChar)(PyObject *unicode, wchar_t *w, size_t size);
121    FILE* (  *_Py_fopen)(const char* filename, const char* mode);
122    int( *Py_AddPendingCall)(int(*func)(void *), void *arg);
123    PyGILState_STATE( *PyGILState_Ensure)();
124    void( *PyGILState_Release)(PyGILState_STATE state);
125    PyObject* ( *PyDescr_NewMethod)(PyObject* type, struct PyMethodDef *meth);
126
127    HMODULE  m_handlePython;
128    PyThreadState*  m_globalState;
129    PythonInterpreter*  m_globalInterpreter;
130    bool m_pykdInit;
131};
132
133
134
135class PythonInterpreter
136{
137public:
138
139    PythonInterpreter(PyModule* mod) :
140        m_module(mod)
141    {
142        PyThreadState*  state = mod->Py_NewInterpreter();
143
144        m_module->PyThreadState_Swap(state);
145
146        m_state = m_module->PyEval_SaveThread();
147    }
148
149    ~PythonInterpreter()
150    {
151        m_module->PyEval_RestoreThread(m_state);
152
153        m_module->Py_EndInterpreter(m_state);
154    }
155
156    PyModule*  m_module;
157
158    PyThreadState*  m_state;
159};
160
161
162class PythonSingleton
163{
164public:
165
166
167    static  PythonSingleton* get()
168    {
169        if (m_singleton.get() == 0)
170            m_singleton.reset(new PythonSingleton());
171        return m_singleton.get();
172    }
173
174
175    PythonInterpreter* currentInterpreter()
176    {
177        return m_currentInterpter;
178    }
179
180    PythonInterpreter* getInterpreter(int majorVersion, int minorVersion, bool global)
181    {
182        PyModule*  module = 0;
183
184        if (m_modules.find(std::make_pair(majorVersion, minorVersion)) == m_modules.end())
185        {
186            module = new PyModule(majorVersion, minorVersion);
187            m_modules.insert(std::make_pair(std::make_pair(majorVersion, minorVersion), module));
188        }
189        else
190        {
191            module = m_modules[std::make_pair(majorVersion, minorVersion)];
192        }
193
194        if (global)
195        {
196            if (module->m_globalInterpreter == 0)
197            {
198                module->PyEval_RestoreThread(module->m_globalState);
199                module->m_globalInterpreter = new PythonInterpreter(module);
200            }
201
202            m_currentInterpter = module->m_globalInterpreter;
203            m_currentIsGlobal = true;
204        }
205        else
206        {
207            module->PyEval_RestoreThread(module->m_globalState);
208            m_currentInterpter = new PythonInterpreter(module);
209            m_currentIsGlobal = false;
210        }
211
212        m_currentInterpter->m_module->PyEval_RestoreThread(m_currentInterpter->m_state);
213
214        return m_currentInterpter;
215    }
216
217    void releaseInterpretor(PythonInterpreter* interpret)
218    {
219        PyModule*  module = m_currentInterpter->m_module;
220
221        m_currentInterpter->m_state = module->PyEval_SaveThread();
222
223        if (!m_currentIsGlobal)
224        {
225            delete m_currentInterpter;
226
227            module->PyThreadState_Swap(module->m_globalState);
228            module->m_globalState = module->PyEval_SaveThread();
229        }
230
231        m_currentInterpter = 0;
232    }
233
234    bool isInterpreterLoaded(int majorVersion, int minorVersion)
235    {
236        return m_modules.find(std::make_pair(majorVersion, minorVersion)) != m_modules.end();
237    }
238
239    void checkPykd()
240    {
241        m_currentInterpter->m_module->checkPykd();
242    }
243
244    void stopAllInterpreter()
245    {
246        for (auto m : m_modules)
247        {
248            m_currentInterpter = m.second->m_globalInterpreter;
249            m.second->deactivate();
250        }
251        m_currentInterpter = 0;
252    }
253
254private:
255
256    static std::auto_ptr<PythonSingleton>  m_singleton;
257
258    std::map<std::pair<int,int>, PyModule*>  m_modules;
259   
260    PythonInterpreter*  m_currentInterpter;
261    bool  m_currentIsGlobal;
262};
263
264std::auto_ptr<PythonSingleton>  PythonSingleton::m_singleton; 
265
266HMODULE LoadPythonForKey(HKEY installPathKey, int majorVersion, int minorVersion)
267{
268
269    HMODULE  hmodule = NULL;
270
271    char  installPath[1000];
272    DWORD  installPathSize = sizeof(installPath);
273
274    if (ERROR_SUCCESS == RegQueryValueExA(installPathKey, NULL, NULL, NULL, (LPBYTE)installPath, &installPathSize))
275    {
276        std::stringstream  dllName;
277        dllName << "python" << majorVersion << minorVersion << ".dll";
278
279        std::stringstream  imagePath;
280        imagePath << installPath << dllName.str();
281
282        hmodule = LoadLibraryExA(imagePath.str().c_str(), NULL, LOAD_WITH_ALTERED_SEARCH_PATH);
283        if (hmodule)
284            return hmodule;
285
286        hmodule = LoadLibraryA(dllName.str().c_str());
287        if (hmodule)
288            return hmodule;
289
290    }
291
292    return NULL;
293}
294
295
296HMODULE LoadPythonLibrary(int majorVersion, int minorVersion)
297{
298
299    HKey  pythonCoreKey;
300
301    for (auto rootKey : std::list<HKEY>({ HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }))
302    {
303        if (ERROR_SUCCESS == RegOpenKeyA(rootKey, "SOFTWARE\\Python\\PythonCore", pythonCoreKey))
304        {
305            HKey  installPathKey;
306
307            std::stringstream   installPathStr;
308
309            if (majorVersion == 2 || (majorVersion == 3 && minorVersion <= 4))
310            {
311                installPathStr << majorVersion << '.' << minorVersion << "\\InstallPath";
312            }
313            else
314            if (majorVersion == 3 && minorVersion >= 5)
315            {
316#ifdef _M_X64
317                installPathStr << majorVersion << '.' << minorVersion << "\\InstallPath";
318#else
319                installPathStr << majorVersion << '.' << minorVersion << "-32" << "\\InstallPath";
320#endif
321            }
322
323            if (ERROR_SUCCESS == RegOpenKeyA(pythonCoreKey, installPathStr.str().c_str(), installPathKey))
324            {
325                HMODULE  hmodule = LoadPythonForKey(installPathKey, majorVersion, minorVersion);
326                if (hmodule)
327                    return hmodule;
328            }
329        }
330    }
331
332    return NULL;
333}
334
335
336std::list<InterpreterDesc>  getInstalledInterpreter()
337{
338    std::set<InterpreterDesc>  interpretSet;
339
340    for (auto rootKey : const std::list<HKEY>({ HKEY_LOCAL_MACHINE, HKEY_CURRENT_USER }))
341    {
342        HKey  pythonCoreKey;
343        
344        if (ERROR_SUCCESS != RegOpenKeyA(rootKey, "SOFTWARE\\Python\\PythonCore", pythonCoreKey))
345            continue;
346
347        for (DWORD i = 0;; ++i)
348        {
349            char  versionStr[20];
350            if (ERROR_SUCCESS != RegEnumKeyA(pythonCoreKey, i, versionStr, sizeof(versionStr)))
351                break;
352
353            int  majorVersion = -1, minorVersion = -1;
354            sscanf_s(versionStr, "%d.%d", &majorVersion, &minorVersion);
355
356            HKey  installPathKey;
357            std::string   installPathStr(versionStr);
358            installPathStr += "\\InstallPath";
359
360            if (ERROR_SUCCESS != RegOpenKeyA(pythonCoreKey, installPathStr.c_str(), installPathKey))
361                continue;
362
363            HMODULE  hmodule = LoadPythonForKey(installPathKey, majorVersion, minorVersion);
364            
365            if (hmodule)
366            {
367                char  fullPath[1000];
368            
369                if (GetModuleFileNameA(hmodule, fullPath, sizeof(fullPath)))
370                {
371                    interpretSet.insert({ majorVersion, minorVersion, fullPath });
372                }
373            
374                FreeLibrary(hmodule);
375            }
376        }
377    }
378
379    std::list<InterpreterDesc>  interpretLst;
380
381    std::copy(interpretSet.begin(), interpretSet.end(), std::inserter(interpretLst, interpretLst.begin()));
382
383    interpretLst.sort();
384
385    return interpretLst;
386}
387
388PyModule::PyModule(int majorVesion, int minorVersion)
389{
390    m_handlePython = LoadPythonLibrary(majorVesion, minorVersion);
391
392    if (!m_handlePython)
393        throw std::exception("failed to load python module");
394
395    isPy3 = majorVesion == 3;
396
397    *reinterpret_cast<FARPROC*>(&PyType_Type) = GetProcAddress(m_handlePython, "PyType_Type");
398    *reinterpret_cast<FARPROC*>(&PyProperty_Type) = GetProcAddress(m_handlePython, "PyProperty_Type");
399    *reinterpret_cast<FARPROC*>(&Py_None) = GetProcAddress(m_handlePython, "_Py_NoneStruct");
400    PyExc_SystemExit = *reinterpret_cast<PyObject**>(GetProcAddress(m_handlePython, "PyExc_SystemExit"));
401
402    *reinterpret_cast<FARPROC*>(&Py_Initialize) = GetProcAddress(m_handlePython, "Py_Initialize");
403    *reinterpret_cast<FARPROC*>(&Py_Finalize) = GetProcAddress(m_handlePython, "Py_Finalize");
404    *reinterpret_cast<FARPROC*>(&Py_NewInterpreter) = GetProcAddress(m_handlePython, "Py_NewInterpreter");
405    *reinterpret_cast<FARPROC*>(&Py_EndInterpreter) = GetProcAddress(m_handlePython, "Py_EndInterpreter");
406    *reinterpret_cast<FARPROC*>(&Py_DecRef) = GetProcAddress(m_handlePython, "Py_DecRef");
407    *reinterpret_cast<FARPROC*>(&Py_IncRef) = GetProcAddress(m_handlePython, "Py_IncRef");
408    *reinterpret_cast<FARPROC*>(&PyEval_GetGlobals) = GetProcAddress(m_handlePython, "PyEval_GetGlobals");
409    *reinterpret_cast<FARPROC*>(&PyEval_InitThreads) = GetProcAddress(m_handlePython, "PyEval_InitThreads");
410    *reinterpret_cast<FARPROC*>(&PyEval_SaveThread) = GetProcAddress(m_handlePython, "PyEval_SaveThread");
411    *reinterpret_cast<FARPROC*>(&PyEval_RestoreThread) = GetProcAddress(m_handlePython, "PyEval_RestoreThread");
412    *reinterpret_cast<FARPROC*>(&PyThreadState_Swap) = GetProcAddress(m_handlePython, "PyThreadState_Swap");
413    *reinterpret_cast<FARPROC*>(&PyRun_String) = GetProcAddress(m_handlePython, "PyRun_String");
414    *reinterpret_cast<FARPROC*>(&PyRun_SimpleString) = GetProcAddress(m_handlePython, "PyRun_SimpleString");
415    *reinterpret_cast<FARPROC*>(&PyRun_File) = GetProcAddress(m_handlePython, "PyRun_File");
416    *reinterpret_cast<FARPROC*>(&PyDict_New) = GetProcAddress(m_handlePython, "PyDict_New");
417    *reinterpret_cast<FARPROC*>(&PyDict_SetItemString) = GetProcAddress(m_handlePython, "PyDict_SetItemString");
418    *reinterpret_cast<FARPROC*>(&PyDict_GetItemString) = GetProcAddress(m_handlePython, "PyDict_GetItemString");
419    *reinterpret_cast<FARPROC*>(&PyObject_Call) = GetProcAddress(m_handlePython, "PyObject_Call");
420    *reinterpret_cast<FARPROC*>(&PyObject_GetAttr) = GetProcAddress(m_handlePython, "PyObject_GetAttr");
421    *reinterpret_cast<FARPROC*>(&PyObject_GetAttrString) = GetProcAddress(m_handlePython, "PyObject_GetAttrString");
422    *reinterpret_cast<FARPROC*>(&PyObject_SetAttr) = GetProcAddress(m_handlePython, "PyObject_SetAttr");
423    *reinterpret_cast<FARPROC*>(&PyObject_CallObject) = GetProcAddress(m_handlePython, "PyObject_CallObject");
424    *reinterpret_cast<FARPROC*>(&PyTuple_New) = GetProcAddress(m_handlePython, "PyTuple_New");
425    *reinterpret_cast<FARPROC*>(&PyTuple_SetItem) = GetProcAddress(m_handlePython, "PyTuple_SetItem");
426    *reinterpret_cast<FARPROC*>(&PyTuple_GetItem) = GetProcAddress(m_handlePython, "PyTuple_GetItem");
427    *reinterpret_cast<FARPROC*>(&PyTuple_Size) = GetProcAddress(m_handlePython, "PyTuple_Size");
428    *reinterpret_cast<FARPROC*>(&PyString_FromString) = GetProcAddress(m_handlePython, "PyString_FromString");
429    *reinterpret_cast<FARPROC*>(&PyCFunction_NewEx) = GetProcAddress(m_handlePython, "PyCFunction_NewEx");
430    *reinterpret_cast<FARPROC*>(&PySys_GetObject) = GetProcAddress(m_handlePython, "PySys_GetObject");
431    *reinterpret_cast<FARPROC*>(&PySys_SetObject) = GetProcAddress(m_handlePython, "PySys_SetObject");
432    *reinterpret_cast<FARPROC*>(&PySys_SetArgv) = !isPy3 ? GetProcAddress(m_handlePython, "PySys_SetArgv") : 0 ;
433    *reinterpret_cast<FARPROC*>(&PySys_SetArgv_Py3) = isPy3 ? GetProcAddress(m_handlePython, "PySys_SetArgv") : 0;
434    *reinterpret_cast<FARPROC*>(&PyString_FromString) = GetProcAddress(m_handlePython, "PyString_FromString");
435    *reinterpret_cast<FARPROC*>(&PyString_AsString) = GetProcAddress(m_handlePython, "PyString_AsString");
436    *reinterpret_cast<FARPROC*>(&PyErr_Fetch) = GetProcAddress(m_handlePython, "PyErr_Fetch");
437    *reinterpret_cast<FARPROC*>(&PyErr_NormalizeException) = GetProcAddress(m_handlePython, "PyErr_NormalizeException");
438    *reinterpret_cast<FARPROC*>(&PyErr_SetString) = GetProcAddress(m_handlePython, "PyErr_SetString");
439    *reinterpret_cast<FARPROC*>(&PyErr_Clear) = GetProcAddress(m_handlePython, "PyErr_Clear");
440    *reinterpret_cast<FARPROC*>(&PyImport_AddModule) = GetProcAddress(m_handlePython, "PyImport_AddModule");
441    *reinterpret_cast<FARPROC*>(&PyImport_ImportModule) = GetProcAddress(m_handlePython, "PyImport_ImportModule");    
442    *reinterpret_cast<FARPROC*>(&PyClass_New) = GetProcAddress(m_handlePython, "PyClass_New");
443    *reinterpret_cast<FARPROC*>(&PyInstance_New) = GetProcAddress(m_handlePython, "PyInstance_New");
444    *reinterpret_cast<FARPROC*>(&PyMethod_New) = GetProcAddress(m_handlePython, "PyMethod_New");
445    *reinterpret_cast<FARPROC*>(&PyCapsule_New) = GetProcAddress(m_handlePython, "PyCapsule_New");
446    *reinterpret_cast<FARPROC*>(&PyCapsule_GetPointer) = GetProcAddress(m_handlePython, "PyCapsule_GetPointer");
447    *reinterpret_cast<FARPROC*>(&PyObject_SetAttrString) = GetProcAddress(m_handlePython, "PyObject_SetAttrString");
448    *reinterpret_cast<FARPROC*>(&PyUnicode_FromWideChar) = isPy3 ? GetProcAddress(m_handlePython, "PyUnicode_FromWideChar") :
449         GetProcAddress(m_handlePython, "PyUnicodeUCS2_FromWideChar");
450    *reinterpret_cast<FARPROC*>(&PyImport_Import) = GetProcAddress(m_handlePython, "PyImport_Import");
451    *reinterpret_cast<FARPROC*>(&PyBool_FromLong) = GetProcAddress(m_handlePython, "PyBool_FromLong");
452    *reinterpret_cast<FARPROC*>(&PyList_Size) = GetProcAddress(m_handlePython, "PyList_Size");
453    *reinterpret_cast<FARPROC*>(&PyList_GetItem) = GetProcAddress(m_handlePython, "PyList_GetItem");
454    *reinterpret_cast<FARPROC*>(&PyFile_FromString) = GetProcAddress(m_handlePython, "PyFile_FromString");
455    *reinterpret_cast<FARPROC*>(&PyFile_AsFile) = GetProcAddress(m_handlePython, "PyFile_AsFile");
456    *reinterpret_cast<FARPROC*>(&PyUnicode_FromString) = GetProcAddress(m_handlePython, "PyUnicode_FromString");
457    *reinterpret_cast<FARPROC*>(&PyInstanceMethod_New) = GetProcAddress(m_handlePython, "PyInstanceMethod_New");
458    *reinterpret_cast<FARPROC*>(&PyUnicode_AsWideChar) = GetProcAddress(m_handlePython, "PyUnicode_AsWideChar");
459    *reinterpret_cast<FARPROC*>(&_Py_fopen) = GetProcAddress(m_handlePython, "_Py_fopen");
460    *reinterpret_cast<FARPROC*>(&Py_AddPendingCall) = GetProcAddress(m_handlePython, "Py_AddPendingCall");
461    *reinterpret_cast<FARPROC*>(&PyGILState_Ensure) = GetProcAddress(m_handlePython, "PyGILState_Ensure");
462    *reinterpret_cast<FARPROC*>(&PyGILState_Release) = GetProcAddress(m_handlePython, "PyGILState_Release");
463    *reinterpret_cast<FARPROC*>(&PyDescr_NewMethod) = GetProcAddress(m_handlePython, "PyDescr_NewMethod");
464    
465    Py_Initialize();
466    PyEval_InitThreads();
467
468    m_globalState = PyEval_SaveThread();
469}
470
471
472PyModule::~PyModule()
473{
474    assert(0);
475
476    //if (m_globalInterpreter)
477    //{
478    //    delete m_globalInterpreter;
479    //    m_globalInterpreter = 0;
480    //}
481
482    //PyThreadState_Swap(m_globalState);
483
484    //Py_Finalize();
485
486    //FreeLibrary(m_handlePython);
487}
488
489
490void PyModule::deactivate()
491{
492    if (m_globalInterpreter)
493    {
494        delete m_globalInterpreter;
495        m_globalInterpreter = 0;
496    }
497
498    PyThreadState_Swap(m_globalState);
499
500    if (m_pykdInit)
501    {
502        PyObject* mainName = isPy3 ? PyUnicode_FromString("__main__") : PyString_FromString("__main__");
503        PyObject*  mainMod = PyImport_Import(mainName);
504        PyObject*  globals = PyObject_GetAttrString(mainMod, "__dict__");
505        PyObject*  result = PyRun_String("__import__('pykd').deinitialize()\n", Py_file_input, globals, globals);
506
507        if (mainName) Py_DecRef(mainName);
508        if (mainMod) Py_DecRef(mainMod);
509        if (globals) Py_DecRef(globals);
510        if (result) Py_DecRef(result);
511
512        m_pykdInit = false;
513    }
514
515    m_globalState = PyEval_SaveThread();
516}
517
518void PyModule::checkPykd()
519{
520
521    PyObject  *mainName = 0, *mainMod = 0, *globals = 0, *result = 0;
522
523    do {
524        if (m_pykdInit)
525            break;
526
527        mainName = isPy3 ? PyUnicode_FromString("__main__") : PyString_FromString("__main__");
528        if (!mainName)
529            break;
530
531        mainMod = PyImport_Import(mainName);
532        if (!mainMod)
533            break;
534
535        globals = PyObject_GetAttrString(mainMod, "__dict__");
536        if (!globals)
537            break;
538
539        result = PyRun_String("__import__('pykd').initialize()\n", Py_file_input, globals, globals);
540        if (!result)
541            break;
542
543        m_pykdInit = true;
544
545    } while( false);
546
547    if (mainName) Py_DecRef(mainName);
548    if (mainMod) Py_DecRef(mainMod);
549    if (globals) Py_DecRef(globals);
550    if (result) Py_DecRef(result);
551}
552
553PythonInterpreter* activateInterpreter(bool global, int majorVersion, int minorVersion)
554{
555    return PythonSingleton::get()->getInterpreter(majorVersion, minorVersion, global);
556}
557
558void releaseInterpretor(PythonInterpreter* interpret)
559{
560    PythonSingleton::get()->releaseInterpretor(interpret);
561}
562
563bool isInterpreterLoaded(int majorVersion, int minorVersion)
564{
565    return PythonSingleton::get()->isInterpreterLoaded(majorVersion, minorVersion);
566}
567
568void stopAllInterpreter()
569{
570    PythonSingleton::get()->stopAllInterpreter();
571}
572
573void checkPykd()
574{
575    PythonSingleton::get()->checkPykd();
576}
577
578void __stdcall Py_IncRef(PyObject* object)
579{
580    PythonSingleton::get()->currentInterpreter()->m_module->Py_IncRef(object);
581}
582
583void __stdcall Py_DecRef(PyObject* object)
584{
585    PythonSingleton::get()->currentInterpreter()->m_module->Py_DecRef(object);
586}
587
588PyObject* __stdcall PyString_FromString(const char *v)
589{
590    return PythonSingleton::get()->currentInterpreter()->m_module->PyString_FromString(v);
591}
592
593PyObject* __stdcall  PyDict_New()
594{
595    return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_New();
596}
597
598PyObject* __stdcall PyDict_GetItemString(PyObject *p, const char *key)
599{
600    return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_GetItemString(p, key);
601}
602
603int __stdcall PyDict_SetItemString(PyObject *p, const char *key, PyObject *val)
604{
605    return PythonSingleton::get()->currentInterpreter()->m_module->PyDict_SetItemString(p, key, val);
606}
607
608PyObject* __stdcall PyCFunction_NewEx(PyMethodDef* pydef, PyObject *p1, PyObject *p2)
609{
610    return PythonSingleton::get()->currentInterpreter()->m_module->PyCFunction_NewEx(pydef, p1, p2);
611}
612
613PyObject* __stdcall PyClass_New(PyObject* className, PyObject* classBases, PyObject* classDict)
614{
615    return PythonSingleton::get()->currentInterpreter()->m_module->PyClass_New(className, classBases, classDict);
616}
617
618PyObject* __stdcall PyMethod_New(PyObject *func, PyObject *self, PyObject *classobj)
619{
620    return PythonSingleton::get()->currentInterpreter()->m_module->PyMethod_New(func, self, classobj);
621}
622
623int __stdcall PySys_SetObject(char *name, PyObject *v)
624{
625    return PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetObject(name, v);
626}
627
628void __stdcall PySys_SetArgv(int argc, char **argv)
629{
630    PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetArgv(argc, argv);
631}
632
633void __stdcall PySys_SetArgv_Py3(int argc, wchar_t **argv)
634{
635    PythonSingleton::get()->currentInterpreter()->m_module->PySys_SetArgv_Py3(argc, argv);
636}
637
638PyObject* __stdcall PySys_GetObject(char *name)
639{
640    return PythonSingleton::get()->currentInterpreter()->m_module->PySys_GetObject(name);
641}
642
643PyObject* __stdcall PyInstance_New(PyObject *classobj, PyObject *arg, PyObject *kw)
644{
645    return PythonSingleton::get()->currentInterpreter()->m_module->PyInstance_New(classobj, arg, kw);
646}
647
648int __stdcall PyRun_SimpleString(const char* str)
649{
650    return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_SimpleString(str);
651}
652
653PyObject* __stdcall PyRun_String(const char *str, int start, PyObject *globals, PyObject *locals)
654{
655    return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_String(str, start, globals, locals);
656}
657
658PyObject* PyCapsule_New(void *pointer, const char *name, PyCapsule_Destructor destructor)
659{
660    return PythonSingleton::get()->currentInterpreter()->m_module->PyCapsule_New(pointer, name, destructor);
661}
662
663void* PyCapsule_GetPointer(PyObject *capsule, const char *name)
664{
665    return PythonSingleton::get()->currentInterpreter()->m_module->PyCapsule_GetPointer(capsule, name);
666}
667
668int PyObject_SetAttrString(PyObject *o, const char *attr_name, PyObject *v)
669{
670    return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_SetAttrString(o, attr_name, v);
671}
672
673PyObject* PyObject_GetAttrString(PyObject *o, const char *attr_name)
674{
675    return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_GetAttrString(o, attr_name);
676}
677
678PyObject* PyObject_CallObject(PyObject *callable_object, PyObject *args)
679{
680    return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_CallObject(callable_object, args);
681}
682
683PyObject* PyObject_Call(PyObject *callable_object, PyObject *args, PyObject *kw)
684{
685    return PythonSingleton::get()->currentInterpreter()->m_module->PyObject_Call(callable_object, args, kw);
686}
687
688PyObject* __stdcall PyTuple_New(size_t len)
689{
690    return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_New(len);
691}
692
693PyObject* __stdcall PyTuple_GetItem(PyObject *p, size_t pos)
694{
695    return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_GetItem(p, pos);
696}
697
698int __stdcall PyTuple_SetItem(PyObject *p, size_t pos, PyObject *obj)
699{
700    return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_SetItem(p, pos, obj);
701}
702
703size_t __stdcall PyTuple_Size(PyObject *p)
704{
705    return PythonSingleton::get()->currentInterpreter()->m_module->PyTuple_Size(p);
706}
707
708char* PyString_AsString(PyObject *string)
709{
710    return PythonSingleton::get()->currentInterpreter()->m_module->PyString_AsString(string);
711}
712
713PyObject* PyUnicode_FromWideChar(const wchar_t *w, size_t size)
714{
715    return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_FromWideChar(w, size);
716}
717
718PyObject* PyImport_Import(PyObject *name)
719{
720    return PythonSingleton::get()->currentInterpreter()->m_module->PyImport_Import(name);
721}
722
723PyObject* PyBool_FromLong(long v)
724{
725    return PythonSingleton::get()->currentInterpreter()->m_module->PyBool_FromLong(v);
726}
727
728PyObject* Py_None()
729{
730    return PythonSingleton::get()->currentInterpreter()->m_module->Py_None;
731}
732
733PyObject* PyExc_SystemExit()
734{
735    return PythonSingleton::get()->currentInterpreter()->m_module->PyExc_SystemExit;
736}
737
738PyObject* PyType_Type()
739{
740    return  PythonSingleton::get()->currentInterpreter()->m_module->PyType_Type;
741}
742
743PyObject* PyProperty_Type()
744{
745    return PythonSingleton::get()->currentInterpreter()->m_module->PyProperty_Type;
746}
747
748void PyErr_Fetch(PyObject **ptype, PyObject **pvalue, PyObject **ptraceback)
749{
750    PythonSingleton::get()->currentInterpreter()->m_module->PyErr_Fetch(ptype, pvalue, ptraceback);
751}
752
753
754void PyErr_NormalizeException(PyObject**exc, PyObject**val, PyObject**tb)
755{
756    PythonSingleton::get()->currentInterpreter()->m_module->PyErr_NormalizeException(exc, val, tb);
757}
758
759void PyErr_Clear()
760{
761    PythonSingleton::get()->currentInterpreter()->m_module->PyErr_Clear();
762}
763
764void PyErr_SetString(PyObject *type, const char *message)
765{
766    PythonSingleton::get()->currentInterpreter()->m_module->PyErr_SetString(type, message);
767}
768
769size_t PyList_Size(PyObject* list)
770{
771    return PythonSingleton::get()->currentInterpreter()->m_module->PyList_Size(list);
772}
773
774PyObject* PyList_GetItem(PyObject *list, size_t index)
775{
776    return PythonSingleton::get()->currentInterpreter()->m_module->PyList_GetItem(list, index);
777}
778
779PyObject* PyFile_FromString(char *filename, char *mode)
780{
781    return PythonSingleton::get()->currentInterpreter()->m_module->PyFile_FromString(filename, mode);
782}
783
784FILE* PyFile_AsFile(PyObject *pyfile)
785{
786    return PythonSingleton::get()->currentInterpreter()->m_module->PyFile_AsFile(pyfile);
787}
788
789PyObject* PyRun_File(FILE *fp, const char *filename, int start, PyObject *globals, PyObject *locals)
790{
791    return PythonSingleton::get()->currentInterpreter()->m_module->PyRun_File(fp, filename, start, globals, locals);
792}
793
794PyObject* __stdcall PyUnicode_FromString(const char*  str)
795{
796    return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_FromString(str);
797}
798
799PyObject* __stdcall PyInstanceMethod_New(PyObject *func)
800{
801    return PythonSingleton::get()->currentInterpreter()->m_module->PyInstanceMethod_New(func);
802}
803
804size_t __stdcall PyUnicode_AsWideChar(PyObject *unicode, wchar_t *w, size_t size)
805{
806    return PythonSingleton::get()->currentInterpreter()->m_module->PyUnicode_AsWideChar(unicode, w, size);
807}
808
809PyObject* __stdcall PyImport_ImportModule(const char *name)
810{
811    return PythonSingleton::get()->currentInterpreter()->m_module->PyImport_ImportModule(name);
812}
813
814PyThreadState* __stdcall PyEval_SaveThread()
815{
816    return PythonSingleton::get()->currentInterpreter()->m_module->PyEval_SaveThread();
817}
818
819void __stdcall PyEval_RestoreThread(PyThreadState *tstate)
820{
821    PythonSingleton::get()->currentInterpreter()->m_module->PyEval_RestoreThread(tstate);
822}
823
824FILE* _Py_fopen(const char* filename, const char* mode)
825{
826    return PythonSingleton::get()->currentInterpreter()->m_module->_Py_fopen(filename, mode);
827}
828
829int __stdcall Py_AddPendingCall(int(*func)(void *), void *arg)
830{
831    return PythonSingleton::get()->currentInterpreter()->m_module->Py_AddPendingCall(func, arg);
832}
833
834PyGILState_STATE __stdcall PyGILState_Ensure()
835{
836    return PythonSingleton::get()->currentInterpreter()->m_module->PyGILState_Ensure();
837}
838
839void __stdcall PyGILState_Release(PyGILState_STATE state)
840{
841    PythonSingleton::get()->currentInterpreter()->m_module->PyGILState_Release(state);
842}
843
844PyObject* __stdcall PyDescr_NewMethod(PyObject* type, struct PyMethodDef *meth)
845{
846    return PythonSingleton::get()->currentInterpreter()->m_module->PyDescr_NewMethod(type, meth);
847}
848
849
850
851bool IsPy3()
852{
853    return PythonSingleton::get()->currentInterpreter()->m_module->isPy3;
854}
855
856