summaryrefslogblamecommitdiffstats
path: root/private/ole32/dbgexts/dfilepat.cxx
blob: 6508e0709e7f941e4496a673205505a356b69445 (plain) (tree)

































































































































































                                                                            
//+-------------------------------------------------------------------------
//
//  Microsoft Windows
//  Copyright (C) Microsoft Corporation, 1995
//
//  File:       dfilepat.cxx
//
//  Contents:   Ole NTSD extension routines to dump the file type (bit
//              patterns) cache
//
//  Functions:  filePatHelp
//              displayFilePatTbl
//
//
//  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);




//+-------------------------------------------------------------------------
//
//  Function:   filePatHelp
//
//  Synopsis:   Display a menu for the command 'ft'
//
//  Arguments:  -
//
//  Returns:    -
//
//  History:    07-Mar-95   BruceMa    Created
//
//--------------------------------------------------------------------------
void filePatHelp(PNTSD_EXTENSION_APIS lpExtensionApis)
{
    Printf("ft         - Display entire file type patterns table\n");
    Printf("ft clsid   - Display file type patterns for clsid\n");
}






//+-------------------------------------------------------------------------
//
//  Function:   displayFilePatTbl
//
//  Synopsis:   Display some or all of the file type patterns table
//
//  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 displayFilePatTbl(HANDLE hProcess,
                       PNTSD_EXTENSION_APIS lpExtensionApis,
                       SDllShrdTbl *pShrdTbl,
                       CLSID *pClsid)
{
    SDllShrdTbl  sDllTbl;
    STblHdr     *pTblHdr;
    STblHdr      sTblHdr;
    BYTE        *pStart;
    LPVOID       pEnd;
    CLSID        oldClsid = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
    UINT         ulCnt = 0;

    
    // Read the shared table locally
    ReadMem(&sDllTbl, pShrdTbl, sizeof(SDllShrdTbl));

    // Read the table header locally
    pTblHdr = sDllTbl._PatternTbl._pTblHdr;
    ReadMem(&sTblHdr, pTblHdr, sizeof(STblHdr));

    // Set up to read the entries
    pStart = sDllTbl._PatternTbl._pStart;
    pEnd = pStart + sTblHdr.OffsEnd - sizeof(STblHdr);

    // Do over the file extension entries
    while (pStart < pEnd)
    {
        ULONG         ulLen;
        SPatternEntry sPatEnt;
        char          szClsid[CLSIDSTR_MAX];

        // Just in case the loop gets away from us
        if (CheckControlC())
        {
            return;
        }

        // Read the length of this entry
        ReadMem(&ulLen, pStart + sizeof(CLSID), sizeof(ULONG));

        // Read the next entry locally
        ReadMem(&sPatEnt, pStart, ulLen);

        // Print the clsid if we haven't yet
        if (pClsid == NULL  &&  !IsEqualCLSID(&sPatEnt.clsid, &oldClsid))
        {
            FormatCLSID(sPatEnt.clsid, szClsid);
            Printf("\n%s\n", szClsid);

            // Save the clisd
            oldClsid = sPatEnt.clsid;

            // Initialize a count per clsid
            ulCnt = 0;
        }

        // Print only if printing the whole table or at our sought clsid
        if (pClsid == NULL  ||  IsEqualCLSID(pClsid, &sPatEnt.clsid))
        {
            // Print the index of this pattern
            Printf("%2d  ", ulCnt++);

            // Print the file offset
            Printf("%d\t", sPatEnt.lFileOffset);

            // Print the length of the pattern in bytes
            Printf("%3d  ", sPatEnt.ulCb);

            // Print the mask
            for (UINT k = 0; k < sPatEnt.ulCb; k++)
            {
                Printf("%02x", sPatEnt.abData[k]);
            }
            Printf("  ");

            // Print the pattern
            for (k = 0; k < sPatEnt.ulCb; k++)
            {
                Printf("%02x", sPatEnt.abData[sPatEnt.ulCb + k]);
            }
            Printf("\n");
        }
        
        // Go to the next entry
        pStart += ulLen;
    }
}