我已經在內核空間中創建了一個設備,並在用戶空間中使用它來訪問它CreateFile
我能夠將ioctl發送給驅動程序,並且它們被正確執行。不知道如何跟蹤WdfRequestComplete
後發生的情況,並在返回時以錯誤1結束(無效函數)。在此標記爲dup之前,請注意與this有區別,因爲我編寫的驅動程序ioctl和我使用的同步io不是異步。DeviceIoControl錯誤1錯誤的功能
在用戶空間:
fd = CreateFile(dev_path,
(FILE_GENERIC_READ | FILE_GENERIC_WRITE),
(FILE_SHARE_READ | FILE_SHARE_WRITE),
NULL, OPEN_EXISTING, 0, NULL);
// ... error checking code here
DeviceIoControl(fd, // device handler
VIRTQC_CMD_MMAP, // command to send
&inputBuffer,
inputBufferLength,
&outputBuffer,
outputBufferLength,
&returnLength,
(LPOVERLAPPED)NULL); // overlapped structure not needed using sync io
,並在內核空間
status = WdfRequestRetrieveInputBuffer(Request, InputBufferLength, &inputBuffer, NULL);
if (!NT_SUCCESS(status))
{
WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
return;
}
inputVirtArg = (VirtioQCArg*)inputBuffer;
status = WdfRequestRetrieveOutputBuffer(Request, OutputBufferLength, &outputBuffer, NULL);
if (!NT_SUCCESS(status))
{
WdfRequestComplete(Request, STATUS_INVALID_PARAMETER);
return;
}
outputVirtArg = (VirtioQCArg*)outputBuffer;
switch (IoControlCode)
{
case VIRTQC_CMD_MMAP:
if (PsGetCurrentThread() == irp->Tail.Overlay.Thread)
{
status = CreateAndMapMemory(device, &(inputVirtArg), &(outputVirtArg));
outputVirtArg->flag = (!NT_SUCCESS(status)) ? 0 : 1;
}
else
status = STATUS_UNSUCCESSFUL;
break;
default:
status = STATUS_INVALID_DEVICE_REQUEST;
break;
}
WdfRequestComplete(Request, status);
更新1:
我已經試過WdfRequestCompleteWithInformation(Request, status, OutputBufferLength);
但同樣的結果。
此外,我注意到inputBuffer和outputBuffer的地址是相同的。
更新2: 我試圖做
temp = ExAllocatePoolWithTag(
NonPagedPool,
PAGE_SIZE,
MEMORY_TAG
);
// other code to
RtlCopyMemory((VirtioQCArg*)outputBuffer, temp, OutputBufferLength);
仍然得到錯誤1
您需要從一些基本的故障排除開始:使用DbgPrint自由查看哪個函數失敗並使用哪些錯誤代碼。沒有這些信息,我們不可能幫助你。 –
我能夠在使用'outputBuffer = irp-> AssociatedIrp.SystemBuffer'而不是'WdfRequestRetrieveOutputBuffer'後在用戶空間訪問結果,但我不知道爲什麼。我使用DbgPrint並使用windbg進行跟蹤,以檢查爲什麼我仍然收到錯誤1,但似乎都在EvtIoDeviceControl中正確執行。 – Luis
IOCTL使用哪種數據傳輸類型,請參閱https://msdn.microsoft.com/en-us/library/windows/hardware/ff540663(v=vs.85).aspx? –