home *** CD-ROM | disk | FTP | other *** search
- /*
- * Author : Ranveer Chandra
- * Directory : VirtualWiFi_Root\driver
- * File Name : vwifi.c
- * Purpose : Ioctl Handlers, Dispatch Routines, Driver Init
- */
-
- #include "precomp.h"
- #pragma hdrstop
-
- #define MODULE_NUMBER MODULE_MUX
-
- #pragma NDIS_INIT_FUNCTION(DriverEntry)
-
-
- #if DEBUG
- //
- // Debug level for mux driver
- //
- INT muxDebugLevel = MUX_LOUD;
-
- #endif //DBG
- //
- // G L O B A L V A R I A B L E S
- // ----------- -----------------
- //
-
- NDIS_MEDIUM MediumArray[1] =
- {
- NdisMedium802_3, // Ethernet
- };
-
-
- //
- // Global Mutex protects the AdapterList;
- // see macros MUX_ACQUIRE/RELEASE_MUTEX
- //
- MUX_MUTEX GlobalMutex = {0};
-
- //
- // List of all bound adapters.
- //
- LIST_ENTRY AdapterList;
-
- //
- // Total number of VELAN miniports in existance:
- //
- LONG MiniportCount = 0;
-
- //
- // Used to assign VELAN numbers (which are used to generate MAC
- // addresses).
- //
- ULONG NextVElanNumber = 0; // monotonically increasing count
-
- //
- // Some global NDIS handles:
- //
- NDIS_HANDLE NdisWrapperHandle = NULL;// From NdisMInitializeWrapper
- NDIS_HANDLE ProtHandle = NULL; // From NdisRegisterProtocol
- NDIS_HANDLE DriverHandle = NULL; // From NdisIMRegisterLayeredMiniport
- NDIS_HANDLE NdisDeviceHandle = NULL; // From NdisMRegisterDevice
-
- PDEVICE_OBJECT ControlDeviceObject = NULL; // Device for IOCTLs
- MUX_MUTEX ControlDeviceMutex;
-
-
-
- NTSTATUS
- DriverEntry(
- IN PDRIVER_OBJECT DriverObject,
- IN PUNICODE_STRING RegistryPath
- )
- /*++
-
- Routine Description:
-
- First entry point to be called, when this driver is loaded.
- Register with NDIS as an intermediate driver.
-
- Arguments:
-
- DriverObject - pointer to the system's driver object structure
- for this driver
-
- RegistryPath - system's registry path for this driver
-
- Return Value:
-
- STATUS_SUCCESS if all initialization is successful, STATUS_XXX
- error code if not.
-
- --*/
- {
- NDIS_STATUS Status;
- NDIS_PROTOCOL_CHARACTERISTICS PChars;
- NDIS_MINIPORT_CHARACTERISTICS MChars;
- PNDIS_CONFIGURATION_PARAMETER Param;
- NDIS_STRING Name;
-
- NdisInitializeListHead(&AdapterList);
- MUX_INIT_MUTEX(&GlobalMutex);
- MUX_INIT_MUTEX(&ControlDeviceMutex);
-
- NdisMInitializeWrapper(&NdisWrapperHandle, DriverObject, RegistryPath, NULL);
-
- do
- {
- //
- // Register the miniport with NDIS. Note that it is the
- // miniport which was started as a driver and not the protocol.
- // Also the miniport must be registered prior to the protocol
- // since the protocol's BindAdapter handler can be initiated
- // anytime and when it is, it must be ready to
- // start driver instances.
- //
- NdisZeroMemory(&MChars, sizeof(NDIS_MINIPORT_CHARACTERISTICS));
-
- MChars.MajorNdisVersion = MUX_MAJOR_NDIS_VERSION;
- MChars.MinorNdisVersion = MUX_MINOR_NDIS_VERSION;
-
- MChars.InitializeHandler = MPInitialize;
- MChars.QueryInformationHandler = MPQueryInformation;
- MChars.SetInformationHandler = MPSetInformation;
- MChars.TransferDataHandler = MPTransferData;
- MChars.HaltHandler = MPHalt;
- #ifdef NDIS51_MINIPORT
- MChars.CancelSendPacketsHandler = MPCancelSendPackets;
- MChars.PnPEventNotifyHandler = MPDevicePnPEvent;
- MChars.AdapterShutdownHandler = MPAdapterShutdown;
- #endif // NDIS51_MINIPORT
-
- //
- // We will disable the check for hang timeout so we do not
- // need a check for hang handler!
- //
- MChars.CheckForHangHandler = NULL;
- MChars.ReturnPacketHandler = MPReturnPacket;
-
- //
- // Either the Send or the SendPackets handler should be specified.
- // If SendPackets handler is specified, SendHandler is ignored
- //
- MChars.SendHandler = NULL;
- MChars.SendPacketsHandler = MPSendPackets;
-
- Status = NdisIMRegisterLayeredMiniport(NdisWrapperHandle,
- &MChars,
- sizeof(MChars),
- &DriverHandle);
- if (Status != NDIS_STATUS_SUCCESS)
- {
- break;
- }
-
- NdisMRegisterUnloadHandler(NdisWrapperHandle, MPUnload);
-
- //
- // Now register the protocol.
- //
- NdisZeroMemory(&PChars, sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
- PChars.MajorNdisVersion = MUX_PROT_MAJOR_NDIS_VERSION;
- PChars.MinorNdisVersion = MUX_PROT_MINOR_NDIS_VERSION;
-
- //
- // Make sure the protocol-name matches the service-name
- // (from the INF) under which this protocol is installed.
- // This is needed to ensure that NDIS can correctly determine
- // the binding and call us to bind to miniports below.
- //
- NdisInitUnicodeString(&Name, L"VWIFIP"); // Protocol name
- PChars.Name = Name;
- PChars.OpenAdapterCompleteHandler = PtOpenAdapterComplete;
- PChars.CloseAdapterCompleteHandler = PtCloseAdapterComplete;
- PChars.SendCompleteHandler = PtSendComplete;
- PChars.TransferDataCompleteHandler = PtTransferDataComplete;
-
- PChars.ResetCompleteHandler = PtResetComplete;
- PChars.RequestCompleteHandler = PtRequestComplete;
- PChars.ReceiveHandler = PtReceive;
- PChars.ReceiveCompleteHandler = PtReceiveComplete;
- PChars.StatusHandler = PtStatus;
- PChars.StatusCompleteHandler = PtStatusComplete;
- PChars.BindAdapterHandler = PtBindAdapter;
- PChars.UnbindAdapterHandler = PtUnbindAdapter;
- PChars.UnloadHandler = NULL;
- PChars.ReceivePacketHandler = PtReceivePacket;
- PChars.PnPEventHandler= PtPNPHandler;
-
- NdisRegisterProtocol(&Status,
- &ProtHandle,
- &PChars,
- sizeof(NDIS_PROTOCOL_CHARACTERISTICS));
-
- if (Status != NDIS_STATUS_SUCCESS)
- {
- NdisIMDeregisterLayeredMiniport(DriverHandle);
- break;
- }
-
- //
- // Let NDIS know of the association between our protocol
- // and miniport entities.
- //
- NdisIMAssociateMiniport(DriverHandle, ProtHandle);
- }
- while (FALSE);
-
- if (Status != NDIS_STATUS_SUCCESS)
- {
- NdisTerminateWrapper(NdisWrapperHandle, NULL);
- }
-
- return(Status);
- }
-
-
- NDIS_STATUS
- PtRegisterDevice(
- VOID
- )
- /*++
-
- Routine Description:
-
- Register an ioctl interface - a device object to be used for this
- purpose is created by NDIS when we call NdisMRegisterDevice.
-
- This routine is called whenever a new miniport instance is
- initialized. However, we only create one global device object,
- when the first miniport instance is initialized. This routine
- handles potential race conditions with PtDeregisterDevice via
- the ControlDeviceMutex.
-
- NOTE: do not call this from DriverEntry; it will prevent the driver
- from being unloaded (e.g. on uninstall).
-
- Arguments:
-
- None
-
- Return Value:
-
- NDIS_STATUS_SUCCESS if we successfully register a device object.
-
- --*/
- {
- NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
- UNICODE_STRING DeviceName;
- UNICODE_STRING DeviceLinkUnicodeString;
- PDRIVER_DISPATCH DispatchTable[IRP_MJ_MAXIMUM_FUNCTION];
- UINT i;
-
- DBGPRINT(MUX_LOUD, ("==>PtRegisterDevice\n"));
-
- MUX_ACQUIRE_MUTEX(&ControlDeviceMutex);
-
- ++MiniportCount;
-
- if (1 == MiniportCount)
- {
- for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++)
- {
- DispatchTable[i] = PtDispatch;
- }
-
- NdisInitUnicodeString(&DeviceName, NTDEVICE_STRING);
- NdisInitUnicodeString(&DeviceLinkUnicodeString, LINKNAME_STRING);
-
- //
- // Create a device object and register our dispatch handlers
- //
- Status = NdisMRegisterDevice(
- NdisWrapperHandle,
- &DeviceName,
- &DeviceLinkUnicodeString,
- &DispatchTable[0],
- &ControlDeviceObject,
- &NdisDeviceHandle
- );
- }
-
- MUX_RELEASE_MUTEX(&ControlDeviceMutex);
-
- DBGPRINT(MUX_INFO, ("<==PtRegisterDevice: %x\n", Status));
-
- return (Status);
- }
-
-
- NTSTATUS
- PtDispatch(
- IN PDEVICE_OBJECT DeviceObject,
- IN PIRP Irp
- )
- /*++
- Routine Description:
-
- Process IRPs sent to this device.
-
- Arguments:
-
- DeviceObject - pointer to a device object
- Irp - pointer to an I/O Request Packet
-
- Return Value:
-
- NTSTATUS - STATUS_SUCCESS always - change this when adding
- real code to handle ioctls.
-
- --*/
- {
- PIO_STACK_LOCATION irpStack;
- NTSTATUS status = STATUS_SUCCESS;
- ULONG inlen, outlen;
- PVOID buffer;
- NDIS_STRING KeyName;
- WCHAR Device[100];
- UCHAR saveControlFlags;
- char tempBuffer[100];
- ULONG adapterNum = 1;
- PLIST_ENTRY p;
- PADAPT pAdapt;
- ULONG i = 0;
- BOOLEAN FoundAdapter = FALSE;
- SetVirtualWiFiTimers setVirtualWiFiTimers;
- SetVirtualWiFiTimersForConnection setVirtualWiFiTimersForConnection;
- NetworkModeAndSSID networkModeAndSSID;
-
- irpStack = IoGetCurrentIrpStackLocation(Irp);
- DBGPRINT(MUX_LOUD, ("==>PtDispatch %d\n", irpStack->MajorFunction));
-
- switch (irpStack->MajorFunction)
- {
- case IRP_MJ_CREATE:
- break;
- case IRP_MJ_CLOSE:
- break;
- case IRP_MJ_DEVICE_CONTROL: {
-
- buffer = Irp->AssociatedIrp.SystemBuffer;
- inlen = irpStack->Parameters.DeviceIoControl.InputBufferLength;
- outlen = irpStack->Parameters.DeviceIoControl.OutputBufferLength;
- saveControlFlags = irpStack->Control;
-
- //DBGPRINT(MUX_LOUD, ("The ioctl string is %s\n", buffer));
- //DBGPRINT(MUX_LOUD, ("The Buffer length is %d\n", outlen));
-
- switch (irpStack->Parameters.DeviceIoControl.IoControlCode) {
- //
- // Add code here to handle ioctl commands.
- //
- /*
- // set the time the adapter should take for switching to an IS network
- case IOCTL_SET_SWITCHING_TIME_INFRA:
- memcpy(tempBuffer, buffer, inlen);
- // set value of switching time from ioctl buffer
- g_SwitchingTimeInfra = atol(tempBuffer);
- DBGPRINT(MUX_LOUD, ("The new infrastructure switching time is %d\n", g_SwitchingTimeInfra));
- Irp->IoStatus.Information = 0;
- break;
-
- // set the time, the adapter is active on an IS network
- case IOCTL_SET_WAITING_TIME_INFRA:
- memcpy(tempBuffer, buffer, inlen);
- // set value of waiting time from ioctl buffer
- g_WaitingTimeInfra = atol(tempBuffer);
- DBGPRINT(MUX_LOUD, ("The new infrastructure waiting time is %d\n", g_WaitingTimeInfra));
- Irp->IoStatus.Information = 0;
- break;
-
- // set the time the adapter should take for switching to AH network
- case IOCTL_SET_SWITCHING_TIME_ADHOC:
- memcpy(tempBuffer, buffer, inlen);
- // set value of switching time from ioctl buffer
- g_SwitchingTimeAdhoc = atol(tempBuffer);
- DBGPRINT(MUX_LOUD, ("The new infrastructure switching time is %d\n", g_SwitchingTimeAdhoc));
- Irp->IoStatus.Information = 0;
- break;
-
- // set the time, the adapter is active on an AH network
- case IOCTL_SET_WAITING_TIME_ADHOC:
- memcpy(tempBuffer, buffer, inlen);
- // set value of waiting time from ioctl buffer
- g_WaitingTimeAdhoc = atol(tempBuffer);
- DBGPRINT(MUX_LOUD, ("The new infrastructure waiting time is %d\n", g_WaitingTimeAdhoc));
- Irp->IoStatus.Information = 0;
- break;
-
- // get the time the adapter takes for switching a network to AH mode
- case IOCTL_GET_SWITCHING_TIME_ADHOC:
- sprintf(tempBuffer, "%d\0", g_SwitchingTimeAdhoc);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // get value of switching time from ioctl buffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- break;
-
- // get the time the adapter stays on a network in AH mode
- case IOCTL_GET_WAITING_TIME_ADHOC:
- sprintf(tempBuffer, "%d\0", g_WaitingTimeAdhoc);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // get value of switching time from ioctl buffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- break;
-
- // get the time the adapter takes for switching a network to IS mode
- case IOCTL_GET_SWITCHING_TIME_INFRA:
- sprintf(tempBuffer, "%d\0", g_SwitchingTimeInfra);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // get value of switching time from ioctl buffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- break;
-
- // get the time the adapter stays on a network in IS mode
- case IOCTL_GET_WAITING_TIME_INFRA:
- sprintf(tempBuffer, "%d\0", g_WaitingTimeInfra);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // get value of switching time from ioctl buffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- break;
- */
-
- case IOCTL_GET_NUM_NETWORKS:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- ULONG count;
- ULONG numActiveNetworks = 0;
-
- // find number of networks with active connections
- for (count=0; count < pAdapt->numConnections; count++) {
- if(pAdapt->NumActiveConnectionsOnSSID[count] > 0)
- numActiveNetworks++;
- }
- sprintf(tempBuffer, "%d\0", numActiveNetworks);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy numnetworks value from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // return the scheduling scheme that should be used by the service
- case IOCTL_GET_SCHEDULING_SCHEME:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- if(pAdapt->isAdaptiveScheduling)
- sprintf(tempBuffer, "%d\0", ADAPTIVE_SCHEDULING);
- else
- sprintf(tempBuffer, "%d\0", FIXED_SCHEDULING);
-
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy scheduling scheme from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // return the timing parameters to be used by the service
- case IOCTL_GET_SWITCH_TIME:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- sprintf(tempBuffer, "%d\0", pAdapt->switchingTime[pAdapt->CurrentActiveConnection]);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy numnetworks value from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // return the timing parameters to be used by the service
- case IOCTL_GET_WAIT_TIME:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- sprintf(tempBuffer, "%d\0", pAdapt->waitingTime[pAdapt->CurrentActiveConnection]);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy numnetworks value from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // set the timing parameters; to be retrieved later by the service
- case IOCTL_SET_SWITCHING_PARAMETERS:
- memcpy(&setVirtualWiFiTimers, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(setVirtualWiFiTimers.adapterNum);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- pAdapt->switchingTime[pAdapt->CurrentActiveConnection] = setVirtualWiFiTimers.switchTime;
- pAdapt->waitingTime[pAdapt->CurrentActiveConnection] = setVirtualWiFiTimers.waitTime;
- pAdapt->isAdaptiveScheduling = setVirtualWiFiTimers.isAdaptiveScheduling;
-
- DBGPRINT(MUX_LOUD, ("Got switch time %d, wait time %d\n",
- setVirtualWiFiTimers.switchTime, setVirtualWiFiTimers.waitTime));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = 0;
- }
- break;
-
- // set the timing parameters; to be retrieved later by the service
- case IOCTL_SET_SWITCHING_PARAMETERS_FOR_CONNECTION:
- memcpy(&setVirtualWiFiTimersForConnection, buffer, inlen);
- DBGPRINT(MUX_LOUD, ("Got switch time %d, wait time %d\n",
- setVirtualWiFiTimersForConnection.switchTime, setVirtualWiFiTimersForConnection.waitTime));
- // get adapter from ioctl buffer
- adapterNum = atol(setVirtualWiFiTimersForConnection.adapterNum);
- i=0;
-
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- ULONG foundConnection = MAX_NETWORK_CONNECTIONS;
- NDIS_802_11_NETWORK_INFRASTRUCTURE networkMode;
- ULONG count, count1;
-
- if(setVirtualWiFiTimersForConnection.networkMode == MODE_IS)
- networkMode = Ndis802_11Infrastructure;
- else if (setVirtualWiFiTimersForConnection.networkMode == MODE_AH)
- networkMode = Ndis802_11IBSS;
- else
- networkMode = Ndis802_11AutoUnknown;
-
- // find whether this SSID existed
- for (count=0; count < pAdapt->numConnections; count++)
- {
- if(foundConnection < MAX_NETWORK_CONNECTIONS) break;
-
- // if the SSID lengths do not match
- if (setVirtualWiFiTimersForConnection.ssidLength != pAdapt->networkSSID[count].SsidLength)
- continue;
-
- // if modes do not match
- if (networkMode != pAdapt->networkMode[count])
- continue;
-
- // check whether SSIDs match
- for (count1=0; count1 < setVirtualWiFiTimersForConnection.ssidLength; count1++)
- {
- if(setVirtualWiFiTimersForConnection.networkSSID[count1] != pAdapt->networkSSID[count].Ssid[count1])
- break;
- if(count1 == (setVirtualWiFiTimersForConnection.ssidLength -1))
- {
- // found the network with required SSID and mode
- foundConnection = count;
- break;
- }
- }
- }
-
- //if(setVirtualWiFiTimersForConnection.connectionNum <= pAdapt->numConnections)
- if(foundConnection < MAX_NETWORK_CONNECTIONS)
- {
- if(setVirtualWiFiTimersForConnection.switchTime > 0)
- pAdapt->switchingTime[foundConnection] = setVirtualWiFiTimersForConnection.switchTime;
- if(setVirtualWiFiTimersForConnection.waitTime > 0)
- pAdapt->waitingTime[foundConnection] = setVirtualWiFiTimersForConnection.waitTime;
- if(setVirtualWiFiTimersForConnection.isAdaptiveScheduling < 2)
- pAdapt->isAdaptiveScheduling = setVirtualWiFiTimersForConnection.isAdaptiveScheduling;
-
- DBGPRINT(MUX_LOUD, ("Got switch time %d, wait time %d\n",
- setVirtualWiFiTimersForConnection.switchTime, setVirtualWiFiTimersForConnection.waitTime));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- }
- Irp->IoStatus.Information = 0;
- }
- break;
-
- // set the timing parameters; to be retrieved later by the service
- case IOCTL_SET_CURRENT_SSID:
- memcpy(&networkModeAndSSID, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(networkModeAndSSID.adapterNum);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- NDIS_802_11_NETWORK_INFRASTRUCTURE networkMode;
- NDIS_802_11_SSID networkSSID;
- LOCK_STATE LockState;
- ULONG ssidToSet = pAdapt->numConnections;
-
- DBGPRINT(MUX_LOUD, ("Got network mode %d, ssid %s, ssid Length %d\n",
- networkModeAndSSID.networkMode, networkModeAndSSID.networkSSID, networkModeAndSSID.ssidLength));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
-
- if(networkModeAndSSID.networkMode == MODE_IS)
- networkMode = Ndis802_11Infrastructure;
- else if (networkModeAndSSID.networkMode == MODE_AH)
- networkMode = Ndis802_11IBSS;
- else
- networkMode = Ndis802_11AutoUnknown;
-
- networkSSID.SsidLength = networkModeAndSSID.ssidLength;
- for(i=0; i<SSID_LENGTH; i++)
- {
- networkSSID.Ssid[i] = networkModeAndSSID.networkSSID[i];
- }
-
- MUX_ACQUIRE_ADAPT_WRITE_LOCK(pAdapt, &LockState);
-
- DBGPRINT(MUX_LOUD, ("Setting mode and ssid\n", buffer));
-
- // Set the mode of the adapter
- PtRequestAdapterAsync(pAdapt,
- NdisRequestSetInformation,
- OID_802_11_INFRASTRUCTURE_MODE,
- &networkMode,
- sizeof(networkMode),
- PtDiscardCompletedRequest);
-
- // Set the SSID of the adapter
- PtRequestAdapterAsync(pAdapt,
- NdisRequestSetInformation,
- OID_802_11_SSID,
- &networkSSID,
- sizeof(networkSSID),
- PtDiscardCompletedRequest);
-
- for(i=0; i<pAdapt->numConnections; i++) {
- if(pAdapt->networkSSID[i].SsidLength == 0) {
- ssidToSet = i;
- }
- }
-
- if(networkModeAndSSID.networkMode == MODE_IS)
- pAdapt->networkMode[ssidToSet] = Ndis802_11Infrastructure;
- else if (networkModeAndSSID.networkMode == MODE_AH)
- pAdapt->networkMode[ssidToSet] = Ndis802_11IBSS;
- else
- pAdapt->networkMode[ssidToSet] = Ndis802_11AutoUnknown;
-
- pAdapt->networkSSID[ssidToSet].SsidLength = networkModeAndSSID.ssidLength;
- for(i=0; i<SSID_LENGTH; i++)
- {
- pAdapt->networkSSID[ssidToSet].Ssid[i] = networkModeAndSSID.networkSSID[i];
- }
-
- MUX_RELEASE_ADAPT_WRITE_LOCK(pAdapt, &LockState);
-
- Irp->IoStatus.Information = 0;
-
- }
- break;
-
- // get the SSID of the current network
- case IOCTL_GET_CURRENT_SSID:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- NDIS_802_11_SSID networkSSID;
- /*
- for(i=0; i<pAdapt->networkSSID[pAdapt->CurrentActiveConnection].SsidLength; i++)
- {
- tempBuffer[i]=pAdapt->networkSSID[pAdapt->CurrentActiveConnection].Ssid[i];
- }
- tempBuffer[i] = '\0';
- i=0;
- */
- // query the SSID
- PtQueryAdapterSync(pAdapt,
- OID_802_11_SSID,
- &networkSSID,
- sizeof(networkSSID));
-
- if(networkSSID.SsidLength < outlen) {
- for(i=0; i<networkSSID.SsidLength; i++)
- {
- tempBuffer[i] = networkSSID.Ssid[i];
- }
- tempBuffer[i] = '\0';
- }
- else {
- strcpy(tempBuffer, "NOTSET");
- tempBuffer[6] = '\0';
- //break;
- }
- i=0;
- }
- else {
- strcpy(tempBuffer, "NOTFOUND");
- tempBuffer[8] = '\0';
- }
- // copy SSID value from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The ssid buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- break;
-
- // get the mode of the current network
- case IOCTL_GET_CURRENT_MODE:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- NDIS_802_11_NETWORK_INFRASTRUCTURE networkMode;
- ULONG uNetworkMode;
-
- // query the mode
- PtQueryAdapterSync(pAdapt,
- OID_802_11_INFRASTRUCTURE_MODE,
- &networkMode,
- sizeof(networkMode));
-
- if(networkMode == Ndis802_11Infrastructure)
- uNetworkMode = MODE_IS;
- else if (networkMode == Ndis802_11IBSS)
- uNetworkMode = MODE_AH;
- else
- uNetworkMode = 3;
-
- sprintf(tempBuffer, "%d\0", networkMode);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy mode from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // get the length of the buffer
- case IOCTL_GET_BUFFER_QUEUE_LENGTH:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- sprintf(tempBuffer, "%d\0", pAdapt->nTotalPacketsSeen[pAdapt->CurrentActiveConnection]);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy buffer length from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // get the length of the buffer
- case IOCTL_GET_CARD_SWITCH_TIME:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- i=0;
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- {
- sprintf(tempBuffer, "%I64d\0", pAdapt->cardSwitchTime);
- if(outlen < strlen(tempBuffer)) {
- status = STATUS_BUFFER_TOO_SMALL;
- break;
- }
- // copy buffer length from tempBuffer
- RtlCopyMemory(buffer, tempBuffer, strlen(tempBuffer));
- DBGPRINT(MUX_LOUD, ("The switch buffer is %s\n", buffer));
- Irp->IoStatus.Information = strlen(tempBuffer);
- }
- break;
-
- // start switching the card
- case IOCTL_START_SWITCHING:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- pAdapt->StartSwitching = TRUE;
- FoundAdapter = FALSE;
- i = 0;
- DBGPRINT(MUX_LOUD, ("The card can switch now\n"));
- Irp->IoStatus.Information = 0;
- break;
-
- // start switching the card
- case IOCTL_SWITCH_SSID:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- if(FoundAdapter)
- PtIoctlSetAdapterSSID(pAdapt);
- FoundAdapter = FALSE;
- i = 0;
- DBGPRINT(MUX_LOUD, ("The card switched SSIDs\n"));
- Irp->IoStatus.Information = 0;
- break;
-
- // start switching the card
- case IOCTL_SEND_BUFFERED_PACKETS:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
-
- // get the corresponding pAdapt data structure
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- // Send the packets for the corresponding adapter
- if(FoundAdapter)
- PtIoctlSendBufferedPackets(pAdapt);
- FoundAdapter = FALSE;
- i = 0;
- DBGPRINT(MUX_LOUD, ("The card sent the buffered packets\n"));
- Irp->IoStatus.Information = 0;
- break;
-
- // start switching the card
- case IOCTL_START_BUFFERING_PACKETS:
- memcpy(tempBuffer, buffer, inlen);
- // get adapter from ioctl buffer
- adapterNum = atol(tempBuffer);
-
- // get the corresponding pAdapt data structure
- for(p = AdapterList.Flink;
- p != &AdapterList;
- p = p->Flink)
- {
- i++;
- if(i<adapterNum) {
- continue;
- }
- pAdapt = CONTAINING_RECORD(p, ADAPT, Link);
- FoundAdapter = TRUE;
- break;
- }
- // Set the signal to start buffering packets on that SSID
- if(FoundAdapter)
- PtIoctlStartBufferingPackets(pAdapt);
- FoundAdapter = FALSE;
- i = 0;
- DBGPRINT(MUX_LOUD, ("The card sent the buffered packets\n"));
- Irp->IoStatus.Information = 0;
- break;
-
- default:
- Irp->IoStatus.Information = 0;
- break;
- }
- break;
- }
- default:
- break;
- }
- //Irp->IoStatus.Information = 0;
- Irp->IoStatus.Status = status;
- IoCompleteRequest(Irp, IO_NO_INCREMENT);
-
- DBGPRINT(MUX_LOUD, ("<== PtDispatch\n"));
-
- return status;
-
- }
-
-
- NDIS_STATUS
- PtDeregisterDevice(
- VOID
- )
- /*++
-
- Routine Description:
-
- Deregister the ioctl interface. This is called whenever a miniport
- instance is halted. When the last miniport instance is halted, we
- request NDIS to delete the device object
-
- Arguments:
-
- NdisDeviceHandle - Handle returned by NdisMRegisterDevice
-
- Return Value:
-
- NDIS_STATUS_SUCCESS if everything worked ok
-
- --*/
- {
- NDIS_STATUS Status = NDIS_STATUS_SUCCESS;
-
- DBGPRINT(MUX_LOUD, ("==>PassthruDeregisterDevice\n"));
-
- MUX_ACQUIRE_MUTEX(&ControlDeviceMutex);
-
- ASSERT(MiniportCount > 0);
-
- --MiniportCount;
-
- if (0 == MiniportCount)
- {
- //
- // All VELAN miniport instances have been halted.
- // Deregister the control device.
- //
-
- if (NdisDeviceHandle != NULL)
- {
- Status = NdisMDeregisterDevice(NdisDeviceHandle);
- NdisDeviceHandle = NULL;
- }
- }
-
- MUX_RELEASE_MUTEX(&ControlDeviceMutex);
-
- DBGPRINT(MUX_INFO, ("<== PassthruDeregisterDevice: %x\n", Status));
- return Status;
-
- }
-
-
-
-