⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wah002.cpp

📁 武安河书第一版(vxd)Windows 驱动例子
💻 CPP
字号:
// WAH002.cpp - main module for VxD WAH002

#define DEVICE_MAIN
#include "wah002.h"
Declare_Virtual_Device(WAH002)
#undef DEVICE_MAIN

#include "apcx.h"

MyHwInt* pMyIRQ;
PVOID	CallBackApc = 0;
THREADHANDLE 	TheThread = 0;	
MyDMAChannel* pMyDMA;
MyBuffer* pMyBUF;
DWORD errCode;
PVOID region;
DWORD size;
DWORD MAX_TRANSFER_PAGES=4096;
DWORD MAX_PHYS_ADDR=0x1000000;

VOID MyHwInt::OnHardwareInt(VMHANDLE hVM)
{
	sendPhysicalEOI();
	VWIN32_QueueUserApc(CallBackApc, NULL, TheThread);
}

VOID MyDMAChannel::handler(VMHANDLE hVM)   // 重载handler成员函数
{
	VDMAChannel::handler(hVM); // let VDMAD do all the work
}

BOOL Wah002Device::OnSysDynamicDeviceInit()
{
	pMyIRQ = new MyHwInt();
	if ((pMyIRQ==NULL) || !pMyIRQ->hook())	return FALSE;
	pMyDMA = new MyDMAChannel();
	if ((pMyDMA==NULL) || !pMyDMA->hook())	return FALSE;
	VDMABuffer::reserve (MAX_TRANSFER_PAGES, (PVOID)MAX_PHYS_ADDR);
	return TRUE;
}

BOOL Wah002Device::OnSysDynamicDeviceExit()
{
	if (pMyDMA) delete pMyDMA;
	if (pMyIRQ) delete pMyIRQ;
	return TRUE;
}

DWORD Wah002Device::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
	DWORD	status;
	switch (pDIOCParams->dioc_IOCtlCode)
	{
	case DIOC_OPEN:
		status = 0;
		break;
		case DIOC_CLOSEHANDLE:
		if (pMyBUF) delete pMyBUF;
		status = 0;
		break;
	case REGISTER:
		CallBackApc = pDIOCParams->dioc_InBuf;
		TheThread = Get_Cur_Thread_Handle();
		status = 0;
		break;
	case DMASET:    //设置DMA通道
		region = pDIOCParams->dioc_InBuf;
		size= pDIOCParams->dioc_cbInBuf;
		pMyBUF = new MyBuffer(NULL,size);
		if (pMyBUF->m_createError == 0)
		{
			pMyDMA->setRegion(pMyBUF, FALSE, NULL, size, pMyBUF->m_physAddress);
			pMyDMA->setPhysicalState(Get_Cur_VM_Handle(),DMA_type_write | DMA_single_mode);
			pMyDMA->physicalUnmask(Get_Cur_VM_Handle(),FALSE);
		pMyIRQ->physicalMask();
		status = 0;
		}
		else status = -1;
		break;
	case READ:    //把buffer的数据拷贝到region
		pMyBUF->copyFrom(region, size, 0, errCode);
		 //重新设置DMA缓冲区
		pMyDMA->setRegion(pMyBUF, FALSE, NULL, size, pMyBUF->m_physAddress);
		pMyDMA->setPhysicalState(Get_Cur_VM_Handle(),DMA_type_write|DMA_single_mode);
		pMyDMA->physicalUnmask(Get_Cur_VM_Handle(),FALSE);
		status = 0;
		break;
	default:
	status = -1;
	}
	return status;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -