金山卫士开源软件之旅(七) netmon下netmon工程的解析---接口KTdiDriverProxy的实现

转载请标明是引用于 http://blog.csdn.net/chenyujing1234

 

在上一节讲FwProxy工程的COM使用方法时,讲到了与它联系紧密的接口

HRESULT KTdiDriverProxy::Init(KProcessInfoMgr* pProcessMgr, KModuleMgr* pModuleMgr, KUrlMonCfg* pUrlCfgMon)
其实不只它与FwProxy联系紧密。

这里我们讲它们通信的另一个函数,

在放入线程池的任务WaitResponseThread中调用了OnApplicationRequest_,它对线程及服务进行Exe检查,并加入

HRESULT	KTdiDriverProxy::OnApplicationRequest( RESPONSE_APP_REQUEST_INFO  *pAppRequestInfo )
{
	// 如果KTdiDriverProxy还没初始化或已经反初始化了,那么给FwProxy一个回复
	if (!IsInit(m_hEventInit))
	{
		if( pAppRequestInfo->pResponseContext != NULL )
			m_pFwProxy->SendResponse( pAppRequestInfo->pResponseContext, Pass);
		return S_OK;
	}

	WAIT_RESPONSE_INFO *waitResponseInfo = new WAIT_RESPONSE_INFO;
	if( waitResponseInfo == NULL )
		return E_FAIL;

	memcpy((char*)&waitResponseInfo->appResponseInfo, (char*)pAppRequestInfo, sizeof(RESPONSE_APP_REQUEST_INFO) );
	waitResponseInfo->pThis = (PVOID)this;
	waitResponseInfo->hEventInit = m_hEventInit;

	InterlockedIncrement(&m_nWorkItemCount);
	// 将一个任务项WaitResponseThread排列到线程池中
	QueueUserWorkItem( WaitResponseThread, (LPVOID)waitResponseInfo, WT_EXECUTELONGFUNCTION );

	return S_OK;
}

 

KTdiDriverProxy除了与 FwProxy通信,也与以下三个类。

KTdiDriverProxy中有亲密联系的还有三个类:

KProcessInfoMgr*  m_pProcessMgr;
 KModuleMgr*    m_pModuleMgr;
 KUrlMonCfg*    m_pUrlCfgMon;

初始化:

HRESULT	KTdiDriverProxy::Init(KProcessInfoMgr* pProcessMgr, KModuleMgr* pModuleMgr, KUrlMonCfg* pUrlCfgMon)
{
	kws_log(TEXT("KTdiDriverProxy::Init begin"));
	m_pProcessMgr = pProcessMgr;
	m_pModuleMgr = pModuleMgr;
	m_pUrlCfgMon = pUrlCfgMon;

通过以上的接口来实现木马网络防火墙的驱动接口。

 实现以上功能的还有另一个类 KDeviceNameMgr

用于针对L"\\Device\\"与L"\\SystemRoot\\"的设备名去查找相应的路径

class KDeviceNameMgr
{
public:
	KDeviceNameMgr();
	~KDeviceNameMgr();
	// 针对L"\\Device\\"与L"\\SystemRoot\\"的设备名去查找相应的路径
	INT			FixDosPathToNormalPath(LPCWSTR strDevicePath, WCHAR path[MAX_PATH]);

private:
	// 从设备名列表中查找是否有此设备路径的设备存在,有则返回
	BOOL		DevicePathToDosPath(LPCWSTR strDevicepath, WCHAR path[MAX_PATH]);
	// 获得系统Root名字
	LPCWSTR		GetSystemRoot() ;
	// 重新刷新设备列表
	void		Refresh();
private:
	kis::KLock				m_lock;
	map<wstring, wstring>	m_DeviceNameMap;
	wstring					m_strSystemRoot;
};


 

你可能感兴趣的:(编程,null,exe,任务,金山)