/*++ Copyright (c) 1999 Microsoft Corporation Module Name: jitdump.cxx Abstract: This file contains routines to dump typelib generated proxy information. Author: Yong Qu (yongqu) August 24 1999 Revision History: --*/ #include #include #include #include #include #include #include "jitdump.h" // CreateStubFromTypeInfo is a private export. We have to LoadLibrary to // retrieve it. PFNCREATESTUBFROMTYPEINFO pfnCreateStubFromTypeInfo = NULL; void PrintHelp() { printf("usage: jitdump [{iid} []]\n"); printf("Arguments:\n"); printf("\t typelibrary filename.\n"); printf("\t[{iid}] when presented, jitdump will dump all proc info of the interface \n"); printf("\t[] when presented, jitdump will dump only the specified proc info\n"); } //+--------------------------------------------------------------------------- // // Function: PrintStubInfo // // Synopsis: Create a proxy from given type library name and IID, then // dump the specified procedure information accordingly. // NdrpDumpStubProc is exported from ndrexts.dll. The debug // extension needs to be presented during runtime. // Dump all the methods if nProcNum is 0. // // Returns: // S_OK if everything is fine. // error code if error occur somewhere. // //---------------------------------------------------------------------------- HRESULT PrintStubInfo(LPOLESTR wszFile, REFIID riid, unsigned long nProcNum) { HRESULT hr; ITypeLib *pTypeLib = NULL; ITypeInfo *pTypeInfo = NULL; IRpcStubBuffer *pStub; hr = LoadTypeLib(wszFile,&pTypeLib); if (SUCCEEDED(hr)) { hr = pTypeLib->GetTypeInfoOfGuid(riid,&pTypeInfo); } if (SUCCEEDED(hr)) { hr = (*pfnCreateStubFromTypeInfo)(pTypeInfo,riid,NULL, &pStub); } if (SUCCEEDED(hr)) { if (nProcNum > 0) NdrpDumpStubProc(pStub,nProcNum); else NdrpDumpStub(pStub); pStub->Release(); } if (pTypeLib) pTypeLib->Release(); return hr; } // dump all the interface defined in the tlb. HRESULT PrintAllStubInfo(LPOLESTR wszFile) { int nCount = 0; HRESULT hr = S_OK; ITypeLib *pTypeLib = NULL; ITypeInfo *pTypeInfo = NULL; IRpcStubBuffer *pStub = NULL; TYPEATTR *pTypeAttr = NULL; TYPEKIND tkind; hr = LoadTypeLib(wszFile,&pTypeLib); if (SUCCEEDED(hr)) { nCount = pTypeLib->GetTypeInfoCount(); } for (int i = 0; ( i < nCount ) ; i++) { hr = pTypeLib->GetTypeInfoType(i,&tkind); if (FAILED(hr)) break; // we need to process interface only. if (tkind == TKIND_INTERFACE || tkind == TKIND_DISPATCH ) { hr = pTypeLib->GetTypeInfo(i,&pTypeInfo); if (SUCCEEDED(hr)) { hr = pTypeInfo->GetTypeAttr(&pTypeAttr); if (SUCCEEDED(hr)) { hr = (*pfnCreateStubFromTypeInfo)(pTypeInfo,pTypeAttr->guid,NULL, &pStub); // IDispatch, IUnknown etc. would show up here also. We'll continue without // dumping those interface. if (SUCCEEDED(hr)) { NdrpDumpStub(pStub); pStub->Release(); } pTypeInfo->ReleaseTypeAttr(pTypeAttr); } pTypeInfo->Release(); } } } if (pTypeLib) pTypeLib->Release(); return hr; } void __cdecl main(int argc, char *argv[]) { HRESULT ret; GUID riid; unsigned long nProcNum,dwlen = 0; WCHAR *wszGUID = NULL, *wszFile = NULL; char *szTLB; if ( argc < 2 || argc > 4) { PrintHelp(); return; } ret = CoInitialize(NULL); if (FAILED (ret) ) { printf("CoInitialize failed 0x%x\n",ret); return; } // load rpcrt4!CreateStubFromTypeInfo. It's not in .lib file if (NULL == pfnCreateStubFromTypeInfo ) { HMODULE hMod = LoadLibraryA("rpcrt4.dll"); if (hMod) { pfnCreateStubFromTypeInfo = (PFNCREATESTUBFROMTYPEINFO)GetProcAddress(hMod, "CreateStubFromTypeInfo"); } if (NULL == hMod || NULL == pfnCreateStubFromTypeInfo ) { printf("can't load rpcrt4.dll\n"); return; } } // covert the filename to LPOLESTR to be used in LoadTypeLib dwlen = ( strlen(argv[1]) + 1 ) * sizeof(OLECHAR) ; wszFile = (LPOLESTR)alloca( dwlen ); memset( wszFile , 0 , dwlen ); dwlen /= sizeof(OLECHAR); // MultiByteTo wants a char count if ( !MultiByteToWideChar(CP_ACP, 0, argv[1], -1, wszFile, dwlen ) ) { printf("Can't process iid, error is 0x%x \n", GetLastError() ); return; } if ( argc == 2 ) { // dump all interfaces if only tlb name is provided. ret = PrintAllStubInfo(wszFile); } else { // convert iid string into real iid. dwlen = ( strlen(argv[2]) + 1 ) * sizeof(OLECHAR) ; wszGUID = (LPOLESTR)alloca( dwlen ); memset( wszGUID , 0 , dwlen ); dwlen /= sizeof(OLECHAR); if ( !MultiByteToWideChar(CP_ACP, 0, argv[2], -1, wszGUID, dwlen ) ) { printf("Can't process iid, error is 0x%x \n", GetLastError() ); return; } ret = IIDFromString(wszGUID, &riid ); if ( FAILED (ret) ) { printf("can't convert iid %S 0x%x\n",wszGUID,ret); PrintHelp(); return; } if ( argc == 3 ) { ret = PrintStubInfo(wszFile,riid,0); } else { nProcNum = atol(argv[3]); ret = PrintStubInfo(wszFile,riid,nProcNum); } } if ( ret != S_OK ) { printf("failed to dump the proxy 0x%x \n",ret); } CoUninitialize(); }