社区
Windows SDK/API
帖子详情
如何获得硬件设备的句柄
faiqi
2003-10-30 10:26:02
比如一块PCI卡,如何获得其设备句柄 ,谢谢!
...全文
424
9
打赏
收藏
如何获得硬件设备的句柄
比如一块PCI卡,如何获得其设备句柄 ,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
9 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jiangchun_xn
2003-11-11
打赏
举报
回复
learning
yayowd
2003-11-11
打赏
举报
回复
不懂!
781014
2003-11-08
打赏
举报
回复
学习
Atomictry
2003-11-04
打赏
举报
回复
学习。
hongliqiu
2003-10-31
打赏
举报
回复
学习~
Yuehj
2003-10-31
打赏
举报
回复
例如:
//打开一个设备
HANDLE hDevice = CreateFile("\\\\.\\PYCommPort0",GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ,
NULL,
OPEN_EXISTING,
0,
NULL
);
if(hDevice==INVALID_HANDLE_VALUE)return E_FAIL;
//与设备进行通讯
if(!DeviceIoControl(hDevice,PYCOMM_IOCTL_SETDATABITS,&comDataBits,sizeof(comDataBits),NULL,
0,&Status, NULL))
Yuehj
2003-10-31
打赏
举报
回复
首先要知道设备的符号连接(针对winnt环境)或设备ID(针对WDM驱动程序,WDM驱动程序有的也是使用符号连接)然后通过CreateFile函数打开设备,或使用DeviceIOControl直接与设备进行通讯。
sczyq
2003-10-31
打赏
举报
回复
//----------------------------------------------------
typedef struct NetCardStruct
{
DWORD Id; // 这就是你需要的设备句柄
AnsiString Name;
bool Enabled;
bool Changed;
bool IsDisable;
bool InitState;
} TNetCardStruct;
typedef TNetCardStruct* PNetCardStruct;
//---------------------------------------------------------------------------
void __fastcall EnumNetCards(TList *NetDeviceList)
{
AnsiString DevValue;
PNetCardStruct NetCard;
LPTSTR Buffer = NULL;
DWORD BufSize = 0;
HDEVINFO hDevInfo = 0;
if (INVALID_HANDLE_VALUE == (hDevInfo =
SetupDiGetClassDevs(NULL,NULL,0,DIGCF_PRESENT|DIGCF_ALLCLASSES)))
return;
SP_DEVINFO_DATA DeviceInfoData = {sizeof(SP_DEVINFO_DATA)};
for (DWORD DeviceId=0;
SetupDiEnumDeviceInfo(hDevInfo,DeviceId,&DeviceInfoData); DeviceId++)
{
DevValue.SetLength(0);
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_CLASS , &Buffer, (PULONG)&BufSize))
DevValue = Buffer;
if (DevValue == "Net") // 判断设备是网卡
{
DevValue.SetLength(0);
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_ENUMERATOR_NAME , &Buffer, (PULONG)&BufSize))
DevValue = Buffer;
if (DevValue != "ROOT") // 判断设备不是虚拟设备
{
NetCard = new TNetCardStruct;
NetCard->Id = DeviceId;
NetCard->Name = "<Unknown Device>";
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DRIVER , &Buffer, (PULONG)&BufSize))
if (GetRegistryProperty(hDevInfo, &DeviceInfoData, SPDRP_DEVICEDESC , &Buffer, (PULONG)&BufSize))
NetCard->Name = Buffer;
NetCard->Changed = false;
NetCard->IsDisable = false;
NetCard->Enabled = GetNetCardState(DeviceInfoData.DevInst) == gdsEnabled;
NetCard->InitState = NetCard->Enabled;
NetDeviceList->Add(NetCard);
}
}
}
}
//---------------------------------------------------------------------------
bool __fastcall GetRegistryProperty(HDEVINFO DeviceInfoSet,
PSP_DEVINFO_DATA DeviceInfoData, ULONG Property, PVOID Buffer, PULONG Length)
{
while (!SetupDiGetDeviceRegistryProperty(DeviceInfoSet,
DeviceInfoData, Property, NULL, (BYTE *)*(TCHAR **)Buffer, *Length, Length))
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
if (*(LPTSTR *)Buffer) LocalFree(*(LPTSTR *)Buffer);
*(LPTSTR *)Buffer = (PCHAR)LocalAlloc(LPTR,*Length);
}
else return false;
}
return (*(LPTSTR *)Buffer)[0];
}
sfemil
2003-10-30
打赏
举报
回复
你可以使用NetBios或者winsock等直接进行网络编程。你只要句柄干什么?
实战DeviceIoControl 之一:通过API访问
设备
驱动程序
(转bhw98 blog)Q 在NT/2000/XP中,我想用VC编写应用程序访问
硬件
设备
,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对
设备
的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的
设备
驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目
实战DeviceIoControl 之一:通过API访问
设备
驱动程序 转帖
Q 在NT/2000/XP中,我想用VC编写应用程序访问
硬件
设备
,如获取磁盘参数、读写绝对扇区数据、测试光驱实际速度等,该从哪里入手呢? A 在NT/2000/XP中,应用程序可以通过API函数DeviceIoControl来实现对
设备
的访问—获取信息,发送命令,交换数据等。利用该接口函数向指定的
设备
驱动发送正确的控制码及数据,然后分析它的响应,就可以达到我们的目的。 Device...
实战DeviceIoControl 之中的一个:通过API訪问
设备
驱动程序
P.bhw98 { PADDING-RIGHT: 0px; PADDING-LEFT: 0px; FONT-SIZE: 9pt; PADDING-BOTTOM: 0px; MARGIN: 10px 0px 5px; LINE-HEIGHT: normal; PADDING-TOP: 0px; FONT-F...
Windows SDK/API
1,222
社区成员
8,135
社区内容
发帖
与我相关
我的任务
Windows SDK/API
C++ Builder Windows SDK/API
复制链接
扫一扫
分享
社区描述
C++ Builder Windows SDK/API
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章