180 lines
4 KiB
C
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;
|
||
|
}
|