一段在WDF的默认队列的EvtIoRead例程中创建READ请求并转发的代码,我在调试的时候,每当运行至 ”发送请求“这里 就会崩溃,但是实在是不知道什么原因
VOID EvtIoRead(_In_ WDFQUEUE Queue, _In_ WDFREQUEST Request, _In_ size_t Length) {
NTSTATUS status;
WDF_REQUEST_SEND_OPTIONS options;
PQUEUE_CONTEXT pQueueContext = NULL;
PAGED_CODE();
pQueueContext = GetQueueContext(Queue);
PVOID buffer = NULL;
WDFMEMORY memory = NULL;
WDFREQUEST newRequest = NULL;
WDF_OBJECT_ATTRIBUTES attributes;
WDFIOTARGET ioTarget = WdfDeviceGetIoTarget(WdfIoQueueGetDevice(Queue));
// 将缓冲区中的数据复制到原始请求的输出缓冲区
status = WdfRequestRetrieveOutputBuffer(Request, Length, &buffer, NULL);
if (!NT_SUCCESS(status)) {
WdfRequestCompleteWithInformation(Request, status, Length);
return;
}
strncpy(buffer, pQueueContext->ReadBuffer, Length);
//
// ******************* 创建一个新的请求 *************************************************
//
//初始化I/O请求对象环境变量结构
WDF_OBJECT_ATTRIBUTES_INIT_CONTEXT_TYPE(&attributes, REQUEST_CONTEXT);
// 创建IO请求
status = WdfRequestCreate(&attributes, ioTarget, &newRequest);
if (NT_SUCCESS(status)) {
PREQUEST_CONTEXT pReaquestContext = GetRequestContext(newRequest);
pReaquestContext->IsCreateManual = TRUE;
// 创建内存对象用于存储读取的数据
status = WdfMemoryCreate(&attributes, NonPagedPool, 0, Length, &memory, NULL);
if (NT_SUCCESS(status)) {
// 将内存对象关联到请求
status = WdfIoTargetFormatRequestForRead(ioTarget, newRequest, memory, NULL, NULL);
if (NT_SUCCESS(status)) {
//WdfRequestFormatRequestUsingCurrentType(newRequest);
WDF_REQUEST_SEND_OPTIONS_INIT(&options, WDF_REQUEST_SEND_OPTION_SYNCHRONOUS);
WdfRequestSetCompletionRoutine(newRequest, EvtReadRequestIoctlCompletionRoutine, NULL);
// 发送请求
if (WdfRequestSend(newRequest, ioTarget, &options) == FALSE) {
WdfObjectDelete(memory);
WdfObjectDelete(newRequest);
}
}
else {
WdfObjectDelete(memory);
WdfObjectDelete(newRequest);
}
}
else {
WdfObjectDelete(newRequest);
}
}
// 完成原始请求
WdfRequestCompleteWithInformation(Request, STATUS_SUCCESS, Length);
}