home *** CD-ROM | disk | FTP | other *** search
/ PCNET 2006 September - Disc 1 / PCNET_CD_2006_09.iso / surpriz / MSRMesh-VirtualWIFI.MSI / virtualwifi.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2005-06-24  |  19.1 KB  |  626 lines

  1. /*
  2.  * Author   : Ranveer Chandra
  3.  * Directory: VirtualWiFi_Root\install
  4.  * File Name: VirtualWiFi.cpp
  5.  * Purpose  : This is the main VirtualWiFi installer file
  6.  */
  7.  
  8. //#include <nt.h>
  9. //#include <ntrtl.h>
  10. //#include <nturtl.h>
  11. #include <windows.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <winsock2.h>
  15. #include <ws2tcpip.h>
  16. #include <math.h>
  17. #include <string.h>
  18. #include <setupapi.h>
  19. #include "precomp.h"
  20.  
  21. //#include "types.h"
  22. //#include "ether.h"
  23. #include "ntddndis.h"
  24. #include "ioctl.h"
  25.  
  26. extern HRESULT AddOrRemoveVirtualWiFi(bool AddOrRemove, const char *SetupKitDir);
  27.  
  28. extern int ControlDeviceClass(DWORD Action);
  29.  
  30. extern VOID AddNetwork (HWND hwndDlg, BOOL addNetwork);
  31.  
  32. extern VOID RenameConnection ( LPCWSTR ConnectionName );
  33.  
  34. extern BOOL DoesConnectionExist ( LPCWSTR ConnectionName );
  35.  
  36. extern BOOL DoesEnabledConnectionExist ( LPCWSTR ConnectionName );
  37.  
  38. extern 
  39. HRESULT EnableDisableConnection ( LPCWSTR ConnectionName, BOOL enableConnection );
  40.  
  41. extern 
  42. int ServiceInstaller(char *action, char *pSvcPath);
  43.  
  44. HANDLE Handle;
  45.  
  46. bool Persistent = FALSE;
  47. bool Verbose = FALSE;
  48. extern bool AdminAccess = TRUE;
  49. bool ConvertHostName = TRUE; // Whether to query names or just print addrs.
  50.  
  51.  
  52. char *
  53. FormatGuid(const GUID *Guid)
  54. {
  55.     static char buffer[40];
  56.  
  57.     sprintf(buffer,
  58.             "{%08lX-%04X-%04X-%02X%02X-%02X%02X%02X%02X%02X%02X}",
  59.             Guid->Data1,
  60.             Guid->Data2,
  61.             Guid->Data3,
  62.             Guid->Data4[0],
  63.             Guid->Data4[1],
  64.             Guid->Data4[2],
  65.             Guid->Data4[3],
  66.             Guid->Data4[4],
  67.             Guid->Data4[5],
  68.             Guid->Data4[6],
  69.             Guid->Data4[7]);
  70.  
  71.     return buffer;
  72. }
  73.  
  74. WCHAR *
  75. MapAdapterGuidToFriendlyName(const GUID *Guid)
  76. {
  77.     static HMODULE hModule;
  78.     static HRESULT (WINAPI *pHrLanConnectionNameFromGuidOrPath)
  79.         (const GUID *pGuid, LPCWSTR pszwPath,
  80.          LPWSTR pszwName, LPDWORD pcchMax);
  81.  
  82.     //
  83.     // Get the conversion function, if we don't already have it.
  84.     //
  85.     if (hModule == NULL) {
  86.         char Path[MAX_PATH + 64];
  87.  
  88.         //
  89.         // Use an absolute path with LoadLibrary
  90.         // to prevent Prefast warning.
  91.         //
  92.         if (GetSystemDirectory(Path, MAX_PATH + 1) == 0)
  93.             return NULL;
  94.         strcat(Path, "\\netman.dll");
  95.  
  96.         hModule = LoadLibrary(Path);
  97.         if (hModule != NULL)
  98.             pHrLanConnectionNameFromGuidOrPath =
  99.                 (HRESULT (WINAPI *)(const GUID *, LPCWSTR, LPWSTR, LPDWORD))
  100.                 GetProcAddress(hModule, "HrLanConnectionNameFromGuidOrPath");
  101.     }
  102.  
  103.     if (pHrLanConnectionNameFromGuidOrPath != NULL) {
  104.         static WCHAR FriendlyName[2048];
  105.         DWORD FriendlyNameLength = 2048;
  106.  
  107.         if ((*pHrLanConnectionNameFromGuidOrPath)(Guid, NULL,
  108.                                                   FriendlyName,
  109.                                                   &FriendlyNameLength) == 0)
  110.             return FriendlyName;
  111.     }
  112.  
  113.     return NULL;
  114. }
  115.  
  116. DWORD WINAPI LoopOnce( LPVOID lpParam ) 
  117.     ULONG numVirtualWiFiNodes = *(ULONG *)lpParam;
  118.     char *adapterNum="1\0";
  119.     ULONG k = 0;
  120.  
  121.     Sleep(3000);
  122.     if(Verbose)
  123.         fprintf(stderr, "Number of virtual nodes %ld\n", numVirtualWiFiNodes);
  124.     for(k = 0; k < 3*numVirtualWiFiNodes; k++) {
  125.         ioctlSet(IOCTL_SWITCH_SSID, adapterNum, sizeof(adapterNum));
  126.         ioctlSet(IOCTL_SEND_BUFFERED_PACKETS, adapterNum, sizeof(adapterNum));
  127.     }
  128.  
  129.     return 0; 
  130.  
  131. void
  132. usage(void)
  133. {
  134.     fprintf(stdout, "usage: VirtualWiFi install\n"); //switch_time wait_time is_adaptive]\n");
  135.     fprintf(stdout, "       VirtualWiFi uninstall\n");
  136.     fprintf(stdout, "       VirtualWiFi addnetwork     -ssid <ssid> -mode <AH | IS>\n");// [-switch <switch_time> -wait <wait_time> -isadapt <is_adaptive>]\n");
  137.     fprintf(stdout, "       VirtualWiFi removenetwork  -ssid <ssid> -mode <AH | IS>\n");
  138.     fprintf(stdout, "       VirtualWiFi changeparams   -ssid <ssid> -mode <AH | IS>  -<param> <value>\n");
  139.     fprintf(stdout, "                  <param>: switch  <switch_time in ms>\n");
  140.     fprintf(stdout, "                           wait    <wait_time in ms>\n");
  141.     fprintf(stdout, "                           isadapt <is_adaptive 0 or 1>\n");
  142.  
  143.     exit(1);
  144. }
  145.  
  146. int __cdecl
  147. main(int argc, char **argv)
  148. {
  149.     WSADATA wsaData;
  150.     int Count;
  151.     FILE *fpConfig; 
  152.     HRESULT hr = S_OK;
  153.    
  154.     if (WSAStartup(MAKEWORD(2, 0), &wsaData)) {
  155.         fprintf(stderr, "WSAStartup failed\n");
  156.         exit(1);
  157.     }
  158.  
  159.     //
  160.     // Parse any global options.
  161.     //
  162.     for (Count = 1; Count < argc; Count++) {
  163.         if (!_stricmp(argv[Count], "-v")) {
  164.             Verbose = TRUE;
  165.             fprintf(stderr, "Set Verbose mode\n");
  166.         }
  167.         else if (!_stricmp(argv[Count], "-p"))
  168.             Persistent = TRUE;
  169.         else if (!_stricmp(argv[Count], "-d"))
  170.             ConvertHostName = FALSE;
  171.         else
  172.             break;
  173.     }
  174.  
  175.     argc -= Count;
  176.     argv += Count;
  177.  
  178.  
  179.     if (argc < 1)
  180.         usage();
  181.  
  182.     //
  183.     // Start with the commands which don't access the device.
  184.     //
  185.  
  186.     fprintf(stdout, " \n");
  187.  
  188.     if (!_stricmp(argv[0], "install")) {
  189.         char currentSSID[MAX_SSID_LENGTH];
  190.         char dataFileName[100];
  191.         char currentMode[3];
  192.         char connectionName[100];
  193.         wchar_t wConnectionName[100];
  194.         SetVirtualWiFiTimers setVirtualWiFiTimers;
  195.         char *stopstring;
  196.         char *temp = ".";
  197.  
  198.         if(Verbose) fprintf(stderr, "argc is %d\n", argc);
  199.  
  200.         fflush(stdout);
  201.  
  202.         if(isInstalledVirtualWiFi()) {
  203.             fprintf(stderr, "VirtualWiFi is already installed!\n");
  204.             exit(0);
  205.         }
  206.         /*
  207.         if(argc == 5) {
  208.             setVirtualWiFiTimers.adapterNum = "1";
  209.             setVirtualWiFiTimers.switchTime = strtol(argv[2], &stopstring, 10);
  210.             setVirtualWiFiTimers.waitTime = atol(argv[3]);
  211.             setVirtualWiFiTimers.isAdaptiveScheduling = atoi(argv[4]);
  212.         }
  213.         */
  214.  
  215.         if (GetAssoc() == TRUE) {
  216.             if(Verbose)
  217.                 fprintf(stderr, "Wireless card is associated\n");
  218.         }
  219.         else {
  220.             fprintf(stderr, "Your card is not connected to any network.\n");
  221.             fprintf(stderr, "Please connect your card any try again\n");
  222.             exit(0);
  223.         }    
  224.         
  225.         switch (argc) {
  226.         case 1:
  227.             fprintf(stdout, "Installing the VirtualWiFi Driver...\n");
  228.             hr = AddOrRemoveVirtualWiFi(TRUE, ".");
  229.             if (hr == S_OK) {
  230.                 fprintf(stdout, "Successfully installed the VirtualWiFi Driver.\n");
  231.                 fprintf(stdout, "Installing the VirtualWiFi Service ...\n");
  232.                 if (ServiceInstaller("install", temp) > 0)
  233.                     if(isInstalledVirtualWiFi())
  234.                         fprintf(stdout, "VirtualWiFi install complete.\n");
  235.                     else {
  236.                         fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
  237.                         exit(0);
  238.                     }
  239.                 else {
  240.                     fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
  241.                     exit(0);
  242.                 }
  243.             } else {
  244.                 fprintf(stdout, "Problem %d installing the VirtualWiFi Driver.\n", hr);
  245.                 exit(0);
  246.             }
  247.             break;
  248.  
  249.         case 2:
  250.             fprintf(stdout, "Installing the VirtualWiFi Driver...\n");
  251.             hr = AddOrRemoveVirtualWiFi(TRUE, argv[1]);
  252.             if (hr == S_OK) {
  253.                 fprintf(stdout, "Successfully installed the VirtualWiFi Driver.\n");
  254.                 fprintf(stdout, "Installing the VirtualWiFi Service ...\n");
  255.                 if(ServiceInstaller("install", argv[1]) > 0) {
  256.                     if(isInstalledVirtualWiFi())
  257.                         fprintf(stdout, "VirtualWiFi install complete.\n");
  258.                     else {
  259.                         fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
  260.                         exit(0);
  261.                     }
  262.                 }
  263.                 else {
  264.                     fprintf(stdout, "Error: Check that name of your wireless adapter is in the keywords, FAQ#1\n");
  265.                     exit(0);
  266.                 }
  267.             } else {
  268.                 fprintf(stdout, "Problem %d installing the VirtualWiFi Driver.\n", hr);
  269.                 exit(0);
  270.             }
  271.             break;
  272.  
  273.         /*
  274.         case 5:
  275.             AddOrRemoveVirtualWiFi(TRUE, argv[1]);
  276.             ServiceInstaller("install", argv[1]);
  277.  
  278.  
  279.             if (Verbose)
  280.                 fprintf(stderr, "Setting switch time to %d, wait time to %d\n", 
  281.                     setVirtualWiFiTimers.switchTime, setVirtualWiFiTimers.waitTime);
  282.  
  283.             ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS, &setVirtualWiFiTimers, 
  284.                 (DWORD)sizeof(SetVirtualWiFiTimers));
  285.  
  286.             break;
  287.  
  288.         
  289.         case 1:
  290.             AddOrRemoveVirtualWiFi(TRUE, NULL);
  291.             ServiceInstaller("install", NULL);
  292.             break;
  293.         */
  294.         default:
  295.             usage();
  296.         }
  297.         Sleep(1000);
  298.     
  299.         // Set the name of the connection
  300.         GetSSID(currentSSID);
  301.         if (Verbose)
  302.             fprintf(stderr, "Got the SSID %s\n", currentSSID);
  303.  
  304.         GetMode(currentMode);
  305.         if(Verbose)
  306.             fprintf(stderr, "Current Mode is %s\n", currentMode);
  307.         
  308.         sprintf(connectionName, "VirtualWiFi %s %s\0", currentMode, currentSSID);
  309.  
  310.         //fpConfig = fopen("C:\\Windows\\VirtualWiFiData.txt", "w");
  311.         sprintf(dataFileName, "%s\\VirtualWiFiData.txt", getenv("windir"));
  312.         fpConfig = fopen(dataFileName, "w");
  313.         fprintf(fpConfig, "%s\n", connectionName);
  314.         fclose(fpConfig);
  315.  
  316.         if(Verbose)
  317.             printf("Name the adapter to: %s\n", connectionName);
  318.         mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
  319.  
  320.         RenameConnection(wConnectionName);
  321.  
  322.         exit(0);
  323.     }
  324.     
  325.     if (!_stricmp(argv[0], "uninstall")) {
  326.         HANDLE hThread; 
  327.         DWORD dwThreadId, dwThrdParam=1; 
  328.         ULONG numNodes=0;
  329.         char *adapterNum="1\0";
  330.  
  331.         if (argc != 1)
  332.             usage();
  333.         fprintf(stdout, "Uninstalling VirtualWiFi ...\n");
  334.         fprintf(stdout, "Stopping the VirtualWiFi Service.\n");
  335.         ServiceInstaller("uninstall", NULL);
  336.  
  337.         numNodes = ioctlGetFromAdapter(IOCTL_GET_NUM_NETWORKS, adapterNum, (DWORD)strlen(adapterNum), &numNodes, sizeof(ULONG));
  338.         hThread = CreateThread( 
  339.             NULL,                        // no security attributes 
  340.             0,                           // use default stack size  
  341.             LoopOnce,                     // thread function 
  342.             &numNodes,                     // argument to thread function
  343.             0,                           // use default creation flags 
  344.             &dwThreadId);                // returns the thread identifier 
  345.         if (hThread == NULL) {
  346.             printf("CreateThread failed." ); 
  347.         } else {
  348.             hr = AddOrRemoveVirtualWiFi(FALSE, NULL);
  349.             Sleep(1000);
  350.             CloseHandle( hThread );
  351.         }
  352.  
  353.         if (hr == S_OK) {
  354.             fprintf(stdout, "VirtualWiFi uninstalled.\n");
  355.         } else {
  356.             fprintf(stderr, "Problems uninstalling the VirtualWiFi driver.\n");
  357.         }
  358.         exit(0);
  359.     }
  360.     
  361.     if (!_stricmp(argv[0], "enable")) {
  362.         if (argc != 1)
  363.             usage();
  364.         Count = ControlDeviceClass(DICS_ENABLE);
  365.         printf("%u Adapter%s enabled.\n", Count, (Count == 1) ? "" : "s");
  366.         exit(0);
  367.     }
  368.  
  369.     if (!_stricmp(argv[0], "disable")) {
  370.         if (argc != 1)
  371.             usage();
  372.         Count = ControlDeviceClass(DICS_DISABLE);
  373.         printf("%u Adapter%s disabled.\n", Count, (Count == 1) ? "" : "s");
  374.         exit(0);
  375.     }
  376.  
  377.     if (!_stricmp(argv[0], "restart")) {
  378.         if (argc != 1)
  379.             usage();
  380.         Count = ControlDeviceClass(DICS_PROPCHANGE);
  381.         printf("%u Adapter%s restarted.\n", Count, (Count == 1) ? "" : "s");
  382.         exit(0);
  383.     }
  384.  
  385.     if (!_stricmp(argv[0], "changeparams")) {
  386.         SetVirtualWiFiTimersForConnection setVirtualWiFiTimersForConnection;
  387.         int count;
  388.         BOOL foundParamToSet = FALSE;
  389.         BOOL foundNetworkModeToSet = FALSE;
  390.         BOOL foundNetworkSSIDToSet = FALSE;
  391.  
  392.         if(!isInstalledVirtualWiFi()) {
  393.             fprintf(stderr, "Please install VirtualWiFi before this operation\n");
  394.             exit(0);
  395.         }
  396.         setVirtualWiFiTimersForConnection.adapterNum = "1";
  397.         setVirtualWiFiTimersForConnection.switchTime = 0;
  398.         setVirtualWiFiTimersForConnection.waitTime = 0;
  399.         setVirtualWiFiTimersForConnection.isAdaptiveScheduling = 2;
  400.  
  401.         for(count = 1; count < argc; count++) 
  402.         {
  403.             if(count == argc-1) {
  404.                 fprintf(stderr, "Incorrect arguments\n");
  405.                 usage();
  406.             }
  407.             if(!_stricmp(argv[count], "-switch")) {
  408.                 setVirtualWiFiTimersForConnection.switchTime = atol(argv[count+1]);
  409.                 foundParamToSet = TRUE;
  410.             } else if(!_stricmp(argv[count], "-wait")) {
  411.                 setVirtualWiFiTimersForConnection.waitTime = atol(argv[count+1]);
  412.                 foundParamToSet = TRUE;
  413.             } else if(!_stricmp(argv[count], "-isadapt")) {
  414.                 setVirtualWiFiTimersForConnection.isAdaptiveScheduling = atoi(argv[count+1]);
  415.                 foundParamToSet = TRUE;
  416.             }
  417.             else if(!_stricmp(argv[count], "-mode")) {
  418.                 if(!_stricmp(argv[count+1], "ah"))
  419.                     setVirtualWiFiTimersForConnection.networkMode = MODE_AH;
  420.                 else if(!_stricmp(argv[count+1], "is"))
  421.                     setVirtualWiFiTimersForConnection.networkMode = MODE_IS;
  422.                 else 
  423.                     usage();
  424.                 foundNetworkModeToSet = TRUE;
  425.             } else if(!_stricmp(argv[count], "-ssid")) {
  426.                 strcpy(setVirtualWiFiTimersForConnection.networkSSID, argv[count+1]);
  427.                 setVirtualWiFiTimersForConnection.ssidLength = (ULONG)strlen(setVirtualWiFiTimersForConnection.networkSSID);
  428.                 foundNetworkSSIDToSet = TRUE;
  429.             } else {
  430.                 fprintf(stderr, "Incorrect arguments\n");
  431.                 usage();
  432.             }
  433.             count+=1;
  434.         }
  435.         if(foundParamToSet && foundNetworkModeToSet && foundNetworkSSIDToSet) {
  436.             char connectionName[100];
  437.             wchar_t wConnectionName[100];
  438.             if(setVirtualWiFiTimersForConnection.networkMode == MODE_AH)
  439.                 sprintf(connectionName, "VirtualWiFi AH %s\0", setVirtualWiFiTimersForConnection.networkSSID);
  440.             else
  441.                 sprintf(connectionName, "VirtualWiFi IS %s\0", setVirtualWiFiTimersForConnection.networkSSID);
  442.             mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
  443.                     
  444.             if(!DoesConnectionExist(wConnectionName)) {
  445.                 fprintf(stderr, "The specified connection does not exist\n");
  446.                 exit(0);
  447.             }
  448.             ServiceInstaller("stop", NULL);
  449.             Sleep(1000);
  450.             ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS_FOR_CONNECTION, &setVirtualWiFiTimersForConnection, 
  451.                 (DWORD)sizeof(SetVirtualWiFiTimersForConnection));
  452.             Sleep(2000);
  453.             fprintf(stderr, "Set parameters successful\n");
  454.             ServiceInstaller("start", NULL);
  455.         } else {
  456.             fprintf(stderr, "Incorrect arguments. Specify SSID, mode and parameter\n");
  457.             usage();
  458.         }
  459.         exit(0);
  460.     }
  461.  
  462.     if (!_stricmp(argv[0], "addnetwork") || !_stricmp(argv[0], "removenetwork")) {
  463.         char newSSID[MAX_SSID_LENGTH];
  464.         char response[50];
  465.         char networkSSID[MAX_SSID_LENGTH];
  466.         char connectionName[100];
  467.         wchar_t wConnectionName[100];
  468.         USHORT mode;
  469.         int count = 0;
  470.         SetVirtualWiFiTimers setVirtualWiFiTimers;
  471.         bool userParameters = FALSE;
  472.         NetworkModeAndSSID networkModeAndSSID;
  473.  
  474.         if(!isInstalledVirtualWiFi()) {
  475.             fprintf(stderr, "Please install VirtualWiFi before this operation\n");
  476.             exit(0);
  477.         }
  478.         // take as input the parameters of the network
  479.         if(argc == 1) {
  480.             printf("Enter the SSID: ");
  481.             scanf("%s", newSSID);
  482.             printf("Enter Mode, ADHOC (0), INFRASTRUCTURE (1): ");
  483.             scanf("%d", &mode);
  484.         } else if(argc == 5) {
  485.             for(count = 1; count < argc; count++) {
  486.                 if(!_stricmp(argv[count], "-mode")) {
  487.                     if(!_stricmp(argv[count+1], "ah"))
  488.                         mode = MODE_AH;
  489.                     else if(!_stricmp(argv[count+1], "is"))
  490.                         mode = MODE_IS;
  491.                     else 
  492.                         usage();
  493.                 } else if(!_stricmp(argv[count], "-ssid")) {
  494.                     strcpy(newSSID, argv[count+1]);
  495.                 } else {
  496.                     fprintf(stderr, "Incorrect args\n");
  497.                     exit(0);
  498.                 }
  499.                 count+=1;
  500.             }
  501.         } else if(argc == 11 && !_stricmp(argv[0], "addnetwork")) {
  502.             for(count = 1; count < argc; count++) {
  503.                 if(!_stricmp(argv[count], "-mode")) {
  504.                     if(!_stricmp(argv[count+1], "ah"))
  505.                         mode = MODE_AH;
  506.                     else if(!_stricmp(argv[count+1], "is"))
  507.                         mode = MODE_IS;
  508.                     else 
  509.                         usage();
  510.                 } else if(!_stricmp(argv[count], "-ssid")) {
  511.                     strcpy(newSSID, argv[count+1]);
  512.                 } else if(!_stricmp(argv[count], "-switch")) {
  513.                     setVirtualWiFiTimers.switchTime = atol(argv[count+1]);
  514.                 } else if(!_stricmp(argv[count], "-wait")) {
  515.                     setVirtualWiFiTimers.waitTime = atol(argv[count+1]);
  516.                 } else if(!_stricmp(argv[count], "-isadapt")) {
  517.                     setVirtualWiFiTimers.isAdaptiveScheduling = atoi(argv[count+1]);
  518.                 } else {
  519.                     fprintf(stderr, "Incorrect args\n");
  520.                     exit(0);
  521.                 }
  522.                 count+=1;
  523.             }
  524.  
  525.             userParameters = TRUE;
  526.             setVirtualWiFiTimers.adapterNum = "1";
  527.         } else 
  528.             usage();
  529.  
  530.         count = 0;
  531.         if(mode == MODE_AH)
  532.             sprintf(connectionName, "VirtualWiFi AH %s\0", newSSID);
  533.         else
  534.             sprintf(connectionName, "VirtualWiFi IS %s\0", newSSID);
  535.  
  536.         if(Verbose) 
  537.             fprintf(stderr, "Check Name of the adapter: %s\n", connectionName);
  538.         mbstowcs(wConnectionName, connectionName, strlen(connectionName)+1);
  539.                 
  540.         if(!DoesEnabledConnectionExist(wConnectionName)) {
  541.             if(!_stricmp(argv[0], "addnetwork")) {
  542.                 ServiceInstaller("stop", NULL);
  543.                 /* This worked with WMI. Needed to change this for SP2 */
  544.                 /*    SetMode(mode);
  545.                     Sleep(50);
  546.                     SetSSID(newSSID);
  547.                     while((GetAssoc()!= S_OK) && count < 5) {
  548.                         SetSSID(newSSID);
  549.                         count++;
  550.                         Sleep(1000);
  551.                     }
  552.                 */
  553.                 strcpy(networkModeAndSSID.networkSSID, newSSID);
  554.                 networkModeAndSSID.adapterNum = "1";
  555.                 networkModeAndSSID.ssidLength = (ULONG)strlen(networkModeAndSSID.networkSSID);
  556.                 networkModeAndSSID.networkMode = mode;
  557.  
  558.                 if(!DoesConnectionExist(wConnectionName)) {
  559.                     char dataFileName[100];
  560.                     GetSSID(networkSSID);
  561.                     while(_stricmp(networkSSID, newSSID) && count < 5) {
  562.                         ioctlSet(IOCTL_SET_CURRENT_SSID, &networkModeAndSSID, (DWORD) sizeof(networkModeAndSSID));
  563.                         count++;
  564.                         Sleep(1000);
  565.                         GetSSID(networkSSID);
  566.                     }
  567.     
  568.                     if(_stricmp(networkSSID, newSSID)) {
  569.                         fprintf(stderr, "Unable to associate to the network\n");
  570.                         fprintf(stdout, "Do you want to continue with the installation? (Y/N) \n");
  571.                         scanf("%s", response);
  572.                         if(!_stricmp(response, "y")) {
  573.                             fprintf(stdout, "Continuing with the installation.\n"); 
  574.                         } else {
  575.                             fprintf(stderr, "EXITING .....\n");
  576.                             ServiceInstaller("start", NULL);
  577.                             exit(0);
  578.                         }
  579.                     }
  580.  
  581.                     AddNetwork(GetDesktopWindow(), TRUE);
  582.                     if (Verbose)
  583.                         fprintf(stderr, "Trying to rename\n");
  584.                     fprintf(stdout, "Successfully added network.\n");
  585.                     RenameConnection(wConnectionName);
  586.                     //fpConfig = fopen("C:\\Windows\\VirtualWiFiData.txt", "a");
  587.                     //printf("Windir is %s\n", getenv("windir"));
  588.                     sprintf(dataFileName, "%s\\VirtualWiFiData.txt", getenv("windir"));
  589.                     fpConfig = fopen(dataFileName, "a");
  590.                     fprintf(fpConfig, "%s\n", connectionName);
  591.                     fclose(fpConfig);
  592.                 } else {
  593.                     ioctlSet(IOCTL_SET_CURRENT_SSID, &networkModeAndSSID, (DWORD) sizeof(networkModeAndSSID));
  594.                     EnableDisableConnection(wConnectionName, TRUE);
  595.                 }    
  596.                 if(userParameters) {
  597.                     fprintf(stderr, "Trying to set\n");
  598.                     ioctlSet(IOCTL_SET_SWITCHING_PARAMETERS, &setVirtualWiFiTimers, 
  599.                         (DWORD)sizeof(SetVirtualWiFiTimers));
  600.                     fprintf(stderr, "Set parameters successful\n");
  601.                 }
  602.             } else { /* remove a network */
  603.                 fprintf(stderr, "Network to remove is not installed\n");
  604.             }
  605.         } else {
  606.             if(!_stricmp(argv[0], "removenetwork")) {
  607.                 //AddNetwork(GetDesktopWindow(), FALSE);
  608.                 EnableDisableConnection(wConnectionName, FALSE);
  609.                 ServiceInstaller("stop", NULL);
  610.             } else {
  611.                 fprintf(stderr, "Network to add is already installed\n");
  612.                 exit(0);
  613.             }
  614.         }
  615.         if(Verbose)
  616.             fprintf(stderr, "Starting Service ...\n");
  617.  
  618.         ServiceInstaller("start", NULL);
  619.         exit(0);
  620.     }
  621.  
  622.     usage();
  623. }
  624.