279 lines
8.5 KiB
C++
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;
|
|
}
|