Windows OpenBoard流程
which means 打开driver获得句柄的流程。
1 2 3 4
| HDEVINFO hDevInfo; SP_INTERFACE_DEVICE_DATA IfDevData; SP_INTERFACE_DEVICE_DETAIL_DATA *IfDevDetail=NULL; DWORD ReqLen;
|
1. SetupDiGetClassDevs函数
SetupDiGetClassDevs函数返回设备信息集的句柄,该设备信息集包含本地计算机请求的设备信息元素。
1 2 3 4 5 6
| WINSETUPAPI HDEVINFO SetupDiGetClassDevsW( [in, optional] const GUID *ClassGuid, [in, optional] PCWSTR Enumerator, [in, optional] HWND hwndParent, [in] DWORD Flags );
|
1 2 3 4
| hDevInfo = SetupDiGetClassDevs(pGuid, NULL, * NULL, * DIGCF_PRESENT | DIGCF_INTERFACEDEVICE );
|
2. SetupDiEnumDeviceInterfaces函数
SetupDiEnumDeviceInterfaces函数枚举设备信息集中包含的设备接口。
1 2 3 4 5 6 7
| WINSETUPAPI BOOL SetupDiEnumDeviceInterfaces( [in] HDEVINFO DeviceInfoSet, [in, optional] PSP_DEVINFO_DATA DeviceInfoData, [in] const GUID *InterfaceClassGuid, [in] DWORD MemberIndex, [out] PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData );
|
1
| SetupDiEnumDeviceInterfaces(hDevInfo, NULL, pGuid, 0, &IfDevData);
|
3. SetupDiGetDeviceInterfaceDetailW函数
SetupDiGetDeviceInterfaceDetail函数返回有关设备接口的详细信息。
另有SetupDiGetDeviceInterfaceDetailA函数。
1 2 3 4 5 6 7 8
| WINSETUPAPI BOOL SetupDiGetDeviceInterfaceDetailW( [in] HDEVINFO DeviceInfoSet, [in] PSP_DEVICE_INTERFACE_DATA DeviceInterfaceData, [out, optional] PSP_DEVICE_INTERFACE_DETAIL_DATA_W DeviceInterfaceDetailData, [in] DWORD DeviceInterfaceDetailDataSize, [out, optional] PDWORD RequiredSize, [out, optional] PSP_DEVINFO_DATA DeviceInfoData );
|
1 2 3 4 5
| SetupDiGetDeviceInterfaceDetail(hDevInfo ,&IfDevData, NULL, 0, &ReqLen, NULL);
IfDevDetail->cbSize=sizeof(SP_INTERFACE_DEVICE_DETAIL_DATA);
SetupDiGetDeviceInterfaceDetail(hDevInfo,&IfDevData, IfDevDetail, ReqLen, NULL, NULL);
|
4. CreateFile
创建或打开文件或 I/O 设备。
最常用的 I/O 设备如下:文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、邮槽和管道。
该函数返回一个handle,根据文件或设备以及指定的标志和属性,该句柄可用于访问文件或设备以进行各种类型的 I/O。
1 2 3 4 5 6 7 8 9
| HANDLE CreateFileW( [in] LPCWSTR lpFileName, [in] DWORD dwDesiredAccess, [in] DWORD dwShareMode, [in, optional] LPSECURITY_ATTRIBUTES lpSecurityAttributes, [in] DWORD dwCreationDisposition, [in] DWORD dwFlagsAndAttributes, [in, optional] HANDLE hTemplateFile );
|
1 2 3 4 5 6 7 8 9
| HANDLE m_hDevice = CreateFile( IfDevDetail->DevicePath, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, NULL );
|
5. 获取到handle后
清理工作
1 2
| delete [] IfDevDetail; SetupDiDestroyDeviceInfoList(hDevInfo);
|