请教USB设备驱动开发中的一个问题

tchaikov 2000-08-16 10:35:00
本人使用Win2K DDK 编写一USB网卡驱动,在用
IoBuildDeviceIoControlRequest()函数产生一个IRP以后,
用IoCallDriver调用下层USBD时返回0xC000000D(“参数错误”),
但同样的参数,在Win32程序中用DeviceIoControl()调用时却返回
0x103(“等待”),结果正常,我不知道这两者之间还有什么区别,
已经检查了100多个参数,完全一致。
本人的DDK为正版 MSDN 中获取,由于该驱动为公司正式产品所用,很重要,
特请各位大侠多多指教。谢谢。

本人E-mail: tchaikov@163.net
有意者我们可以继续探讨。
...全文
382 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
stanly_12 2001-02-13
  • 打赏
  • 举报
回复
还有没有了?
pc00000 2000-11-11
  • 打赏
  • 举报
回复
???
isdom 2000-11-10
  • 打赏
  • 举报
回复
tchaikov 2000-11-10
  • 打赏
  • 举报
回复
请跟贴啊!同志们!
tchaikov 2000-11-09
  • 打赏
  • 举报
回复
哪抄来的1394的东西?这里讨论的是USB,这样会误导别人的。不过分白送。
再等两位。随便来签个名就是了。
tchaikov 2000-11-08
  • 打赏
  • 举报
回复
waiting ...
tchaikov 2000-11-07
  • 打赏
  • 举报
回复
这是我来论坛的第一个帖子,现在问题自己早已解决,分数送给大家,(我刚加到200分),请跟贴(4位)。
dingsg 2000-11-07
  • 打赏
  • 举报
回复
需要判断:
ANSI_STRING ntString;
UNICODE_STRING ntUnicodeString;
KEVENT event;
PDEVICE_OBJECT PcmciaDeviceObject = NULL;
NTSTATUS istatus = 0;
PFILE_OBJECT fileObject = NULL;
PIRP irp = NULL;
LONG SktNo = 0;
LONG ValidSkts = 0;
PCMCIA_SOCKET_INFORMATION PcmciaSkt;
IO_STATUS_BLOCK ioStatusBlock;
CCHAR deviceNameBuffer[64];
LONG portNumber = 0;
LONG MorePorts = TRUE;
LONG MoreSkts = TRUE;

//Loop for all the controllers.
do{
sprintf(deviceNameBuffer,"\\Device\\Pcmcia%d",portNumber);
RtlInitAnsiString(
&ntString,
deviceNameBuffer
); //Initialize the string
istatus = RtlAnsiStringToUnicodeString(
&ntUnicodeString,
&ntString,
TRUE
);
if (!NT_SUCCESS(istatus)){
//Handle this error properly.
return STATUS_UNSUCCESSFUL; //Error
}//ENDIF
status = IoGetDeviceObjectPointer(
&ntUnicodeString,
FILE_READ_ATTRIBUTES,
&fileObject,
&PcmciaDeviceObject
);
if (!NT_SUCCESS(istatus)){
return STATUS_UNSUCCESSFUL; //Error
}//ENDIF
do{
RtlZeroMemory(
&PcmciaSkt,
sizeof(PCMCIA_SOCKET_INFORMATION)
);
PcmciaSkt.Socket = (USHORT) SktNo;
KeInitializeEvent(&event, NotificationEvent, FALSE);
irp = IoBuildDeviceIoControlRequest
(
IOCTL_SOCKET_INFORMATION,
PcmciaDeviceObject,
&PcmciaSkt,
sizeof(PCMCIA_SOCKET_INFORMATION),
&PcmciaSkt,
sizeof (PCMCIA_SOCKET_INFORMATION),
FALSE,
&event,
&ioStatusBlock
);

if (!irp){
//Handle the error properly.
MoreSkts = FALSE;
break; //Error
}//ENDIF

ioStatusBlock.Status = STATUS_NOT_SUPPORTED;
ioStatusBlock.Information = 0;

// Send the request down.
istatus = IoCallDriver(
PcmciaDeviceObject,
irp
);
if (istatus == STATUS_PENDING){
// If pending then wait for done.
KeWaitForSingleObject(
&event,
Executive,
KernelMode,
FALSE,
NULL
);
istatus = ioStatusBlock.Status;
}//ENDIF
if (!NT_SUCCESS(istatus)){
//The error can occur for many reasons including the
//STATUS_INVALID_PARAMETER,STATUS_BUFFER_TOO_SMALL
//if the parameters in the IoBuildDevice.... function
//are not valid.

//If the error is because of invalid parameter then,
//it could be because there may not be more valid socket
//on this controller. In this case just break see if
//any other controller exists.
//Otherwise handle the error carefully.

MoreSkts = FALSE;
break;
}//ENDIF
//You have the socket information now to handle in your driver.
SktNo++;
}while (MoreSkts)//END FOR
//Dereference the file object on this controller.
ObDereferenceObject(fileObject);
portNumber++;
//Here before reinitializing the flag you can insert your code.
MoreSkts = TRUE;
}while(MorePorts)//END WHILE
MorePorts = TRUE;
}
tchaikov 2000-11-07
  • 打赏
  • 举报
回复
to jansenzhu:
一个非常简单而且非常可气的结果:那块主板不认我的USB设备,换了机子就什么问题也没了。
茂奇软件 2000-11-07
  • 打赏
  • 举报
回复
hi,
tell use the reason of the bug please.
I have interest in know it.
second question of mine.
I found some bug in usb wdm driver.
it exist in power manager in win98.
I wish to know whether it is the bug from ddk.

Jansen Zhu.
asm@midatech.com



DDKProgrammer 2000-08-23
  • 打赏
  • 举报
回复
有兴趣。
tchaikov 2000-08-17
  • 打赏
  • 举报
回复
有没有写USB驱动的高手,我们可以讨论讨论.
tchaikov 2000-08-17
  • 打赏
  • 举报
回复
我写的驱动是一个典型的 基于WDM的NDIS驱动,分两层写,上层是网络适配卡部分,下层是USB接口部分,下层连接到USBD的设备驱动堆栈上,目前已调通,下层外露的设备接口是\device\USBDEV00,使用win32的DeviceIoControl能够正确调用,而且结果正常,上层网络驱动通过IoAttachDeviceToStack连接到堆栈,而且也正常,但为了调用下层,必须使用IoBuildDeviceIoControlRequest分配一个IRP,按理说,这和win32的DeviceIoControl产生的结果是应该是一样的,只要输入输出的长度、内容一样,可结果却不一致,为此,我检查了URB的查不多100多个参数,没发现什么不同,除了地址的值,而且地址指向的内容也是一样的。
我主要是想搞清楚DeviceIoControl和IoBuildDeviceIoControlRequest到底还有什么区别。我用softice在所有的deviceiocontrolcode处理前都加了断点,结果发现DeviceIoControl也没有另外进行什么动作,这就怪了。
欢迎继续讨论。
谢谢。 tchaikov@netease.com
元明 2000-08-17
  • 打赏
  • 举报
回复
感兴趣
creative 2000-08-17
  • 打赏
  • 举报
回复
关注!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧