Sample Code

windows driver samples/ OEM Printer Customization Plug-in Samples/ C++/ oemprean/ debug.cpp/

//  THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF
//  ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO
//  THE IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A
//  PARTICULAR PURPOSE.
//
//  Copyright  1996 - 2003  Microsoft Corporation.  All Rights Reserved.
//
//  FILE:   Debug.cpp
//
//  PURPOSE:  Implementation of the debug functions.
//
//
//  History:
//          06/28/03    xxx created.
//
//

#include "precomp.h"
#include "debug.h"

// This indicates to Prefast that this is a usermode driver file.
_Analysis_mode_(_Analysis_code_type_user_driver_);


////////////////////////////////////////////////////////
//      INTERNAL DEFINES
////////////////////////////////////////////////////////

#define DEBUG_BUFFER_SIZE       1024
#define PATH_SEPARATOR          '\\'

////////////////////////////////////////////////////////
//      EXTERNAL GLOBALS
////////////////////////////////////////////////////////

#ifdef DBG

INT giDebugLevel = DEBUG_LEVEL;


PCWSTR
EnsureLabel(
    _In_opt_ PCWSTR      pszInLabel,
    _In_ PCWSTR      pszDefLabel
    )

/*++

Routine Description:

    This function checks if pszInLabel is valid. If not, it returns
    pszDefLabel else pszInLabel is returned.

Arguments:

    pszInLabel - custom label string passed in with the call to the dump function
    pszDefLabel - default label string in case custom label string is not valid

Return Value:

    pszInLabel if it is valid, else pszDefLabel

--*/

{
    // By design, pszDefLabel is assumed to be a valid, non-empty
    // string (since it is supplied internally).
    //
    if (!pszInLabel || !*pszInLabel)
    {
        // The caller supplied a NULL string or empty string;
        // supply the internal default.
        //
        return pszDefLabel;
    }

    return pszInLabel;
}

BOOL OEMDebugMessage(
    LPCWSTR lpszMessage,
    ...
    )

/*++

Routine Description:

    Outputs variable argument debug string.

Arguments:

    dwSize - size of temp buffer to hold formatted string
    lpszMessage - format string
    arglist - Variable argument list...

Return Value:

    TRUE if successful, FALSE if there is an error

--*/

{
    va_list VAList;
    HRESULT hResult;

    // Parameter checking.
    if( NULL == lpszMessage)
    {
        return FALSE;
    }

    LPWSTR lpszMsgBuf = new WCHAR[DEBUG_BUFFER_SIZE];
    if(NULL == lpszMsgBuf)
        return FALSE;

    va_start(VAList, lpszMessage);
    // Pass the variable parameters to wvsprintf to be formatted.
    hResult = StringCchVPrintfW(lpszMsgBuf, DEBUG_BUFFER_SIZE, lpszMessage, VAList);
    va_end(VAList);

    // Dump string to debug output.
    OutputDebugStringW(lpszMsgBuf);

    // Clean up.
    delete[] lpszMsgBuf;

    return SUCCEEDED(hResult);
}

PCSTR
StripDirPrefixA(
    IN PCSTR    pstrFilename
    )

/*++

Routine Description:

    Strip the directory prefix off a filename (ANSI version)

Arguments:

    pstrFilename - Pointer to filename string

Return Value:

    Pointer to the last component of a filename (without directory prefix)

--*/

{
    PCSTR   pstr;

    pstr = strrchr(pstrFilename, PATH_SEPARATOR);
    if (pstr)
        return pstr + 1;

    return pstrFilename;
}

void
vDumpFlags(
    DWORD           dwFlags,
    PDBG_FLAGS      pDebugFlags
    )

/*++

Routine Description:

    Dumps the combination of flags in members such as
    pso->fjBitmap, pstro->flAccel, pfo->flFontType etc.

Arguments:

    dwFlags - combined value of the relevant member
        Example values are pso->fjBitmap, pstro->flAccel
    pDebugFlags - structure containing the different possible values
        that can be combined in dwFlags

Return Value:

    NONE

--*/

{
    DWORD dwFound = 0;
    BOOL bFirstFlag = FALSE;

    OEMDebugMessage(L"%#x [", dwFlags);

    // Traverse through the list of flags to see if any match
    //
    for ( ; pDebugFlags->dwFlag; ++pDebugFlags)
    {
        if(dwFlags & pDebugFlags->dwFlag)
        {
            if (!bFirstFlag)
            {
                OEMDebugMessage(L"%s", pDebugFlags->pszFlag);
                bFirstFlag = TRUE;
            }
            else
            {
                OEMDebugMessage(L" | %s", pDebugFlags->pszFlag);
            }
            dwFound |= pDebugFlags->dwFlag;
        }
    }

    OEMDebugMessage(L"]");

    //
    // Check if there are extra bits set that we don't understand.
    //
    if(dwFound != dwFlags)
    {
        OEMDebugMessage(L"  <ExtraBits: %x>", dwFlags & ~dwFound);
    }

    OEMDebugMessage(L"\r\n");
}

void
vDumpOemDMParam(
    INT             iDebugLevel,
    _In_ PWSTR      pszInLabel,
    POEMDMPARAM     pOemDMParam
    )

/*++

Routine Description:

    Dumps the members of a OEMDMPARAM structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pOemDMParam - pointer to the OEMDMPARAM strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pOemDMParam");

    // Return if strct to be dumped is invalid
    //
    if (!pOemDMParam)
    {
        OEMDebugMessage(L"\npOemDMParam [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\npOemDMParam [%s]: %#x\r\n", pszLabel, pOemDMParam);
    OEMDebugMessage(L"\tcbSize = %d\r\n", pOemDMParam->cbSize);
    OEMDebugMessage(L"\tpdriverobj = %#x\r\n", pOemDMParam->pdriverobj);
    OEMDebugMessage(L"\thPrinter = %#x\r\n", pOemDMParam->hPrinter);
    OEMDebugMessage(L"\thModule = %#x\r\n", pOemDMParam->hModule);
    OEMDebugMessage(L"\tpPublicDMIn = %#x\r\n", pOemDMParam->pPublicDMIn);
    OEMDebugMessage(L"\tpPublicDMOut = %#x\r\n", pOemDMParam->pPublicDMOut);
    OEMDebugMessage(L"\tpOEMDMIn = %#x\r\n", pOemDMParam->pOEMDMIn);
    OEMDebugMessage(L"\tpOEMDMOut = %#x\r\n", pOemDMParam->pOEMDMOut);
    OEMDebugMessage(L"\tcbBufSize = %d\r\n", pOemDMParam->cbBufSize);

    OEMDebugMessage(L"\n");

}

#if DBG
    DBG_FLAGS gafdSURFOBJ_fjBitmap[] = {
        { L"BMF_TOPDOWN",       BMF_TOPDOWN},
        { L"BMF_NOZEROINIT",        BMF_NOZEROINIT},
        { L"BMF_DONTCACHE",     BMF_DONTCACHE},
        { L"BMF_USERMEM",       BMF_USERMEM},
        { L"BMF_KMSECTION",     BMF_KMSECTION},
        { L"BMF_NOTSYSMEM",     BMF_NOTSYSMEM},
        { L"BMF_WINDOW_BLT",    BMF_WINDOW_BLT},
        {NULL, 0}               // The NULL entry is important
//      { L"BMF_UMPDMEM",       BMF_UMPDMEM},
//      { L"BMF_RESERVED",      BMF_RESERVED},
    };
#else
    DBG_FLAGS gafdSURFOBJ_fjBitmap[] = {
        {NULL, 0}
    };
#endif

void
vDumpSURFOBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    SURFOBJ     *pso
    )

/*++

Routine Description:

    Dumps the members of a SURFOBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pso - pointer to the SURFOBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pso");

    // Return if strct to be dumped is invalid
    //
    if (!pso)
    {
        OEMDebugMessage(L"\nSURFOBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nSURFOBJ [%s]: %#x\r\n", pszLabel, pso);
    OEMDebugMessage(L"\tdhSurf: %#x\r\n", pso->dhsurf);
    OEMDebugMessage(L"\thSurf: %#x\r\n", pso->hsurf);
    OEMDebugMessage(L"\tdhpdev: %#x\r\n", pso->dhpdev);
    OEMDebugMessage(L"\thdev: %#x\r\n", pso->hdev);
    OEMDebugMessage(L"\tsizlBitmap: [%ld x %ld]\r\n", pso->sizlBitmap.cx, pso->sizlBitmap.cy);
    OEMDebugMessage(L"\tcjBits: %ld\r\n", pso->cjBits);
    OEMDebugMessage(L"\tpvBits: %#x\r\n", pso->pvBits);
    OEMDebugMessage(L"\tpvScan0: %#x\r\n", pso->pvScan0);
    OEMDebugMessage(L"\tlDelta: %ld\r\n", pso->lDelta);
    OEMDebugMessage(L"\tiUniq: %ld\r\n", pso->iUniq);

    PWSTR psziBitmapFormat = L"0";
    switch (pso->iBitmapFormat)
    {
        case BMF_1BPP : psziBitmapFormat = L"BMF_1BPP" ; break;
        case BMF_4BPP : psziBitmapFormat = L"BMF_4BPP" ; break;
        case BMF_8BPP : psziBitmapFormat = L"BMF_8BPP" ; break;
        case BMF_16BPP: psziBitmapFormat = L"BMF_16BPP"; break;
        case BMF_24BPP: psziBitmapFormat = L"BMF_24BPP"; break;
        case BMF_32BPP: psziBitmapFormat = L"BMF_32BPP"; break;
        case BMF_4RLE : psziBitmapFormat = L"BMF_4RLE" ; break;
        case BMF_8RLE : psziBitmapFormat = L"BMF_8RLE" ; break;
        case BMF_JPEG : psziBitmapFormat = L"BMF_JPEG" ; break;
        case BMF_PNG  : psziBitmapFormat = L"BMF_PNG " ; break;
    }
    OEMDebugMessage(L"\tiBitmapFormat: %s\r\n", psziBitmapFormat);

    PWSTR psziType = L"0";
    switch (pso->iType)
    {
        case STYPE_BITMAP   : psziType = L"STYPE_BITMAP"   ; break;
        case STYPE_DEVBITMAP: psziType = L"STYPE_DEVBITMAP"; break;
        case STYPE_DEVICE   : psziType = L"STYPE_DEVICE"   ; break;
    }
    OEMDebugMessage(L"\tiType: %s\r\n", psziType);

    OEMDebugMessage(L"\tfjBitmap: ");
    if (STYPE_BITMAP == pso->iType)
        vDumpFlags(pso->fjBitmap, gafdSURFOBJ_fjBitmap);
    else
        OEMDebugMessage(L"IGNORE\r\n");

    OEMDebugMessage(L"\n");

}

#if DBG
    DBG_FLAGS gafdSTROBJ_flAccel[] = {
        { L"SO_FLAG_DEFAULT_PLACEMENT",             SO_FLAG_DEFAULT_PLACEMENT},
        { L"SO_HORIZONTAL",                         SO_HORIZONTAL},
        { L"SO_VERTICAL",                           SO_VERTICAL},
        { L"SO_REVERSED",                           SO_REVERSED},
        { L"SO_ZERO_BEARINGS",                      SO_ZERO_BEARINGS},
        { L"SO_CHAR_INC_EQUAL_BM_BASE",         SO_CHAR_INC_EQUAL_BM_BASE},
        { L"SO_MAXEXT_EQUAL_BM_SIDE",               SO_MAXEXT_EQUAL_BM_SIDE},
        { L"SO_DO_NOT_SUBSTITUTE_DEVICE_FONT",      SO_DO_NOT_SUBSTITUTE_DEVICE_FONT},
        { L"SO_GLYPHINDEX_TEXTOUT",                 SO_GLYPHINDEX_TEXTOUT},
        { L"SO_ESC_NOT_ORIENT",                     SO_ESC_NOT_ORIENT},
        { L"SO_DXDY",                               SO_DXDY},
        { L"SO_CHARACTER_EXTRA",                    SO_CHARACTER_EXTRA},
        { L"SO_BREAK_EXTRA",                            SO_BREAK_EXTRA},
        {NULL, 0}                                   // The NULL entry is important
    };
#else
    DBG_FLAGS gafdSTROBJ_flAccel[] = {
        {NULL, 0}
    };
#endif

void
vDumpSTROBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    STROBJ      *pstro
    )

/*++

Routine Description:

    Dumps the members of a STROBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pstro - pointer to the STROBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pstro");

    // Return if strct to be dumped is invalid
    //
    if (!pstro)
    {
        OEMDebugMessage(L"\nSTROBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nSTROBJ [%s]: %#x\r\n", pszLabel, pstro);
    OEMDebugMessage(L"\tcGlyphs: %ld\r\n", pstro->cGlyphs);
    OEMDebugMessage(L"\tflAccel: ");
    vDumpFlags(pstro->flAccel, gafdSTROBJ_flAccel);
    OEMDebugMessage(L"\tulCharInc: %ld\r\n", pstro->ulCharInc);
    OEMDebugMessage(L"\trclBkGround: (%ld, %ld) (%ld, %ld)\r\n", pstro->rclBkGround.left, pstro->rclBkGround.top, pstro->rclBkGround.right, pstro->rclBkGround.bottom);
    if (!pstro->pgp)
        OEMDebugMessage(L"\tpgp: NULL\r\n");
    else
        OEMDebugMessage(L"\tpgp: %#x\r\n", pstro->pgp);
    OEMDebugMessage(L"\tpwszOrg: \"%s\"\r\n", pstro->pwszOrg);

    OEMDebugMessage(L"\n");

}

#if DBG
    DBG_FLAGS gafdFONTOBJ_flFontType[] = {
        { L"FO_TYPE_RASTER",        FO_TYPE_RASTER},
        { L"FO_TYPE_DEVICE",        FO_TYPE_DEVICE},
        { L"FO_TYPE_TRUETYPE",  FO_TYPE_TRUETYPE},
        { L"FO_TYPE_OPENTYPE",  0x8},
        { L"FO_SIM_BOLD",       FO_SIM_BOLD},
        { L"FO_SIM_ITALIC",     FO_SIM_ITALIC},
        { L"FO_EM_HEIGHT",      FO_EM_HEIGHT},
        { L"FO_GRAY16",         FO_GRAY16},
        { L"FO_NOGRAY16",       FO_NOGRAY16},
        { L"FO_CFF",                FO_CFF},
        { L"FO_POSTSCRIPT",     FO_POSTSCRIPT},
        { L"FO_MULTIPLEMASTER", FO_MULTIPLEMASTER},
        { L"FO_VERT_FACE",      FO_VERT_FACE},
        { L"FO_DBCS_FONT",      FO_DBCS_FONT},
        {NULL, 0}               // The NULL entry is important
    };
#else
    DBG_FLAGS gafdFONTOBJ_flFontType[] = {
        {NULL, 0}
    };
#endif

void
vDumpFONTOBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    FONTOBJ     *pfo
    )

/*++

Routine Description:

    Dumps the members of a FONTOBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pfo - pointer to the FONTOBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pfo");

    // Return if strct to be dumped is invalid
    //
    if (!pfo)
    {
        OEMDebugMessage(L"\nFONTOBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nFONTOBJ [%s]: %#x\r\n", pszLabel, pfo);
    OEMDebugMessage(L"\tiUniq: %ld\r\n", pfo->iUniq);
    OEMDebugMessage(L"\tiFace: %ld\r\n", pfo->iFace);
    OEMDebugMessage(L"\tcxMax: %ld\r\n", pfo->cxMax);
    OEMDebugMessage(L"\tflFontType: ");
    vDumpFlags(pfo->flFontType, gafdFONTOBJ_flFontType);
    OEMDebugMessage(L"\tiTTUniq: %#x\r\n", pfo->iTTUniq);
    OEMDebugMessage(L"\tiFile: %#x\r\n", pfo->iFile);
    OEMDebugMessage(L"\tsizLogResPpi: [%ld x %ld]\r\n", pfo->sizLogResPpi.cx, pfo->sizLogResPpi.cy);
    OEMDebugMessage(L"\tulStyleSize: %ld\r\n", pfo->ulStyleSize);
    if (!pfo->pvConsumer)
        OEMDebugMessage(L"\tpvConsumer: NULL\r\n");
    else
        OEMDebugMessage(L"\tpvConsumer: %#x\r\n", pfo->pvConsumer);
    if (!pfo->pvProducer)
        OEMDebugMessage(L"\tpvProducer: NULL\r\n");
    else
        OEMDebugMessage(L"\tpvProducer: %#x\r\n", pfo->pvProducer);

    OEMDebugMessage(L"\n");

}

void
vDumpCLIPOBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    CLIPOBJ     *pco
    )

/*++

Routine Description:

    Dumps the members of a CLIPOBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pco - pointer to the CLIPOBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pco");

    // Return if strct to be dumped is invalid
    //
    if (!pco)
    {
        OEMDebugMessage(L"\nCLIPOBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nCLIPOBJ [%s]: %#x\r\n", pszLabel, pco);
    OEMDebugMessage(L"\tiUniq: %ld\r\n", pco->iUniq);
    OEMDebugMessage(L"\trclBounds: (%ld, %ld) (%ld, %ld)\r\n", pco->rclBounds.left, pco->rclBounds.top, pco->rclBounds.right, pco->rclBounds.bottom);

    PWSTR psziDComplexity = L"Unknown iDComplexity.";
    switch (pco->iDComplexity )
    {
        case DC_COMPLEX: psziDComplexity = L"DC_COMPLEX"; break;
        case DC_RECT: psziDComplexity = L"DC_RECT"; break;
        case DC_TRIVIAL: psziDComplexity = L"DC_TRIVIAL"; break;
    }
    OEMDebugMessage(L"\tiDComplexity: %s\r\n", psziDComplexity);

    PWSTR psziFComplexity = L"0";
    switch (pco->iFComplexity)
    {
        case FC_COMPLEX: psziFComplexity = L"FC_COMPLEX"; break;
        case FC_RECT: psziFComplexity = L"FC_RECT"; break;
        case FC_RECT4: psziFComplexity = L"FC_RECT4"; break;
    }
    OEMDebugMessage(L"\tiFComplexity: %s\r\n", psziFComplexity);

    PWSTR psziMode = L"0";
    switch (pco->iMode)
    {
        case TC_PATHOBJ: psziMode = L"TC_PATHOBJ"; break;
        case TC_RECTANGLES: psziMode = L"TC_RECTANGLES"; break;
    }
    OEMDebugMessage(L"\tiMode: %s\r\n", psziMode);

    PWSTR pszfjOptions = L"0";
    switch (pco->fjOptions)
    {
        case OC_BANK_CLIP: pszfjOptions = L"TC_PATHOBJ"; break;
    }
    OEMDebugMessage(L"\tfjOptions: %s\r\n", pszfjOptions);

    OEMDebugMessage(L"\n");
}

#if DBG
    DBG_FLAGS gafdBRUSHOBJ_flColorType[] = {
        { L"BR_CMYKCOLOR",      BR_CMYKCOLOR},
        { L"BR_DEVICE_ICM",     BR_DEVICE_ICM},
        { L"BR_HOST_ICM",       BR_HOST_ICM},
        {NULL, 0}               // The NULL entry is important
    };
#else
    DBG_FLAGS gafdBRUSHOBJ_flColorType[] = {
        {NULL, 0}
    };
#endif

void
vDumpBRUSHOBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    BRUSHOBJ    *pbo
    )

/*++

Routine Description:

    Dumps the members of a BRUSHOBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pbo - pointer to the BRUSHOBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pbo");

    // Return if strct to be dumped is invalid
    //
    if (!pbo)
    {
        OEMDebugMessage(L"\nBRUSHOBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nBRUSHOBJ [%s]: %#x\r\n", pszLabel, pbo);
    OEMDebugMessage(L"\tiSolidColor: %#x\r\n", pbo->iSolidColor);
    OEMDebugMessage(L"\tpvRbrush: %#x\r\n", pbo->pvRbrush);
    OEMDebugMessage(L"\tflColorType: ");
    vDumpFlags(pbo->flColorType, gafdBRUSHOBJ_flColorType);

    OEMDebugMessage(L"\n");
}

#if DBG
    DBG_FLAGS gafdGDIINFO_flHTFlags[] = {
        { L"HT_FLAG_8BPP_CMY332_MASK",          HT_FLAG_8BPP_CMY332_MASK},
        { L"HT_FLAG_ADDITIVE_PRIMS",                HT_FLAG_ADDITIVE_PRIMS},
        { L"HT_FLAG_DO_DEVCLR_XFORM",           HT_FLAG_DO_DEVCLR_XFORM},
        { L"HT_FLAG_HAS_BLACK_DYE",             HT_FLAG_HAS_BLACK_DYE},
        { L"HT_FLAG_HIGH_INK_ABSORPTION",       HT_FLAG_HIGH_INK_ABSORPTION},
        { L"HT_FLAG_HIGHER_INK_ABSORPTION",     HT_FLAG_HIGHER_INK_ABSORPTION},
        { L"HT_FLAG_HIGHEST_INK_ABSORPTION",    HT_FLAG_HIGHEST_INK_ABSORPTION},
        { L"HT_FLAG_INK_ABSORPTION_IDX0",       HT_FLAG_INK_ABSORPTION_IDX0},
        { L"HT_FLAG_INK_ABSORPTION_IDX1",       HT_FLAG_INK_ABSORPTION_IDX1},
        { L"HT_FLAG_INK_ABSORPTION_IDX2",       HT_FLAG_INK_ABSORPTION_IDX2},
        { L"HT_FLAG_INK_ABSORPTION_IDX3",       HT_FLAG_INK_ABSORPTION_IDX3},
        { L"HT_FLAG_INK_HIGH_ABSORPTION",       HT_FLAG_INK_HIGH_ABSORPTION},
        { L"HT_FLAG_LOW_INK_ABSORPTION",        HT_FLAG_LOW_INK_ABSORPTION},
        { L"HT_FLAG_LOWER_INK_ABSORPTION",      HT_FLAG_LOWER_INK_ABSORPTION},
        { L"HT_FLAG_LOWEST_INK_ABSORPTION",     HT_FLAG_LOWEST_INK_ABSORPTION},
        { L"HT_FLAG_OUTPUT_CMY",                    HT_FLAG_OUTPUT_CMY},
        { L"HT_FLAG_PRINT_DRAFT_MODE",          HT_FLAG_PRINT_DRAFT_MODE},
        { L"HT_FLAG_SQUARE_DEVICE_PEL",         HT_FLAG_SQUARE_DEVICE_PEL},
        { L"HT_FLAG_USE_8BPP_BITMASK",          HT_FLAG_USE_8BPP_BITMASK},
        { L"HT_FLAG_NORMAL_INK_ABSORPTION",     HT_FLAG_NORMAL_INK_ABSORPTION},
//      { L"HT_FLAG_INVERT_8BPP_BITMASK_IDX",   HT_FLAG_INVERT_8BPP_BITMASK_IDX},
        {NULL, 0}                               // The NULL entry is important
    };
#else
    DBG_FLAGS gafdGDIINFO_flHTFlags[] = {
        {NULL, 0}
    };
#endif

void
vDumpGDIINFO(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    GDIINFO     *pGdiInfo
    )

/*++

Routine Description:

    Dumps the members of a GDIINFO structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pGdiInfo - pointer to the GDIINFO strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pGdiInfo");

    // Return if strct to be dumped is invalid
    //
    if (!pGdiInfo)
    {
        OEMDebugMessage(L"\nGDIINFO [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nGDIINFO [%s]: %#x\r\n", pszLabel, pGdiInfo);
    OEMDebugMessage(L"\tulVersion: %#x\r\n", pGdiInfo->ulVersion);

    PWSTR pszulTechnology = L"???";
    switch (pGdiInfo->ulTechnology)
    {
        case DT_PLOTTER: pszulTechnology = L"DT_PLOTTER"; break;
        case DT_RASDISPLAY: pszulTechnology = L"DT_RASDISPLAY"; break;
        case DT_RASPRINTER: pszulTechnology = L"DT_RASPRINTER"; break;
        case DT_RASCAMERA: pszulTechnology = L"DT_RASCAMERA"; break;
        case DT_CHARSTREAM: pszulTechnology = L"DT_CHARSTREAM"; break;
    }
    OEMDebugMessage(L"\tulTechnology: %ld [%s]\r\n", pGdiInfo->ulTechnology, pszulTechnology);

    OEMDebugMessage(L"\tulHorzSize: %ld\r\n", pGdiInfo->ulHorzSize);
    OEMDebugMessage(L"\tulVertSize: %ld\r\n", pGdiInfo->ulVertSize);
    OEMDebugMessage(L"\tulHorzRes: %ld\r\n", pGdiInfo->ulHorzRes);
    OEMDebugMessage(L"\tulVertRes: %ld\r\n", pGdiInfo->ulVertRes);
    OEMDebugMessage(L"\tcBitsPixel: %ld\r\n", pGdiInfo->cBitsPixel);
    OEMDebugMessage(L"\tcPlanes: %ld\r\n", pGdiInfo->cPlanes);
    OEMDebugMessage(L"\tulNumColors: %ld\r\n", pGdiInfo->ulNumColors);
    OEMDebugMessage(L"\tflRaster: %#x\r\n", pGdiInfo->flRaster);
    OEMDebugMessage(L"\tulLogPixelsX: %ld\r\n", pGdiInfo->ulLogPixelsX);
    OEMDebugMessage(L"\tulLogPixelsY: %ld\r\n", pGdiInfo->ulLogPixelsY);

    PWSTR pszTextCaps = L"Text scrolling through DrvBitBlt/DrvCopyBits";
    if (TC_SCROLLBLT == (pGdiInfo->flTextCaps & TC_SCROLLBLT))
    {
        pszTextCaps = L"Text scrolling through DrvTextOut";
    }
    OEMDebugMessage(L"\tflTextCaps: %s\n", pszTextCaps);

    OEMDebugMessage(L"\tulDACRed: %#x\r\n", pGdiInfo->ulDACRed);
    OEMDebugMessage(L"\tulDACGreen: %#x\r\n", pGdiInfo->ulDACGreen);
    OEMDebugMessage(L"\tulDACBlue: %#x\r\n", pGdiInfo->ulDACBlue);
    OEMDebugMessage(L"\tulAspectX: %ld\r\n", pGdiInfo->ulAspectX);
    OEMDebugMessage(L"\tulAspectY: %ld\r\n", pGdiInfo->ulAspectY);
    OEMDebugMessage(L"\tulAspectXY: %ld\r\n", pGdiInfo->ulAspectXY);
    OEMDebugMessage(L"\txStyleStep: %ld\r\n", pGdiInfo->xStyleStep);
    OEMDebugMessage(L"\tyStyleStep: %ld\r\n", pGdiInfo->yStyleStep);
    OEMDebugMessage(L"\tdenStyleStep: %ld\r\n", pGdiInfo->denStyleStep);
    OEMDebugMessage(L"\tptlPhysOffset: (%ld, %ld)\r\n", pGdiInfo->ptlPhysOffset.x, pGdiInfo->ptlPhysOffset.y);
    OEMDebugMessage(L"\tszlPhysSize: (%ld, %ld)\r\n", pGdiInfo->szlPhysSize.cx, pGdiInfo->szlPhysSize.cy);
    OEMDebugMessage(L"\tulNumPalReg: %ld\r\n", pGdiInfo->ulNumPalReg);
    OEMDebugMessage(L"\tulDevicePelsDPI: %ld\r\n", pGdiInfo->ulDevicePelsDPI);

    PWSTR pszPrimaryOrder = L"???";
    switch(pGdiInfo->ulPrimaryOrder)
    {
        case PRIMARY_ORDER_ABC: pszPrimaryOrder = L"PRIMARY_ORDER_ABC [RGB/CMY]"; break;
        case PRIMARY_ORDER_ACB: pszPrimaryOrder = L"PRIMARY_ORDER_ACB [RBG/CYM]"; break;
        case PRIMARY_ORDER_BAC: pszPrimaryOrder = L"PRIMARY_ORDER_BAC [GRB/MCY]"; break;
        case PRIMARY_ORDER_BCA: pszPrimaryOrder = L"PRIMARY_ORDER_BCA [GBR/MYC]"; break;
        case PRIMARY_ORDER_CBA: pszPrimaryOrder = L"PRIMARY_ORDER_CBA [BGR/YMC]"; break;
        case PRIMARY_ORDER_CAB: pszPrimaryOrder = L"PRIMARY_ORDER_CAB [BRG/YCM]"; break;
    }
    OEMDebugMessage(L"\tulPrimaryOrder: %s\n", pszPrimaryOrder);

    PWSTR pszHTPat = L"???";
    switch(pGdiInfo->ulHTPatternSize)
    {
        case HT_PATSIZE_2x2         : pszHTPat = L"HT_PATSIZE_2x2 ";            break;
        case HT_PATSIZE_2x2_M       : pszHTPat = L"HT_PATSIZE_2x2_M";           break;
        case HT_PATSIZE_4x4         : pszHTPat = L"HT_PATSIZE_4x4";         break;
        case HT_PATSIZE_4x4_M       : pszHTPat = L"HT_PATSIZE_4x4_M";           break;
        case HT_PATSIZE_6x6         : pszHTPat = L"HT_PATSIZE_6x6";         break;
        case HT_PATSIZE_6x6_M       : pszHTPat = L"HT_PATSIZE_6x6_M";           break;
        case HT_PATSIZE_8x8         : pszHTPat = L"HT_PATSIZE_8x8";         break;
        case HT_PATSIZE_8x8_M       : pszHTPat = L"HT_PATSIZE_8x8_M";           break;
        case HT_PATSIZE_10x10       : pszHTPat = L"HT_PATSIZE_10x10";           break;
        case HT_PATSIZE_10x10_M     : pszHTPat = L"HT_PATSIZE_10x10_M";     break;
        case HT_PATSIZE_12x12       : pszHTPat = L"HT_PATSIZE_12x12";           break;
        case HT_PATSIZE_12x12_M     : pszHTPat = L"HT_PATSIZE_12x12_M";     break;
        case HT_PATSIZE_14x14       : pszHTPat = L"HT_PATSIZE_14x14";           break;
        case HT_PATSIZE_14x14_M     : pszHTPat = L"HT_PATSIZE_14x14_M";     break;
        case HT_PATSIZE_16x16       : pszHTPat = L"HT_PATSIZE_16x16";           break;
        case HT_PATSIZE_16x16_M     : pszHTPat = L"HT_PATSIZE_16x16_M";     break;
        case HT_PATSIZE_SUPERCELL   : pszHTPat = L"HT_PATSIZE_SUPERCELL";       break;
        case HT_PATSIZE_SUPERCELL_M : pszHTPat = L"HT_PATSIZE_SUPERCELL_M"; break;
        case HT_PATSIZE_USER        : pszHTPat = L"HT_PATSIZE_USER";            break;
//      case HT_PATSIZE_MAX_INDEX   : pszHTPat = L"HT_PATSIZE_MAX_INDEX";       break;
//      case HT_PATSIZE_DEFAULT     : pszHTPat = L"HT_PATSIZE_DEFAULT";     break;
    }
    OEMDebugMessage(L"\tulHTPatternSize: %s\n", pszHTPat);

    PWSTR pszHTOutputFormat = L"???";
    switch(pGdiInfo->ulHTOutputFormat)
    {
        case HT_FORMAT_1BPP         : pszHTOutputFormat = L"HT_FORMAT_1BPP";        break;
        case HT_FORMAT_4BPP         : pszHTOutputFormat = L"HT_FORMAT_4BPP";        break;
        case HT_FORMAT_4BPP_IRGB    : pszHTOutputFormat = L"HT_FORMAT_4BPP_IRGB";   break;
        case HT_FORMAT_8BPP         : pszHTOutputFormat = L"HT_FORMAT_8BPP";        break;
        case HT_FORMAT_16BPP        : pszHTOutputFormat = L"HT_FORMAT_16BPP";       break;
        case HT_FORMAT_24BPP        : pszHTOutputFormat = L"HT_FORMAT_24BPP";       break;
        case HT_FORMAT_32BPP        : pszHTOutputFormat = L"HT_FORMAT_32BPP";       break;
    }
    OEMDebugMessage(L"\tulHTOutputFormat: %s\n", pszHTOutputFormat);

    OEMDebugMessage(L"\tflHTFlags: ");
    vDumpFlags(pGdiInfo->flHTFlags, gafdGDIINFO_flHTFlags);
    OEMDebugMessage(L"\tulVRefresh: %ld\r\n", pGdiInfo->ulVRefresh);
    OEMDebugMessage(L"\tulBltAlignment: %ld\r\n", pGdiInfo->ulBltAlignment);
    OEMDebugMessage(L"\tulPanningHorzRes: %ld\r\n", pGdiInfo->ulPanningHorzRes);
    OEMDebugMessage(L"\tulPanningVertRes: %ld\r\n", pGdiInfo->ulPanningVertRes);
    OEMDebugMessage(L"\txPanningAlignment: %ld\r\n", pGdiInfo->xPanningAlignment);
    OEMDebugMessage(L"\tyPanningAlignment: %ld\r\n", pGdiInfo->yPanningAlignment);
    OEMDebugMessage(L"\tcxHTPat: %ld\r\n", pGdiInfo->cxHTPat);
    OEMDebugMessage(L"\tcyHTPat: %ld\r\n", pGdiInfo->cyHTPat);
    OEMDebugMessage(L"\tpHTPatA: %#x\r\n", pGdiInfo->pHTPatA);
    OEMDebugMessage(L"\tpHTPatB: %#x\r\n", pGdiInfo->pHTPatB);
    OEMDebugMessage(L"\tpHTPatC: %#x\r\n", pGdiInfo->pHTPatC);
    OEMDebugMessage(L"\tflShadeBlend: %#x\r\n", pGdiInfo->flShadeBlend);

    PWSTR pszPhysPixChars = L"???";
    switch(pGdiInfo->ulPhysicalPixelCharacteristics)
    {
        case PPC_DEFAULT: pszPhysPixChars = L"PPC_DEFAULT"; break;
        case PPC_BGR_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_HORIZONTAL_STRIPES"; break;
        case PPC_BGR_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_BGR_ORDER_VERTICAL_STRIPES"; break;
        case PPC_RGB_ORDER_HORIZONTAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_HORIZONTAL_STRIPES"; break;
        case PPC_RGB_ORDER_VERTICAL_STRIPES: pszPhysPixChars = L"PPC_RGB_ORDER_VERTICAL_STRIPES"; break;
        case PPC_UNDEFINED: pszPhysPixChars = L"PPC_UNDEFINED"; break;
    }
    OEMDebugMessage(L"\tulPhysicalPixelCharacteristics: %s\n", pszPhysPixChars);

    PWSTR pszPhysPixGamma = L"???";
    switch(pGdiInfo->ulPhysicalPixelGamma)
    {
        case PPG_DEFAULT: pszPhysPixGamma = L"PPG_DEFAULT"; break;
        case PPG_SRGB   : pszPhysPixGamma = L"PPG_SRGB"; break;
    }
    OEMDebugMessage(L"\tulPhysicalPixelGamma: %s\n", pszPhysPixGamma);

    OEMDebugMessage(L"\n");
}

#if DBG
    DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = {
        { L"GCAPS_BEZIERS",             GCAPS_BEZIERS},
        { L"GCAPS_GEOMETRICWIDE",       GCAPS_GEOMETRICWIDE},
        { L"GCAPS_ALTERNATEFILL",       GCAPS_ALTERNATEFILL},
        { L"GCAPS_WINDINGFILL",         GCAPS_WINDINGFILL},
        { L"GCAPS_HALFTONE",                GCAPS_HALFTONE},
        { L"GCAPS_COLOR_DITHER",        GCAPS_COLOR_DITHER},
        { L"GCAPS_HORIZSTRIKE",         GCAPS_HORIZSTRIKE},
        { L"GCAPS_VERTSTRIKE",          GCAPS_VERTSTRIKE},
        { L"GCAPS_OPAQUERECT",          GCAPS_OPAQUERECT},
        { L"GCAPS_VECTORFONT",          GCAPS_VECTORFONT},
        { L"GCAPS_MONO_DITHER",         GCAPS_MONO_DITHER},
        { L"GCAPS_ASYNCCHANGE",     GCAPS_ASYNCCHANGE},
        { L"GCAPS_ASYNCMOVE",           GCAPS_ASYNCMOVE},
        { L"GCAPS_DONTJOURNAL",         GCAPS_DONTJOURNAL},
        { L"GCAPS_DIRECTDRAW",          GCAPS_DIRECTDRAW},
        { L"GCAPS_ARBRUSHOPAQUE",       GCAPS_ARBRUSHOPAQUE},
        { L"GCAPS_PANNING",             GCAPS_PANNING},
        { L"GCAPS_PALMANAGED",          GCAPS_PALMANAGED},
        { L"GCAPS_DITHERONREALIZE",     GCAPS_DITHERONREALIZE},
        { L"GCAPS_NO64BITMEMACCESS",    GCAPS_NO64BITMEMACCESS},
        { L"GCAPS_FORCEDITHER",         GCAPS_FORCEDITHER},
        { L"GCAPS_GRAY16",              GCAPS_GRAY16},
        { L"GCAPS_ICM",                 GCAPS_ICM},
        { L"GCAPS_CMYKCOLOR",           GCAPS_CMYKCOLOR},
        { L"GCAPS_LAYERED",             GCAPS_LAYERED},
        { L"GCAPS_ARBRUSHTEXT",         GCAPS_ARBRUSHTEXT},
        { L"GCAPS_SCREENPRECISION",     GCAPS_SCREENPRECISION},
        { L"GCAPS_FONT_RASTERIZER",     GCAPS_FONT_RASTERIZER},
        { L"GCAPS_NUP",                 GCAPS_NUP},
        {NULL, 0}                       // The NULL entry is important
    };

    DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = {
        { L"GCAPS2_JPEGSRC",            GCAPS2_JPEGSRC},
        { L"GCAPS2_xxxx",               GCAPS2_xxxx},
        { L"GCAPS2_PNGSRC",             GCAPS2_PNGSRC},
        { L"GCAPS2_CHANGEGAMMARAMP",    GCAPS2_CHANGEGAMMARAMP},
        { L"GCAPS2_ALPHACURSOR",        GCAPS2_ALPHACURSOR},
        { L"GCAPS2_SYNCFLUSH",          GCAPS2_SYNCFLUSH},
        { L"GCAPS2_SYNCTIMER",          GCAPS2_SYNCTIMER},
        { L"GCAPS2_ICD_MULTIMON",       GCAPS2_ICD_MULTIMON},
        { L"GCAPS2_MOUSETRAILS",        GCAPS2_MOUSETRAILS},
        { L"GCAPS2_REMOTEDRIVER",       GCAPS2_REMOTEDRIVER},
        {NULL, 0}                       // The NULL entry is important
    };
#else
    DBG_FLAGS gafdDEVINFO_flGraphicsCaps[] = {
        {NULL, 0}
    };

    DBG_FLAGS gafdDEVINFO_flGraphicsCaps2[] = {
        {NULL, 0}
    };
#endif

void
vDumpDEVINFO(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    DEVINFO     *pDevInfo
    )

/*++

Routine Description:

    Dumps the members of a DEVINFO structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pDevInfo - pointer to the DEVINFO strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pDevInfo");

    // Return if strct to be dumped is invalid
    //
    if (!pDevInfo)
    {
        OEMDebugMessage(L"\nDEVINFO [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nDEVINFO [%s]: %#x\r\n", pszLabel, pDevInfo);
    OEMDebugMessage(L"\tflGraphicsCaps: ");
    vDumpFlags(pDevInfo->flGraphicsCaps, gafdDEVINFO_flGraphicsCaps);
    OEMDebugMessage(L"\tcFonts: %ld\r\n", pDevInfo->cFonts);

    PWSTR psziDitherFormat = L"0";
    switch (pDevInfo->iDitherFormat)
    {
        case BMF_1BPP : psziDitherFormat = L"BMF_1BPP" ; break;
        case BMF_4BPP : psziDitherFormat = L"BMF_4BPP" ; break;
        case BMF_8BPP : psziDitherFormat = L"BMF_8BPP" ; break;
        case BMF_16BPP: psziDitherFormat = L"BMF_16BPP"; break;
        case BMF_24BPP: psziDitherFormat = L"BMF_24BPP"; break;
        case BMF_32BPP: psziDitherFormat = L"BMF_32BPP"; break;
        case BMF_4RLE : psziDitherFormat = L"BMF_4RLE" ; break;
        case BMF_8RLE : psziDitherFormat = L"BMF_8RLE" ; break;
        case BMF_JPEG : psziDitherFormat = L"BMF_JPEG" ; break;
        case BMF_PNG  : psziDitherFormat = L"BMF_PNG " ; break;
    }
    OEMDebugMessage(L"\tiDitherFormat: %s\r\n", psziDitherFormat);

    OEMDebugMessage(L"\tcxDither: %ld\r\n", pDevInfo->cxDither);
    OEMDebugMessage(L"\tcyDither: %ld\r\n", pDevInfo->cyDither);
    OEMDebugMessage(L"\thpalDefault: %#x\r\n", pDevInfo->hpalDefault);
    OEMDebugMessage(L"\tflGraphicsCaps2: ");
    vDumpFlags(pDevInfo->flGraphicsCaps2, gafdDEVINFO_flGraphicsCaps2);

    OEMDebugMessage(L"\n");
}

void
vDumpBitmapInfoHeader(
    INT                 iDebugLevel,
    _In_ PWSTR          pszInLabel,
    BITMAPINFOHEADER    *pBitmapInfoHeader
    )

/*++

Routine Description:

    Dumps the members of a BITMAPINFOHEADER structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pBitmapInfoHeader - pointer to the BITMAPINFOHEADER strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pBitmapInfoHeader");

    // Return if strct to be dumped is invalid
    //
    if (!pBitmapInfoHeader)
    {
        OEMDebugMessage(L"\nBITMAPINFOHEADER [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nBITMAPINFOHEADER [%s]: %#x\r\n", pszLabel, pBitmapInfoHeader);
    OEMDebugMessage(L"\tbiSize: %ld\r\n", pBitmapInfoHeader->biSize);
    OEMDebugMessage(L"\tbiWidth: %ld\r\n", pBitmapInfoHeader->biWidth);
    OEMDebugMessage(L"\tbiHeight: %ld\r\n", pBitmapInfoHeader->biHeight);
    OEMDebugMessage(L"\tbiPlanes: %ld\r\n", pBitmapInfoHeader->biPlanes);
    OEMDebugMessage(L"\tbiBitCount: %ld\r\n", pBitmapInfoHeader->biBitCount);

    PWSTR pszbiCompression = L"0";
    switch (pBitmapInfoHeader->biCompression)
    {
        case BI_RGB : pszbiCompression = L"BI_RGB" ; break;
        case BI_RLE8 : pszbiCompression = L"BI_RLE8" ; break;
        case BI_RLE4 : pszbiCompression = L"BI_RLE4" ; break;
        case BI_BITFIELDS: pszbiCompression = L"BI_BITFIELDS"; break;
        case BI_JPEG : pszbiCompression = L"BI_JPEG" ; break;
        case BI_PNG  : pszbiCompression = L"BI_PNG " ; break;
    }
    OEMDebugMessage(L"\tbiCompression: %s\r\n", pszbiCompression);

    OEMDebugMessage(L"\tbiSizeImage: %ld\r\n", pBitmapInfoHeader->biSizeImage);
    OEMDebugMessage(L"\tbiXPelsPerMeter: %ld\r\n", pBitmapInfoHeader->biXPelsPerMeter);
    OEMDebugMessage(L"\tbiYPelsPerMeter: %ld\r\n", pBitmapInfoHeader->biYPelsPerMeter);
    OEMDebugMessage(L"\tbiClrUsed: %ld\r\n", pBitmapInfoHeader->biClrUsed);
    OEMDebugMessage(L"\tbiClrImportant: %ld\r\n", pBitmapInfoHeader->biClrImportant);

    OEMDebugMessage(L"\n");
}

void
vDumpPOINTL(
    INT          iDebugLevel,
    _In_ PWSTR   pszInLabel,
    POINTL       *pptl
    )

/*++

Routine Description:

    Dumps the members of a POINTL structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pptl - pointer to the POINTL strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pptl");

    // Return if strct to be dumped is invalid
    //
    if (!pptl)
    {
        OEMDebugMessage(L"\nPOINTL [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nPOINTL [%s]: %#x (%ld, %ld)\r\n", pszLabel, pptl, pptl->x, pptl->y);

    OEMDebugMessage(L"\n");
}

void
vDumpRECTL(
    INT          iDebugLevel,
    _In_ PWSTR   pszInLabel,
    RECTL        *prcl
    )

/*++

Routine Description:

    Dumps the members of a RECTL structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    prcl - pointer to the RECTL strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"prcl");

    // Return if strct to be dumped is invalid
    //
    if (!prcl)
    {
        OEMDebugMessage(L"\nRECTL [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nRECTL [%s]: %#x (%ld, %ld) (%ld, %ld)\r\n", pszLabel, prcl, prcl->left, prcl->top, prcl->right, prcl->bottom);

    OEMDebugMessage(L"\n");
}

#if DBG
    DBG_FLAGS gafdXLATEOBJ_flXlate[] = {
        { L"XO_DEVICE_ICM",     XO_DEVICE_ICM},
        { L"XO_FROM_CMYK",      XO_FROM_CMYK},
        { L"XO_HOST_ICM",       XO_HOST_ICM},
        { L"XO_TABLE",          XO_TABLE},
        { L"XO_TO_MONO",        XO_TO_MONO},
        { L"XO_TRIVIAL",            XO_TRIVIAL},
        {NULL, 0}               // The NULL entry is important
    };
#else
    DBG_FLAGS gafdXLATEOBJ_flXlate[] = {
        {NULL, 0}
    };
#endif

void
vDumpXLATEOBJ(
    INT         iDebugLevel,
    _In_ PWSTR  pszInLabel,
    XLATEOBJ    *pxlo
    )

/*++

Routine Description:

    Dumps the members of a XLATEOBJ structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pxlo - pointer to the XLATEOBJ strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pxlo");

    // Return if strct to be dumped is invalid
    //
    if (!pxlo)
    {
        OEMDebugMessage(L"\nXLATEOBJ [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nXLATEOBJ [%s]: %#x\r\n", pszLabel, pxlo);
    OEMDebugMessage(L"\tiUniq: %ld\r\n", pxlo->iUniq);
    OEMDebugMessage(L"\tflXlate: ");
    vDumpFlags(pxlo->flXlate, gafdXLATEOBJ_flXlate);
    OEMDebugMessage(L"\tiSrcType: %ld [obsolete]\r\n", pxlo->iSrcType);
    OEMDebugMessage(L"\tiDstType: %ld [obsolete]\r\n", pxlo->iDstType);
    OEMDebugMessage(L"\tcEntries: %ld\r\n", pxlo->cEntries);
    if (pxlo->pulXlate)
        OEMDebugMessage(L"\tpulXlate: %#x [%ld]\r\n", pxlo->pulXlate, *pxlo->pulXlate);
    else
        OEMDebugMessage(L"\tpulXlate: %#x\r\n", pxlo->pulXlate);

    OEMDebugMessage(L"\n");
}

#if DBG
    DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = {
        { L"CA_NEGATIVE",       CA_NEGATIVE},
        { L"CA_LOG_FILTER",     CA_LOG_FILTER},
        {NULL, 0}               // The NULL entry is important
    };
#else
    DBG_FLAGS gafdCOLORADJUSTMENT_caFlags[] = {
        {NULL, 0}
    };
#endif

void
vDumpCOLORADJUSTMENT(
    INT             iDebugLevel,
    _In_ PWSTR      pszInLabel,
    COLORADJUSTMENT *pca
    )

/*++

Routine Description:

    Dumps the members of a COLORADJUSTMENT structure.

Arguments:

    iDebugLevel - desired output debug level
    pszInLabel - output label string
    pca - pointer to the COLORADJUSTMENT strct to be dumped

Return Value:

    NONE

--*/

{
    // Check if the debug level is appropriate
    //
    if (iDebugLevel < giDebugLevel)
    {
        // Nothing to output here
        //
        return;
    }

    // Prepare the label string
    //
    PCWSTR pszLabel = EnsureLabel(pszInLabel, L"pca");

    // Return if strct to be dumped is invalid
    //
    if (!pca)
    {
        OEMDebugMessage(L"\nCOLORADJUSTMENT [%s]: NULL\r\n", pszLabel);

        // Nothing else to output
        //
        return;
    }

    // Format the data
    //
    OEMDebugMessage(L"\nCOLORADJUSTMENT [%s]: %#x\r\n", pszLabel, pca);
    OEMDebugMessage(L"\tcaSize: %#x\r\n", pca->caSize);
    OEMDebugMessage(L"\tcaFlags: ");
    if (pca->caFlags)
        vDumpFlags(pca->caFlags, gafdCOLORADJUSTMENT_caFlags);
    else
        OEMDebugMessage(L"NULL\r\n");

    PWSTR pszcaIlluminantIndex = L"0";
    switch (pca->caIlluminantIndex)
    {
        case ILLUMINANT_DEVICE_DEFAULT: pszcaIlluminantIndex = L"ILLUMINANT_DEVICE_DEFAULT" ; break;
        case ILLUMINANT_A: pszcaIlluminantIndex = L"ILLUMINANT_A [Tungsten lamp]" ; break;
        case ILLUMINANT_B: pszcaIlluminantIndex = L"ILLUMINANT_B [Noon sunlight]" ; break;
        case ILLUMINANT_C: pszcaIlluminantIndex = L"ILLUMINANT_C [NTSC daylight]" ; break;
        case ILLUMINANT_D50: pszcaIlluminantIndex = L"ILLUMINANT_D50 [Normal print]" ; break;
        case ILLUMINANT_D55: pszcaIlluminantIndex = L"ILLUMINANT_D55 [Bond paper print]" ; break;
        case ILLUMINANT_D65: pszcaIlluminantIndex = L"ILLUMINANT_D65 [Standard daylight]" ; break;
        case ILLUMINANT_D75: pszcaIlluminantIndex = L"ILLUMINANT_D75 [Northern daylight]" ; break;
        case ILLUMINANT_F2: pszcaIlluminantIndex = L"ILLUMINANT_F2 [Cool white lamp]" ; break;
    }
    OEMDebugMessage(L"\tcaIlluminantIndex: %s\r\n", pszcaIlluminantIndex);

    OEMDebugMessage(L"\tcaRedGamma: %d\r\n", (int)pca->caRedGamma);
    OEMDebugMessage(L"\tcaGreenGamma: %d\r\n", (int)pca->caGreenGamma);
    OEMDebugMessage(L"\tcaBlueGamma: %d\r\n", (int)pca->caBlueGamma);
    OEMDebugMessage(L"\tcaReferenceBlack: %d\r\n", (int)pca->caReferenceBlack);
    OEMDebugMessage(L"\tcaReferenceWhite: %d\r\n", (int)pca->caReferenceWhite);
    OEMDebugMessage(L"\tcaContrast: %d\r\n", (int)pca->caContrast);
    OEMDebugMessage(L"\tcaBrightness: %d\r\n", (int)pca->caBrightness);
    OEMDebugMessage(L"\tcaColorfulness: %d\r\n", (int)pca->caColorfulness);
    OEMDebugMessage(L"\tcaRedGreenTint: %d\r\n", (int)pca->caRedGreenTint);

    OEMDebugMessage(L"\n");
}

#endif

Our Services

  • What our customers say about us?

© 2011-2025 All Rights Reserved. Joya Systems. 4425 South Mopac Building II Suite 101 Austin, TX 78735 Tel: 800-DEV-KERNEL

Privacy Policy. Terms of use. Valid XHTML & CSS