199 lines
4.1 KiB
C
199 lines
4.1 KiB
C
|
/*++
|
||
|
|
||
|
Copyright (c) 1991-92 Microsoft Corporation
|
||
|
|
||
|
Module Name:
|
||
|
|
||
|
splinit.c
|
||
|
|
||
|
Abstract:
|
||
|
|
||
|
Spooler Service Initialization Routines.
|
||
|
The following is a list of functions in this file:
|
||
|
|
||
|
SpoolerInitializeSpooler
|
||
|
|
||
|
Author:
|
||
|
|
||
|
Krishna Ganugapati (KrishnaG) 17-Oct-1993
|
||
|
|
||
|
Environment:
|
||
|
|
||
|
User Mode - Win32
|
||
|
|
||
|
Notes:
|
||
|
|
||
|
optional-notes
|
||
|
|
||
|
Revision History:
|
||
|
|
||
|
17-October-1993 KrishnaG
|
||
|
created.
|
||
|
|
||
|
|
||
|
--*/
|
||
|
//
|
||
|
// Includes
|
||
|
//
|
||
|
|
||
|
#define NOMINMAX
|
||
|
#include <nt.h>
|
||
|
#include <ntrtl.h>
|
||
|
#include <nturtl.h>
|
||
|
#include <windows.h>
|
||
|
#include <winspool.h>
|
||
|
#include <winsplp.h>
|
||
|
#include <rpc.h>
|
||
|
#include "splsvr.h"
|
||
|
#include "splr.h"
|
||
|
#include "server.h"
|
||
|
#include "client.h"
|
||
|
#include "kmspool.h"
|
||
|
|
||
|
#include <winsvc.h> // Service control APIs
|
||
|
#include <lmsname.h>
|
||
|
#include <rpc.h> // DataTypes and runtime APIs
|
||
|
|
||
|
|
||
|
DWORD MessageThreadId; // message thread ID
|
||
|
|
||
|
extern DWORD GetSpoolMessages(VOID);
|
||
|
|
||
|
|
||
|
DWORD
|
||
|
SpoolerInitializeSpooler(
|
||
|
DWORD argc,
|
||
|
LPTSTR *argv
|
||
|
)
|
||
|
|
||
|
/*++
|
||
|
|
||
|
Routine Description:
|
||
|
|
||
|
Registers the control handler with the dispatcher thread. Then it
|
||
|
performs all initialization including the starting of the RPC server.
|
||
|
If any of the initialization fails, SpoolerStatusUpdate is called so that the
|
||
|
status is updated and the thread is terminated.
|
||
|
|
||
|
Arguments:
|
||
|
|
||
|
|
||
|
|
||
|
Return Value:
|
||
|
|
||
|
|
||
|
|
||
|
--*/
|
||
|
|
||
|
{
|
||
|
RPC_STATUS rpcStatus;
|
||
|
DWORD Win32status;
|
||
|
HANDLE hThread;
|
||
|
DWORD ThreadId;
|
||
|
DWORD i;
|
||
|
|
||
|
//
|
||
|
// Initialize the ThreadCritical Section which serializes access to
|
||
|
// the Status database.
|
||
|
//
|
||
|
|
||
|
InitializeCriticalSection(&ThreadCriticalSection);
|
||
|
|
||
|
//
|
||
|
// Initialize the status structure
|
||
|
//
|
||
|
|
||
|
SpoolerStatusInit();
|
||
|
|
||
|
//
|
||
|
// Register this service with the ControlHandler.
|
||
|
// Now we can accept control requests and be requested to UNINSTALL.
|
||
|
//
|
||
|
|
||
|
DBGMSG(DBG_TRACE, ("Calling RegisterServiceCtrlHandler\n"));
|
||
|
if ((SpoolerStatusHandle = RegisterServiceCtrlHandler(
|
||
|
SERVICE_SPOOLER,
|
||
|
SpoolerCtrlHandler
|
||
|
)) == (SERVICE_STATUS_HANDLE) NULL) {
|
||
|
|
||
|
Win32status = GetLastError();
|
||
|
|
||
|
DBGMSG(DBG_ERROR,
|
||
|
("FAILURE: RegisterServiceCtrlHandler status = %d\n", Win32status));
|
||
|
|
||
|
return( SpoolerBeginForcedShutdown (
|
||
|
IMMEDIATE,
|
||
|
Win32status,
|
||
|
(DWORD)0
|
||
|
));
|
||
|
}
|
||
|
|
||
|
//
|
||
|
// Notify that installation is pending
|
||
|
//
|
||
|
|
||
|
SpoolerState = SpoolerStatusUpdate(STARTING);
|
||
|
|
||
|
if (SpoolerState != STARTING) {
|
||
|
//
|
||
|
// An UNINSTALL control request must have been received
|
||
|
//
|
||
|
return(SpoolerState);
|
||
|
}
|
||
|
|
||
|
DBGMSG(DBG_TRACE,
|
||
|
("SpoolerInitializeSpooler:getting ready to start RPC server\n"));
|
||
|
|
||
|
rpcStatus = SpoolerStartRpcServer();
|
||
|
|
||
|
|
||
|
if (rpcStatus != RPC_S_OK) {
|
||
|
DBGMSG(DBG_ERROR, ("RPC Initialization Failed %d\n", rpcStatus));
|
||
|
return (SpoolerBeginForcedShutdown(
|
||
|
PENDING,
|
||
|
rpcStatus,
|
||
|
(DWORD)0
|
||
|
));
|
||
|
}
|
||
|
|
||
|
SpoolerStatusUpdate(STARTING);
|
||
|
|
||
|
|
||
|
DBGMSG(DBG_TRACE,
|
||
|
("SpoolerInitializeSpooler:Getting ready to kick off the Router\n"));
|
||
|
|
||
|
|
||
|
hThread = CreateThread(NULL,
|
||
|
64*1024,
|
||
|
(LPTHREAD_START_ROUTINE)InitializeRouter,
|
||
|
NULL,
|
||
|
0,
|
||
|
&ThreadId);
|
||
|
|
||
|
CloseHandle(hThread);
|
||
|
|
||
|
|
||
|
//
|
||
|
// Create Kernel Spooler Message Thread
|
||
|
//
|
||
|
|
||
|
Win32status = GetSpoolMessages();
|
||
|
if (Win32status != ERROR_SUCCESS) {
|
||
|
DBGMSG(DBG_WARNING, ("Kernel Spooler Messaging Initialization Failed %d\n", Win32status));
|
||
|
return SpoolerBeginForcedShutdown(PENDING, Win32status, (DWORD) 0);
|
||
|
}
|
||
|
|
||
|
|
||
|
//
|
||
|
// Update the status to indicate that installation is complete.
|
||
|
// Get the current state back in case the ControlHandling thread has
|
||
|
// told us to shutdown.
|
||
|
//
|
||
|
|
||
|
DBGMSG(DBG_TRACE, ("Exiting SpoolerInitializeSpooler - Init Done!\n"));
|
||
|
|
||
|
return (SpoolerStatusUpdate(RUNNING));
|
||
|
}
|
||
|
|
||
|
|