Windows OpenBoard流程
Angie An

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, *// Enumerator*
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);
 Comments