2025-11-28 00:35:46 +09:00

279 lines
8.5 KiB
C++

// 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 (c) Microsoft Corporation. All rights reserved.
#include "stdafx.h"
HRESULT
IsXPSCapableDriver(
HDC hdc
)
{
CHAR lpszOutData[ARRAYSIZE(gszTechnologyIdentifier)] = {0};
INT cbOutput = (INT) ( strlen(gszTechnologyIdentifier) + 1 );
HRESULT hr = E_FAIL;
if ( 0 > ExtEscape(
hdc, // handle to DC
GETTECHNOLOGY, // escape function
0, // size of input structure
NULL, // input structure
cbOutput, // size of output structure
lpszOutData // output structure
)
)
{
hr = HRESULT_FROM_WIN32(GetLastError());
}
else
{
//
// ExtEscape succeeded. Compare the technology returned with
// the technology we want it to return.
//
if (0 == strcmp(lpszOutData, gszTechnologyIdentifier) )
{
hr = S_OK;
}
else
{
hr = S_FALSE;
}
}
return hr;
}
HRESULT
PutTogetherEscapeStructureForImage(
__in ULONG OpCode,
__in_bcount(cbInBuffer) PBYTE pbInBuffer,
__in DWORD cbInBuffer,
__in LPCSTR pszURI,
__deref_out_bcount(*pcbOutBuffer) PBYTE *ppbOutBuffer,
__out PDWORD pcbOutBuffer
)
{
P_MXDC_ESCAPE_HEADER_T pEscHeader = NULL;
P_MXDC_XPS_S0PAGE_RESOURCE_T pEscData = NULL;
P_MXDC_S0PAGE_RESOURCE_ESCAPE_T pEscBuffer = NULL;
DWORD cbEscBuffer = 0;
HRESULT hr = S_OK;
if ( NULL == pbInBuffer ||
0 == cbInBuffer ||
NULL == ppbOutBuffer ||
NULL == pcbOutBuffer )
{
hr = E_INVALIDARG;
}
if ( SUCCEEDED(hr) )
{
*ppbOutBuffer = NULL;
*pcbOutBuffer = 0;
//
// bData[1] is the beginig of the data buffer. The actual
// size of the buffer is cbBuffer (which includes bData[1]
// So we subtract 1
//
cbEscBuffer = sizeof(MXDC_S0PAGE_RESOURCE_ESCAPE_T) - sizeof(pEscData->bData);
cbEscBuffer += cbInBuffer;
// Allocate contiguous data
pEscBuffer = (P_MXDC_S0PAGE_RESOURCE_ESCAPE_T) MemAlloc(cbEscBuffer);
if ( NULL == pEscBuffer)
{
hr = E_OUTOFMEMORY;
}
else
{
// Zero out allocated memory
memset((PBYTE)pEscBuffer, 0, cbEscBuffer);
pEscHeader = &(pEscBuffer->mxdcEscape);
pEscData = &(pEscBuffer->xpsS0PageResourcePassthrough);
// Fill out the Escape Header data
pEscHeader->cbInput = cbEscBuffer;
pEscHeader->cbOutput = 0;
pEscHeader->opCode = OpCode;
// Fill out the Escape data
pEscData->dwSize = sizeof(MXDC_XPS_S0PAGE_RESOURCE_T) + cbInBuffer - sizeof(pEscData->bData);
pEscData->dwResourceType = MXDC_RESOURCE_JPEG;
hr = StringCchCopyA((LPSTR)pEscData->szUri, CCHOF(pEscData->szUri), pszURI);
if ( SUCCEEDED(hr) )
{
pEscData->dwDataSize = cbInBuffer;
memcpy(&pEscData->bData, pbInBuffer, cbInBuffer);
}
}
}
if ( SUCCEEDED(hr ) )
{
*ppbOutBuffer = (PBYTE)pEscBuffer;
*pcbOutBuffer = cbEscBuffer;
}
return hr;
}
HRESULT
PutTogetherEscapeStructureForPrintTicket(
__in ULONG OpCode,
__in_bcount(cbInBuffer) PBYTE pbInBuffer,
__in DWORD cbInBuffer,
__deref_out_bcount(*pcbOutBuffer) PBYTE *ppbOutBuffer,
__out PDWORD pcbOutBuffer
)
{
P_MXDC_ESCAPE_HEADER_T pEscHeader = NULL;
P_MXDC_PRINTTICKET_DATA_T pEscData = NULL;
P_MXDC_PRINTTICKET_ESCAPE_T pEscBuffer = NULL;
DWORD cbEscBuffer = 0;
HRESULT hr = S_OK;
if ( NULL == pbInBuffer ||
0 == cbInBuffer ||
NULL == ppbOutBuffer ||
NULL == pcbOutBuffer )
{
hr = E_INVALIDARG;
}
if ( SUCCEEDED(hr) )
{
*ppbOutBuffer = NULL;
*pcbOutBuffer = 0;
//
// bData[1] is the beginig of the data buffer. The actual
// size of the buffer is cbBuffer (which includes bData[1]
// So we subtract 1
//
cbEscBuffer = sizeof(MXDC_PRINTTICKET_ESCAPE_T) - sizeof(pEscData->bData);
cbEscBuffer += cbInBuffer;
// Allocate contiguous data
pEscBuffer = (P_MXDC_PRINTTICKET_ESCAPE_T) MemAlloc(cbEscBuffer);
if ( NULL == pEscBuffer )
{
hr = E_OUTOFMEMORY;
}
else
{
// Zero out allocated memory
memset((PBYTE)pEscBuffer, 0, cbEscBuffer);
pEscHeader = &(pEscBuffer->mxdcEscape);
pEscData = &(pEscBuffer->printTicketData);
// Fill out the Escape Header data
pEscHeader->cbInput = cbEscBuffer;
pEscHeader->cbOutput = 0;
pEscHeader->opCode = OpCode;
// Fill out the actual escape data
pEscData->dwDataSize = cbInBuffer + sizeof(pEscData->dwDataSize);
memcpy(&pEscData->bData, pbInBuffer, cbInBuffer);
}
}
if ( SUCCEEDED(hr ) )
{
*ppbOutBuffer = (PBYTE)pEscBuffer;
*pcbOutBuffer = cbEscBuffer;
}
return hr;
}
HRESULT
PutTogetherEscapeStructureForFixedPage(
__in ULONG OpCode,
__in_bcount(cbInBuffer) PBYTE pbInBuffer,
__in DWORD cbInBuffer,
__deref_out_bcount(*pcbOutBuffer) PBYTE *ppbOutBuffer,
__out PDWORD pcbOutBuffer
)
{
P_MXDC_S0PAGE_PASSTHROUGH_ESCAPE_T pEscBuffer = NULL;
P_MXDC_ESCAPE_HEADER_T pEscHeader = NULL;
P_MXDC_S0PAGE_DATA_T pEscData = NULL;
DWORD cbEscBuffer = 0;
HRESULT hr = S_OK;
if ( NULL == pbInBuffer ||
0 == cbInBuffer ||
NULL == ppbOutBuffer ||
NULL == pcbOutBuffer )
{
hr = E_INVALIDARG;
}
if ( SUCCEEDED(hr) )
{
*ppbOutBuffer = NULL;
*pcbOutBuffer = 0;
//
// bData[1] is the beginig of the data buffer. The actual
// size of the buffer is cbBuffer (which includes bData[1]
// So we subtract 1
//
cbEscBuffer = sizeof(MXDC_S0PAGE_PASSTHROUGH_ESCAPE_T) - sizeof(pEscData->bData);
cbEscBuffer += cbInBuffer;
// Allocate contiguous data
pEscBuffer = (P_MXDC_S0PAGE_PASSTHROUGH_ESCAPE_T)MemAlloc(cbEscBuffer);
if ( NULL == pEscBuffer )
{
hr = E_OUTOFMEMORY;
}
else
{
// Zero out allocated memory
// Note that memory allocated is not just sizeof(P_MXDC_S0PAGE_PASSTHROUGH_ESCAPE_T)
// There are extra bytes at the end of the structure.
memset((PBYTE)pEscBuffer, 0, cbEscBuffer);
pEscHeader = &(pEscBuffer->mxdcEscape);
pEscData = &(pEscBuffer->xpsS0PageData);
// Fill out the Escape Header data
pEscHeader->cbInput = cbEscBuffer;
pEscHeader->cbOutput = 0;
pEscHeader->opCode = OpCode;
// Fill out the actual escape data
pEscData->dwSize = cbInBuffer + sizeof(pEscData->dwSize);
memcpy(&pEscData->bData, pbInBuffer, cbInBuffer);
}
}
if ( SUCCEEDED(hr ) )
{
*ppbOutBuffer = (PBYTE)pEscBuffer;
*pcbOutBuffer = cbEscBuffer;
}
return hr;
}