首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >DeviceIoControl后的访问冲突错误

DeviceIoControl后的访问冲突错误
EN

Stack Overflow用户
提问于 2016-03-13 13:54:26
回答 1查看 236关注 0票数 0

我正在尝试将INOUT_PARAM发送到我的内核驱动程序,而且我似乎已经成功了。当我试图编辑它并将其发送回应用程序时,我得到了以下错误:

以下是应用程序代码:

代码语言:javascript
复制
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的功能:

代码语言:javascript
复制
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;
}

我似乎找不到问题的所在,任何帮助都将不胜感激。

提前谢谢你。

注意:当我发送没有wp->RStr =“Test”的INOUT_PARAM时,它成功地回显了初始值,这意味着由驱动程序编辑或读取已编辑的内存不能正常工作。

注2:只有当我回显/cout n.RStr PCHAR值时,才会显示错误。

重要注意事项:,如果我有wp->PID = 6969;在驱动程序中,然后回送(n.PID);它实际上工作.我不知道为什么PCHAR会引起问题,但这很有可能。有什么办法解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-14 17:10:00

我找到了解决办法让它起作用。我使用了以下方法:

代码语言:javascript
复制
typedef struct _INOUT_PARAM {
    ULONG PID;
    ULONG Addr;
    CHAR Str[1024];
    ULONG RAddr;
    CHAR RStr[1024];
} INOUT_PARAM, *PINOUTPARAM;

通过将PCHAR更改为Char[],实际上完成了工作--我在字符串上使用了strcpy()。但是我不明白为什么,有什么解释吗?对于我来说,我不会把这个问题标为答案,好像解释比答案更重要一样。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35971101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档