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

572 lines
9 KiB
C

/*++
Copyright (c) 1990-1994 Microsoft Corporation
All rights reserved
Module Name:
Change.c
Abstract:
Handles new WaitForPrinterChange implementation and:
FindFirstPrinterChangeNotification (client and remote)
FindNextPrinterChangeNotification
FindClosePrinterChangeNotification
ReplyOpenPrinter
ReplyClosePrinter
RouterReplyPrinter{Ex}
RefreshPrinterChangeNotification
Author:
Albert Ting (AlbertT) 18-Jan-94
Environment:
User Mode -Win32
Revision History:
--*/
#include <windows.h>
#include <rpc.h>
#include <winspool.h>
#include <offsets.h>
#include "server.h"
#include "winspl.h"
BOOL
RouterFindFirstPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
DWORD dwPID,
PPRINTER_NOTIFY_OPTIONS pPrinterNotifyOptions,
PHANDLE phEvent);
BOOL
RemoteFindFirstPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
LPWSTR pszLocalMachine,
DWORD dwPrinterRemote,
PPRINTER_NOTIFY_OPTIONS pPrinterNotifyOptions);
BOOL
RouterFindNextPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
LPDWORD pfdwChange,
PVOID pPrinterNotifyRefresh,
PVOID* ppPrinterNotifyInfo);
BOOL
RouterReplyPrinter(
HANDLE hNotify,
DWORD dwColor,
DWORD fdwFlags,
PDWORD pdwResult,
DWORD dwType,
PVOID pBuffer);
BOOL
RouterRefreshPrinterChangeNotification(
HANDLE hPrinter,
DWORD dwColor,
PVOID pPrinterNotifyRefresh,
PPRINTER_NOTIFY_INFO* ppInfo);
BOOL
ReplyOpenPrinter(
DWORD dwPrinterRemote,
PHANDLE phNotify,
DWORD dwType,
DWORD cbBuffer,
LPBYTE pBuffer);
BOOL
ReplyClosePrinter(
HANDLE hNotify);
DWORD
RpcRouterFindFirstPrinterChangeNotificationOld(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
LPWSTR pszLocalMachine,
DWORD dwPrinterLocal)
/*++
Routine Description:
This call is only used by beta2 daytona, but we can't remove it
since this will allow beta2 to crash daytona. (Someday, when
beta2 is long gone, we can reuse this slot for something else.)
Arguments:
Return Value:
--*/
{
return ERROR_INVALID_FUNCTION;
}
//
// Old version for Daytona.
//
DWORD
RpcRemoteFindFirstPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
LPWSTR pszLocalMachine,
DWORD dwPrinterLocal,
DWORD cbBuffer,
LPBYTE pBuffer)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RemoteFindFirstPrinterChangeNotification(hPrinter,
fdwFlags,
fdwOptions,
pszLocalMachine,
dwPrinterLocal,
NULL);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcRemoteFindFirstPrinterChangeNotificationEx(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
LPWSTR pszLocalMachine,
DWORD dwPrinterLocal,
PRPC_V2_NOTIFY_OPTIONS pRpcV2NotifyOptions)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RemoteFindFirstPrinterChangeNotification(
hPrinter,
fdwFlags,
fdwOptions,
pszLocalMachine,
dwPrinterLocal,
(PPRINTER_NOTIFY_OPTIONS)pRpcV2NotifyOptions);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcClientFindFirstPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
DWORD fdwOptions,
DWORD dwPID,
PRPC_V2_NOTIFY_OPTIONS pRpcV2NotifyOptions,
LPDWORD pdwEvent)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RouterFindFirstPrinterChangeNotification(
hPrinter,
fdwFlags,
fdwOptions,
dwPID,
(PPRINTER_NOTIFY_OPTIONS)pRpcV2NotifyOptions,
(PHANDLE)pdwEvent);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcFindNextPrinterChangeNotification(
HANDLE hPrinter,
DWORD fdwFlags,
LPDWORD pfdwChange,
PRPC_V2_NOTIFY_OPTIONS pRpcV2NotifyOptions,
PRPC_V2_NOTIFY_INFO* ppInfo)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RouterFindNextPrinterChangeNotification(
hPrinter,
fdwFlags,
pfdwChange,
pRpcV2NotifyOptions,
ppInfo);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcFindClosePrinterChangeNotification(
HANDLE hPrinter)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = FindClosePrinterChangeNotification(hPrinter);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcReplyOpenPrinter(
LPWSTR pszLocalMachine,
PHANDLE phNotify,
DWORD dwPrinterRemote,
DWORD dwType,
DWORD cbBuffer,
LPBYTE pBuffer)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = ReplyOpenPrinter(dwPrinterRemote,
phNotify,
dwType,
cbBuffer,
pBuffer);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcReplyClosePrinter(
PHANDLE phNotify)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = ReplyClosePrinter(*phNotify);
RpcRevertToSelf();
if (bRet) {
*phNotify = NULL;
return ERROR_SUCCESS;
}
else
return GetLastError();
}
DWORD
RpcRouterReplyPrinter(
HANDLE hNotify,
DWORD fdwFlags,
DWORD cbBuffer,
LPBYTE pBuffer)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RouterReplyPrinter(hNotify,
0,
fdwFlags,
NULL,
0,
NULL);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcRouterReplyPrinterEx(
HANDLE hNotify,
DWORD dwColor,
DWORD fdwFlags,
PDWORD pdwResult,
DWORD dwReplyType,
RPC_V2_UREPLY_PRINTER Reply)
/*++
Routine Description:
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RouterReplyPrinter(hNotify,
dwColor,
fdwFlags,
pdwResult,
dwReplyType,
Reply.pInfo);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}
DWORD
RpcRouterRefreshPrinterChangeNotification(
HANDLE hPrinter,
DWORD dwColor,
PRPC_V2_NOTIFY_OPTIONS pRpcV2NotifyOptions,
PRPC_V2_NOTIFY_INFO* ppInfo)
/*++
Routine Description:
Updates info.
Arguments:
Return Value:
--*/
{
BOOL bRet;
RPC_STATUS Status;
if ((Status = RpcImpersonateClient(NULL)) != RPC_S_OK)
{
SetLastError(Status);
return FALSE;
}
bRet = RouterRefreshPrinterChangeNotification(
hPrinter,
dwColor,
(PPRINTER_NOTIFY_OPTIONS)pRpcV2NotifyOptions,
(PPRINTER_NOTIFY_INFO*)ppInfo);
RpcRevertToSelf();
if (bRet)
return FALSE;
else
return GetLastError();
}