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

📄 mapdev.cpp

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

#define DEVICE_MAIN
#include "mapdev.h"
Declare_Virtual_Device(MAPDEV)
#undef DEVICE_MAIN
//#define LPVOID PVOID
#include "mdapp.h"

#define PAGENUM(p)  (((ULONG)(p)) >> 12)
//#define PAGEOFF(p)  (((ULONG)(p)) & 0xFFF)
//#define PAGEBASE(p) (((ULONG)(p)) & ~0xFFF)
#define _NPAGES_(p, k)  ((PAGENUM((char*)p+(k-1)) - PAGENUM(p)) + 1)

////////////////////////////////////////////////////////////
// Device Mapping Function
//
PVOID MapDevice(PVOID PhysAddress, DWORD SizeInBytes)
{
// There are two ways to map the device memory:
//
// (1) The old 3.1 way, using MapPhysToLinear. This is fine as long
//     the driver is never going to be unloaded:

#ifdef USE_MAP_PHYS_TO_LINEAR

	return MapPhysToLinear(PhysAddress, SizeInBytes, 0);

#else

	PVOID Linear;
	ULONG nPages = _NPAGES_(PhysAddress, SizeInBytes);

//	(2) The Win95 way, which enables the memory to be unmapped	
//	    when the driver unloads, or when the mapping is no longer
//      needed.

	Linear = PageReserve(
		PR_SYSTEM,
		nPages,
		PR_FIXED
		);

	PageCommitPhys(
		PAGENUM(Linear),
		nPages,
		PAGENUM(PhysAddress),
		PC_INCR | PC_WRITEABLE | PC_USER
		);		

	LinPageLock(PAGENUM(Linear), nPages, 0);
	
//	return (PVOID) ((ULONG)Linear+PAGEOFF(PhysAddress));
	return Linear;

#endif
}

////////////////////////////////////////////////////////////
// Device Unmapping Function
//
VOID UnmapDevice(PVOID LinearAddress, DWORD SizeInBytes)
{

#ifdef USE_MAP_PHYS_TO_LINEAR

	// cannot unmap

#else
	LinPageUnLock(
		PAGENUM(LinearAddress),
		_NPAGES_(LinearAddress, SizeInBytes),
		0
		);

	PageDecommit(
		PAGENUM(LinearAddress),
		_NPAGES_(LinearAddress, SizeInBytes),
		0
		);

	PageFree((MEMHANDLE)LinearAddress,0);
#endif
}

DWORD MapdevDevice::OnW32DeviceIoControl(PIOCTLPARAMS p)
{
	PMAPDEVREQUEST pReq;

	switch (p->dioc_IOCtlCode)
	{
	case DIOC_OPEN:
	case DIOC_CLOSEHANDLE:
		break;

	case MDR_SERVICE_UNMAP:
		pReq = *(PMAPDEVREQUEST*)p->dioc_InBuf;	

		UnmapDevice(
			pReq->mdr_LinearAddress,
			pReq->mdr_SizeInBytes
			);
		pReq->mdr_Status = MDR_STATUS_SUCCESS;
		break;		

	case MDR_SERVICE_MAP:
		pReq = *(PMAPDEVREQUEST*)p->dioc_InBuf;	

		pReq->mdr_LinearAddress = MapDevice(
			pReq->mdr_PhysicalAddress,			// the physical address to map
			pReq->mdr_SizeInBytes				// size of the region
			);									// flags

		if	(pReq->mdr_LinearAddress == NULL) 
			pReq->mdr_Status = MDR_STATUS_ERROR;
		else
			pReq->mdr_Status =  MDR_STATUS_SUCCESS;
		break;

	default:
		return ERROR_INVALID_FUNCTION;
	}

	return DEVIOCTL_NOERROR;
}


⌨️ 快捷键说明

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