阅读:1850回复:4
虽然Buffer有数据,但传输字节总设为0
我的设备是个HID设备,我用这个函数来从设备上读数据,但是很奇怪,当向底层发出IRP后并等他返回,IoStatusBlock.Status为STATUS_SUCCESS,而且缓冲区中读到了数据(绝对是正确的数据),但是IoStatusBlock.Information总是被设为0,而按照文档他应该被设为返回的字节数.请问问什么?
NTSTATUS NTAPI GetString (PDEVICE_OBJECT Fdo, ULONG uIndex, WCHAR* Buffer, ULONG BufferLen, PULONG puTransed) { KdPrint(("string %d\n", uIndex)); KEVENT event; IO_STATUS_BLOCK IoStatusBlock; RtlZeroMemory((PVOID)Buffer, BufferLen); KeInitializeEvent(&event, NotificationEvent, FALSE); PDEVICE_EXTENSION pDX = (PDEVICE_EXTENSION)Fdo->DeviceExtension; UNICODE_STRING UnicodeString; UnicodeString.Buffer = Buffer; UnicodeString.MaximumLength = (USHORT)BufferLen; UnicodeString.Length = (USHORT)BufferLen; PIRP Irp = IoBuildDeviceIoControlRequest(IOCTL_HID_GET_INDEXED_STRING, pDX->Ldo, &uIndex, sizeof(ULONG), (PVOID)Buffer, BufferLen, FALSE, NULL, NULL); if (!Irp) { *puTransed = 0L; return STATUS_INSUFFICIENT_RESOURCES; } IoSetCompletionRoutine(Irp, (PIO_COMPLETION_ROUTINE) OnRequestComplete, (PVOID)&event, TRUE, TRUE, TRUE); NTSTATUS ntStatus = IoCallDriver(pDX->Ldo, Irp); // if (ntStatus == STATUS_PENDING) { KdPrint(("Wait for string %d\n", uIndex)); KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); } KdPrint(("String-%d ntStatus %u\n", uIndex, Irp->IoStatus.Status)); ULONG cBytes = (ULONG)Irp->IoStatus.Information; KdPrint(("String-%d String Length is %u\n", uIndex, cBytes)); ANSI_STRING AnsiString; RtlUnicodeStringToAnsiString(&AnsiString, &UnicodeString, TRUE); if (ntStatus != STATUS_SUCCESS) { *puTransed = 0L; return ntStatus; } AnsiString.Buffer[AnsiString.Length - 1] = 0; KdPrint(("String %u is \n%s\n", uIndex, AnsiString.Buffer)); RtlFreeAnsiString(&AnsiString); *puTransed = Irp->IoStatus.Information; ntStatus = Irp->IoStatus.Status; // KeClearEvent(&event); IoCompleteRequest(Irp, IO_NO_INCREMENT); // KeWaitForSingleObject(&event, Executive, KernelMode, FALSE, NULL); return ntStatus; } |
|
最新喜欢:![]()
|
沙发#
发布于:2001-08-15 15:24
你的完成函数返回值是多少?
|
|
板凳#
发布于:2001-08-15 15:39
NTSTATUS NTAPI OnRequestComplete(PDEVICE_OBJECT Fdo, PIRP Irp, PKEVENT pEvent)
{ KeSetEvent(pEvent, 0, FALSE); return STATUS_MORE_PROCESSING_REQUIRED; } |
|
|
地板#
发布于:2001-08-16 09:08
你试一试如下这么做:
PIRP Irp = IoBuildDeviceIoControlRequest(IOCTL_HID_GET_INDEXED_STRING, pDX->Ldo, &uIndex, sizeof(ULONG), (PVOID)Buffer, BufferLen, FALSE, NULL, &IoStatusBlock); 看一看IoStatusBlock返回的Information的值以及Status的值。 |
|
地下室#
发布于:2001-08-16 12:53
还是为0
|
|
|