85 lines
3.7 KiB
C++
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_ */
|
|
|