bSuccess = DeviceIoControl(hAdapter,
IOCTL_NDISUIO_SET_OID_VALUE,
&SetOid,
- sizeof(SetOid),
+ FIELD_OFFSET(NDISUIO_SET_OID, Data),
NULL,
0,
&dwBytesReturned,
DWORD QueryOidSize;
PNDIS_802_11_BSSID_LIST BssidList;
DWORD i, j;
+ DWORD dwNetworkCount;
WCHAR szMsgBuf[128];
SetOid.Oid = OID_802_11_BSSID_LIST_SCAN;
bSuccess = DeviceIoControl(hAdapter,
IOCTL_NDISUIO_SET_OID_VALUE,
&SetOid,
- sizeof(SetOid),
+ FIELD_OFFSET(NDISUIO_SET_OID, Data),
NULL,
0,
&dwBytesReturned,
if (!bSuccess)
return FALSE;
- /* Allocate space for 15 networks to be returned */
- QueryOidSize = sizeof(NDISUIO_QUERY_OID) + (sizeof(NDIS_WLAN_BSSID) * 15);
- QueryOid = HeapAlloc(GetProcessHeap(), 0, QueryOidSize);
- if (!QueryOid)
- return FALSE;
+ /* Wait 2 seconds for the scan to return some results */
+ Sleep(2000);
- QueryOid->Oid = OID_802_11_BSSID_LIST;
- BssidList = (PNDIS_802_11_BSSID_LIST)QueryOid->Data;
+ /* Allocate space for 10 networks to be returned initially */
+ QueryOid = NULL;
+ dwNetworkCount = 10;
+ for (;;)
+ {
+ if (QueryOid)
+ HeapFree(GetProcessHeap(), 0, QueryOid);
+
+ QueryOidSize = sizeof(NDISUIO_QUERY_OID) + (sizeof(NDIS_WLAN_BSSID) * dwNetworkCount);
+ QueryOid = HeapAlloc(GetProcessHeap(), 0, QueryOidSize);
+ if (!QueryOid)
+ return FALSE;
+
+ QueryOid->Oid = OID_802_11_BSSID_LIST;
+ BssidList = (PNDIS_802_11_BSSID_LIST)QueryOid->Data;
+
+ bSuccess = DeviceIoControl(hAdapter,
+ IOCTL_NDISUIO_QUERY_OID_VALUE,
+ QueryOid,
+ QueryOidSize,
+ QueryOid,
+ QueryOidSize,
+ &dwBytesReturned,
+ NULL);
+ if (!bSuccess && GetLastError() == ERROR_INSUFFICIENT_BUFFER)
+ {
+ /* Try allocating space for 10 more networks */
+ dwNetworkCount += 10;
+ }
+ else
+ {
+ break;
+ }
+ }
- bSuccess = DeviceIoControl(hAdapter,
- IOCTL_NDISUIO_QUERY_OID_VALUE,
- QueryOid,
- QueryOidSize,
- QueryOid,
- QueryOidSize,
- &dwBytesReturned,
- NULL);
if (!bSuccess)
{
HeapFree(GetProcessHeap(), 0, QueryOid);
}
/* Return the bytes read */
- if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.SET_INFORMATION.BytesRead;
+ if (Status == NDIS_STATUS_INVALID_LENGTH ||
+ Status == NDIS_STATUS_BUFFER_TOO_SHORT)
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ }
+ else if (Status == NDIS_STATUS_SUCCESS)
+ {
+ Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.SET_INFORMATION.BytesRead;
+ }
DPRINT("Final request status: 0x%x (%d)\n", Status, Irp->IoStatus.Information);
}
}
/* Return the bytes written */
- if (NT_SUCCESS(Status)) Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.QUERY_INFORMATION.BytesWritten;
+ if (Status == NDIS_STATUS_INVALID_LENGTH ||
+ Status == NDIS_STATUS_BUFFER_TOO_SHORT)
+ {
+ Status = STATUS_BUFFER_TOO_SMALL;
+ }
+ else if (Status == NDIS_STATUS_SUCCESS)
+ {
+ Irp->IoStatus.Information = sizeof(NDIS_OID) + Request.DATA.QUERY_INFORMATION.BytesWritten;
+ }
DPRINT("Final request status: 0x%x (%d)\n", Status, Irp->IoStatus.Information);
}