www.pudn.com > RaSwap_2.1.0.5.zip > RaSwap.cpp
// RaSwap.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "RaSwap.h" #include#define ULONG_PTR DWORD #define DWORD_PTR DWORD #include #include #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object #define WIN32_PATH_CLASS_PATH_NETCARDS _TEXT("System\\CurrentControlSet\\Control\\Class\\{4D36E972-E325-11CE-BFC1-08002bE10318}") #define REGSTR_KEY_DEFAULT _T("Default") #define REGSTR_KEY_AP_DEFAULT _T("ApDefault") #define REGSTR_KEY_STA_BACKUP _T("StaBackup") #define REGSTR_KEY_AP_BACKUP _T("ApBackup") //#define REGSTR_DEVCLASS_PCI_COMPONENTID _T("PCI\\VEN_1814&DEV_0201") #define REGSTR_PATH_CLASS_2K _T("System\\CurrentControlSet\\Control\\Class") #define REGSTR_PATH_CLASS_9X _T("System\\CurrentControlSet\\Services\\Class") typedef BOOL (WINAPI *ENUMPROCESSES)(DWORD*,DWORD,DWORD*); typedef BOOL (WINAPI *ENUMPROCESSMODULES)(HANDLE,HMODULE*,DWORD,LPDWORD); typedef DWORD (WINAPI *GETMODULEBASENAME)(HANDLE,HMODULE,LPSTR,DWORD); typedef BOOL (WINAPI *PROCESSWALK)(HANDLE, LPPROCESSENTRY32); typedef BOOL (WINAPI *MODULEWALK)(HANDLE, LPMODULEENTRY32); typedef HANDLE (WINAPI *CREATESNAPSHOT)(DWORD, DWORD); BOOL OpenAllAccess(HKEY hKey, const char *lpszSubKey, PHKEY phkResult, BOOL bCreate = FALSE); TCHAR PciDeviceIdTable[][22] = { // _T("PCI\\VEN_1814&DEV_0201"), //not for RT2500 _T("PCI\\VEN_1814&DEV_0301"), _T("PCI\\VEN_1814&DEV_0401"), }; int G_nPciDeviceIdCount = sizeof(PciDeviceIdTable) / 22; TCHAR UsbDeviceIdTable[][22] = { _T("USB\\VID_148F&PID_2561"), _T("USB\\VID_148F&PID_2661"), /* _T("USB\\VID_148F&PID_2570"), //not for RT2500USB _T("USB\\VID_148F&PID_2573"), _T("USB\\VID_148F&PID_5225"), _T("USB\\VID_148F&PID_5226"), _T("USB\\VID_148F&PID_9020"), _T("USB\\VID_0DB0&PID_6861"), _T("USB\\VID_0DB0&PID_6865"), _T("USB\\VID_0DB0&PID_6869"), _T("USB\\VID_0707&PID_EE13"), _T("USB\\VID_0B05&PID_1706"), _T("USB\\VID_0B05&PID_1707"), _T("USB\\VID_5A57&PID_0260"), _T("USB\\VID_5A57&PID_0261"), _T("USB\\VID_0F88&PID_3012"), _T("USB\\VID_13B1&PID_000D"), _T("USB\\VID_0769&PID_11F3"), _T("USB\\VID_14B2&PID_3C02"), _T("USB\\VID_14B2&PID_3C03"), _T("USB\\VID_1044&PID_8007"), _T("USB\\VID_0411&PID_0066"), _T("USB\\VID_0411&PID_0067"), */ }; int G_nUsbDeviceIdCount = sizeof(UsbDeviceIdTable) / 22; char BridgeNetCfgInstanceId[512]; BOOL G_bAp = TRUE; BOOL G_bUsb = FALSE; OS_VERSION G_osVersion = Undefine; CUIntArray G_arrayDeviceEnum; HANDLE m_hDrv; OVERLAPPED m_ovlp; bool m_IsLoadSuccessfully; // Rseb #define NDISHK_ETHERNET_BRIDGE 0x00000002 #define FILE_DEVICE_PROTOCOL 0x8000 #define IOCTL_PIM_BASE FILE_DEVICE_PROTOCOL #define IOCTL_PIM_GET_VERSION\ CTL_CODE(IOCTL_PIM_BASE, 0, METHOD_BUFFERED, FILE_ANY_ACCESS) #define IOCTL_PIM_SET_BRIDGING\ CTL_CODE(IOCTL_PIM_BASE, 1, METHOD_BUFFERED, FILE_ANY_ACCESS) void Trace(const char *format, ...) { va_list pArg; va_start(pArg, format); CHAR buf[512]; wvsprintf(buf, format, pArg); OutputDebugString(buf); va_end(pArg); } void CPIMApi(const char * pszFileName) { char FullName [ 300 ]; strcpy ( FullName, "\\\\.\\" ); strcat ( FullName, pszFileName ); m_IsLoadSuccessfully = FALSE; m_hDrv = CreateFile ( FullName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED | FILE_FLAG_DELETE_ON_CLOSE, 0 ); if( m_hDrv == INVALID_HANDLE_VALUE ) m_hDrv = CreateFile ( FullName, 0, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0 ); if( m_hDrv == INVALID_HANDLE_VALUE ) m_ovlp.hEvent = 0; else { m_ovlp.hEvent = 0; m_ovlp.hEvent = CreateEvent ( 0, TRUE, FALSE, NULL ); if ( m_ovlp.hEvent ) { m_IsLoadSuccessfully = TRUE; } } } void RemoveCPIMApi() { if( m_hDrv != INVALID_HANDLE_VALUE ) CloseHandle ( m_hDrv ); if( m_ovlp.hEvent ) CloseHandle ( m_ovlp.hEvent ); } // Wrapper around DeviceIoControl API bool DrvIoControl(DWORD dwService, void *BuffIn, int SizeIn, void *BuffOut, int SizeOut, int *SizeRet, LPOVERLAPPED povlp) { ULONG Ret = 0; if ( m_hDrv != INVALID_HANDLE_VALUE ) { if(povlp == NULL) Ret = DeviceIoControl ( m_hDrv, dwService, BuffIn, SizeIn, BuffOut, SizeOut, (unsigned long*)SizeRet, &m_ovlp); else Ret = DeviceIoControl ( m_hDrv, dwService, BuffIn, SizeIn, BuffOut, SizeOut, (unsigned long*)SizeRet, povlp); } return Ret?true:false; } // Getting version info function int GetRSEBVersion() { ULONG nDriverAPIVersion = 0xFFFFFFFF; int cbBytesRet =0; bool bIOResult = DrvIoControl( IOCTL_PIM_GET_VERSION, &nDriverAPIVersion, sizeof(ULONG), &nDriverAPIVersion, sizeof(ULONG), &cbBytesRet, // Bytes Returned NULL ); return nDriverAPIVersion; } // Starts bridging interfaces // 1: Bridge On // 0: Bridge Off // We will try for 3 times to set the bridge. BOOL SetBridgingState (ULONG state) { int cbBytesRet =0; BOOL bIOResult = FALSE; int count = 0; #if 0 if(G_osVersion >= WinXP) { TRACE("RaSwap::SetBridgingState() -> If XP, do nothing\n"); // If XP, do nothing. return TRUE; } else { TRACE("RaSwap::SetBridgingState() -> Do the follows\n"); ; // Do the follows. } #endif if (GetRSEBVersion() == NDISHK_ETHERNET_BRIDGE) { // printf ("\nThis version support bridging.\n"); for (count = 0; count < 3; count++) { bIOResult = DrvIoControl( IOCTL_PIM_SET_BRIDGING, &state, sizeof(ULONG), NULL, 0, &cbBytesRet, // Bytes Returned NULL ); if (bIOResult) { if (state) TRACE("Bridging succesfully started.\n"); else TRACE("Bridging successfuly stoped.\n"); break; } else TRACE ("Failed to change bridging state.\n"); Sleep(1000); } } else TRACE ("\nThis version of driver does not support ethernet bridging.\n"); return bIOResult; } void KillProcess(long PID) { HANDLE process; process = OpenProcess(PROCESS_TERMINATE, 0, PID); TerminateProcess(process, (unsigned)-1); } long GetProcessID(LPTSTR ModuleName) { DWORD dwVersion, PID; HMODULE hLib; ENUMPROCESSES lpEnumProcesses; ENUMPROCESSMODULES lpEnumProcessModules; GETMODULEBASENAME lpGetModuleBaseName; DWORD tbProcesses[1024]; DWORD cbNeeded; DWORD cbProcesses; unsigned i; HANDLE hProcess; HMODULE tbMod[1024]; CHAR szProcessName[MAX_PATH]; CREATESNAPSHOT lpCreateToolhelp32Snapshot; PROCESSWALK lpProcess32First; PROCESSWALK lpProcess32Next; MODULEWALK lpModule32First; MODULEWALK lpModule32Next; HANDLE hSnapShot; PROCESSENTRY32 procentry; HANDLE hSnapShot2; MODULEENTRY32 modentry; BOOL bFlag; dwVersion=GetVersion(); if((dwVersion & 0x80000000)) { hLib=LoadLibrary("kernel32.dll"); if (hLib!=NULL) { lpCreateToolhelp32Snapshot= (CREATESNAPSHOT)GetProcAddress(hLib,"CreateToolhelp32Snapshot"); lpProcess32First= (PROCESSWALK)GetProcAddress(hLib,"Process32First"); lpProcess32Next= (PROCESSWALK)GetProcAddress(hLib,"Process32Next") ; lpModule32First= (MODULEWALK)GetProcAddress(hLib,"Module32First"); lpModule32Next= (MODULEWALK)GetProcAddress(hLib,"Module32Next") ; if(lpCreateToolhelp32Snapshot!=NULL && lpProcess32First!=NULL && lpProcess32Next!=NULL) { hSnapShot=lpCreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0); if(hSnapShot!=INVALID_HANDLE_VALUE) { procentry.dwSize=sizeof(PROCESSENTRY32) ; bFlag=lpProcess32First(hSnapShot,&procentry); while(bFlag) { hSnapShot2=lpCreateToolhelp32Snapshot(TH32CS_SNAPMODULE,procentry.th32ProcessID); if(hSnapShot2!=INVALID_HANDLE_VALUE) { modentry.dwSize=sizeof(MODULEENTRY32) ; bFlag=lpModule32First(hSnapShot2,&modentry); while(bFlag) { if(strnicmp(modentry.szModule,ModuleName,strlen(ModuleName))==0) { PID = procentry.th32ProcessID; FreeLibrary(hLib); return PID; } modentry.dwSize=sizeof(MODULEENTRY32); bFlag=lpModule32Next(hSnapShot2,&modentry); } } procentry.dwSize=sizeof(PROCESSENTRY32); bFlag=lpProcess32Next(hSnapShot,&procentry); } } } FreeLibrary(hLib); } } else { hLib = LoadLibrary("psapi.dll"); if (hLib != NULL) { lpEnumProcesses=(ENUMPROCESSES)GetProcAddress(hLib,"EnumProcesses"); lpEnumProcessModules=(ENUMPROCESSMODULES)GetProcAddress(hLib,"EnumProcessModules"); lpGetModuleBaseName=(GETMODULEBASENAME)GetProcAddress(hLib,"GetModuleBaseNameA"); if(lpEnumProcesses!=NULL && lpEnumProcessModules!=NULL && lpGetModuleBaseName!=NULL) { if(lpEnumProcesses(tbProcesses,sizeof(tbProcesses),&cbNeeded)) { cbProcesses=cbNeeded/sizeof(tbProcesses[0]); for (i=0;i = Win2000) strRoot.Format(_T("%s\\%s"), REGSTR_PATH_CLASS_2K, buf); else strRoot.Format(_T("%s\\%s"), REGSTR_PATH_CLASS_9X, buf); dwStatus = OpenAllAccess(HKEY_LOCAL_MACHINE, strRoot.GetBuffer(200), &hKeyRoot); if(dwStatus == FALSE) { sprintf(buf, _T("OpenAllAccess '%hs' failed\n"), strRoot); TRACE(buf); continue; } if(G_bAp) { strBackup = strRoot + _T("\\") + REGSTR_KEY_STA_BACKUP; strDefault = strRoot + _T("\\") + REGSTR_KEY_AP_BACKUP; } else { strBackup = strRoot + _T("\\") + REGSTR_KEY_AP_BACKUP; strDefault = strRoot + _T("\\") + REGSTR_KEY_STA_BACKUP; } dwStatus = OpenAllAccess(HKEY_LOCAL_MACHINE, strDefault.GetBuffer(200), &hDefault); if(dwStatus == FALSE) { strDefault.Empty(); if(G_bAp) strDefault = strRoot + _T("\\") + REGSTR_KEY_AP_DEFAULT; else strDefault = strRoot + _T("\\") + REGSTR_KEY_DEFAULT; dwStatus = OpenAllAccess(HKEY_LOCAL_MACHINE, strDefault.GetBuffer(200), &hDefault); if(dwStatus == FALSE) { RegCloseKey(hKeyRoot); sprintf(buf, _T("OpenAllAccess '%hs' failed\n"), strDefault); TRACE(buf); continue; } } dwStatus = OpenAllAccess(HKEY_LOCAL_MACHINE, strBackup.GetBuffer(200), &hBackup, TRUE); if(dwStatus == FALSE) { RegCloseKey(hKeyRoot); RegCloseKey(hDefault); sprintf(buf, _T("OpenAllAccess '%hs' failed\n"), strBackup); TRACE(buf); continue; } CopyValues(hKeyRoot, hBackup); CopyValues(hDefault, hKeyRoot); RegCloseKey(hDefault); RegCloseKey(hKeyRoot); } if(devs != INVALID_HANDLE_VALUE) SetupDiDestroyDeviceInfoList(devs); return TRUE; } void SetOPMode(bool G_bAp) { HKEY hOpenedKey; if(RegCreateKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\RaLink", 0, "", REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hOpenedKey, NULL) == ERROR_SUCCESS) { char szOpMode[4]; if(G_bAp) lstrcpy(szOpMode, "1"); else lstrcpy(szOpMode, "0"); //Trace("[FlashInstall] Let RaLaunch run as admin on Vista"); RegSetValueEx( hOpenedKey, // subkey handle "OpMode", // value name 0, // must be zero REG_SZ, // value type (LPBYTE)szOpMode, // pointer to value data lstrlen(szOpMode)); // length of value data RegCloseKey(hOpenedKey); //Trace("[FlashInstall] Write AppCompatFlags registry %s: %s", szLaunchFile, szRunAsAdmin); } } void CloseUtility() { int PID ; PID = GetProcessID("RaUI.exe"); if(PID != FALSE) KillProcess(PID); PID = GetProcessID("ApUI.exe"); if(PID != FALSE) KillProcess(PID); } void RunUtility() { char szCurDir[256], szUtiltiy[256], szSelectCard[256], szCmdLine[128]; UINT nRet; GetModuleFileName(NULL, szCurDir, sizeof(szCurDir)); CHAR * c=szCurDir + strlen(szCurDir) -1; while(*c!='\\') c--; *(c+1)=0; //strcpy(szSelectCard, szCurDir); if(G_osVersion > Win2000) { if(G_bAp == FALSE) { sprintf(szSelectCard, "\"%s\\SelectCard.exe\" ICS_DOWN", szCurDir); //WinExec("\"SelectCard.exe\" ICS_DOWN", SW_HIDE); } else { sprintf(szSelectCard, "\"%s\\SelectCard.exe\" %s", szCurDir, gVarDevID); //WinExec("SelectCard.exe", SW_SHOW); } //Trace("[RC][RaSwap] Launch %s", szSelectCard); //WinExec(szSelectCard, SW_SHOW); PROCESS_INFORMATION proc; STARTUPINFO start; ZeroMemory(&start, sizeof(start)); start.cb = sizeof(start); ZeroMemory(&proc, sizeof(proc)); if(CreateProcess(NULL, szSelectCard, NULL, NULL, false, 0, NULL, NULL, &start, &proc)) { // Wait for the shelled application to finish: int ret = WaitForSingleObject(proc.hProcess, INFINITE); DWORD dwExit; GetExitCodeProcess(proc.hProcess, &dwExit); CloseHandle(proc.hThread); CloseHandle(proc.hProcess); } } if(G_bAp == FALSE) { sprintf(szUtiltiy, "\"%s\\RaUI.exe\"", szCurDir); //strcat(szUtiltiy, "RaUI.exe"); } else { sprintf(szUtiltiy, "\"%s\\APUI.exe\"", szCurDir); //strcat(szUtiltiy, "APUI.exe"); } //Trace("[RC][RaSwap] Launch %s", szUtiltiy); nRet = WinExec(szUtiltiy, SW_SHOW); SetOPMode(G_bAp); if(nRet <= 31) AfxMessageBox("Config Utility cannot be found"); } //CSIDL_COMMON_STARTUP ˇXTo add an Menu item in Startup Menu. //CSIDL_COMMON_PROGRAMS ˇXTo add an Menu item in Start->Program Menu. void CreateShortCut(CString strLink, CString strCompany, CString strChip) { LPTSTR lpszCurDir; TCHAR tchBuffer[BUFFER]; lpszCurDir = tchBuffer; LPITEMIDLIST pidl; LPMALLOC pMalloc; char *pdest; GetModuleFileName(NULL, lpszCurDir, 256); pdest = strrchr(lpszCurDir, '\\'); *pdest = '\0'; HRESULT hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_STARTUP, &pidl); char szPath[_MAX_PATH]; BOOL f = SHGetPathFromIDList(pidl, szPath); hr = SHGetMalloc(&pMalloc); pMalloc->Free(pidl); pMalloc->Release(); CString strTarget, strLinkName; CString m_strCurrentDirectory = szPath ;// "D:\\Documents and Settings\\Administrator\\Start Menu"; strLinkName.Format("%s\\Ralink Wireless Utility.lnk", m_strCurrentDirectory); strTarget.Format("%s\\%s.exe", lpszCurDir, strLink); TRACE("strLinkName: %s\n", strLinkName); TRACE("strTarget: %s\n", strTarget); //CopyFile(strTarget, strLinkName, FALSE); HRESULT hres = NULL; IShellLink* psl = NULL; // Get a pointer to the IShellLink interface. hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast (&psl)); if (SUCCEEDED(hres)) { IPersistFile* ppf = NULL; /* if(G_osVersion >= WinVistaX86) { CHAR szPath[256], szParam[256]; strcpy(szPath, strTarget); CHAR * c=szPath + strlen(szPath) -1; while(*c!='\\') c--; *(c+1)=0; lstrcat(szPath, "RaLaunch.exe"); psl->SetPath(szPath); sprintf(szParam, "\"%s\" -s", strTarget); psl->SetArguments(szParam); psl->SetIconLocation(strTarget, 0); } else */ { psl->SetPath(strTarget); //Robin add to run App in silent mode(tray icon only) when it is launched by startup shortcut. psl->SetArguments("-s"); } hres = psl->QueryInterface(IID_IPersistFile, reinterpret_cast (&ppf)); if (SUCCEEDED(hres)) { WCHAR wsz[MAX_PATH]; // Ensure that the string is ANSI. MultiByteToWideChar(CP_ACP, 0, strLinkName, -1, wsz, MAX_PATH); // Save the link by calling IPersistFile::Save. hres = ppf->Save(wsz, TRUE); ppf->Release(); } psl->Release(); } if(G_osVersion >= Win2000) { hr = SHGetSpecialFolderLocation(NULL, CSIDL_COMMON_PROGRAMS, &pidl); } else { hr = SHGetSpecialFolderLocation(NULL, CSIDL_PROGRAMS, &pidl); } f = SHGetPathFromIDList(pidl, szPath); hr = SHGetMalloc(&pMalloc); pMalloc->Free(pidl); pMalloc->Release(); m_strCurrentDirectory = szPath ; m_strCurrentDirectory += _T("\\"); m_strCurrentDirectory += strCompany; CreateDirectory(m_strCurrentDirectory, NULL); //m_strCurrentDirectory += _T("\\"); //m_strCurrentDirectory += strChip; //CreateDirectory(m_strCurrentDirectory, NULL); strLinkName.Format("%s\\Ralink Wireless Utility.lnk", m_strCurrentDirectory); strTarget.Format("%s\\%s.exe", lpszCurDir, strLink); TRACE("strLinkName: %s\n", strLinkName); TRACE("strTarget: %s\n", strTarget); hres = NULL; psl = NULL; // Get a pointer to the IShellLink interface. hres = CoCreateInstance(CLSID_ShellLink, NULL, CLSCTX_INPROC_SERVER, IID_IShellLink, reinterpret_cast (&psl)); if (SUCCEEDED(hres)) { IPersistFile* ppf = NULL; /* if(G_osVersion >= WinVistaX86) { CHAR szPath[256], szParam[256]; strcpy(szPath, strTarget); CHAR * c=szPath + strlen(szPath) -1; while(*c!='\\') c--; *(c+1)=0; lstrcat(szPath, "RaLaunch.exe"); psl->SetPath(szPath); sprintf(szParam, "\"%s\"", strTarget); psl->SetArguments(szParam); psl->SetIconLocation(strTarget, 0); } else */ { // Set the path to the shortcut target psl->SetPath(strTarget); } // Query IShellLink for the IPersistFile interface for // saving the shortcut in persistent storage. hres = psl->QueryInterface(IID_IPersistFile, reinterpret_cast (&ppf)); if (SUCCEEDED(hres)) { WCHAR wsz[MAX_PATH]; // Ensure that the string is ANSI. MultiByteToWideChar(CP_ACP, 0, strLinkName, -1, wsz, MAX_PATH); // Save the link by calling IPersistFile::Save. hres = ppf->Save(wsz, TRUE); ppf->Release(); } psl->Release(); } } // 1: On: To Ap Off: To Nic // 2: RaConfig ShortCut Name // 3: APConfig ShortCut Name // 4: Company Name // 5: Chip Name // 6: usb or not int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { /* const char * pszFileName = "RSEB"; CPIMApi(pszFileName); */ char szTmp[256]; lstrcpy(szTmp, ""); if(argc > 1) { for(int i=0;i = 4) { GetOSVersion(); CoInitialize(NULL) ; CString strSta = argv[2]; CString strAp = argv[3]; CString strCompany = argv[4]; CString strChip = argv[5]; if (argc > 6) { if ((!strcmp(argv[6], "USB")) || (!strcmp(argv[6], "usb"))) G_bUsb = TRUE; } if (argc > 7) strcpy(gVarDevID, argv[7]); if ((!strcmp(argv[1], "ON")) || (!strcmp(argv[1], "on"))) { G_bAp = TRUE; if(G_osVersion <= WinME) { WinExec("\"IPDETECT.exe\" OFF", SW_MINIMIZE); Sleep(12000); } if(G_osVersion <= WinME) { Sleep(1000); WinExec("\"IPDETECT.exe\" ON", SW_MINIMIZE); } CreateShortCut(strAp, strCompany, strChip); ResetDefaultSetup(); RunUtility(); } else if ((!strcmp(argv[1], "OFF")) || (!strcmp(argv[1], "off"))) { G_bAp = FALSE; if(G_osVersion <= WinME) { WinExec("\"IPDETECT.exe\" OFF", SW_MINIMIZE); Sleep(10000); } if(G_osVersion <= WinME) { Sleep(1000); WinExec("\"IPDETECT.exe\" ON", SW_MINIMIZE); } CreateShortCut(strSta, strCompany, strChip); ResetDefaultSetup(); RunUtility(); } } if(G_osVersion < WinVistaX86) { G_arrayDeviceEnum.RemoveAll(); Sleep(5000); } /* // Sometimes will fail to set bridge state if (G_bAp) { SetBridgingState(1); } else { SetBridgingState(0); } RemoveCPIMApi(); */ return 0; }