分享
 
 
 

如何根据驱动程序及其安装文件来访问该设备呢(Visual C++ or C++ Builder均可以)

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

First of all,我要讲一下Windows对每检测到一个新设备的处理过程:

1.首先Windows将各种设备分成不同的设备类,比如说USB Storage存储类设备,而这些类设备都有一个GUID,它们位于注册表中HKEY_LOCAL_MACHINE\ControlSet001\Control\Class下,在这个键下你看到的以128位长度结点名称为结点都是设备类。

2.当检测到一个新设备时,Windows OS就会到KEY_LOCAL_MACHINE\ControlSet001下去搜索,如果此类设备已经注册,那么就此子键下增加一个子键,这个子键的名称是顺序递增的,如果当前该类设备中最大子键名称为0005,那么新设备的就是0006,0000,0001等就是设备的序列号。如果发现这个设备没有注册,那么OS就会以该设备对应的驱动程序安装文件.inf中的ClassGuid为名称来创建一个键,并将此被检测到的设备的序列号为0,在该键下创建一个子键,并且命名为0000来存储该设备的相关信息,之所以命名为0000,因为该设备是该类设备的第一个。

3.有些设备,如我们常用的COM1,COM2,当我们要访问它时可以用CreateFile("COM1"。。。)就可以打开串口,这里的COM1,COM2是符号名,有些设备也用到了符号名,比如说有些USB设备虚拟成一个COM口,如COM3,COM4,COM5等,在程序中我们只需要对COM3,COM4,COM5进行访问,就相当对该设备进行访问。

在没有符号名的情况下,我们如何根据设备驱动程序以及设备安装文件.inf来对设备进行访问呢?我们可以这样:

1.首先,我们在这个设备的符号名中找到设备类的ClassGuid,这是一定可以找到的。

2.然后我们到HKEY_LOCAL_MACHINE\ControlSet001\Control\Class下去找这个设备类,在找到后,我们再找它的子键,找到该设备对应的序列号,如它到底是0000还是0001,在得到这两个数据即ClassGuid和设备序列号后,就好办了。

下面我写一段代码,用来访问我机器上的一USB设备,并在listbox中列出当前机器上此设备类下的所有设备。

extern "C"

{

#include "setupapi.h"

}

void __fastcall TForm1::Button1Click(TObject *Sender)

{

//First of all,I will enumurate all the devices under the specified deviceclass

HKEY m_hKey,m_hSubKey;

long m_lResult=0;//using for return value

int m_nKeyIndex=0,m_nValueIndex=0;

char cKeyName[255],cValue[255];

unsigned char pbData[255];

BOOL bOutter=TRUE,bInter=TRUE;

char *cRoot="SYSTEM\\ControlSet001\\Control\\Class\\{4D36E96D-E325-11CE-BFC1-08002BE10318}";

AnsiString m_sAttached("");

m_lResult=::RegOpenKeyEx(HKEY_LOCAL_MACHINE,cRoot,0,KEY_ALL_ACCESS,&m_hKey);

if(m_lResult!=ERROR_SUCCESS) return FALSE;

//Enum Keys

while(bOutter){

m_lResult=::RegEnumKey(m_hKey,m_nKeyIndex,cKeyName,255);

bInter=TRUE;

if(m_lResult!=ERROR_SUCCESS) bOutter=FALSE;

else{

m_lResult=::RegOpenKeyEx(m_hKey,cKeyName,0,KEY_ALL_ACCESS,&m_hSubKey);

if(m_lResult!=ERROR_SUCCESS){

::RegCloseKey(m_hKey);

return FALSE;}

while(bInter){

unsigned long m_nDataSize=255;

unsigned long m_nValueNameSize=255;

unsigned long m_nType;

m_lResult=::RegEnumValue(m_hSubKey,m_nValueIndex,cValue,&m_nValueNameSize,0,&m_nType,pbData,&m_nDataSize);

if(m_lResult!=ERROR_SUCCESS) bInter=FALSE;

else{

if(!strcmp(cValue,"AttachedTo")){

m_sAttached=(AnsiString)(char*)pbData;

}

if(!strcmp(cValue,"DriverDesc")){

m_lstDevice->Items->Add((AnsiString)(char*)pbData+" "+m_sAttached);

}

m_nValueIndex++;

}

}

m_nValueIndex=0;

m_nKeyIndex++;

}

}

::RegCloseKey(m_hKey);

::RegCloseKey(m_hSubKey);

file://Next Step,I will access one of the device.I know its device serialno:0001

DWORD ReqLength;

DWORD Flags=DIGCF_PRESENT|DIGCF_DEVICEINTERFACE;

GUID CardGuid={4D36E96D-E325-11CE-BFC1-08002BE10318};

HANDLE hCard=0;

PSP_DEVICE_INTERFACE_DETAIL_DATA DeviceDetailData;

SP_DEVICE_INTERFACE_DATA DeviceInterfaceData;

DeviceInterfaceData.cbSize=sizeof(SP_DEVICE_INTERFACE_DATA);

hCard=SetupDiGetClassDevs(&CardGuid,NULL,NULL,Flags);

if(hCard==INVALID_HANDLE_VALUE){

::MessageBox(0,"Invalid Parameters!","Error",MB_OK|MB_ICONERROR);

return;}

BOOL status=SetupDiEnumDeviceInterfaces(hCard,NULL,&CardGuid,Index,&DeviceInterfaceData,&ReqLength,

NULL);//Index即设备的序号,这里的Index为1.

if(!status){

::MessageBox(0,"Failed to enumurate the specified

device!","Error",MB_OK+MB_ICONERROR);

::CloseHandle(hCard);

return;}

SetupDiGetInterfaceDeviceDetail(hCard,&DeviceInterfaceData,NULL,0,&ReqLength,NULL);

DeviceDetailData=(PSP_INTERFACE_DEVICE_DETAIL_DATA)new char[ReqLength];

if(DeviceDetailData){

::MessageBox("ERROR NOT ENOUGH MEMORY!","Error",MB_OK+MB_ICONERROR);

::CloseHandle(hCard);

return;}

status=SetupDiGetInterfaceDeviceDetail(hCard,&DeviceInterfaceData,DeviceDetailData,ReqLength,&ReqLength,NULL);

if(!status){

::MessageBox(0,"Failed to get interface detailed data","Error",MB_OK+MB_ICONERROR);

delete DeviceDetailData;

DeviceDetailData=NULL;

return;}

ShowMessage(DeviceDetailData->DevicePath());//在这里得到DevicePath就像得到符号名一样,那么接着下来,你你就可以象对串口操作一样来写程序,即是说:

HANDLE hUSB=::CreateFile(DeviceDetailData.DevicePath(),..............);

file://ReadFile,WriteFile and so on.....

}

所有以file:为前缀的地方都是注释部分,特此声明,以免误解,这是CSDN文档编辑器自动加的。

因最近一直在忙于学习驱动开发,现正在用DriverStudio进行开发一个USB Modem的驱动程序,有一点学习心得,特此交流一下。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有