【问题标题】:Access Violation Error after DeviceIoControlDeviceIoControl 后访问冲突错误
【发布时间】:2016-06-28 12:30:23
【问题描述】:

我正在尝试将 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;
}

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

提前谢谢你。

注意:当我发送不带 wp->RStr = "Test"; 的 INOUT_PARAM 时它成功地回显了初始值,意味着驱动程序编辑或读取编辑的内存无法正常工作。

注意 2:只有在我回显/计算 n.RStr PCHAR 值时才会出现错误。

重要提示:如果我有 wp->PID = 6969;在驱动程序中,然后 echo(n.PID);它实际上有效......我不知道为什么 PCHAR 会导致问题,但这很可能是它。任何想法如何解决这个问题?

【问题讨论】:

    标签: c++ c kernel driver kmdf


    【解决方案1】:

    我找到了一个解决方案来让它工作。 我使用了以下内容:

    typedef struct _INOUT_PARAM {
        ULONG PID;
        ULONG Addr;
        CHAR Str[1024];
        ULONG RAddr;
        CHAR RStr[1024];
    } INOUT_PARAM, *PINOUTPARAM;
    

    通过将 PCHAR 更改为 Char[] 实际上完成了这项工作 - 我在字符串上使用了 strcpy()。但我不明白为什么,请解释一下?我不会将此标记为答案,好像解释对我来说比答案更重要。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多