这似乎是一个基本问题,但我无法在任何地方找到解决方案。
我必须从内核模式中获取信息。因此,我与 IOCTL 合作。我的用户模式应用程序使用 DeviceIoControl 和 METHOD_OUT_DIRECT 发送此 IOCTL,因为我需要传输大量数据。这会向我的驱动程序发送一个字符指针。
Driver 获取 IOCTL 并可以在中断请求中对其进行响应。
代码如下所示:
case IOCTL_FILTERIO_REQUEST_DATA:
{
PVOID pInputBuffer;
PVOID pOutputBuffer;
ULONG outputBufferLength;
PCHAR pReturnData = g_pDataPack;
ULONG dwDataSize = 8000;
ULONG dwDataRead = 0, dwDataWritten = 0;
status = STATUS_UNSUCCESSFUL;
pInputBuffer = Irp - > AssociatedIrp.SystemBuffer;
pOutputBuffer = NULL;
if (Irp - > MdlAddress) {
pOutputBuffer = MmGetSystemAddressForMdlSafe(Irp - > MdlAddress, NormalPagePriority);
}
if (pOutputBuffer) {
RtlCopyMemory(pOutputBuffer, pReturnData, dwDataSize);
status = STATUS_SUCCESS; * g_pDataPack = 0;
db_counter = 0;
}
}
break;
但我需要从内核模式的另一部分复制信息。
我试图像这样创建一个全局 PCHAR:
头文件(声明):extern PCHAR g_pDataPack;
源文件(定义):PCHAR g_pDataPack = "IOCTL DEFINITION";
编辑(其他源文件):*g_pDataPack++ = 'some stuff';
我的问题是,在中断将全局 PCHAR 复制到本地 PCHAR 并将其发送回我的用户模式应用程序之前,我必须多次编辑和放大全局 PCHAR。我试图每 5000 个版本重置一次全局指针,但这并没有真正奏效。
if (db_counter > 5000)
{
*g_pDataPack = 0;
db_counter = 0;
}
程序在一段特殊的时间后崩溃。我猜是因为全局指针分配了很多空间?
我试图创建一个 CHAR 数组,但这根本不起作用。
是否有另一种更好或更简单的方法来分配特殊大小的内存,然后在需要时对其进行编辑并将其复制到本地 PCHAR pReturnData,或者我是否必须学习如何为该项目使用 DMA?