From 98574d58488bb466f7efb6dbabb3cd3eb2cea704 Mon Sep 17 00:00:00 2001 From: wj32 Date: Sun, 18 Jul 2010 09:03:34 +0000 Subject: [PATCH] finished ICorPublish wrappers git-svn-id: svn://svn.code.sf.net/p/processhacker/code@3392 21ef857c-d57f-4fe0-8362-d861dc6d29cd --- 2.x/trunk/phlib/clrsup.c | 131 ++++++++++++++++++++++++++++++- 2.x/trunk/phlib/include/clrsup.h | 35 ++++++++- 2 files changed, 161 insertions(+), 5 deletions(-) diff --git a/2.x/trunk/phlib/clrsup.c b/2.x/trunk/phlib/clrsup.c index b0bd55a7d..28c4408ff 100644 --- a/2.x/trunk/phlib/clrsup.c +++ b/2.x/trunk/phlib/clrsup.c @@ -21,6 +21,7 @@ */ #include +#include #define CINTERFACE #define COBJMACROS #include @@ -28,7 +29,7 @@ #include #include -PVOID PhClrCreatePublish() +PPH_CLR_PUBLISH PhClrCreatePublish() { ICorPublish *publish; @@ -40,7 +41,7 @@ PVOID PhClrCreatePublish() &publish ))) { - return publish; + return (PPH_CLR_PUBLISH)publish; } else { @@ -49,8 +50,132 @@ PVOID PhClrCreatePublish() } VOID PhClrFreePublish( - __in PVOID Publish + __in PPH_CLR_PUBLISH Publish ) { ICorPublish_Release((ICorPublish *)Publish); } + +PPH_CLR_PUBLISH_PROCESS PhClrGetProcessPublish( + __in PPH_CLR_PUBLISH Publish, + __in HANDLE ProcessId + ) +{ + ICorPublishProcess *process; + + if (SUCCEEDED(ICorPublish_GetProcess( + (ICorPublish *)Publish, + (ULONG)ProcessId, + &process + ))) + { + return (PPH_CLR_PUBLISH_PROCESS)process; + } + else + { + return NULL; + } +} + +VOID PhClrFreePublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process + ) +{ + ICorPublishProcess_Release((ICorPublishProcess *)Process); +} + +BOOLEAN PhClrIsManagedPublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process + ) +{ + BOOL managed; + + if (SUCCEEDED(ICorPublishProcess_IsManaged( + (ICorPublishProcess *)Process, + &managed + ))) + { + return !!managed; + } + + return FALSE; +} + +BOOLEAN PhClrEnumAppDomainsPublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process, + __out PPH_CLR_PUBLISH_APPDOMAIN *AppDomains, + __out PULONG NumberOfAppDomains + ) +{ + ICorPublishAppDomainEnum *appDomainEnum; + + if (SUCCEEDED(ICorPublishProcess_EnumAppDomains( + (ICorPublishProcess *)Process, + &appDomainEnum + ))) + { + PPH_CLR_PUBLISH_APPDOMAIN *appDomains; + ULONG count; + + if (SUCCEEDED(ICorPublishAppDomainEnum_GetCount( + appDomainEnum, + &count + ))) + { + appDomains = PhAllocate(sizeof(PPH_CLR_PUBLISH_APPDOMAIN) * count); + + if (SUCCEEDED(ICorPublishAppDomainEnum_Next( + appDomainEnum, + count, + (ICorPublishAppDomain **)appDomains, + &count + ))) + { + ICorPublishAppDomainEnum_Release(appDomainEnum); + + *AppDomains = appDomains; + *NumberOfAppDomains = count; + + return TRUE; + } + + PhFree(appDomains); + } + + ICorPublishAppDomainEnum_Release(appDomainEnum); + } + + return FALSE; +} + +VOID PhClrFreePublishAppDomain( + __in PPH_CLR_PUBLISH_APPDOMAIN AppDomain + ) +{ + ICorPublishAppDomain_Release((ICorPublishAppDomain *)AppDomain); +} + +PPH_STRING PhClrGetNamePublishAppDomain( + __in PPH_CLR_PUBLISH_APPDOMAIN AppDomain + ) +{ + PPH_STRING name; + + name = PhCreateStringEx(NULL, 0x100); + + if (SUCCEEDED(ICorPublishAppDomain_GetName( + (ICorPublishAppDomain *)AppDomain, + name->Length, + NULL, + name->Buffer + ))) + { + PhTrimStringToNullTerminator(name); + + return name; + } + + PhDereferenceObject(name); + + return NULL; +} diff --git a/2.x/trunk/phlib/include/clrsup.h b/2.x/trunk/phlib/include/clrsup.h index 76acc4be1..f816391cc 100644 --- a/2.x/trunk/phlib/include/clrsup.h +++ b/2.x/trunk/phlib/include/clrsup.h @@ -1,10 +1,41 @@ #ifndef _PH_CLRSUP_H #define _PH_CLRSUP_H -PVOID PhClrCreatePublish(); +typedef PVOID PPH_CLR_PUBLISH; +typedef PVOID PPH_CLR_PUBLISH_PROCESS; +typedef PVOID PPH_CLR_PUBLISH_APPDOMAIN; + +PPH_CLR_PUBLISH PhClrCreatePublish(); VOID PhClrFreePublish( - __in PVOID Publish + __in PPH_CLR_PUBLISH Publish + ); + +PPH_CLR_PUBLISH_PROCESS PhClrGetProcessPublish( + __in PPH_CLR_PUBLISH Publish, + __in HANDLE ProcessId + ); + +VOID PhClrFreePublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process + ); + +BOOLEAN PhClrIsManagedPublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process + ); + +BOOLEAN PhClrEnumAppDomainsPublishProcess( + __in PPH_CLR_PUBLISH_PROCESS Process, + __out PPH_CLR_PUBLISH_APPDOMAIN *AppDomains, + __out PULONG NumberOfAppDomains + ); + +VOID PhClrFreePublishAppDomain( + __in PPH_CLR_PUBLISH_APPDOMAIN AppDomain + ); + +PPH_STRING PhClrGetNamePublishAppDomain( + __in PPH_CLR_PUBLISH_APPDOMAIN AppDomain ); #endif