Windows2003-3790/termsrv/newclient/rdpdr/w32proc.h
2020-09-30 16:53:55 +02:00

353 lines
8.5 KiB
C++

/*++
Copyright (c) 1998-2000 Microsoft Corporation
Module Name:
w32proc.h
Abstract:
Contains the parent of the Win32 IO processing class hierarchy
for TS Device Redirection, W32ProcObj.
Author:
Madan Appiah (madana) 17-Sep-1998
Revision History:
--*/
#ifndef __W32PROC_H__
#define __W32PROC_H__
#include "proc.h"
#include "w32drprn.h"
#include "w32dispq.h"
#include "thrpool.h"
///////////////////////////////////////////////////////////////
//
// Registry Key and Value Names.
//
#define REGISTRY_KEY_NAME_SIZE MAX_PATH
#define REGISTRY_VALUE_NAME_SIZE 64
#define REGISTRY_DATA_SIZE 256
#ifndef OS_WINCE
#define REGISTRY_ALLOC_DATA_SIZE (8 * 1024)
#else
#define REGISTRY_ALLOC_DATA_SIZE (4 * 1024)
#endif
// Parent key for device redirection registry values.
#define REG_RDPDR_PARAMETER_PATH \
_T("Software\\Microsoft\\Terminal Server Client\\Default\\AddIns\\RDPDR")
///////////////////////////////////////////////////////////////
//
// Configurable Value Names and Defaults
//
#define REGISTRY_BACKGROUNDTHREAD_TIMEOUT_NAME _T("ThreadTimeOut")
#define REGISTRY_BACKGROUNDTHREAD_TIMEOUT_DEFAULT INFINITE
///////////////////////////////////////////////////////////////
//
// Other Defines
//
#define RDPDR_MODULE_NAME _T("rdpdr.dll")
#define KERNEL32_MODULE_NAME _T("kernel32.dll")
#define QUEUE_USER_APC_PROC_NAME _T("QueueUserAPC")
#define MAX_INTEGER_STRING_SIZE 32
class W32ProcObj;
class W32DeviceChangeParam {
public:
W32ProcObj *_instance;
WPARAM _wParam;
LPARAM _lParam;
W32DeviceChangeParam(W32ProcObj *procObj, WPARAM wParam, LPARAM lParam) {
_instance = procObj;
_wParam = wParam;
_lParam = lParam;
}
};
///////////////////////////////////////////////////////////////
//
// W32ProcObj
//
// W32ProcObj is the parent device IO processing class for
// Win32 TS Device Redirection.
//
class W32ProcObj : public ProcObj {
private:
//
// Asynchronous IO Request Context
//
typedef struct _AsyncIOReqContext {
RDPAsyncFunc_StartIO ioStartFunc;
RDPAsyncFunc_IOComplete ioCompleteFunc;
RDPAsyncFunc_IOCancel ioCancelFunc;
PVOID clientContext;
W32ProcObj *instance;
} ASYNCIOREQCONTEXT, *PASYNCIOREQCONTEXT;
//
// Worker Thread Info
//
typedef struct _ThreadInfo {
// Handle to the thread owning this data
HANDLE hWorkerThread;
// Thread ID
ULONG ulThreadId;
// Waitable Object Array and Corresponding IO Requests
HANDLE waitableObjects[MAXIMUM_WAIT_OBJECTS];
PASYNCIOREQCONTEXT waitingReqs[MAXIMUM_WAIT_OBJECTS];
// Number of Waitable Objects and Corresponding Requests being Tracked
ULONG waitableObjectCount;
// Synchronization event for controlling this thread.
HANDLE controlEvent;
// If set, then the background thread should shut down.
BOOL shutDownFlag;
// The dispatch queue for a single thread instance.
W32DispatchQueue *dispatchQueue;
// Constructor
_ThreadInfo() : hWorkerThread(NULL), ulThreadId(0), waitableObjectCount(0)
{
memset(&waitableObjects[0], 0, sizeof(waitableObjects));
memset(&waitingReqs[0], 0, sizeof(waitingReqs));
}
~_ThreadInfo()
{
if (hWorkerThread != NULL) {
CloseHandle(hWorkerThread);
hWorkerThread = NULL;
}
}
} THREAD_INFO, *PTHREAD_INFO ;
BOOL ProcessIORequestPacket( PRDPDR_IOREQUEST_PACKET pIoRequestPacket );
ULONG GetClientID( VOID );
//
// True if devices have been scanned for redirection.
//
BOOL _bLocalDevicesScanned;
//
// The object is shutting down.
//
BOOL _isShuttingDown;
//
// The thread pool
//
ThreadPool *_threadPool;
//
// Background Worker Thread Handle
//
PTHREAD_INFO _pWorkerThread;
//
// Background Thread Timeout
//
DWORD _threadTimeout;
//
// Win9x system flag. TRUE if the system is Win9x
// FALSE otherwise.
//
BOOL _bWin9xFlag;
HINSTANCE _hRdpDrModuleHandle;
//
// Initialize a worker thread.
//
ULONG CreateWorkerThreadEntry(PTHREAD_INFO *ppThreadInfo);
//
// Handle a signaled worker thread object that is associated with some kind
// of asynchronous request.
//
VOID ProcessWorkerThreadObject(PTHREAD_INFO pThreadInfo, ULONG offset);
//
// Shutdown an instance of this class.
//
VOID Shutdown();
//
// Handler for asynchronous IO request dispatching.
//
static VOID _DispatchAsyncIORequest_Private(
PASYNCIOREQCONTEXT reqContext,
BOOL cancelled
);
VOID DispatchAsyncIORequest_Private(
PASYNCIOREQCONTEXT reqContext,
BOOL cancelled
);
//
// Track another waitable object in the worker thread.
//
DWORD AddWaitableObjectToWorkerThread(PTHREAD_INFO threadInfo,
HANDLE waitableObject,
PASYNCIOREQCONTEXT reqContext
);
//
// Main Worker Thread Function. Static version invokes
// instance-specific version.
//
static DWORD WINAPI _ObjectWorkerThread(LPVOID lpParam);
ULONG ObjectWorkerThread(VOID);
//
// Check the operation dispatch queue for queued operations.
//
VOID CheckForQueuedOperations(PTHREAD_INFO thread);
//
// Enumerate devices and announce them to the server from the
// worker thread.
//
virtual VOID AnnounceDevicesToServer();
static HANDLE _AnnounceDevicesToServerFunc(W32ProcObj *obj, DWORD *status);
VOID AnnounceDevicesToServerFunc(DWORD *status);
//
// Handle device change notification from a worker thread
//
static HANDLE _OnDeviceChangeFunc(W32DeviceChangeParam *param, DWORD *status);
VOID OnDeviceChangeFunc(DWORD *status, IN WPARAM wParam, IN LPARAM lParam);
protected:
//
// Return the client's host name.
//
virtual VOID GetClientComputerName(
PBYTE pbBuffer,
PULONG pulBufferLen,
PBOOL pbUnicodeFlag,
PULONG pulCodePage
);
public:
//
// Constructor/Destructor
//
W32ProcObj(VCManager *pVCM);
virtual ~W32ProcObj();
//
// Initialize an instance of this class.
//
virtual ULONG Initialize();
//
// Dispatch an asynchronous IO function.
//
// startFunc points to the function that will be called to initiate the IO.
// finishFunc, optionally, points to the function that will be called once
// the IO has completed.
//
virtual DWORD DispatchAsyncIORequest(
IN RDPAsyncFunc_StartIO ioStartFunc,
IN OPTIONAL RDPAsyncFunc_IOComplete ioCompleteFunc = NULL,
IN OPTIONAL RDPAsyncFunc_IOCancel ioCancelFunc = NULL,
IN OPTIONAL PVOID clientContext = NULL
);
//
// Return Configurable Parameters.
//
virtual ULONG GetDWordParameter(LPTSTR lpszValueName,
PULONG lpdwValue);
virtual ULONG GetStringParameter(LPTSTR valueName,
OUT DRSTRING value,
IN ULONG maxSize);
//
// Return a reference to the thread pool.
//
ThreadPool &GetThreadPool() {
return *_threadPool;
}
//
// Returns whether the proc obj is in the middle of shutting down.
//
virtual BOOL IsShuttingDown() {
return _isShuttingDown;
}
//
// Return whether the platform is 9x.
//
virtual BOOL Is9x() {
return _bWin9xFlag;
}
//
// Return the class name.
//
virtual DRSTRING ClassName() { return TEXT("W32ProcObj"); }
virtual void OnDeviceChange(WPARAM wParam, LPARAM lParam);
};
#endif