//+------------------------------------------------------------------------- // // 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 #include #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; } }