KDriver
驱动中牛
驱动中牛
  • 注册日期2001-06-09
  • 最后登录2008-09-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1851回复:4

虽然Buffer有数据,但传输字节总设为0

楼主#
更多 发布于:2001-08-15 13:48
我的设备是个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;
}

最新喜欢:

PolomWUSPolomW...
“萎软”,是Microsoft的小名!
software
驱动牛犊
驱动牛犊
  • 注册日期2001-03-23
  • 最后登录2012-08-07
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望2点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2001-08-15 15:24
你的完成函数返回值是多少?
KDriver
驱动中牛
驱动中牛
  • 注册日期2001-06-09
  • 最后登录2008-09-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2001-08-15 15:39
NTSTATUS NTAPI OnRequestComplete(PDEVICE_OBJECT Fdo, PIRP Irp, PKEVENT pEvent)
{
KeSetEvent(pEvent, 0, FALSE);
return STATUS_MORE_PROCESSING_REQUIRED;
}
“萎软”,是Microsoft的小名!
dazzy
驱动中牛
驱动中牛
  • 注册日期2001-03-23
  • 最后登录2008-08-12
  • 粉丝1
  • 关注0
  • 积分0分
  • 威望10点
  • 贡献值1点
  • 好评度10点
  • 原创分0分
  • 专家分0分
地板#
发布于: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的值。
 
KDriver
驱动中牛
驱动中牛
  • 注册日期2001-06-09
  • 最后登录2008-09-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2001-08-16 12:53
还是为0
“萎软”,是Microsoft的小名!
游客

返回顶部