mirror of https://github.com/lianthony/NT4.0
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.
237 lines
5.4 KiB
237 lines
5.4 KiB
/******************************* MODULE HEADER *******************************
|
|
* oemdm.c
|
|
*
|
|
* OEM devmode related functions.
|
|
*
|
|
*
|
|
* Copyright (C) 1996 Microsoft Corporation.
|
|
*
|
|
****************************************************************************/
|
|
|
|
#include "rasuipch.h"
|
|
#pragma hdrstop("rasuipch.h")
|
|
|
|
/**************************** Function Header ********************************
|
|
* OEMDrvUpgradePrinter
|
|
*
|
|
* RETURNS:
|
|
* (BOOL) TRUE for success.
|
|
*
|
|
* HISTORY:
|
|
*****************************************************************************/
|
|
BOOL
|
|
OEMDrvUpgradePrinter(
|
|
HANDLE hPrinter,
|
|
DWORD dwLevel,
|
|
LPBYTE pDriverUpgradeInfo)
|
|
{
|
|
PRASDDUIINFO pInfo = 0;
|
|
BOOL b= TRUE;
|
|
|
|
TRY
|
|
/* Get UI info and call OEM.
|
|
*/
|
|
pInfo = pGetUIInfo(hPrinter, 0, eInfo, eNoChange, eNoHelp);
|
|
if (!pInfo) {
|
|
b = FALSE;
|
|
LEAVE;
|
|
}
|
|
if (pInfo->OEMUIInfo.UIEntryPoints[OEM_IDX_UPGRADE]) {
|
|
b = (* (OEM_UPGRADEFN) pInfo->OEMUIInfo.UIEntryPoints[
|
|
OEM_IDX_UPGRADE])(dwLevel, pDriverUpgradeInfo);
|
|
}
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
if (pInfo) {
|
|
vReleaseUIInfo(&pInfo);
|
|
}
|
|
ENDFINALLY
|
|
return(b);
|
|
}
|
|
|
|
/**************************** Function Header ********************************
|
|
* OEMDrvDeviceCapabilities
|
|
*
|
|
* RETURNS:
|
|
* (DWORD)
|
|
*
|
|
* HISTORY:
|
|
*****************************************************************************/
|
|
DWORD
|
|
OEMDrvDeviceCapabilities(
|
|
PRASDDUIINFO pInfo,
|
|
HANDLE hPrinter,
|
|
PWSTR pDeviceName,
|
|
WORD iDevCap,
|
|
void *pvOutput,
|
|
DEVMODE *pDMIn)
|
|
{
|
|
DWORD result = GDI_ERROR;
|
|
ASSERT(pInfo);
|
|
|
|
TRY
|
|
|
|
if (pInfo && pInfo->OEMUIInfo.UIEntryPoints[OEM_IDX_DEVICECAPS]) {
|
|
result = (* (OEM_DEVCAPSFN) pInfo->OEMUIInfo.UIEntryPoints[
|
|
OEM_IDX_DEVICECAPS])(hPrinter, pDeviceName, iDevCap, pvOutput, pDMIn);
|
|
}
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
ENDFINALLY
|
|
|
|
return(result);
|
|
}
|
|
|
|
/**************************** Function Header ********************************
|
|
* OEMDevQueryPrintEx
|
|
*
|
|
* RETURNS:
|
|
* (BOOL) TRUE if OEM can print this job.
|
|
*
|
|
* HISTORY:
|
|
*****************************************************************************/
|
|
BOOL
|
|
OEMDevQueryPrintEx(
|
|
PDEVQUERYPRINT_INFO pDQPInfo)
|
|
{
|
|
PRASDDUIINFO pInfo = 0;
|
|
BOOL b = TRUE;
|
|
OEMDQPPARAM dqp;
|
|
|
|
TRY
|
|
/* Get UI info and call OEM.
|
|
*/
|
|
pInfo = pGetUIInfo(pDQPInfo->hPrinter, 0, eInfo, eNoChange, eNoHelp);
|
|
if (!pInfo) {
|
|
LEAVE;
|
|
}
|
|
|
|
dqp.cbSize = sizeof(OEMDQPPARAM);
|
|
dqp.pDQPInfo = pDQPInfo;
|
|
dqp.pOEMDevmode = pGetOEMExtra(pDQPInfo->pDevMode);
|
|
|
|
if (pInfo->OEMUIInfo.UIEntryPoints[OEM_IDX_QUERYPRINT]) {
|
|
b = (* (OEM_QUERYPRINTFN) pInfo->OEMUIInfo.UIEntryPoints[
|
|
OEM_IDX_QUERYPRINT])(&dqp);
|
|
}
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
if (pInfo) {
|
|
vReleaseUIInfo(&pInfo);
|
|
}
|
|
ENDFINALLY
|
|
return(b);
|
|
}
|
|
|
|
/**************************** Function Header ********************************
|
|
* dwGetDriverExtraSize
|
|
*
|
|
* RETURNS:
|
|
* (DWORD) Size of Rasdd's devmode, including OEM's extra data. This is
|
|
* the size of the current DEVMODE.
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
DWORD
|
|
dwGetDriverExtraSize(
|
|
PRASDDUIINFO pRasdduiInfo,
|
|
HANDLE hPrinter)
|
|
{
|
|
return(dwGetCurrentRasddExtraSize() + dwGetOEMDevmodeSize(pRasdduiInfo, hPrinter));
|
|
}
|
|
|
|
/**************************** Function Header ********************************
|
|
* dwGetDevmodeSize
|
|
*
|
|
* RETURNS:
|
|
* (DWORD) Size of Rasdd's devmode, including OEM's extra data.
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
DWORD
|
|
dwGetDevmodeSize(
|
|
PRASDDUIINFO pRasdduiInfo,
|
|
HANDLE hPrinter)
|
|
{
|
|
return(sizeof(DEVMODE) + dwGetDriverExtraSize(pRasdduiInfo, hPrinter));
|
|
}
|
|
|
|
/**************************** Function Header ********************************
|
|
* dwGetOEMDevmodeSize
|
|
*
|
|
* RETURNS:
|
|
* (DWORD) Size of OEM's extra devmode data.
|
|
*
|
|
* HISTORY:
|
|
*
|
|
*****************************************************************************/
|
|
DWORD
|
|
dwGetOEMDevmodeSize(
|
|
PRASDDUIINFO pRasdduiInfo,
|
|
HANDLE hPrinter)
|
|
{
|
|
DWORD cbNeeded = 0;
|
|
BOOL bReleaseUIInfo = FALSE;
|
|
|
|
TRY
|
|
/* Get UI info.
|
|
*/
|
|
if (pRasdduiInfo == 0) {
|
|
|
|
pRasdduiInfo = pGetUIInfo(hPrinter, 0, eInfo, eNoChange, eNoHelp);
|
|
|
|
/* If we don't have pRasdduiInfo by this point, either supplied or
|
|
* retrieved through hPrinter, abort.
|
|
*/
|
|
if (pRasdduiInfo == 0) {
|
|
LEAVE;
|
|
}
|
|
bReleaseUIInfo = TRUE;
|
|
}
|
|
|
|
/* If we do have pRasdduiInfo, use it if we already know the size.
|
|
* If not, continue and get it from OEM.
|
|
*/
|
|
else if (pRasdduiInfo->OEMUIInfo.dwDevmodeExtra != -1) {
|
|
cbNeeded = pRasdduiInfo->OEMUIInfo.dwDevmodeExtra;
|
|
LEAVE;
|
|
}
|
|
|
|
|
|
/* We should now have pRasdduiInfo. If there's no OEM or OEM has no devmode,
|
|
* we're done.
|
|
*/
|
|
if (!(pRasdduiInfo->OEMUIInfo.flags & OEMUI_HASCUSTOMUI) ||
|
|
!(pRasdduiInfo->OEMUIInfo.flags & OEMUI_HASDEVMODE)) {
|
|
LEAVE;
|
|
}
|
|
|
|
/* Call OEM.
|
|
*/
|
|
cbNeeded = dwLibGetOEMDevmodeSize(pRasdduiInfo->hPrinter, pRasdduiInfo->PI.pwstrModel,
|
|
pRasdduiInfo->OEMUIInfo.hOEMLib,
|
|
(OEM_DEVMODEFN) pRasdduiInfo->OEMUIInfo.UIEntryPoints[OEM_IDX_DEVMODE]);
|
|
pRasdduiInfo->OEMUIInfo.dwDevmodeExtra = cbNeeded;
|
|
|
|
ENDTRY
|
|
|
|
FINALLY
|
|
|
|
/* If we loaded UIIinfo just for this call, release it now.
|
|
*/
|
|
if (bReleaseUIInfo) {
|
|
vReleaseUIInfo(&pRasdduiInfo);
|
|
}
|
|
ENDFINALLY
|
|
|
|
return(cbNeeded);
|
|
}
|
|
|