Leaked source code of windows server 2003
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

/*++
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);
}