Source code of Windows XP (NT5)
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
|
|
// --------------------------------------------------------------------------
// 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_ */
|