|
|
//+-------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1995
//
// File: dmoniker.cxx
//
// Contents: Interpret a moniker object
//
// Functions: monikersHelp
// displayMonikers
//
//
// History: 06-01-95 BruceMa Created
//
//
//--------------------------------------------------------------------------
#include <ole2int.h>
#include <windows.h>
#include "ole.h"
#include "dmoniker.h"
static void displayFileMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayFileMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayItemMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayItemMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayCompositeMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayCompositeMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayPointerMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayPointerMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayAntiMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static void displayAntiMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
static enum mnkType findMnkType(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker);
extern BOOL fInScm; static BOOL fRetail;
//+-------------------------------------------------------------------------
//
// Function: monikerHelp
//
// Synopsis: Display a menu for the command 'mk'
//
// Arguments: -
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
void monikerHelp(PNTSD_EXTENSION_APIS lpExtensionApis) { Printf("mk addr - Interpret addr as a moniker\n"); }
//+-------------------------------------------------------------------------
//
// Function: displayMoniker
//
// Synopsis: Display a moniker
//
// Arguments: [hProcess] - Handle of this process
// [lpExtensionApis] - Table of extension functions
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
BOOL displayMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { ULONG pAdr; enum mnkType mType;
// Determine if this is checked or retail ole
if (fInScm) { pAdr = GetExpression("scm!_CairoleInfoLevel"); } else { pAdr = GetExpression("ole32!_CairoleInfoLevel"); } fRetail = pAdr == NULL ? TRUE : FALSE;
mType = findMnkType(hProcess, lpExtensionApis, pMoniker); switch (mType) { case NOMNK: return FALSE; case FILEMNK: if (fRetail) { displayFileMoniker(hProcess, lpExtensionApis, pMoniker); } else { displayFileMonikerCk(hProcess, lpExtensionApis, pMoniker); } return TRUE; case POINTERMNK: if (fRetail) { displayPointerMoniker(hProcess, lpExtensionApis, pMoniker); } else { displayPointerMonikerCk(hProcess, lpExtensionApis, pMoniker); } return TRUE; case ITEMMNK: if (fRetail) { displayItemMoniker(hProcess, lpExtensionApis, pMoniker); } else { displayItemMonikerCk(hProcess, lpExtensionApis, pMoniker); } return TRUE; case ANTIMNK: if (fRetail) { displayAntiMoniker(hProcess, lpExtensionApis, pMoniker); } else { displayAntiMonikerCk(hProcess, lpExtensionApis, pMoniker); } return TRUE; case COMPOSITEMNK: if (fRetail) { displayCompositeMoniker(hProcess, lpExtensionApis, pMoniker); } else { displayCompositeMonikerCk(hProcess, lpExtensionApis, pMoniker); } return TRUE; }
return FALSE; }
//+-------------------------------------------------------------------------
//
// Function: displayFileMoniker
//
// Synopsis: Display a retail file moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayFileMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SFileMonikerCk file; WCHAR *pwszPath;
// Fetch the moniker
ReadMem(&file, pMoniker, sizeof(SFileMoniker));
// It's a file moniker
Printf("File Moniker\n");
// The current references
Printf("refs = %d\n", file.m_refs);
// The path
pwszPath = (WCHAR *) OleAlloc(2 * (file.m_ccPath + 1)); ReadMem(pwszPath, file.m_szPath, 2 * (file.m_ccPath + 1)); Printf("%ws", pwszPath); OleFree(pwszPath); if (file.m_fHashValueValid) { Printf(" (%d)\n", file.m_dwHashValue); } else { Printf("\n"); }
// The version
if (file.m_ole1 == ole1) { Printf("ole1\n"); }
// The anti count (if any)
if (file.m_cAnti) { Printf("CAnti count = %d\n", file.m_cAnti); }
// The extents (if any)
if (file.m_ExtentList.m_cbMonikerExtents) { BYTE *pExtent; BYTE *pEnd ; ULONG cbExtentBytes;
// A header
Printf("Extents:\n"); // Read all the extents
pExtent = (BYTE *) OleAlloc(file.m_ExtentList.m_cbMonikerExtents); ReadMem(pExtent, file.m_ExtentList.m_pchMonikerExtents, file.m_ExtentList.m_cbMonikerExtents); pEnd = pExtent;
// Do over the extents
while (pExtent < pEnd) { // Fetch length
cbExtentBytes = (*pExtent++ << 16) | *pExtent++;
// Fetch and display key
switch (*pExtent++) { case mnk_MAC: Printf("mnk_MAC "); break; case mnk_DFS: Printf("mnk_DFS "); break; case mnk_UNICODE: Printf("mnk_UNICODE "); break; case mnk_MacPathName: Printf("mnk_MacPathName "); break; case mnk_ShellLink: Printf("mnk_ShellLink "); break;
default: Printf("%15d "); }
// Display the extent in hexadecimal
UINT k = 0; while (cbExtentBytes--) { Printf("%2x ", *pExtent++); k++; if (k % 16 == 0) { Printf("\n "); k = 0; } } if (k % 8 != 0) { Printf("\n"); } }
// Release the allocated extent buffer
OleFree(pExtent); } }
//+-------------------------------------------------------------------------
//
// Function: displayFileMonikerCk
//
// Synopsis: Display a checked file moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayFileMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SFileMonikerCk file; WCHAR *pwszPath;
// Fetch the moniker
ReadMem(&file, pMoniker, sizeof(SFileMonikerCk));
// It's a file moniker
Printf("File Moniker\n");
// The current references
Printf("refs = %d\n", file.m_refs);
// The path
pwszPath = (WCHAR *) OleAlloc(2 * (file.m_ccPath + 1)); ReadMem(pwszPath, file.m_szPath, 2 * (file.m_ccPath + 1)); Printf("%ws", pwszPath); OleFree(pwszPath); if (file.m_fHashValueValid) { Printf(" (%d)\n", file.m_dwHashValue); } else { Printf("\n"); }
// The version
if (file.m_ole1 == ole1) { Printf("ole1\n"); }
// The anti count (if any)
if (file.m_cAnti) { Printf("CAnti count = %d\n", file.m_cAnti); }
// The extents (if any)
if (file.m_ExtentList.m_cbMonikerExtents) { BYTE *pExtent; BYTE *pEnd ; ULONG cbExtentBytes;
// A header
Printf("Extents:\n"); // Read all the extents
pExtent = (BYTE *) OleAlloc(file.m_ExtentList.m_cbMonikerExtents); ReadMem(pExtent, file.m_ExtentList.m_pchMonikerExtents, file.m_ExtentList.m_cbMonikerExtents); pEnd = pExtent;
// Do over the extents
while (pExtent < pEnd) { // Fetch length
cbExtentBytes = (*pExtent++ << 16) | *pExtent++;
// Fetch and display key
switch (*pExtent++) { case mnk_MAC: Printf("mnk_MAC "); break; case mnk_DFS: Printf("mnk_DFS "); break; case mnk_UNICODE: Printf("mnk_UNICODE "); break; case mnk_MacPathName: Printf("mnk_MacPathName "); break; case mnk_ShellLink: Printf("mnk_ShellLink "); break;
default: Printf("%15d "); }
// Display the extent in hexadecimal
UINT k = 0; while (cbExtentBytes--) { Printf("%2x ", *pExtent++); k++; if (k % 16 == 0) { Printf("\n "); k = 0; } } if (k % 8 != 0) { Printf("\n"); } }
// Release the allocated extent buffer
OleFree(pExtent); } }
//+-------------------------------------------------------------------------
//
// Function: displayItemMoniker
//
// Synopsis: Display a retail item moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayItemMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SItemMonikerCk item; WCHAR *pwszItem; WCHAR *pwszDelimiter;
// Fetch the moniker
ReadMem(&item, pMoniker, sizeof(SItemMoniker)); // It's an item moniker
Printf("Item Moniker\n");
// The current references
Printf("refs = %d\n", item.m_refs);
// The delimiter plus item
pwszDelimiter = (WCHAR *) OleAlloc(2 * (item.m_ccDelimiter + 1)); ReadMem(pwszDelimiter, item.m_lpszDelimiter, 2 * (item.m_ccDelimiter + 1)); pwszItem = (WCHAR *) OleAlloc(2 * (item.m_ccItem + 1)); ReadMem(pwszItem, item.m_lpszItem, 2 * (item.m_ccItem + 1)); Printf("item = %ws%ws\n", pwszDelimiter, pwszItem); OleFree(pwszItem);
// The hash value
if (item.m_fHashValueValid) { Printf("hash = %d\n", item.m_dwHashValue); } }
//+-------------------------------------------------------------------------
//
// Function: displayItemMonikerCk
//
// Synopsis: Display a checked item moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayItemMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SItemMonikerCk item; WCHAR *pwszItem; WCHAR *pwszDelimiter;
// Fetch the moniker
ReadMem(&item, pMoniker, sizeof(SItemMonikerCk)); // It's an item moniker
Printf("Item Moniker\n");
// The current references
Printf("refs = %d\n", item.m_refs);
// The delimiter plus item
pwszDelimiter = (WCHAR *) OleAlloc(2 * (item.m_ccDelimiter + 1)); ReadMem(pwszDelimiter, item.m_lpszDelimiter, 2 * (item.m_ccDelimiter + 1)); pwszItem = (WCHAR *) OleAlloc(2 * (item.m_ccItem + 1)); ReadMem(pwszItem, item.m_lpszItem, 2 * (item.m_ccItem + 1)); Printf("item = %ws%ws\n", pwszDelimiter, pwszItem); OleFree(pwszItem);
// The hash value
if (item.m_fHashValueValid) { Printf("hash = %d\n", item.m_dwHashValue); } }
//+-------------------------------------------------------------------------
//
// Function: displayCompositeMoniker
//
// Synopsis: Display a retail composite moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayCompositeMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SCompositeMonikerCk composite;
// Fetch the moniker
ReadMem(&composite, pMoniker, sizeof(SCompositeMoniker)); // It's a composite moniker
Printf("Composite Moniker\n");
// The current references
Printf("refs = %d\n", composite.m_refs);
// Reduced?
if (composite.m_fReduced) { Printf("reduced\n"); }
// The left component
Printf("\nleft component\n"); Printf("--------------\n"); if (composite.m_pmkLeft) { displayMoniker(hProcess, lpExtensionApis, (ULONG) composite.m_pmkLeft); } else { Printf("NULL\n"); }
// The right component
Printf("\nright component\n"); Printf("---------------\n"); if (composite.m_pmkRight) { displayMoniker(hProcess, lpExtensionApis, (ULONG) composite.m_pmkRight); } else { Printf("NULL\n"); } }
//+-------------------------------------------------------------------------
//
// Function: displayCompositeMonikerCk
//
// Synopsis: Display a checked composite moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayCompositeMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SCompositeMonikerCk composite;
// Fetch the moniker
ReadMem(&composite, pMoniker, sizeof(SCompositeMonikerCk)); // It's a composite moniker
Printf("Composite Moniker\n");
// The current references
Printf("refs = %d\n", composite.m_refs);
// Reduced?
if (composite.m_fReduced) { Printf("reduced\n"); }
// The left component
Printf("\nleft component\n"); Printf("--------------\n"); if (composite.m_pmkLeft) { displayMoniker(hProcess, lpExtensionApis, (ULONG) composite.m_pmkLeft); } else { Printf("NULL\n"); }
// The right component
Printf("\nright component\n"); Printf("---------------\n"); if (composite.m_pmkRight) { displayMoniker(hProcess, lpExtensionApis, (ULONG) composite.m_pmkRight); } else { Printf("NULL\n"); } }
//+-------------------------------------------------------------------------
//
// Function: displayPointerMoniker
//
// Synopsis: Display a retail pointer moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayPointerMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SPointerMoniker pointer;
// Fetch the moniker
ReadMem(&pointer, pMoniker, sizeof(SPointerMoniker)); // It's a pointer moniker
Printf("Pointer Moniker\n");
// The current references
Printf("refs = %d\n", pointer.m_refs);
// The pointer
Printf("IUnknown = %08x\n", pointer.m_pUnk); }
//+-------------------------------------------------------------------------
//
// Function: displayPointerMonikerCk
//
// Synopsis: Display a checked pointer moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayPointerMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SPointerMonikerCk pointer;
// Fetch the moniker
ReadMem(&pointer, pMoniker, sizeof(SPointerMonikerCk)); // It's a pointer moniker
Printf("Pointer Moniker\n");
// The current references
Printf("refs = %d\n", pointer.m_refs);
// The pointer
Printf("IUnknown = %08x\n", pointer.m_pUnk); }
//+-------------------------------------------------------------------------
//
// Function: displayAntiMoniker
//
// Synopsis: Display a retail anti moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayAntiMoniker(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SAntiMoniker anti;
// Fetch the moniker
ReadMem(&anti, pMoniker, sizeof(SAntiMoniker)); // It's a pointer moniker
Printf("Anti Moniker\n");
// The current references
Printf("refs = %d\n", anti.m_refs);
// The count
Printf("count = %d\n", anti.m_count); }
//+-------------------------------------------------------------------------
//
// Function: displayAntiMonikerCk
//
// Synopsis: Display a checked anti moniker
//
// Arguments: [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static void displayAntiMonikerCk(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { SAntiMonikerCk anti;
// Fetch the moniker
ReadMem(&anti, pMoniker, sizeof(SAntiMonikerCk)); // It's a pointer moniker
Printf("Anti Moniker\n");
// The current references
Printf("refs = %d\n", anti.m_refs);
// The count
Printf("count = %d\n", anti.m_count); }
//+-------------------------------------------------------------------------
//
// Function: findMnkType
//
// Synopsis: Given a moniker, compute its type
//
// Arguments: [HANDLE] - process handle
// [PNTSD_EXTENSION_APIS] Convenience routines
// [ULONG] - The moniker
//
// Returns: -
//
// History: 07-Mar-95 BruceMa Created
//
//--------------------------------------------------------------------------
static enum mnkType findMnkType(HANDLE hProcess, PNTSD_EXTENSION_APIS lpExtensionApis, ULONG pMoniker) { void *vtbl; char szSymbol[128]; DWORD dwOffset; // Read the symbol for the first element in the first vtbl
ReadMem(&vtbl, pMoniker, sizeof(ULONG)); ReadMem(&vtbl, vtbl, sizeof(ULONG)); szSymbol[0] = '\0'; GetSymbol(vtbl, (UCHAR *) szSymbol, &dwOffset);
// We better be looking at a QueryInterface on a moniker
if (dwOffset != 0) { return NOMNK; } if (lstrcmp(szSymbol, "ole32!CFileMoniker__QueryInterface") == 0) { return FILEMNK; } else if (lstrcmp(szSymbol, "ole32!CItemMoniker__QueryInterface") == 0) { return ITEMMNK; } else if (lstrcmp(szSymbol, "ole32!CCompositeMoniker__QueryInterface") == 0) { return COMPOSITEMNK; } else if (lstrcmp(szSymbol, "ole32!CPointerMoniker__QueryInterface") == 0) { return POINTERMNK; } else if (lstrcmp(szSymbol, "ole32!CAntiMoniker__QueryInterface") == 0) { return ANTIMNK; } else { return NOMNK; } }
|