⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 raswap.cpp

📁 11N RUOTER Source Code
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// RaSwap.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "RaSwap.h"
#include <atlbase.h>

#define   ULONG_PTR	DWORD
#define   DWORD_PTR	DWORD

#include <Setupapi.h>
#include <tlhelp32.h>


#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<cbProcesses;i++)
					{
						hProcess=OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,false,tbProcesses[i]);
						if(hProcess!=NULL)
						{
							if(lpEnumProcessModules(hProcess,tbMod,sizeof(tbMod),&cbNeeded))
							{
								lpGetModuleBaseName(hProcess,tbMod[0],szProcessName,sizeof(szProcessName));
								if(strcmpi(szProcessName,ModuleName)==0)
								{
									PID = tbProcesses[i];
									CloseHandle(hProcess);
									FreeLibrary(hLib);
									return PID;
								}
							}
							CloseHandle(hProcess);
						}
					} 
				}
			}
			FreeLibrary(hLib);
		}
	}
	return FALSE;
}

bool IsX64Platform()
{
	bool bIsX64 = false;
	HKEY hkOpenedKey;

	if(RegOpenKeyEx(HKEY_LOCAL_MACHINE,
					"System\\CurrentControlSet\\Control\\Session Manager\\Environment",						
					0,
					KEY_READ,

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -