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; 
}