home *** CD-ROM | disk | FTP | other *** search
- /*
- * Author : Ranveer Chandra
- * Directory: VirtualWiFi_Root\install
- * File Name: VirtualWiFi.cpp
- * Purpose : This is the main VirtualWiFi installer file
- */
-
- //#include <nt.h>
- //#include <ntrtl.h>
- //#include <nturtl.h>
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <winsock2.h>
- #include <ws2tcpip.h>
- #include <math.h>
- #include <string.h>
- #include <setupapi.h>
- #include "precomp.h"
-
- //#include "types.h"
- //#include "ether.h"
- #include "ntddndis.h"
- #include "ioctl.h"
-
- extern HRESULT AddOrRemoveVirtualWiFi(bool AddOrRemove, const char *SetupKitDir);
-
- extern int ControlDeviceClass(DWORD Action);
-
- extern VOID AddNetwork (HWND hwndDlg, BOOL addNetwork);
-
- extern VOID RenameConnection ( LPCWSTR ConnectionName );
-
- extern BOOL DoesConnectionExist ( LPCWSTR ConnectionName );
-
- extern BOOL DoesEnabledConnectionExist ( LPCWSTR ConnectionName );
-
- extern
- HRESULT EnableDisableConnection ( LPCWSTR ConnectionName, BOOL enableConnection );
-
- extern
- int ServiceInstaller(char *action, char *pSvcPath);
-
- HANDLE Handle;
-
- bool Persistent = FALSE;
- bool Verbose = FALSE;
- extern bool AdminAccess = TRUE;
- bool ConvertHostName = TRUE; // Whether to query names or just print addrs.
-
-
- char *
- FormatGuid(const GUID *Guid)
- {
- static char buffer[40];
-
- sprintf(buffer,
- "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
- Guid->Data1,
- Guid->Data2,
- Guid->Data3,
- Guid->Data4[0],
- Guid->Data4[1],
- Guid->Data4[2],
- Guid->Data4[3],
- Guid->Data4[4],
- Guid->Data4[5],
- Guid->Data4[6],
- Guid->Data4[7]);
-
- return buffer;
- }
-
- WCHAR *
- MapAdapterGuidToFriendlyName(const GUID *Guid)
- {
- static HMODULE hModule;
- static HRESULT (WINAPI *pHrLanConnectionNameFromGuidOrPath)
- (const GUID *pGuid, LPCWSTR pszwPath,
- LPWSTR pszwName, LPDWORD pcchMax);
-
- //
- // Get the conversion function, if we don't already have it.
- //
- if (hModule == NULL) {
- char Path[MAX_PATH + 64];
-
- //
- // Use an absolute path with LoadLibrary
- // to prevent Prefast warning.
- //
- if (GetSystemDirectory(Path, MAX_PATH + 1) == 0)
- return NULL;
- strcat(Path, "\\netman.dll");
-
- hModule = LoadLibrary(Path);
- if (hModule != NULL)
- pHrLanConnectionNameFromGuidOrPath =
- (HRESULT (WINAPI *)(const GUID *, LPCWSTR, LPWSTR, LPDWORD))
- GetProcAddress(hModule, "HrLanConnectionNameFromGuidOrPath");
- }
-
- if (pHrLanConnectionNameFromGuidOrPath != NULL) {
- static WCHAR FriendlyName[2048];
- DWORD FriendlyNameLength = 2048;
-
- if ((*pHrLanConnectionNameFromGuidOrPath)(Guid, NULL,
- FriendlyName,
- &FriendlyNameLength) == 0)
- return FriendlyName;
- }
-
- return NULL;
- }
-
- DWORD WINAPI LoopOnce( LPVOID lpParam )
- {
- ULONG numVirtualWiFiNodes = *(ULONG *)lpParam;
- char *adapterNum="1\0";
- ULONG k = 0;
-
- Sleep(3000);
- if(Verbose)
- fprintf(stderr, "Number of virtual nodes %ld\n", numVirtualWiFiNodes);
- for(k = 0; k < 3*numVirtualWiFiNodes; k++) {
- ioctlSet(IOCTL_SWITCH_SSID, adapterNum, sizeof(adapterNum));
- ioctlSet(IOCTL_SEND_BUFFERED_PACKETS, adapterNum, sizeof(adapterNum));
- }
-
- return 0;
- }
-
- void
- usage(void)
- {
- fprintf(stdout, "usage: VirtualWiFi install\n"); //switch_time wait_time is_adaptive]\n");
- fprintf(stdout, " VirtualWiFi uninstall\n");
- fprintf(stdout, " VirtualWiFi addnetwork -ssid <ssid> -mode <AH | IS>\n");// [-switch <switch_time> -wait <wait_time> -isadapt <is_adaptive>]\n");
- fprintf(stdout, " VirtualWiFi removenetwork -ssid <ssid> -mode <AH | IS>\n");
- fprintf(stdout, " VirtualWiFi changeparams -ssid <ssid> -mode <AH | IS> -<param> <value>\n");
- fprintf(stdout, " <param>: switch <switch_time in ms>\n");
- fprintf(stdout, " wait <wait_time in ms>\n");
- fprintf(stdout, " isadapt <is_adaptive 0 or 1>\n");
-
- exit(1);
- }
-
- int __cdecl
- main(int argc, char **argv)
- {
- WSADATA wsaData;
- int Count;
- FILE *fpConfig;
- HRESULT hr = S_OK;
-
- if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
- fprintf(stderr, "WSAStartup failed\n");
- exit(1);
- }
-
- //
- // Parse any global options.
- //
- for (Count = 1; Count < argc; Count++) {
- if (!_stricmp(argv[Count], "-v")) {
- Verbose = TRUE;
- fprintf(stderr, "Set Verbose mode\n");
- }
- else if (!_stricmp(argv[Count], "-p"))
- Persistent = TRUE;
- else if (!_stricmp(argv[Count], "-d"))
- ConvertHostName = FALSE;
- else
- break;
- }
-
- argc -= Count;
- argv += Count;
-
-
- if (argc < 1)
- usage();
-
- //
- // Start with the commands which don't access the device.
- //
-
- fprintf(stdout, " \n");
-
- if (!_stricmp(argv[0], "install")) {
- char currentSSID[MAX_SSID_LENGTH];
- char dataFileName[100];
- char currentMode[3];
- char connectionName[100];
- wchar_t wConnectionName[100];
- SetVirtualWiFiTimers setVirtualWiFiTimers;
- char *stopstring;
- char *temp = ".";
-
- if(Verbose) fprintf(stderr, "argc is %d\n", argc);
-
- fflush(stdout);
-
- if(isInstalledVirtualWiFi()) {
- fprintf(stderr, "VirtualWiFi is already installed!\n");
- exit(0);
- }
- /*
- if(argc == 5) {
- setVirtualWiFiTimers.adapterNum = "1";
- setVirtualWiFiTimers.switchTime = strtol(argv[2], &stopstring, 10);
- setVirtualWiFiTimers.waitTime = atol(argv[3]);
- setVirtualWiFiTimers.isAdaptiveScheduling = atoi(argv[4]);
- }
- */
-
- if (GetAssoc() == TRUE) {
- if(Verbose)
- fprintf(stderr, "Wireless card is associated\n");
- }
- else {
- fprintf(stderr, "Your card is not connected to any network.\n");
- fprintf(stderr, "Please connect your card any try again\n");
- exit(0);
- }
-
- switch (argc) {
- case 1:
- fprintf(stdout, "Installing the VirtualWiFi Driver...\n");
- hr = AddOrRemoveVirtualWiFi(TRUE, ".");
- if (hr == S_OK) {
- fprintf(stdout, "Successfully installed the VirtualWiFi Driver.\n");
- fprintf(stdout, "Installing the VirtualWiFi Service ...\n");
- if (ServiceInstaller("install", temp) > 0)
- if(isInstalledVirtualWiFi())
- fprintf(stdout, "VirtualWiFi install complete.\n");
- else {
- fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
- exit(0);
- }
- else {
- fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
- exit(0);
- }
- } else {
- fprintf(stdout, "Problem %d installing the VirtualWiFi Driver.\n", hr);
- exit(0);
- }
- break;
-
- case 2:
- fprintf(stdout, "Installing the VirtualWiFi Driver...\n");
- hr = AddOrRemoveVirtualWiFi(TRUE, argv[1]);
- if (hr == S_OK) {
- fprintf(stdout, "Successfully installed the VirtualWiFi Driver.\n");
- fprintf(stdout, "Installing the VirtualWiFi Service ...\n");
- if(ServiceInstaller("install", argv[1]) > 0) {
- if(isInstalledVirtualWiFi())
- fprintf(stdout, "VirtualWiFi install complete.\n");
- else {
- fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
- exit(0);
- }
- }
- else {
- fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
- exit(0);
- }
- } else {
- fprintf(stdout, "Problem %d installing the VirtualWiFi Driver.\n", hr);
- exit(0);
- }
- break;
-
- /*
- case 5:
- AddOrRemoveVirtualWiFi(TRUE, argv[1]);
- ServiceInstaller("install", argv[1]);
-
-
- if (Verbose)
- fprintf(stderr, "Setting switch time to %d, wait time to %d\n",
- setVirtualWiFiTimers.switchTime, setVirtualWiFiTimers.waitTime);
-
- ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS, &setVirtualWiFiTimers,
- (DWORD)sizeof(SetVirtualWiFiTimers));
-
- break;
-
-
- case 1:
- AddOrRemoveVirtualWiFi(TRUE, NULL);
- ServiceInstaller("install", NULL);
- break;
- */
- default:
- usage();
- }
- Sleep(1000);
-
- // Set the name of the connection
- GetSSID(currentSSID);
- if (Verbose)
- fprintf(stderr, "Got the SSID %s\n", currentSSID);
-
- GetMode(currentMode);
- if(Verbose)
- fprintf(stderr, "Current Mode is %s\n", currentMode);
-
- sprintf(connectionName, "VirtualWiFi %s %s\0", currentMode, currentSSID);
-
- //fpConfig = fopen("C:\\Windows\\VirtualWiFiData.txt", "w");
- sprintf(dataFileName, "%s\\VirtualWiFiData.txt", getenv("windir"));
- fpConfig = fopen(dataFileName, "w");
- fprintf(fpConfig, "%s\n", connectionName);
- fclose(fpConfig);
-
- if(Verbose)
- printf("Name the adapter to: %s\n", connectionName);
- mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
-
- RenameConnection(wConnectionName);
-
- exit(0);
- }
-
- if (!_stricmp(argv[0], "uninstall")) {
- HANDLE hThread;
- DWORD dwThreadId, dwThrdParam=1;
- ULONG numNodes=0;
- char *adapterNum="1\0";
-
- if (argc != 1)
- usage();
- fprintf(stdout, "Uninstalling VirtualWiFi ...\n");
- fprintf(stdout, "Stopping the VirtualWiFi Service.\n");
- ServiceInstaller("uninstall", NULL);
-
- numNodes = ioctlGetFromAdapter(IOCTL_GET_NUM_NETWORKS, adapterNum, (DWORD)strlen(adapterNum), &numNodes, sizeof(ULONG));
- hThread = CreateThread(
- NULL, // no security attributes
- 0, // use default stack size
- LoopOnce, // thread function
- &numNodes, // argument to thread function
- 0, // use default creation flags
- &dwThreadId); // returns the thread identifier
- if (hThread == NULL) {
- printf("CreateThread failed." );
- } else {
- hr = AddOrRemoveVirtualWiFi(FALSE, NULL);
- Sleep(1000);
- CloseHandle( hThread );
- }
-
- if (hr == S_OK) {
- fprintf(stdout, "VirtualWiFi uninstalled.\n");
- } else {
- fprintf(stderr, "Problems uninstalling the VirtualWiFi driver.\n");
- }
- exit(0);
- }
-
- if (!_stricmp(argv[0], "enable")) {
- if (argc != 1)
- usage();
- Count = ControlDeviceClass(DICS_ENABLE);
- printf("%u Adapter%s enabled.\n", Count, (Count == 1) ? "" : "s");
- exit(0);
- }
-
- if (!_stricmp(argv[0], "disable")) {
- if (argc != 1)
- usage();
- Count = ControlDeviceClass(DICS_DISABLE);
- printf("%u Adapter%s disabled.\n", Count, (Count == 1) ? "" : "s");
- exit(0);
- }
-
- if (!_stricmp(argv[0], "restart")) {
- if (argc != 1)
- usage();
- Count = ControlDeviceClass(DICS_PROPCHANGE);
- printf("%u Adapter%s restarted.\n", Count, (Count == 1) ? "" : "s");
- exit(0);
- }
-
- if (!_stricmp(argv[0], "changeparams")) {
- SetVirtualWiFiTimersForConnection setVirtualWiFiTimersForConnection;
- int count;
- BOOL foundParamToSet = FALSE;
- BOOL foundNetworkModeToSet = FALSE;
- BOOL foundNetworkSSIDToSet = FALSE;
-
- if(!isInstalledVirtualWiFi()) {
- fprintf(stderr, "Please install VirtualWiFi before this operation\n");
- exit(0);
- }
- setVirtualWiFiTimersForConnection.adapterNum = "1";
- setVirtualWiFiTimersForConnection.switchTime = 0;
- setVirtualWiFiTimersForConnection.waitTime = 0;
- setVirtualWiFiTimersForConnection.isAdaptiveScheduling = 2;
-
- for(count = 1; count < argc; count++)
- {
- if(count == argc-1) {
- fprintf(stderr, "Incorrect arguments\n");
- usage();
- }
- if(!_stricmp(argv[count], "-switch")) {
- setVirtualWiFiTimersForConnection.switchTime = atol(argv[count+1]);
- foundParamToSet = TRUE;
- } else if(!_stricmp(argv[count], "-wait")) {
- setVirtualWiFiTimersForConnection.waitTime = atol(argv[count+1]);
- foundParamToSet = TRUE;
- } else if(!_stricmp(argv[count], "-isadapt")) {
- setVirtualWiFiTimersForConnection.isAdaptiveScheduling = atoi(argv[count+1]);
- foundParamToSet = TRUE;
- }
- else if(!_stricmp(argv[count], "-mode")) {
- if(!_stricmp(argv[count+1], "ah"))
- setVirtualWiFiTimersForConnection.networkMode = MODE_AH;
- else if(!_stricmp(argv[count+1], "is"))
- setVirtualWiFiTimersForConnection.networkMode = MODE_IS;
- else
- usage();
- foundNetworkModeToSet = TRUE;
- } else if(!_stricmp(argv[count], "-ssid")) {
- strcpy(setVirtualWiFiTimersForConnection.networkSSID, argv[count+1]);
- setVirtualWiFiTimersForConnection.ssidLength = (ULONG)strlen(setVirtualWiFiTimersForConnection.networkSSID);
- foundNetworkSSIDToSet = TRUE;
- } else {
- fprintf(stderr, "Incorrect arguments\n");
- usage();
- }
- count+=1;
- }
- if(foundParamToSet && foundNetworkModeToSet && foundNetworkSSIDToSet) {
- char connectionName[100];
- wchar_t wConnectionName[100];
- if(setVirtualWiFiTimersForConnection.networkMode == MODE_AH)
- sprintf(connectionName, "VirtualWiFi AH %s\0", setVirtualWiFiTimersForConnection.networkSSID);
- else
- sprintf(connectionName, "VirtualWiFi IS %s\0", setVirtualWiFiTimersForConnection.networkSSID);
- mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
-
- if(!DoesConnectionExist(wConnectionName)) {
- fprintf(stderr, "The specified connection does not exist\n");
- exit(0);
- }
- ServiceInstaller("stop", NULL);
- Sleep(1000);
- ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS_FOR_CONNECTION, &setVirtualWiFiTimersForConnection,
- (DWORD)sizeof(SetVirtualWiFiTimersForConnection));
- Sleep(2000);
- fprintf(stderr, "Set parameters successful\n");
- ServiceInstaller("start", NULL);
- } else {
- fprintf(stderr, "Incorrect arguments. Specify SSID, mode and parameter\n");
- usage();
- }
- exit(0);
- }
-
- if (!_stricmp(argv[0], "addnetwork") || !_stricmp(argv[0], "removenetwork")) {
- char newSSID[MAX_SSID_LENGTH];
- char response[50];
- char networkSSID[MAX_SSID_LENGTH];
- char connectionName[100];
- wchar_t wConnectionName[100];
- USHORT mode;
- int count = 0;
- SetVirtualWiFiTimers setVirtualWiFiTimers;
- bool userParameters = FALSE;
- NetworkModeAndSSID networkModeAndSSID;
-
- if(!isInstalledVirtualWiFi()) {
- fprintf(stderr, "Please install VirtualWiFi before this operation\n");
- exit(0);
- }
- // take as input the parameters of the network
- if(argc == 1) {
- printf("Enter the SSID: ");
- scanf("%s", newSSID);
- printf("Enter Mode, ADHOC (0), INFRASTRUCTURE (1): ");
- scanf("%d", &mode);
- } else if(argc == 5) {
- for(count = 1; count < argc; count++) {
- if(!_stricmp(argv[count], "-mode")) {
- if(!_stricmp(argv[count+1], "ah"))
- mode = MODE_AH;
- else if(!_stricmp(argv[count+1], "is"))
- mode = MODE_IS;
- else
- usage();
- } else if(!_stricmp(argv[count], "-ssid")) {
- strcpy(newSSID, argv[count+1]);
- } else {
- fprintf(stderr, "Incorrect args\n");
- exit(0);
- }
- count+=1;
- }
- } else if(argc == 11 && !_stricmp(argv[0], "addnetwork")) {
- for(count = 1; count < argc; count++) {
- if(!_stricmp(argv[count], "-mode")) {
- if(!_stricmp(argv[count+1], "ah"))
- mode = MODE_AH;
- else if(!_stricmp(argv[count+1], "is"))
- mode = MODE_IS;
- else
- usage();
- } else if(!_stricmp(argv[count], "-ssid")) {
- strcpy(newSSID, argv[count+1]);
- } else if(!_stricmp(argv[count], "-switch")) {
- setVirtualWiFiTimers.switchTime = atol(argv[count+1]);
- } else if(!_stricmp(argv[count], "-wait")) {
- setVirtualWiFiTimers.waitTime = atol(argv[count+1]);
- } else if(!_stricmp(argv[count], "-isadapt")) {
- setVirtualWiFiTimers.isAdaptiveScheduling = atoi(argv[count+1]);
- } else {
- fprintf(stderr, "Incorrect args\n");
- exit(0);
- }
- count+=1;
- }
-
- userParameters = TRUE;
- setVirtualWiFiTimers.adapterNum = "1";
- } else
- usage();
-
- count = 0;
- if(mode == MODE_AH)
- sprintf(connectionName, "VirtualWiFi AH %s\0", newSSID);
- else
- sprintf(connectionName, "VirtualWiFi IS %s\0", newSSID);
-
- if(Verbose)
- fprintf(stderr, "Check Name of the adapter: %s\n", connectionName);
- mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
-
- if(!DoesEnabledConnectionExist(wConnectionName)) {
- if(!_stricmp(argv[0], "addnetwork")) {
- ServiceInstaller("stop", NULL);
- /* This worked with WMI. Needed to change this for SP2 */
- /* SetMode(mode);
- Sleep(50);
- SetSSID(newSSID);
- while((GetAssoc()!= S_OK) && count < 5) {
- SetSSID(newSSID);
- count++;
- Sleep(1000);
- }
- */
- strcpy(networkModeAndSSID.networkSSID, newSSID);
- networkModeAndSSID.adapterNum = "1";
- networkModeAndSSID.ssidLength = (ULONG)strlen(networkModeAndSSID.networkSSID);
- networkModeAndSSID.networkMode = mode;
-
- if(!DoesConnectionExist(wConnectionName)) {
- char dataFileName[100];
- GetSSID(networkSSID);
- while(_stricmp(networkSSID, newSSID) && count < 5) {
- ioctlSet(IOCTL_SET_CURRENT_SSID, &networkModeAndSSID, (DWORD) sizeof(networkModeAndSSID));
- count++;
- Sleep(1000);
- GetSSID(networkSSID);
- }
-
- if(_stricmp(networkSSID, newSSID)) {
- fprintf(stderr, "Unable to associate to the network\n");
- fprintf(stdout, "Do you want to continue with the installation? (Y/N) \n");
- scanf("%s", response);
- if(!_stricmp(response, "y")) {
- fprintf(stdout, "Continuing with the installation.\n");
- } else {
- fprintf(stderr, "EXITING .....\n");
- ServiceInstaller("start", NULL);
- exit(0);
- }
- }
-
- AddNetwork(GetDesktopWindow(), TRUE);
- if (Verbose)
- fprintf(stderr, "Trying to rename\n");
- fprintf(stdout, "Successfully added network.\n");
- RenameConnection(wConnectionName);
- //fpConfig = fopen("C:\\Windows\\VirtualWiFiData.txt", "a");
- //printf("Windir is %s\n", getenv("windir"));
- sprintf(dataFileName, "%s\\VirtualWiFiData.txt", getenv("windir"));
- fpConfig = fopen(dataFileName, "a");
- fprintf(fpConfig, "%s\n", connectionName);
- fclose(fpConfig);
- } else {
- ioctlSet(IOCTL_SET_CURRENT_SSID, &networkModeAndSSID, (DWORD) sizeof(networkModeAndSSID));
- EnableDisableConnection(wConnectionName, TRUE);
- }
- if(userParameters) {
- fprintf(stderr, "Trying to set\n");
- ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS, &setVirtualWiFiTimers,
- (DWORD)sizeof(SetVirtualWiFiTimers));
- fprintf(stderr, "Set parameters successful\n");
- }
- } else { /* remove a network */
- fprintf(stderr, "Network to remove is not installed\n");
- }
- } else {
- if(!_stricmp(argv[0], "removenetwork")) {
- //AddNetwork(GetDesktopWindow(), FALSE);
- EnableDisableConnection(wConnectionName, FALSE);
- ServiceInstaller("stop", NULL);
- } else {
- fprintf(stderr, "Network to add is already installed\n");
- exit(0);
- }
- }
- if(Verbose)
- fprintf(stderr, "Starting Service ...\n");
-
- ServiceInstaller("start", NULL);
- exit(0);
- }
-
- usage();
- }
-