📄 wah002.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 + -