描述:
关于DeviceIoControl、共享内存、指针的疑问?
BOOL DeviceIoControl(
HANDLE hDevice, // handle to device of interest
DWORD dwIoControlCode, // control code of operation to perform
LPVOID lpInBuffer, // pointer to buffer to supply input data
DWORD nInBufferSize, // size, in bytes, of input buffer
LPVOID lpOutBuffer, // pointer to buffer to receive output data
DWORD nOutBufferSize, // size, in bytes, of output buffer
LPDWORD lpBytesReturned, // pointer to variable to receive byte count
LPOVERLAPPED lpOverlapped // pointer to structure for asynchronous operation
);
看别人的一段程序是这么用的(共享内存的实现)?
一、应用程序部分
TCHAR szOutputBuffer[20];
PVOID psharememory; // 共享内存地址
…………
// 取得共享内存的地址
if(!DeviceIoControl(m_hDevice, IO_GET_SHAREMEMORY_ADDR,
NULL,
NULL,
szOutputBuffer,
sizeof(szOutputBuffer),
&dwReturn,
NULL
))
psharememory = *((PVOID *)szOutputBuffer);
……
// 在列表控件中显示
P_IP_PACKET pkt = (P_IP_PACKET)pThis->psharememory;
二、驱动程序部分
// 与应用程序共享内存
PVOID SystemVirtualAddress, UserVirtualAddress;
………………
// 将分配的内存映射到用户进程地址空间,并返回地址。
try
{
UserVirtualAddress = MmMapLockedPages(Mdl, UserMode);
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;
Irp->IoStatus.Status = STATUS_SUCCESS;
Irp->IoStatus.Information = sizeof(PVOID);
}
except(EXCEPTION_EXECUTE_HANDLER){}
break;
疑问一、既然lpOutBuffer是“pointer to buffer to receive output data”,意思就是lpOutBuffer
是一个地址(从UserVirtualAddress也可以看出来),为什么szOutputBuffer还要自己还要先申请一个内存空间,
然后作为DeviceIoControl的参数。不明白是什么意思?
我一开始就是这么写的,总出错。
PVOID psharememory ;
if(!DeviceIoControl(m_hDevice, IO_GET_SHAREMEMORY_ADDR,
NULL,
NULL,
&psharememory
512,
&dwReturn,
NULL
))
疑问二:
谁能帮我解释一下下面两句中的*((PVOID *)(被指针整的晕头转向的)
psharememory = *((PVOID *)szOutputBuffer);
*((PVOID *)(Irp->AssociatedIrp.SystemBuffer)) = UserVirtualAddress;