C++ 在应用程序和驱动程序之间共享内存

C++ 在应用程序和驱动程序之间共享内存,c++,windows,driver,C++,Windows,Driver,我有DMA驱动程序的源代码,我开发了一个应用程序来向这个驱动程序发送数据包 问题是内核崩溃总是可能存在的,因为错误的指针“内存地址”共享给驱动程序 问题是:如何向驱动程序发送指针,并使驱动程序在应用程序看到内存时看到内存 我知道它可能是映射虚拟内存到物理内存,但我仍然不确定确切的问题或如何解决 提示:驱动程序是一个系统文件和信息文件,所以我不能在其中调试 我的平台是Windows7,下面是我在我的应用程序

我有DMA驱动程序的源代码,我开发了一个应用程序来向这个驱动程序发送数据包

问题是内核崩溃总是可能存在的,因为错误的指针“内存地址”共享给驱动程序

问题是:如何向驱动程序发送指针,并使驱动程序在应用程序看到内存时看到内存

我知道它可能是映射虚拟内存到物理内存,但我仍然不确定确切的问题或如何解决

提示:驱动程序是一个系统文件和信息文件,所以我不能在其中调试

我的平台是
Windows7
,下面是我在我的应用程序中尝试的内容:

DeviceIoControl(hDMADevice, IOCode, &TC, sizeof(TestCmd), NULL, 0, &bytes, &os))
我的地址在哪里

DMADevice中,windows框架将调用函数“EvtIoControl”,该函数将获取此地址并读取其数据

Mydata = TC.mydata;
64位应用程序,驱动程序为32位

这是不可能的。可以是32位应用程序和64位驱动程序

在这种情况下,需要了解32和64的结构布局不同(因为不同的PVOID大小-4或8字节) 这就是为什么指针“内存地址”错误的原因 您需要使用函数和读取

64位应用程序,驱动程序为32位

这是不可能的。可以是32位应用程序和64位驱动程序

在这种情况下,需要了解32和64的结构布局不同(因为不同的PVOID大小-4或8字节) 这就是为什么指针“内存地址”错误的原因
你需要使用function-and-read

如果没有任何代码和目标操作系统,这将很难帮助你。我更新了帖子,包括代码和其他信息。一行代码是不够的。“驱动程序是一个系统文件和信息文件,所以我无法在其中调试。”:使用WinDBG调试驱动程序:在主计算机上开发,在这台计算机上为您的测试系统托管一个VM,请使用将调试从main降级到VM。仍然没有足够的信息吗?您正在运行32位/64位吗?用户流程是什么?此外,DMA通常是异步的,因此我希望您复制用户模式内存。如果没有任何代码和目标操作系统,将很难为您提供帮助。我更新了帖子,包括代码和其他信息。一行代码是不够的。“驱动程序是一个系统文件和信息文件,因此我无法在其中调试。”:使用WinDBG调试驱动程序:在主计算机上开发,在此计算机上为测试系统托管VM,使用将调试从主计算机降级到VM。信息仍然不足吗?您正在运行32位/64位吗?用户流程是什么?此外,DMA通常是异步的,所以我希望您复制一份用户模式内存。不,我认为这不会有帮助,我认为这必须与虚拟地址映射到实际物理内存有关。@mohamedrauof-您没有提供足够的崩溃信息-具体发生在哪里(在什么代码上)。你的问题是——“如何向驱动程序发送指针,并使驱动程序在应用程序看到内存时看到内存”好的,我将重新表述这个问题,在驱动程序代码中运行“带调试器”DeviceIOControl后,将显示内核蓝屏。可能是传递到内核的错误地址。另一种提问方式是,如何通过DeviceIOControl将数据“数组”发送给驱动程序?@mohamedrauof-您需要打开内存转储,并查看驱动程序中的哪个命令BSOD。你的信息不完整。再一次-你有64位驱动程序和32位应用程序?是或否。是否将32位数据结构修复为64位布局?您是否在驱动程序中将虚拟映射到物理?通过
MmGetPhysicalAddress
或如何说?“如何通过DeviceIOControl将数据“数组”发送到驱动程序?”但这里有什么问题?!通过指针。elementaryNO,我不认为这会有帮助,我认为这必须与虚拟地址映射到我们真实的物理内存有关。@mohamedrauof-你没有提供足够的崩溃信息-在哪里(在什么代码上)发生这种情况。你的问题是——“如何向驱动程序发送指针,并使驱动程序在应用程序看到内存时看到内存”好的,我将重新表述这个问题,在驱动程序代码中运行“带调试器”DeviceIOControl后,将显示内核蓝屏。可能是传递到内核的错误地址。另一种提问方式是,如何通过DeviceIOControl将数据“数组”发送给驱动程序?@mohamedrauof-您需要打开内存转储,并查看驱动程序中的哪个命令BSOD。你的信息不完整。再一次-你有64位驱动程序和32位应用程序?是或否。是否将32位数据结构修复为64位布局?您是否在驱动程序中将虚拟映射到物理?通过
MmGetPhysicalAddress
或如何说?“如何通过DeviceIOControl将数据“数组”发送到驱动程序?”但这里有什么问题?!通过指针。初级的