我正在尝试将INOUT_PARAM发送到我的内核驱动程序,似乎我已经成功了。当我试图编辑它并将其发送回应用程序时,我收到以下错误:
这是应用程序代码:
typedef struct _INOUT_PARAM {
ULONG PID;
ULONG Addr;
PCHAR Str;
ULONG RAddr;
PCHAR RStr;
} INOUT_PARAM, *PINOUTPARAM;
INOUT_PARAM TellDriver(DWORD IOCTL, INOUT_PARAM rtmp)
{
INOUT_PARAM tmp = rtmp;
HANDLE h;
DWORD bytesIO;
h = CreateFile(TEXT("\\\\.\\KJPA"), GENERIC_READ | GENERIC_WRITE,
0, NULL, OPEN_EXISTING, 0, NULL);
if (h != INVALID_HANDLE_VALUE) {
DeviceIoControl(h, IOCTL,
&tmp, sizeof(tmp), &tmp,
sizeof(tmp), &bytesIO, NULL);
CloseHandle(h);
}
return tmp;
}
int __cdecl main(int argc, char* argv[])
{
echo("Input some text for IOCTL_Entry");
gecho();
INOUT_PARAM parms;
initParms(&parms);
INOUT_PARAM n = TellDriver(IOCTL_ENTRY, parms);
echo(n.RStr);
gecho();
return 0;
}
这是驱动程序IOCTL函数:
NTSTATUS Function_IRP_DEVICE_CONTROL(PDEVICE_OBJECT pDeviceObject, PIRP Irp)
{
NTSTATUS status = STATUS_SUCCESS;
ULONG bytesIO = 0;
PIO_STACK_LOCATION stack;
BOOLEAN condition = FALSE;
PINOUTPARAM wp;
UNREFERENCED_PARAMETER(pDeviceObject);
stack = IoGetCurrentIrpStackLocation(Irp);
if (stack == NULL) {
status = STATUS_INTERNAL_ERROR;
}
wp = (PINOUTPARAM)Irp->AssociatedIrp.SystemBuffer;
wp->RStr = "Test";
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = sizeof(INOUT_PARAM);
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
我似乎无法找到问题所在的位置,我们将不胜感激。
提前谢谢。
注意:当我发送INOUT_PARAM而没有wp-> RStr =“Test”时;它成功地回显了初始值,这意味着驱动程序编辑或读取已编辑的内存不能正常工作。
注2:只有当我回显/输出n.RStr PCHAR值时才会出现错误。
重要提示:如果我有wp-> PID = 6969;在驱动程序中然后回显(n.PID);它确实有效...我不知道为什么PCHAR会引起问题,但这很可能就是这样。任何想法如何解决?
答案 0 :(得分:0)
我找到了解决方案让它发挥作用。 我使用了以下内容:
typedef struct _INOUT_PARAM {
ULONG PID;
ULONG Addr;
CHAR Str[1024];
ULONG RAddr;
CHAR RStr[1024];
} INOUT_PARAM, *PINOUTPARAM;
通过将PCHAR更改为Char []实际完成了这项工作 - 我在字符串上使用了strcpy()。但是我不明白为什么,请问有什么解释吗?我不会将此标记为答案,好像解释比对我的答案更重要。