hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
阅读:3218回复:21

拙见:找到你自己驱动的USB设备

楼主#
更多 发布于:2004-08-25 09:07
我也是一个初次和USB打交道的“低手”,在编写驱动程序的时候,拜读了无数高手的文章,还买了ZhouLiGong的书,可惜,资质愚顿,始终没有“开窍”。
就连使用ZhouLiGong书里面的例子都没有成功。

后来只好自己动手,摸石头过河,没想到误打误撞,居然小有进展。
总结一下,可能会对和我一样初涉此地的兄弟们有抛砖的功效。

也请各位高手多多批评指正。

最新喜欢:

crazyqpcrazyq...
biometrics
驱动牛犊
驱动牛犊
  • 注册日期2004-06-05
  • 最后登录2004-08-26
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2004-08-26 18:54
真是好文章!
要是早贴出来一个月就好了。
支持加分!
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-08-26 17:40
我安装这个DDK时,机箱的都的都的报警,重新启动以后也没有发现多出什么东西!!这是怎么回事啊!!我的机器是win2000 professional,没有安装VC6.0


安装之后不会有诸如程序组这样的东东的,只是在你安装时指定的目录下有NTDDK的相关文件。

没有程序组,没有图标。

你需要在NTDDK的目录下找到相关文件。
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-08-26 17:31
[quote呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!! [/quote]
多谢鼓励。
我在哪里下载的记不清了,sorry!
大小是65.7MB.
yunhaisoft
驱动牛犊
驱动牛犊
  • 注册日期2004-08-11
  • 最后登录2009-11-06
  • 粉丝0
  • 关注0
  • 积分21分
  • 威望12点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-08-26 14:31
好文章! :)
crazyqp
驱动小牛
驱动小牛
  • 注册日期2004-07-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望12点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-08-26 13:20
兄弟,我实在是撑不下去了,自己开了哥新的帖子,请你帮帮忙!!!
http://www.driverdevelop.com/forum/html_76447.html?1093497576
谢谢
christ23
驱动牛犊
驱动牛犊
  • 注册日期2004-08-19
  • 最后登录2009-06-11
  • 粉丝0
  • 关注0
  • 积分4分
  • 威望20点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2004-08-26 12:37
好好好,哈哈,谢谢了,对我有帮助 :D
lovetina
驱动牛犊
驱动牛犊
  • 注册日期2004-07-11
  • 最后登录2006-04-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-08-25 12:54
应该是对的,我的是65.7M正常使用!
crazyqp
驱动小牛
驱动小牛
  • 注册日期2004-07-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望12点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-25 12:42
我安装这个DDK时,机箱的都的都的报警,重新启动以后也没有发现多出什么东西!!这是怎么回事啊!!我的机器是win2000 professional,没有安装VC6.0
crazyqp
驱动小牛
驱动小牛
  • 注册日期2004-07-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望12点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-25 10:51
首先要在自己的机器上安装DDK,偶找到了一个Win2KDDK.EXE。
安装之后,你就可以开发和编译了。
最重要的是,这里会有很多例子的。

偶就是在其中的“bulkusb”这个例子的基础上改动的。

呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!!我下载了一个67。5M的,不是是不是这个啊???
crazyqp
驱动小牛
驱动小牛
  • 注册日期2004-07-28
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分69分
  • 威望12点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-25 10:48
首先要在自己的机器上安装DDK,偶找到了一个Win2KDDK.EXE。
安装之后,你就可以开发和编译了。
最重要的是,这里会有很多例子的。

偶就是在其中的“bulkusb”这个例子的基础上改动的。

呵呵,好文章,先顶一下!!想请教一下,你的Win2KDDK.EXE是在那里下载的,大概有多大啊!能不能把网址贴出啊!!
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-08-25 09:59
虽然很糊涂,但好歹找到了自己的设备。
就可以编写读写处理了。

不足之处,还请有经验的网友指正。
谢谢。
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-08-25 09:57
把偶的代码放上来吧,见笑啊,写的不好:(


const GUID DiskClassGuid = {这里是你自己的GUID};
           GUID hidGuid ;
hidGuid=DiskClassGuid;



HDEVINFO hDevInfo = SetupDiGetClassDevs(&hidGuid,
NULL, // no enumerator
NULL, // no parent
(DIGCF_PRESENT | DIGCF_INTERFACEDEVICE));

if(!hDevInfo) {
AfxMessageBox("Couldn't get handle for HID devices");
return;
}

SP_INTERFACE_DEVICE_DATA devInfoData;
devInfoData.cbSize = sizeof (SP_INTERFACE_DEVICE_DATA);
int deviceNo = 0;

SetLastError(NO_ERROR);

while(GetLastError() != ERROR_NO_MORE_ITEMS){
if(SetupDiEnumInterfaceDevice (hDevInfo,
0,//lpDeviceInfoData,
&hidGuid,
deviceNo,
&devInfoData)){
ULONG requiredLength = 0;
SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
NULL,
0,
&requiredLength,
NULL);

PSP_INTERFACE_DEVICE_DETAIL_DATA devDetail = (SP_INTERFACE_DEVICE_DETAIL_DATA*) malloc (requiredLength);
devDetail->cbSize = sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);

if(! SetupDiGetInterfaceDeviceDetail(hDevInfo,
&devInfoData,
devDetail,
requiredLength,
NULL,
NULL)) {
AfxMessageBox("Couldn't get HID details");
free(devDetail);
return;
}

AfxMessageBox(devDetail->DevicePath);

char sDevPath[512];

strcpy(sDevPath,devDetail->DevicePath);
strcat(sDevPath,"\\PIPE1");

//打开设备句柄
HANDLE hDeviceHandle = CreateFile(sDevPath,//devDetail->DevicePath ,
           GENERIC_READ | GENERIC_WRITE,
           FILE_SHARE_READ | FILE_SHARE_WRITE,
           NULL,
           OPEN_EXISTING,
           0,
           NULL);
if (hDeviceHandle == INVALID_HANDLE_VALUE)
AfxMessageBox("打开设备路径出错!\n");
else {
char sBuf[512];
ULONG l;

if (!WriteFile(hDeviceHandle,
sBuf,
512,
&l,
NULL)){
AfxMessageBox("写入设备出错!\n");
int i=::GetLastError();
char sBuf[128];

ltoa(i,sBuf,10);
AfxMessageBox(sBuf);

}

CloseHandle(hDeviceHandle);
}


free(devDetail);

deviceNo++;
}
else {
int i=::GetLastError();
char sBuf[128];

ltoa(i,sBuf,10);
AfxMessageBox(sBuf);
if (i==ERROR_NO_MORE_ITEMS) break;
}
}
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-08-25 09:49
在应用程序中找自己的设备很关键。
我按照高手们的建议找了,总找不到,即使我的设备连接上也找不到。
于是只好自己动手做了。
关键是直接找自己的设备,不要用HidD_GetHidGuid(&hidGuid);找
反正偶没有用这个函数成功找到过。
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-08-25 09:40
按照DDK语法,make自己的驱动程序。
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2004-08-25 09:37
接下来,在你的驱动程序指明自己设备的GUID
例子程序的guid829.h中有:

DEFINE_GUID(GUID_CLASS_I82930_BULK,
0x873fdf, 0x61a8, 0x11d1, 0xaa, 0x5e, 0x0, 0xc0, 0x4f, 0xb1, 0x72, 0x8b);

你要替换成自己的GUID.

hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-08-25 09:30
最简单的,把 BulkUsb.INF中:
ClassGuid改为自己的GUID
把所有“VID_045E&PID_930A”改为自己的,偶的是“VID_0471&PID_0888”
就可以了,
其他的,你可以适当修改标识的内容,变成自己的设备,具体看帮助吧。
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-08-25 09:25
VID和USB芯片也有关
偶的是0888
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-08-25 09:23
PID和你的USB芯片有关。
偶用的是D12,PID是0471
hulihutu
驱动牛犊
驱动牛犊
  • 注册日期2004-05-12
  • 最后登录2006-10-26
  • 粉丝0
  • 关注0
  • 积分111分
  • 威望12点
  • 贡献值0点
  • 好评度11点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-08-25 09:22
系统缺省的USB设备的GUID是:{36FC9E60-C465-11CF-8056-444553540000}

不能用啊,偶用了多次,都不能找到自己的设备。
估计这是留给USB的HostHub这样的设备用的吧。

所以要给自己的设备一个自定义的GUID,GUID的生成有一些工具。
只要不和系统缺省的那些GUID冲突,自己编一个GUID也可以。
不过,最好用GUID工具来生成。

偶的设备的GUID是{6309DF86-017C-410e-9D7E-B897F0EECFB6}
上一页
游客

返回顶部