You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
335 lines
10 KiB
335 lines
10 KiB
/*++
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
ddiexts.cxx
|
|
|
|
Abstract:
|
|
|
|
This file contains the DDI related extensions.
|
|
|
|
Author:
|
|
|
|
Jason Hartman (JasonHa) 2000-11-01
|
|
|
|
Environment:
|
|
|
|
User Mode
|
|
|
|
--*/
|
|
|
|
#include "precomp.hxx"
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* BLENDOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( blendobj )
|
|
{
|
|
return ExtDumpType(Client, "blendobj", "BLENDOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* BRUSHOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( brushobj )
|
|
{
|
|
return ExtDumpType(Client, "brushobj", "BRUSHOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* CLIPOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( clipobj )
|
|
{
|
|
return ExtDumpType(Client, "clipobj", "CLIPOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* LINEATTRS
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( lineattrs )
|
|
{
|
|
HRESULT hr = S_OK;
|
|
OutputControl OutCtl(Client);
|
|
DEBUG_VALUE Offset;
|
|
|
|
BEGIN_API( lineattrs );
|
|
|
|
while (isspace(*args)) args++;
|
|
|
|
if (*args == '-' ||
|
|
(hr = OutCtl.Evaluate(args, DEBUG_VALUE_INT64, &Offset, NULL)) != S_OK ||
|
|
Offset.I64 == 0)
|
|
{
|
|
if (hr != S_OK)
|
|
{
|
|
OutCtl.OutErr("Evaluate '%s' returned %s.\n",
|
|
args,
|
|
pszHRESULT(hr));
|
|
}
|
|
OutCtl.Output("Usage: lineattrs [-?] <LINEATTRS Addr>\n");
|
|
}
|
|
else
|
|
{
|
|
OutputFilter OutFilter(Client);
|
|
OutputState OutState(Client, FALSE);
|
|
|
|
if (hr == S_OK &&
|
|
(hr = OutState.Setup(0, &OutFilter)) == S_OK &&
|
|
(hr = OutCtl.SetControl(DEBUG_OUTCTL_THIS_CLIENT |
|
|
DEBUG_OUTCTL_NOT_LOGGED |
|
|
DEBUG_OUTCTL_OVERRIDE_MASK,
|
|
OutState.Client)) == S_OK)
|
|
|
|
{
|
|
hr = DumpType(Client,
|
|
"_LINEATTRS",
|
|
Offset.I64,
|
|
DEBUG_OUTTYPE_DEFAULT,
|
|
&OutCtl);
|
|
|
|
OutCtl.SetControl(DEBUG_OUTCTL_AMBIENT, Client);
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
// Determine if FLOAT_LONG unions contain
|
|
// FLOATL's or LONG's.
|
|
if (OutFilter.Query("LA_GEOMETRIC") == S_OK)
|
|
{
|
|
OutFilter.Skip(OUTFILTER_QUERY_EVERY_LINE |
|
|
OUTFILTER_QUERY_WHOLE_WORD,
|
|
"l");
|
|
}
|
|
else
|
|
{
|
|
OutFilter.Skip(OUTFILTER_QUERY_EVERY_LINE |
|
|
OUTFILTER_QUERY_WHOLE_WORD,
|
|
"e");
|
|
}
|
|
|
|
OutFilter.OutputText();
|
|
}
|
|
else
|
|
{
|
|
OutCtl.OutErr("Type Dump for LINEATTRS returned %s.\n", pszHRESULT(hr));
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OutCtl.OutErr("Type Dump setup for LINEATTRS returned %s.\n", pszHRESULT(hr));
|
|
}
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* PATHOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( pathobj )
|
|
{
|
|
return ExtDumpType(Client, "pathobj", "PATHOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* SURFOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( surfobj )
|
|
{
|
|
BEGIN_API( surfobj );
|
|
|
|
HRESULT hr = S_OK;
|
|
DEBUG_VALUE Arg;
|
|
DEBUG_VALUE Offset;
|
|
TypeOutputParser TypeParser(Client);
|
|
OutputState OutState(Client);
|
|
|
|
OutputControl OutCtl(Client);
|
|
|
|
while (isspace(*args)) args++;
|
|
|
|
if (*args == '-' ||
|
|
(hr = Evaluate(Client, args, DEBUG_VALUE_INT64, 0, &Arg, NULL)) != S_OK ||
|
|
Arg.I64 == 0)
|
|
{
|
|
OutCtl.Output("Usage: surfobj [-?] <HSURF | SURFOBJ Addr>\n");
|
|
}
|
|
else if ((hr = OutState.Setup(0, &TypeParser)) == S_OK)
|
|
{
|
|
ULONG64 SurfAddr;
|
|
ULONG64 SurfObjAddr = 0;
|
|
DEBUG_VALUE SurfObjHandle;
|
|
BOOL SurfObjHandleChecked = FALSE;
|
|
|
|
hr = GetObjectAddress(Client, Arg.I64, &SurfAddr, SURF_TYPE, TRUE, TRUE);
|
|
|
|
if (hr != S_OK || SurfAddr == 0)
|
|
{
|
|
// Invalid handle try argument as a SURFOBJ address
|
|
SurfObjAddr = Arg.I64;
|
|
|
|
// Try to read hsurf from SURFOBJ
|
|
if ((hr = OutState.OutputTypeVirtual(SurfObjAddr, GDIType(_SURFOBJ), 0)) != S_OK ||
|
|
(hr = TypeParser.Get(&SurfObjHandle, "hsurf", DEBUG_VALUE_INT64)) != S_OK)
|
|
{
|
|
OutCtl.OutErr("Unable to get contents of SURFOBJ's handle\n");
|
|
OutCtl.OutErr(" (Type Read returned %s)\n", pszHRESULT(hr));
|
|
OutCtl.OutErr(" 0x%p is neither an HSURF nor valid SURFOBJ address\n", Arg.I64);
|
|
}
|
|
}
|
|
|
|
if (hr == S_OK)
|
|
{
|
|
PDEBUG_SYMBOLS Symbols;
|
|
|
|
ULONG64 SurfModule = 0;
|
|
ULONG SurfTypeId = 0;
|
|
ULONG BaseObjTypeId = 0;
|
|
ULONG SurfObjOffset = 0;
|
|
|
|
if ((hr = Client->QueryInterface(__uuidof(IDebugSymbols),
|
|
(void **)&Symbols)) == S_OK)
|
|
{
|
|
// Try to read SURFOBJ offset from SURFACE type, but
|
|
// if that fails assume it is directly after BASEOBJECT.
|
|
if ((hr = GetTypeId(Client, "SURFACE", &SurfTypeId, &SurfModule)) != S_OK ||
|
|
(hr = Symbols->GetFieldOffset(SurfModule, SurfTypeId, "so", &SurfObjOffset)) != S_OK)
|
|
{
|
|
if ((hr = Symbols->GetTypeId(Type_Module.Base, "_BASEOBJECT", &BaseObjTypeId)) == S_OK)
|
|
{
|
|
hr = Symbols->GetTypeSize(Type_Module.Base, BaseObjTypeId, &SurfObjOffset);
|
|
}
|
|
}
|
|
|
|
Symbols->Release();
|
|
}
|
|
|
|
if (SurfObjAddr != 0)
|
|
{
|
|
// If we were given a address, check hsurf validity.
|
|
// hsurf value (SurfObjHandle) is retrieved above.
|
|
|
|
hr = GetObjectAddress(Client, SurfObjHandle.I64, &SurfAddr,
|
|
SURF_TYPE, TRUE, FALSE);
|
|
|
|
if (hr != S_OK || SurfAddr == 0)
|
|
{
|
|
OutCtl.OutWarn(" SURFOBJ's hsurf is not valid.\n");
|
|
}
|
|
else if (SurfObjOffset != 0 &&
|
|
SurfObjAddr != SurfAddr + SurfObjOffset)
|
|
{
|
|
OutCtl.OutWarn(" SURFOBJ's hsurf may not be valid.\n");
|
|
}
|
|
else
|
|
{
|
|
ULONG64 SurfaceHandle;
|
|
hr = GetObjectHandle(Client, SurfAddr, &SurfaceHandle, FALSE);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
OutCtl.OutErr("Unable to get contents of surface handle\n");
|
|
OutCtl.OutErr(" (Type Read returned %s)\n", pszHRESULT(hr));
|
|
}
|
|
else if (SurfaceHandle != SurfObjHandle.I64)
|
|
{
|
|
OutCtl.OutWarn(" Surface has an invalid handle.\n");
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
// If we were given a handle,
|
|
// compute SURFOBJ address.
|
|
if (SurfObjOffset != 0)
|
|
{
|
|
SurfObjAddr = SurfAddr + SurfObjOffset;
|
|
|
|
// Try to read hsurf from SURFOBJ
|
|
if ((hr = OutState.OutputTypeVirtual(SurfObjAddr, GDIType(_SURFOBJ), 0)) != S_OK ||
|
|
(hr = TypeParser.Get(&SurfObjHandle, "hsurf", DEBUG_VALUE_INT64)) != S_OK)
|
|
{
|
|
OutCtl.OutErr("Unable to get contents of SURFOBJ's handle\n");
|
|
OutCtl.OutErr(" (Type Read returned %s)\n", pszHRESULT(hr));
|
|
}
|
|
else if (SurfObjHandle.I64 != Arg.I64)
|
|
{
|
|
OutCtl.OutWarn(" SURFOBJ's hsurf is not valid.\n");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (SurfObjAddr != 0)
|
|
{
|
|
hr = DumpType(Client, "_SURFOBJ", SurfObjAddr);
|
|
|
|
if (hr != S_OK)
|
|
{
|
|
OutCtl.OutErr("Type Dump for %s returned %s.\n", GDIType(_SURFOBJ), pszHRESULT(hr));
|
|
}
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
OutCtl.OutErr("Couldn't setup type reader, %s.\n", pszHRESULT(hr));
|
|
}
|
|
|
|
return hr;
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* WNDOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( wndobj )
|
|
{
|
|
return ExtDumpType(Client, "wndobj", "WNDOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* XLATEOBJ
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( xlateobj )
|
|
{
|
|
return ExtDumpType(Client, "xlateobj", "XLATEOBJ", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* DEVMODEA
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( devmodea )
|
|
{
|
|
return ExtDumpType(Client, "devmodea", "_devicemodeA", args);
|
|
}
|
|
|
|
|
|
/******************************Public*Routine******************************\
|
|
* DEVMODEW
|
|
*
|
|
\**************************************************************************/
|
|
DECLARE_API( devmodew )
|
|
{
|
|
return ExtDumpType(Client, "devmodeW", "_devicemodeW", args);
|
|
}
|
|
|
|
|