summaryrefslogblamecommitdiffstats
path: root/private/ole32/dbgexts/dpsclsid.cxx
blob: b48dc01b3ee7d8e51a3dd778973050706712754e (plain) (tree)













































































































































































































































































































































                                                                                      
//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995
//
//  File:       dpsclsid.cxx
//
//  Contents:   Ole NTSD extension routines to dump the proxy/stub
//              clsid cache
//
//  Functions:  psClsidHelp
//              displayPsClsidTbl
//
//
//  History:    06-01-95 BruceMa    Created
//
//
//--------------------------------------------------------------------------


#include <ole2int.h>
#include <windows.h>
#include "ole.h"
#include "dshrdmem.h"




BOOL IsEqualCLSID(CLSID *pClsid1, CLSID *pClsid2);
void FormatCLSID(REFGUID rguid, LPSTR lpsz);
BOOL GetRegistryInterfaceName(REFIID iid, char *szValue, DWORD *pcbValue);
BOOL GetRegistryClsidKey(REFCLSID clsid, char *szKey,
                         char *szValue, DWORD *pcbValue);


//+-------------------------------------------------------------------------
//
//  Function:   psClsidHelp
//
//  Synopsis:   Display a menu for the command 'ps'
//
//  Arguments:  -
//
//  Returns:    -
//
//  History:    07-Mar-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void psClsidHelp(PNTSD_EXTENSION_APIS lpExtensionApis)
{
    Printf("ps          - Display infomation for all IID's\n");
    Printf("ps IID      - Display infomation for IID\n");
}






//+-------------------------------------------------------------------------
//
//  Function:   displayPsClsidTbl
//
//  Synopsis:   Given an interface IID display the CLSID of the
//              associated proxy/stub handler dll
//
//  Arguments:  [hProcess]        -       Handle of this process
//              [lpExtensionApis] -       Table of extension functions
//              [lpFileExtTbl]    -       Address of file extensions table
//              [pClsid]          -       Only for this clsid
//
//  Returns:    -
//
//  History:    01-Jun-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void displayPsClsidTbl(HANDLE hProcess,
                       PNTSD_EXTENSION_APIS lpExtensionApis,
                       SDllShrdTbl *pShrdTbl,
                       IID *pIid)
{
    SDllShrdTbl  sDllTbl;
    GUIDMAP      sGuidMap;
    GUIDPAIR    *pGuidPair;
    DWORDPAIR   *pDwordPair;
    IID          iid = {0, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46}};
    char         szClsid[CLSIDSTR_MAX];
    char         szName[129];
    DWORD        cbValue;
    
    // Read the shared table locally
    ReadMem(&sDllTbl, pShrdTbl, sizeof(SDllShrdTbl));

    // Read the guid map locally
    ReadMem(&sGuidMap, sDllTbl._PSClsidTbl._pGuidMap, sizeof(GUIDMAP));

    // Allocate for the guid pair list
    pGuidPair = (GUIDPAIR *) OleAlloc(sGuidMap.ulCntLong * sizeof(GUIDPAIR));

    // Allocate for the dword pair list
    pDwordPair = (DWORDPAIR *) OleAlloc(sGuidMap.ulCntShort *
                                        sizeof(DWORDPAIR));

    // Read the guid pair list
    ReadMem(pGuidPair, sDllTbl._PSClsidTbl._pLongList -
            (sGuidMap.ulCntLong - 1),
            sGuidMap.ulCntLong * sizeof(GUIDPAIR));

    // Read the dword pair list
    ReadMem(pDwordPair, sDllTbl._PSClsidTbl._pShortList,
            sGuidMap.ulCntShort * sizeof(DWORDPAIR));

    // Are we looking for a specific IID?
    if (pIid != NULL)
    {
        // Search the short list first
        for (UINT cCnt = 0; cCnt < sGuidMap.ulCntShort; pDwordPair++, cCnt++)
        {
            if (pIid->Data1 == pDwordPair->dw1)
            {
                iid.Data1 = pIid->Data1;
                
                // Fetch and print the interface name
                cbValue = 64;
                if(GetRegistryInterfaceName(iid, szName, &cbValue))
                {
                    Printf("%s\t", szName);
                }
                else
                {
                    Printf("-\t");
                }
                
                // The clsid
                iid.Data1 = pDwordPair->dw2;
                FormatCLSID(iid, szClsid);
                Printf("%s\t", szClsid);
                
                // Fetch and print the proxy/stub handler dll
                cbValue = 128;
                if (GetRegistryClsidKey(iid, "InprocServer32", szName,
                                        &cbValue))
                {
                    Printf("%s\n", szName);
                }
                else if(GetRegistryClsidKey(iid, "InprocServer", szName,
                                            &cbValue))
                {
                    Printf("%s(16)\n", szName);
                }
                else
                {
                    Printf("-\n");
                }

                return;
            }
        }
        
        // Search the long list next
        for (cCnt = 0; cCnt < sGuidMap.ulCntLong; pGuidPair++, cCnt++)
        {
            if (IsEqualCLSID(pIid, &pGuidPair->guid1))
            {
                // Fetch and print the interface name
                cbValue = 64;
                if(GetRegistryInterfaceName(pGuidPair->guid1, szName,
                                            &cbValue))
                {
                    Printf("%s\t", szName);
                }
                else
                {
                    Printf("-\t");
                }
                
                // The clsid
                FormatCLSID(pGuidPair->guid2, szClsid);
                Printf("%s\t", szClsid);
                
                // Fetch and print the proxy/stub handler dll
                cbValue = 128;
                if (GetRegistryClsidKey(pGuidPair->guid2, "InprocServer32",
                                        szName,
                                        &cbValue))
                {
                    Printf("%s\n", szName);
                }
                else if(GetRegistryClsidKey(pGuidPair->guid2, "InprocServer",
                                            szName, &cbValue))
                {
                    Printf("%s(16)\n", szName);
                }
                else
                {
                    Printf("-\n");
                }

                return;
            }
        }
    }

    // Else dump everything
    else
    {
        // Print header
        Printf("where -. = '-0000-0000-C000-000000000046}'\n\n");
        Printf("   IID           interface               clsid           p/s dll\n");
        Printf("-----------   ------------------       -----------      ---------\n");
        // Do over the short list
        for (UINT cCnt = 0 ; cCnt < sGuidMap.ulCntShort; pDwordPair++, cCnt++)
        {
            // Print the IID
            iid.Data1 = pDwordPair->dw1;
            FormatCLSID(iid, szClsid);
            if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0)
            {
                szClsid[9] = '\0';
                Printf("%s-.", szClsid);
            }
            else
            {
                Printf("%s\n", szClsid);
            }
               
            // Fetch and print the interface name
            cbValue = 64;
            if(GetRegistryInterfaceName(iid, szName, &cbValue))
            {
                Printf("   %s", szName);
            }
            else
            {
                Printf("   -");
            }

            // Do some pretty printing alignment
            for (UINT cCh = 24 - lstrlen(szName); cCh > 0; cCh--)
            {
                Printf(" ");
            }
            Printf(" ");

            // The clsid
            iid.Data1 = pDwordPair->dw2;
            FormatCLSID(iid, szClsid);
            if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0)
            {
                szClsid[9] = '\0';
                Printf("%s-.\t", szClsid);
            }
            else
            {
                Printf("%s\t", szClsid);
            }

            // Fetch and print the proxy/stub handler dll
            cbValue = 128;
            if (GetRegistryClsidKey(iid, "InprocServer32", szName, &cbValue))
            {
                Printf("%s\n", szName);
            }
            else if(GetRegistryClsidKey(iid, "InprocServer", szName,
                                        &cbValue))
            {
                Printf("%s(16)\n", szName);
            }
            else
            {
                Printf("-\n");
            }
        }
        
        // Do over the long list
        for (cCnt = 0; cCnt < sGuidMap.ulCntLong; pGuidPair++, cCnt++)
        {
            // Print the IID
            FormatCLSID(pGuidPair->guid1, szClsid);
            Printf("%s ", szClsid);

            // Fetch and print the interface name
            cbValue = 64;
            if(GetRegistryInterfaceName(pGuidPair->guid1, szName, &cbValue))
            {
                Printf("   %s", szName);
            }
            else
            {
                Printf("   -");
            }

            // Do some pretty printing alignment
            for (UINT cCh = 24 - lstrlen(szName); cCh > 0; cCh--)
            {
                Printf(" ");
            }
            Printf(" ");

            // The clsid
            FormatCLSID(pGuidPair->guid2, szClsid);
            if (lstrcmp(&szClsid[9], "-0000-0000-C000-000000000046}") == 0)
            {
                szClsid[9] = '\0';
                Printf("%s-.\t", szClsid);
            }
            else
            {
                Printf("%s\t", szClsid);
            }

            // Fetch and print the proxy/stub handler dll
            cbValue = 128;
            if (GetRegistryClsidKey(pGuidPair->guid2, "InprocServer32",
                                    szName, &cbValue))
            {
                Printf("%s\n", szName);
            }
            else if(GetRegistryClsidKey(iid, "InprocServer32", szName,
                                        &cbValue))
            {
                Printf("%s(16)\n", szName);
            }
            else
            {
                Printf("-\n");
            }
        }
    }
    
    // Release allocated resources
    OleFree(pGuidPair);
    OleFree(pDwordPair);
}