memory.cpp

来自「在delphi中实现windows核心编程.原书光盘代码核心编程.原书光盘代码」· C++ 代码 · 共 55 行

CPP
55
字号
// MEMORY.cpp - main module for VxD MEMORY

#define DEVICE_MAIN
#include "memory.h"

Declare_Virtual_Device(MEMORY)

#undef DEVICE_MAIN
/*设置与Win32通信的控制码*/
#define DIOC_MY1 CTL_CODE(FILE_DEVICE_UNKNOWN,1,METHOD_NEITHER,FILE_ANY_ACCESS)
MemoryVM::MemoryVM(VMHANDLE hVM) : VVirtualMachine(hVM) {}

MemoryThread::MemoryThread(THREADHANDLE hThread) : VThread(hThread) {}

BOOL MemoryDevice::OnSysDynamicDeviceInit()
{
	return TRUE;
}

BOOL MemoryDevice::OnSysDynamicDeviceExit()
{
	return TRUE;
}

/*定义输入缓冲区结构*/
struct TMemoryRW {
    BOOL ReadOrNot;  //True:Read, False:Write
    WORD Segment,Offset,Count;
};

DWORD MemoryDevice::OnW32DeviceIoControl(PIOCTLPARAMS pDIOCParams)
{
     switch (pDIOCParams->dioc_IOCtlCode)
     {
      case DIOC_MY1: 
           PVOID plin=0;
           struct TMemoryRW *op;
           op = (struct TMemoryRW *)pDIOCParams->dioc_InBuf;
	   DWORD _tmp=(DWORD)(op->Segment) * 0x10000 + op->Offset;  
	   /*把物理地址_tmp映射为线性地址*/
	   if ((plin=MapPhysToLinear((PVOID)_tmp,op->Count,0))==(PVOID)0xffffffff)
	   {
                *(pDIOCParams->dioc_bytesret)=0;
		return 1;
	   }
           if(op->ReadOrNot)
   	      memcpy(pDIOCParams->dioc_OutBuf,plin,op->Count);
           else memcpy(plin,pDIOCParams->dioc_OutBuf,op->Count);
           *(pDIOCParams->dioc_bytesret)=op->Count;
           break;
     }
	return 0;
}

⌨️ 快捷键说明

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