IOCTL_NDIS_QUERY_GLOBAL_STATS的使用

WLAN Scan with NDIS Miniport and Much More 这篇 文章知道 可以使用IOCTL_NDIS_QUERY_GLOBAL_STATS,然后通过DeviceIoControl()函数把需要的OID传递给底层的Filter驱动或者Miniport驱动。犹如:

oidcode = OID_802_11_BSSID_LIST ;//action to perform

        if( DeviceIoControl(    m_handle,// device to be queried
                                IOCTL_NDIS_QUERY_GLOBAL_STATS,// operation to 
                                                              // perform
                                &oidcode,
                                sizeof( oidcode),//  input buffer
                                ( ULONG *) m_pBSSIDList,// output buffer
                                sizeof( NDIS_802_11_BSSID_LIST) * 
                                NUMBEROF_BSSIDS,
                                &bytesreturned,// # bytes returned
                                NULL) == 0)// synchronous I/O
        {

 看起来很好使用,但是注意的是IOCTL_NDIS_QUERY_GLOBAL_STATS只是适合查询(Query),估计是出于安全的考虑,微软没有允许Set OID,因为这样会更改到底层驱动的某些属性。当然Vista开始,你可以使用与某个OID对应的WMI,比如对于OID_802_11_BSSID_LIST_SCAN你可以使用WlanScan函数,当然也有对应的Ndis6.0版本的OID_DOT11_SCAN_REQUEST。但是是不是可以在User Mode层使用这个OID,未可知。但是WlanScan是可以的。

更加详细资料: http://www.ndis.com/ndis-general/queryglobalstats/default.htm

### IOCTL_VIDEO_QUERY_DISPLAY_CONFIG 的使用方法 `IOCTL_VIDEO_QUERY_DISPLAY_CONFIG` 是用于查询显示配置的 Windows 设备 I/O 控制代码。此控制码允许应用程序获取有关当前显示器连接状态及其模式设置的信息。 #### 函数原型 ```c DWORD WINAPI DeviceIoControl( (HANDLE) hDevice, IOCTL_VIDEO_QUERY_DISPLAY_CONFIG, NULL, 0, lpOutBuffer, nOutBufferSize, lpBytesReturned, (LPOVERLAPPED) lpOverlapped ); ``` 参数说明如下: - `hDevice`: 调用 CreateFile 打开的目标设备句柄。 - `lpOutBuffer`: 输出缓冲区指针,指向接收返回数据结构体数组的位置。 - `nOutBufferSize`: 输出缓冲区大小(字节)。 - `lpBytesReturned`: 返回实际写入到输出缓冲区的数据量。 - `lpOverlapped`: 指向 OVERLAPPED 结构的指针;如果操作是非重叠同步调用,则该值应为NULL[^1]。 #### 数据结构定义 为了处理 `IOCTL_VIDEO_QUERY_DISPLAY_CONFIG` 请求的结果,需定义相应的数据结构。主要涉及两个结构体:`VIDEO_DISPLAYCONFIG_PATH_INFO` 和 `DISPLAYCONFIG_RATIONAL`。 ##### VIDEO_DISPLAYCONFIG_PATH_INFO 描述路径信息,包括源和目标适配器索引以及对应的模式信息等字段。 ##### DISPLAYCONFIG_RATIONAL 表示有理数形式的时间间隔,通常用来表达刷新率。 #### 示例代码 下面是一个简单的 C++ 示例程序片段展示如何使用这个 ioctl 来枚举所有可用的显示设备并打印其基本信息。 ```cpp #include <windows.h> #include <stdio.h> void QueryDisplayConfig() { DWORD result; UINT32 numPathElements = 0; UINT32 numModeInfoElements = 0; // First call to get required buffer sizes. DisplayConfigGetDeviceInfo(&numPathElements, &numModeInfoElements); PDISPLAYCONFIG_PATH_INFO pathArray = (PDISPLAYCONFIG_PATH_INFO)new BYTE[numPathElements * sizeof(DISPLAYCONFIG_PATH_INFO)]; PDISPLAYCONFIG_MODE_INFO modeInfoArray = (PDISPLAYCONFIG_MODE_INFO)new BYTE[numModeInfoElements * sizeof(DISPLAYCONFIG_MODE_INFO)]; try { result = DisplayConfigGetDeviceInfo(pathArray, modeInfoArray); for(UINT i = 0; i < numPathElements ; ++i){ printf("Source Adapter ID:%d\n",pathArray[i].sourceInfo.adapterId); printf("Target Adapter ID:%d\n",pathArray[i].targetInfo.adapterId); } } catch (...) { wprintf(L"Error occurred.\n"); } delete[] pathArray; delete[] modeInfoArray; } ``` 上述代码展示了通过两次调用 `DisplayConfigGetDeviceInfo()` 获取所需内存空间大小后再分配适当的空间存储结果的方式。第一次调用仅是为了获得必要的输入参数数目以便后续动态创建合适的缓存区域。第二次则是真正执行查询并将结果显示出来。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值