windows-nt/Source/XPSP1/NT/printscan/print/spooler/spoolss/client/drvsetup.c
2020-09-26 16:20:57 +08:00

180 lines
4 KiB
C

/*++
Copyright (c) 2000 Microsoft Corporation
All rights reserved
Module Name:
drvsetup.c
Abstract:
This file implements the interface between winspool.drv and ntprint.dll.
Author:
Mark Lawrence (mlawrenc).
Environment:
User Mode -Win32
Revision History:
Larry Zhu (LZhu) Feb 10 -- Added ShowPrintUpgUI
--*/
#include "precomp.h"
#pragma hdrstop
#include "client.h"
#include "drvsetup.h"
/*++
Routine Name:
InitializeSetupInterface
Routine Description:
This routine initializes the setup interfaces. This setup interface could be
expanded over time to support more advance driver options.
Arguments:
pSetupInterface - The setup interface to load and initialize.
Return Value:
Status Return.
--*/
DWORD
InitializeSetupInterface(
IN OUT TSetupInterface *pSetupInterface
)
{
DWORD Status = ERROR_SUCCESS;
pSetupInterface->hLibrary = NULL;
pSetupInterface->pfnSetupShowBlockedDriverUI = NULL;
pSetupInterface->hLibrary = LoadLibrary(L"ntprint.dll");
Status = pSetupInterface->hLibrary != NULL ? ERROR_SUCCESS : GetLastError();
if (Status == ERROR_SUCCESS)
{
pSetupInterface->pfnSetupShowBlockedDriverUI= (pfPSetupShowBlockedDriverUI)
GetProcAddress(pSetupInterface->hLibrary,
"PSetupShowBlockedDriverUI");
Status = pSetupInterface->pfnSetupShowBlockedDriverUI ? ERROR_SUCCESS : ERROR_INVALID_FUNCTION;
}
return Status;
}
/*++
Routine Name:
FreeSetupInterface
Routine Description:
This routine frees the Setup Interface.
Arguments:
pSetupInterface - The setup interface to unload.
Return Value:
Status Return.
--*/
DWORD
FreeSetupInterface(
IN OUT TSetupInterface *pSetupInterface
)
{
DWORD Status = ERROR_SUCCESS;
if (pSetupInterface->hLibrary)
{
Status = FreeLibrary(pSetupInterface->hLibrary) ? ERROR_SUCCESS : GetLastError();
}
return Status;
}
/*++
Routine Name:
ShowPrintUpgUI
Routine Description:
This routine asks ntprint.dll to popup a message box either indicates
the driver is blocked and installation will abort or at the case of
warned driver, whether to preceed the driver installation.
Arguments:
dwBlockingStatus - ErrorCode for blocked or Warned driver
Return Value:
DWORD - If ERROR_SUCCESS, the driver may be installed, otherwise an error
code indicating the failure.
--*/
DWORD
ShowPrintUpgUI(
IN DWORD dwBlockingErrorCode
)
{
DWORD dwStatus = ERROR_SUCCESS;
HWND hWndParent = NULL;
DWORD dwBlockingStatus = BSP_PRINTER_DRIVER_OK;
TSetupInterface SetupInterface;
if (ERROR_PRINTER_DRIVER_BLOCKED == dwBlockingErrorCode)
{
dwBlockingStatus = BSP_PRINTER_DRIVER_BLOCKED;
}
else if (ERROR_PRINTER_DRIVER_WARNED == dwBlockingErrorCode)
{
dwBlockingStatus = BSP_PRINTER_DRIVER_WARNED;
}
else
{
dwStatus = ERROR_INVALID_PARAMETER;
}
if (ERROR_SUCCESS == dwStatus)
{
dwStatus = InitializeSetupInterface(&SetupInterface);
if ((dwStatus == ERROR_SUCCESS))
{
hWndParent = SUCCEEDED(GetCurrentThreadLastPopup(&hWndParent)) ? hWndParent : NULL;
//
// Ask the user what they want to do. If they don't want to proceed,
// then the error is what the would get from the localspl call.
//
dwStatus = (SetupInterface.pfnSetupShowBlockedDriverUI(hWndParent, dwBlockingStatus) & BSP_PRINTER_DRIVER_PROCEEDED) ? ERROR_SUCCESS : dwBlockingErrorCode;
}
(VOID)FreeSetupInterface(&SetupInterface);
}
return dwStatus;
}