diff options
Diffstat (limited to 'src/inc/sospriv.idl')
-rw-r--r-- | src/inc/sospriv.idl | 359 |
1 files changed, 359 insertions, 0 deletions
diff --git a/src/inc/sospriv.idl b/src/inc/sospriv.idl new file mode 100644 index 0000000000..1f9028c8e1 --- /dev/null +++ b/src/inc/sospriv.idl @@ -0,0 +1,359 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. +// See the LICENSE file in the project root for more information. +/***************************************************************************** + ** ** + ** sospriv.idl - The private interface that SOS uses to query the runtime ** + ** for internal data. ** + ** ** + *****************************************************************************/ +import "unknwn.idl"; + +import "xclrdata.idl"; + +struct DacpSyncBlockCleanupData; +struct DacpThreadStoreData; +struct DacpAppDomainStoreData; +struct DacpAppDomainData; +struct DacpAssemblyData; +struct DacpThreadData; +struct DacpMethodDescData; +struct DacpCodeHeaderData; +struct DacpThreadpoolData; +struct DacpObjectData; +struct DacpWorkRequestData; +struct DacpMethodTableData; +struct DacpWorkRequestData; +struct DacpModuleData; +struct DacpGcHeapData; +struct DacpJitManagerInfo; +struct DacpHeapSegmentData; +struct DacpDomainLocalModuleData; +struct DacpDomainLocalModuleData; +struct DACEHInfo; +struct DacpRCWData; +struct DacpAllocData; +struct DacpGenerationAllocData; +struct DacpExceptionObjectData; +cpp_quote("#if 0") +typedef ULONG64 CLRDATA_ADDRESS; +typedef int CONTEXT; +typedef int T_CONTEXT; +typedef int mdToken; +typedef unsigned int size_t; +typedef int ModuleMapType; +typedef int VCSHeapType; +cpp_quote("#endif") + + +cpp_quote("typedef enum ModuleMapType { TYPEDEFTOMETHODTABLE, TYPEREFTOMETHODTABLE };") +cpp_quote("typedef enum VCSHeapType {IndcellHeap, LookupHeap, ResolveHeap, DispatchHeap, CacheEntryHeap};") + +typedef void (*MODULEMAPTRAVERSE)(UINT index, CLRDATA_ADDRESS methodTable,LPVOID token); +typedef void (*VISITHEAP)(CLRDATA_ADDRESS blockData,size_t blockSize,BOOL blockIsCurrentBlock); + +typedef BOOL (*VISITRCWFORCLEANUP)(CLRDATA_ADDRESS RCW,CLRDATA_ADDRESS Context,CLRDATA_ADDRESS Thread, + BOOL bIsFreeThreaded, LPVOID token); +typedef BOOL (*DUMPEHINFO)(UINT clauseIndex,UINT totalClauses, struct DACEHInfo *pEHInfo,LPVOID token); + +cpp_quote("#ifndef _SOS_HandleData") +cpp_quote("#define _SOS_HandleData") + +typedef struct _SOSHandleData +{ + CLRDATA_ADDRESS AppDomain; + CLRDATA_ADDRESS Handle; + CLRDATA_ADDRESS Secondary; + unsigned int Type; + BOOL StrongReference; + + // For RefCounted Handles + unsigned int RefCount; + unsigned int JupiterRefCount; + BOOL IsPegged; +} SOSHandleData; + +cpp_quote("#endif //HandleData") + +[ + object, + local, + uuid(286CA186-E763-4F61-9760-487D43AE4341) +] +interface ISOSEnum : IUnknown +{ + HRESULT Skip([in] unsigned int count); + HRESULT Reset(); + HRESULT GetCount([out] unsigned int *pCount); +} + + +[ + object, + local, + uuid(3E269830-4A2B-4301-8EE2-D6805B29B2FA) +] +interface ISOSHandleEnum : ISOSEnum +{ + HRESULT Next([in] unsigned int count, + [out, size_is(count), length_is(*pNeeded)] SOSHandleData handles[], + [out] unsigned int *pNeeded); +} + +cpp_quote("#ifndef _SOS_StackReference_") +cpp_quote("#define _SOS_StackReference_") + +typedef enum SOSStackSourceType +{ + SOS_StackSourceIP, // Instuction pointer in managed code + SOS_StackSourceFrame, // clr!Frame +} SOSStackSourceType; + +typedef enum SOSRefFlags +{ + SOSRefInterior = 1, + SOSRefPinned = 2 +} SOSRefFlags; + +typedef struct _SOS_StackRefData +{ + BOOL HasRegisterInformation; + int Register; + int Offset; + CLRDATA_ADDRESS Address; + CLRDATA_ADDRESS Object; + unsigned int Flags; + + SOSStackSourceType SourceType; + CLRDATA_ADDRESS Source; + CLRDATA_ADDRESS StackPointer; +} SOSStackRefData; + +/* Informs the user that we were unable to process the given clr!Frame or + * managed frame. + */ +typedef struct _SOS_StackRefError +{ + SOSStackSourceType SourceType; + CLRDATA_ADDRESS Source; + CLRDATA_ADDRESS StackPointer; +} SOSStackRefError; + +cpp_quote("#endif // _SOS_StackReference_") + +[ + object, + local, + uuid(774F4E1B-FB7B-491B-976D-A8130FE355E9) +] +interface ISOSStackRefErrorEnum : ISOSEnum +{ + HRESULT Next([in] unsigned int count, + [out, size_is(count), length_is(*pFetched)] SOSStackRefError ref[], + [out] unsigned int *pFetched); +} + +[ + object, + local, + uuid(8FA642BD-9F10-4799-9AA3-512AE78C77EE) +] +interface ISOSStackRefEnum : ISOSEnum +{ + HRESULT Next([in] unsigned int count, + [out, size_is(count), length_is(*pFetched)] SOSStackRefData ref[], + [out] unsigned int *pFetched); + + + /* Reports all frames which we could not enumerate gc references for. + */ + HRESULT EnumerateErrors([out] ISOSStackRefErrorEnum **ppEnum); +} + + +[ + object, + local, + uuid(436f00f2-b42a-4b9f-870c-e73db66ae930) +] +interface ISOSDacInterface : IUnknown +{ + // ThreadStore + HRESULT GetThreadStoreData(struct DacpThreadStoreData *data); + + // AppDomains + HRESULT GetAppDomainStoreData(struct DacpAppDomainStoreData *data); + HRESULT GetAppDomainList(unsigned int count, CLRDATA_ADDRESS values[], unsigned int *pNeeded); + HRESULT GetAppDomainData(CLRDATA_ADDRESS addr, struct DacpAppDomainData *data); + HRESULT GetAppDomainName(CLRDATA_ADDRESS addr, unsigned int count, WCHAR *name, unsigned int *pNeeded); + HRESULT GetDomainFromContext(CLRDATA_ADDRESS context, CLRDATA_ADDRESS *domain); + + // Assemblies + HRESULT GetAssemblyList(CLRDATA_ADDRESS appDomain, int count, CLRDATA_ADDRESS values[], int *pNeeded); + HRESULT GetAssemblyData(CLRDATA_ADDRESS baseDomainPtr, CLRDATA_ADDRESS assembly, struct DacpAssemblyData *data); + HRESULT GetAssemblyName(CLRDATA_ADDRESS assembly, unsigned int count, WCHAR *name, unsigned int *pNeeded); + + // Modules + HRESULT GetModule(CLRDATA_ADDRESS addr, IXCLRDataModule **mod); + HRESULT GetModuleData(CLRDATA_ADDRESS moduleAddr, struct DacpModuleData *data); + HRESULT TraverseModuleMap(ModuleMapType mmt, CLRDATA_ADDRESS moduleAddr, MODULEMAPTRAVERSE pCallback, LPVOID token); + HRESULT GetAssemblyModuleList(CLRDATA_ADDRESS assembly, unsigned int count, CLRDATA_ADDRESS modules[], unsigned int *pNeeded); + HRESULT GetILForModule(CLRDATA_ADDRESS moduleAddr, DWORD rva, CLRDATA_ADDRESS *il); + + // Threads + HRESULT GetThreadData(CLRDATA_ADDRESS thread, struct DacpThreadData *data); + HRESULT GetThreadFromThinlockID(UINT thinLockId, CLRDATA_ADDRESS *pThread); + HRESULT GetStackLimits(CLRDATA_ADDRESS threadPtr, CLRDATA_ADDRESS *lower, CLRDATA_ADDRESS *upper, CLRDATA_ADDRESS *fp); + + // MethodDescs + HRESULT GetMethodDescData(CLRDATA_ADDRESS methodDesc, CLRDATA_ADDRESS ip, struct DacpMethodDescData *data, ULONG cRevertedRejitVersions, struct DacpReJitData * rgRevertedRejitData, ULONG * pcNeededRevertedRejitData); + HRESULT GetMethodDescPtrFromIP(CLRDATA_ADDRESS ip, CLRDATA_ADDRESS * ppMD); + HRESULT GetMethodDescName(CLRDATA_ADDRESS methodDesc, unsigned int count, WCHAR *name, unsigned int *pNeeded); + HRESULT GetMethodDescPtrFromFrame(CLRDATA_ADDRESS frameAddr, CLRDATA_ADDRESS * ppMD); + HRESULT GetMethodDescFromToken(CLRDATA_ADDRESS moduleAddr, mdToken token, CLRDATA_ADDRESS *methodDesc); + HRESULT GetMethodDescTransparencyData(CLRDATA_ADDRESS methodDesc, struct DacpMethodDescTransparencyData *data); + + // JIT Data + HRESULT GetCodeHeaderData(CLRDATA_ADDRESS ip, struct DacpCodeHeaderData *data); + HRESULT GetJitManagerList(unsigned int count, struct DacpJitManagerInfo *managers, unsigned int *pNeeded); + HRESULT GetJitHelperFunctionName(CLRDATA_ADDRESS ip, unsigned int count, char *name, unsigned int *pNeeded); + HRESULT GetJumpThunkTarget(T_CONTEXT *ctx, CLRDATA_ADDRESS *targetIP, CLRDATA_ADDRESS *targetMD); + + // ThreadPool + HRESULT GetThreadpoolData(struct DacpThreadpoolData *data); + HRESULT GetWorkRequestData(CLRDATA_ADDRESS addrWorkRequest, struct DacpWorkRequestData *data); + HRESULT GetHillClimbingLogEntry(CLRDATA_ADDRESS addr, struct DacpHillClimbingLogEntry *data); + + // Objects + HRESULT GetObjectData(CLRDATA_ADDRESS objAddr, struct DacpObjectData *data); + HRESULT GetObjectStringData(CLRDATA_ADDRESS obj, unsigned int count, WCHAR *stringData, unsigned int *pNeeded); + HRESULT GetObjectClassName(CLRDATA_ADDRESS obj, unsigned int count, WCHAR *className, unsigned int *pNeeded); + + // MethodTable + HRESULT GetMethodTableName(CLRDATA_ADDRESS mt, unsigned int count, WCHAR *mtName, unsigned int *pNeeded); + HRESULT GetMethodTableData(CLRDATA_ADDRESS mt, struct DacpMethodTableData *data); + HRESULT GetMethodTableSlot(CLRDATA_ADDRESS mt, unsigned int slot, CLRDATA_ADDRESS *value); + HRESULT GetMethodTableFieldData(CLRDATA_ADDRESS mt, struct DacpMethodTableFieldData *data); + HRESULT GetMethodTableTransparencyData(CLRDATA_ADDRESS mt, struct DacpMethodTableTransparencyData *data); + + // EEClass + HRESULT GetMethodTableForEEClass(CLRDATA_ADDRESS eeClass, CLRDATA_ADDRESS *value); + + // FieldDesc + HRESULT GetFieldDescData(CLRDATA_ADDRESS fieldDesc, struct DacpFieldDescData *data); + + // Frames + HRESULT GetFrameName(CLRDATA_ADDRESS vtable, unsigned int count, WCHAR *frameName, unsigned int *pNeeded); + + + // PEFiles + HRESULT GetPEFileBase(CLRDATA_ADDRESS addr, CLRDATA_ADDRESS *base); + HRESULT GetPEFileName(CLRDATA_ADDRESS addr, unsigned int count, WCHAR *fileName, unsigned int *pNeeded); + + // GC + HRESULT GetGCHeapData(struct DacpGcHeapData *data); + HRESULT GetGCHeapList(unsigned int count, CLRDATA_ADDRESS heaps[], unsigned int *pNeeded); // svr only + HRESULT GetGCHeapDetails(CLRDATA_ADDRESS heap, struct DacpGcHeapDetails *details); // wks only + HRESULT GetGCHeapStaticData(struct DacpGcHeapDetails *data); + HRESULT GetHeapSegmentData(CLRDATA_ADDRESS seg, struct DacpHeapSegmentData *data); + HRESULT GetOOMData(CLRDATA_ADDRESS oomAddr, struct DacpOomData *data); + HRESULT GetOOMStaticData(struct DacpOomData *data); + HRESULT GetHeapAnalyzeData(CLRDATA_ADDRESS addr, struct DacpGcHeapAnalyzeData *data); + HRESULT GetHeapAnalyzeStaticData(struct DacpGcHeapAnalyzeData *data); + + // DomainLocal + HRESULT GetDomainLocalModuleData(CLRDATA_ADDRESS addr, struct DacpDomainLocalModuleData *data); + HRESULT GetDomainLocalModuleDataFromAppDomain(CLRDATA_ADDRESS appDomainAddr, int moduleID, struct DacpDomainLocalModuleData *data); + HRESULT GetDomainLocalModuleDataFromModule(CLRDATA_ADDRESS moduleAddr, struct DacpDomainLocalModuleData *data); + + // ThreadLocal + HRESULT GetThreadLocalModuleData(CLRDATA_ADDRESS thread, unsigned int index, struct DacpThreadLocalModuleData *data); + + // SyncBlock + HRESULT GetSyncBlockData(unsigned int number, struct DacpSyncBlockData *data); + HRESULT GetSyncBlockCleanupData(CLRDATA_ADDRESS addr, struct DacpSyncBlockCleanupData *data); + + // Handles + HRESULT GetHandleEnum(ISOSHandleEnum **ppHandleEnum); + HRESULT GetHandleEnumForTypes(unsigned int types[], unsigned int count, ISOSHandleEnum **ppHandleEnum); + HRESULT GetHandleEnumForGC(unsigned int gen, ISOSHandleEnum **ppHandleEnum); + + // EH + HRESULT TraverseEHInfo(CLRDATA_ADDRESS ip, DUMPEHINFO pCallback, LPVOID token); + HRESULT GetNestedExceptionData(CLRDATA_ADDRESS exception, CLRDATA_ADDRESS *exceptionObject, CLRDATA_ADDRESS *nextNestedException); + + // StressLog + HRESULT GetStressLogAddress(CLRDATA_ADDRESS *stressLog); + + // Heaps + HRESULT TraverseLoaderHeap(CLRDATA_ADDRESS loaderHeapAddr, VISITHEAP pCallback); + HRESULT GetCodeHeapList(CLRDATA_ADDRESS jitManager, unsigned int count, struct DacpJitCodeHeapInfo *codeHeaps, unsigned int *pNeeded); + HRESULT TraverseVirtCallStubHeap(CLRDATA_ADDRESS pAppDomain, VCSHeapType heaptype, VISITHEAP pCallback); + + // Other + HRESULT GetUsefulGlobals(struct DacpUsefulGlobalsData *data); + HRESULT GetClrWatsonBuckets(CLRDATA_ADDRESS thread, void *pGenericModeBlock); + HRESULT GetTLSIndex(ULONG *pIndex); + HRESULT GetDacModuleHandle(HMODULE *phModule); + + // COM + HRESULT GetRCWData(CLRDATA_ADDRESS addr, struct DacpRCWData *data); + HRESULT GetRCWInterfaces(CLRDATA_ADDRESS rcw, unsigned int count, struct DacpCOMInterfacePointerData *interfaces, unsigned int *pNeeded); + HRESULT GetCCWData(CLRDATA_ADDRESS ccw, struct DacpCCWData *data); + HRESULT GetCCWInterfaces(CLRDATA_ADDRESS ccw, unsigned int count, struct DacpCOMInterfacePointerData *interfaces, unsigned int *pNeeded); + HRESULT TraverseRCWCleanupList(CLRDATA_ADDRESS cleanupListPtr, VISITRCWFORCLEANUP pCallback, LPVOID token); + + // GC Reference Functions + + /* GetStackReferences + * Enumerates all references on a given callstack. + */ + HRESULT GetStackReferences([in] DWORD osThreadID, [out] ISOSStackRefEnum **ppEnum); + HRESULT GetRegisterName([in] int regName, [in] unsigned int count, [out] WCHAR *buffer, [out] unsigned int *pNeeded); + + HRESULT GetThreadAllocData(CLRDATA_ADDRESS thread, struct DacpAllocData *data); + HRESULT GetHeapAllocData(unsigned int count, struct DacpGenerationAllocData *data, unsigned int *pNeeded); + + // For BindingDisplay plugin + HRESULT GetFailedAssemblyList(CLRDATA_ADDRESS appDomain, int count, CLRDATA_ADDRESS values[], unsigned int *pNeeded); + HRESULT GetPrivateBinPaths(CLRDATA_ADDRESS appDomain, int count, WCHAR *paths, unsigned int *pNeeded); + HRESULT GetAssemblyLocation(CLRDATA_ADDRESS assembly, int count, WCHAR *location, unsigned int *pNeeded); + HRESULT GetAppDomainConfigFile(CLRDATA_ADDRESS appDomain, int count, WCHAR *configFile, unsigned int *pNeeded); + HRESULT GetApplicationBase(CLRDATA_ADDRESS appDomain, int count, WCHAR *base, unsigned int *pNeeded); + HRESULT GetFailedAssemblyData(CLRDATA_ADDRESS assembly, unsigned int *pContext, HRESULT *pResult); + HRESULT GetFailedAssemblyLocation(CLRDATA_ADDRESS assesmbly, unsigned int count, WCHAR *location, unsigned int *pNeeded); + HRESULT GetFailedAssemblyDisplayName(CLRDATA_ADDRESS assembly, unsigned int count, WCHAR *name, unsigned int *pNeeded); +}; + +[ + object, + local, + uuid(A16026EC-96F4-40BA-87FB-5575986FB7AF) +] +interface ISOSDacInterface2 : IUnknown +{ + HRESULT GetObjectExceptionData(CLRDATA_ADDRESS objAddr, struct DacpExceptionObjectData *data); + HRESULT IsRCWDCOMProxy(CLRDATA_ADDRESS rcwAddr, BOOL* isDCOMProxy); +}; + +[ + object, + local, + uuid(B08C5CDC-FD8A-49C5-AB38-5FEEF35235B4) +] +interface ISOSDacInterface3 : IUnknown +{ + HRESULT GetGCInterestingInfoData(CLRDATA_ADDRESS interestingInfoAddr, struct DacpGCInterestingInfoData *data); + HRESULT GetGCInterestingInfoStaticData(struct DacpGCInterestingInfoData *data); + HRESULT GetGCGlobalMechanisms(size_t* globalMechanisms); +}; + +[ + object, + local, + uuid(74B9D34C-A612-4B07-93DD-5462178FCE11) +] +interface ISOSDacInterface4 : IUnknown +{ + HRESULT GetClrNotification(CLRDATA_ADDRESS arguments[], int count, int *pNeeded); +};
\ No newline at end of file |