代码之家  ›  专栏  ›  技术社区  ›  Andrew Sun

谁拥有WDFREQUEST中的WDFMEMORY?

  •  0
  • Andrew Sun  · 技术社区  · 6 年前

    我正在编写一个Windows内核驱动程序。我需要创建一个新的I/O请求,并为输入缓冲区分配自己的内存。

    // Create request
    WDFREQUEST request;
    status = WdfRequestCreate(WDF_NO_OBJECT_ATTRIBUTES, target, &request);
    if (!NT_SUCCESS(status)) {
        goto exit;
    }
    
    // Allocate buffer for request
    WDFMEMORY inputMemory;
    status = WdfMemoryCreate(WDF_NO_OBJECT_ATTRIBUTES, PagedPool, 0, 1024, &inputMemory, NULL);
    if (!NT_SUCCESS(status)) {
        goto exit;
    }
    
    // Assign input buffer to request
    status = WdfIoTargetFormatRequestForIoctl(target, request, IOCTL_FOO, inputMemory, NULL, NULL, NULL);
    if (!NT_SUCCESS(status)) {
        goto exit;
    }
    
    // Asynchronously send the ioctl request
    WdfRequestSetCompletionRoutine(request, MyCompletionRoutine, NULL);
    if (!WdfRequestSend(request, target, NULL)) {
        status = WdfRequestGetStatus(request);
        goto exit;
    }
    

    我的问题是,如果 WdfIoTargetFormatRequestForIoctl 成功完成,我还应该执行吗 WdfObjectDelete(inputMemory) WdfObjectDelete(request) 销毁内存和请求?此外,对于函数中的错误清理和完成例程中的错误清理,答案是否相同?

    1 回复  |  直到 6 年前
        1
  •  0
  •   Baget    6 年前

    根据 this

    如果可以使用内存,则应调用WdfObjectDelete()以避免保留未使用的内存。