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