21,600
社区成员
发帖
与我相关
我的任务
分享
NTSTATUS DemoDevControl(IN PDEVICE_OBJECT DeviceObject,PIRP Irp){
NTSTATUS status = STATUS_SUCCESS;
PVOID pOutBuf = NULL ,pSysAddr = NULL,m_DMAMemory=NULL;
PMDL pMdl;
PIO_STACK_LOCATION irpStack = IoGetCurrentIrpStackLocation(Irp);
ULONG uControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;
//PHYSICAL_ADDRESS maxPhysicalAddress,m_DMAPhysicalMemory;
DBGPRINT(("DemoDevControl\n"));
switch(uControlCode){
case IOCTL_SHARE_MEMORY:
pOutBuf = Irp->AssociatedIrp.SystemBuffer;
DBGPRINT((" before IoAllocateMdl\r\n"));
pMdl = IoAllocateMdl(pSysAddr,10,FALSE,FALSE,NULL);
if(pMdl == NULL){
DBGPRINT(("IoAllocateMdl Sorry Failed !\r\n"));
status = STATUS_UNSUCCESSFUL;
break;
}
DBGPRINT((" before MmBuildMdlForNonPagedPool\r\n"));
MmBuildMdlForNonPagedPool(pMdl);
DBGPRINT(("MmMapLockedPagesSpecifyCache\r\n"));
_try{
pOutBuf = MmMapLockedPagesSpecifyCache(
pMdl,
UserMode,
MmNonCached,
NULL,
FALSE,
NormalPagePriority
);
DBGPRINT(("is everything fine?\r\n"));
if(NULL == *(ULONG*)pOutBuf){
DBGPRINT(("Sorry Failed !\r\n"));
status = STATUS_UNSUCCESSFUL;
IoFreeMdl(pMdl);
break;
}
}_except(EXCEPTION_EXECUTE_HANDLER)
{
DBGPRINT(("MmMapLockedPagesSpecifyCache exception\n"));
}
break;
default:
break;
}
return status;
}