windows-nt/Source/XPSP1/NT/shell/services/lpc/apidispatcher.h
2020-09-26 16:20:57 +08:00

85 lines
3.7 KiB
C++

// --------------------------------------------------------------------------
// Module Name: APIDispatcher.h
//
// Copyright (c) 1999-2000, Microsoft Corporation
//
// A class that handles API requests in the server on a separate thread. Each
// thread is dedicated to respond to a single client. This is acceptable for
// a lightweight server.
//
// History: 1999-11-07 vtan created
// 2000-08-25 vtan moved from Neptune to Whistler
// --------------------------------------------------------------------------
#ifndef _APIDispatcher_
#define _APIDispatcher_
#include "KernelResources.h"
#include "PortMessage.h"
#include "Queue.h"
#include "WorkItem.h"
class CAPIRequest; // This would be circular otherwise
// --------------------------------------------------------------------------
// CAPIDispatcher
//
// Purpose: This class processes requests from a client when signaled to.
// CAPIDispatcher::QueueRequest is called by a thread which
// monitors an LPC port. Once the request is queued an event is
// signaled to wake the thread which processes client requests.
// The thread processes all queued requests and wait for the
// event to be signaled again.
//
// History: 1999-11-07 vtan created
// 2000-08-25 vtan moved from Neptune to Whistler
// --------------------------------------------------------------------------
class CAPIDispatcher : public CWorkItem
{
private:
friend class CCatchCorruptor;
CAPIDispatcher (void);
public:
CAPIDispatcher (HANDLE hClientProcess);
virtual ~CAPIDispatcher (void);
HANDLE GetClientProcess (void) const;
DWORD GetClientSessionID (void) const;
void SetPort (HANDLE hPort);
HANDLE GetSection (void);
void* GetSectionAddress (void) const;
NTSTATUS CloseConnection (void);
NTSTATUS QueueRequest (const CPortMessage& portMessage);
NTSTATUS ExecuteRequest (const CPortMessage& portMessage);
NTSTATUS RejectRequest (const CPortMessage& portMessage, NTSTATUS status) const;
virtual NTSTATUS CreateAndQueueRequest (const CPortMessage& portMessage) = 0;
virtual NTSTATUS CreateAndExecuteRequest (const CPortMessage& portMessage) = 0;
protected:
virtual void Entry (void);
NTSTATUS Execute (CAPIRequest *pAPIRequest) const;
virtual NTSTATUS CreateSection (void);
NTSTATUS SignalRequestPending (void);
private:
NTSTATUS SendReply (const CPortMessage& portMessage) const;
#ifdef DEBUG
static bool ExcludedStatusCodeForDebug (NTSTATUS status);
#endif /* DEBUG */
static LONG WINAPI DispatcherExceptionFilter (struct _EXCEPTION_POINTERS *pExceptionInfo);
protected:
HANDLE _hSection;
void* _pSection;
CQueue _queue;
private:
HANDLE _hProcessClient;
HANDLE _hPort;
bool _fRequestsPending,
_fConnectionClosed;
CCriticalSection _lock;
};
#endif /* _APIDispatcher_ */