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.
276 lines
6.9 KiB
276 lines
6.9 KiB
/*++=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
|
|
|
|
Copyright (c) 2000 Microsoft Corporation
|
|
|
|
Module Name:
|
|
|
|
w3sobj.h
|
|
|
|
Abstract:
|
|
|
|
Header for the W3Spoof class & related functions, etc.
|
|
|
|
Author:
|
|
|
|
Paul M Midgen (pmidge) 07-June-2000
|
|
|
|
|
|
Revision History:
|
|
|
|
07-June-2000 pmidge
|
|
Created
|
|
|
|
17-July-2000 pmidge
|
|
Added class factory & IW3Spoof interface.
|
|
|
|
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=--*/
|
|
|
|
#ifndef _W3SOBJ_H_
|
|
#define _W3SOBJ_H_
|
|
|
|
#include "common.h"
|
|
|
|
class IOCTX
|
|
{
|
|
public:
|
|
IOCTX(IOTYPE iot, SOCKET s);
|
|
~IOCTX();
|
|
|
|
IOTYPE Type(void);
|
|
BOOL AllocateWSABuffer(DWORD size, LPVOID pv);
|
|
void FreeWSABuffer(void);
|
|
BOOL ResizeWSABuffer(DWORD size);
|
|
void DisableIoCompletion(void);
|
|
void AddRef(void);
|
|
void Release(void);
|
|
|
|
public:
|
|
PIOCTX pthis;
|
|
OVERLAPPED overlapped;
|
|
SOCKET socket;
|
|
LPVOID sockbuf;
|
|
PHOSTINFO local;
|
|
PHOSTINFO remote;
|
|
LPWSTR clientid;
|
|
WSABUF* pwsa;
|
|
DWORD bufsize;
|
|
PSESSIONOBJ session;
|
|
DWORD bytes;
|
|
DWORD flags;
|
|
DWORD error;
|
|
|
|
private:
|
|
LONG _cRefs;
|
|
IOTYPE _iot;
|
|
};
|
|
|
|
DWORD WINAPI ThreadFunc(LPVOID lpv);
|
|
|
|
class CW3Spoof : public IW3Spoof,
|
|
public IThreadPool,
|
|
public IW3SpoofClientSupport,
|
|
public IExternalConnection,
|
|
public IConnectionPointContainer
|
|
{
|
|
public:
|
|
DECLAREIUNKNOWN();
|
|
|
|
// IConfig
|
|
HRESULT __stdcall SetOption(DWORD dwOption, LPDWORD lpdwValue);
|
|
HRESULT __stdcall GetOption(DWORD dwOption, LPDWORD lpdwValue);
|
|
|
|
//
|
|
// IW3Spoof
|
|
//
|
|
HRESULT __stdcall GetRuntime(IW3SpoofRuntime** pprt);
|
|
HRESULT __stdcall GetTypeLibrary(ITypeLib** pptl);
|
|
HRESULT __stdcall GetScriptEngine(IActiveScript** ppas);
|
|
HRESULT __stdcall GetScriptPath(LPWSTR client, LPWSTR* path);
|
|
HRESULT __stdcall Notify(LPWSTR clientid, PSESSIONOBJ pso, STATE state);
|
|
HRESULT __stdcall WaitForUnload(void);
|
|
HRESULT __stdcall Terminate(void);
|
|
|
|
//
|
|
// IThreadPool
|
|
//
|
|
HRESULT __stdcall GetStatus(PIOCTX* ppioc, LPBOOL pbQuit);
|
|
HRESULT __stdcall GetSession(LPWSTR clientid, PSESSIONOBJ* ppso);
|
|
HRESULT __stdcall Register(SOCKET s);
|
|
|
|
DECLAREIDISPATCH();
|
|
|
|
//
|
|
// IW3SpoofClientSupport
|
|
//
|
|
HRESULT __stdcall RegisterClient(BSTR Client, BSTR ScriptPath);
|
|
HRESULT __stdcall RevokeClient(BSTR Client);
|
|
|
|
//
|
|
// IExternalConnection
|
|
//
|
|
DWORD __stdcall AddConnection(DWORD type, DWORD reserved);
|
|
DWORD __stdcall ReleaseConnection(DWORD type, DWORD reserved, BOOL bCloseIfLast);
|
|
|
|
//
|
|
// IConnectionPointContainer
|
|
//
|
|
HRESULT __stdcall EnumConnectionPoints(IEnumConnectionPoints** ppEnum);
|
|
HRESULT __stdcall FindConnectionPoint(REFIID riid, IConnectionPoint** ppCP);
|
|
|
|
//
|
|
// Class methods
|
|
//
|
|
CW3Spoof();
|
|
~CW3Spoof();
|
|
|
|
static HRESULT Create(IW3Spoof** ppw3s);
|
|
|
|
private:
|
|
DWORD _Initialize(void);
|
|
void _LoadRegDefaults(void);
|
|
BOOL _InitializeThreads(void);
|
|
void _TerminateThreads(void);
|
|
|
|
DWORD _QueueAccept(void);
|
|
BOOL _CompleteAccept(PIOCTX pioc);
|
|
BOOL _DisconnectSocket(PIOCTX pioc, BOOL fNBGC);
|
|
void _SetState(STATE st);
|
|
|
|
|
|
private:
|
|
LONG m_cRefs;
|
|
LONG m_cExtRefs;
|
|
HANDLE m_evtServerUnload;
|
|
STATE m_state;
|
|
PRUNTIME m_prt;
|
|
ITypeLib* m_ptl;
|
|
IActiveScript* m_pas;
|
|
PSTRINGMAP m_clientmap;
|
|
PSTRINGMAP m_sessionmap;
|
|
DWORD m_dwPoolSize;
|
|
DWORD m_dwMaxActiveThreads;
|
|
USHORT m_usServerPort;
|
|
LPHANDLE m_arThreads;
|
|
SOCKET m_sListen;
|
|
HANDLE m_hIOCP;
|
|
LONG m_AcceptQueueStatus;
|
|
LONG m_MaxQueuedAccepts;
|
|
LONG m_PendingAccepts;
|
|
|
|
public:
|
|
//
|
|
// connection point object
|
|
//
|
|
class CW3SpoofEventsCP : public IConnectionPoint
|
|
{
|
|
public:
|
|
//
|
|
// IUnknown
|
|
//
|
|
HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
|
|
ULONG __stdcall AddRef(void);
|
|
ULONG __stdcall Release(void);
|
|
|
|
//
|
|
// IConnectionPoint
|
|
//
|
|
HRESULT __stdcall GetConnectionInterface(IID* pIID);
|
|
HRESULT __stdcall GetConnectionPointContainer(IConnectionPointContainer** ppCPC);
|
|
HRESULT __stdcall Advise(IUnknown* punkSink, LPDWORD pdwCookie);
|
|
HRESULT __stdcall Unadvise(DWORD dwCookie);
|
|
HRESULT __stdcall EnumConnections(IEnumConnections** ppEnum);
|
|
|
|
//
|
|
// object methods
|
|
//
|
|
CW3SpoofEventsCP()
|
|
{
|
|
m_cRefs = 0L;
|
|
m_cConnections = 0L;
|
|
m_dwCookie = 0L;
|
|
m_pSite = NULL;
|
|
m_pSink = NULL;
|
|
}
|
|
|
|
~CW3SpoofEventsCP() {}
|
|
|
|
void FireOnSessionOpen(LPWSTR clientid)
|
|
{
|
|
if(m_pSink)
|
|
{
|
|
m_pSink->OnSessionOpen(clientid);
|
|
}
|
|
}
|
|
|
|
void FireOnSessionStateChange(LPWSTR clientid, STATE state)
|
|
{
|
|
if(m_pSink)
|
|
{
|
|
m_pSink->OnSessionStateChange(clientid, state);
|
|
}
|
|
}
|
|
|
|
void FireOnSessionClose(LPWSTR clientid)
|
|
{
|
|
if(m_pSink)
|
|
{
|
|
m_pSink->OnSessionClose(clientid);
|
|
}
|
|
}
|
|
|
|
void SetSite(IW3Spoof* pSite)
|
|
{
|
|
m_pSite = pSite;
|
|
}
|
|
|
|
private:
|
|
LONG m_cRefs;
|
|
DWORD m_cConnections;
|
|
DWORD m_dwCookie;
|
|
IW3Spoof* m_pSite;
|
|
IW3SpoofEvents* m_pSink;
|
|
};
|
|
|
|
friend class CW3SpoofEventsCP;
|
|
|
|
private:
|
|
CW3SpoofEventsCP m_CP;
|
|
};
|
|
|
|
class CFactory : public IClassFactory
|
|
{
|
|
public:
|
|
//
|
|
// IUnknown
|
|
//
|
|
HRESULT __stdcall QueryInterface(REFIID riid, void** ppv);
|
|
ULONG __stdcall AddRef(void);
|
|
ULONG __stdcall Release(void);
|
|
|
|
//
|
|
// IClassFactory
|
|
//
|
|
HRESULT __stdcall CreateInstance(IUnknown* pContainer, REFIID riid, void** ppv);
|
|
HRESULT __stdcall LockServer(BOOL fLock);
|
|
|
|
//
|
|
// Class methods
|
|
//
|
|
CFactory();
|
|
~CFactory();
|
|
|
|
static HRESULT Create(CFactory** ppCF);
|
|
HRESULT Activate(void);
|
|
HRESULT Terminate(void);
|
|
|
|
private:
|
|
HRESULT _RegisterTypeLibrary(BOOL fMode);
|
|
HRESULT _RegisterServer(BOOL fMode);
|
|
HRESULT _RegisterClassFactory(BOOL fMode);
|
|
IW3Spoof* m_pw3s;
|
|
DWORD m_dwCookie;
|
|
LONG m_cRefs;
|
|
LONG m_cLocks;
|
|
};
|
|
|
|
#endif /* _W3SOBJ_H_ */
|