// Get whether the local-bridging is supported by current OS bool IsBridgeSupported() { UINT type = GetOsInfo()->OsType; if (OS_IS_WINDOWS(type)) { if (IsEthSupported()) { return true; } else { bool ret = false; #ifdef OS_WIN32 ret = MsIsAdmin(); #endif // OS_WIN32 return ret; } } else { return IsEthSupported(); } }
// Main screen void EMMain(RPC *r) { RPC_BRIDGE_SUPPORT t; // Validate arguments if (r == NULL) { return; } // Examine the bridge support status of the server side first Zero(&t, sizeof(t)); if (CALLEX(NULL, ScGetBridgeSupport(r, &t)) == ERR_NO_ERROR) { if (t.IsBridgeSupportedOs == false) { // OS does not support the bridge MsgBox(NULL, MB_ICONEXCLAMATION, _UU("EM_UNSUPPORTED")); return; } if (t.IsWinPcapNeeded) { if (r->Sock->RemoteIP.addr[0] != 127) { // WinPcap is required, but can not do anything because it is in remote management mode MsgBox(NULL, MB_ICONINFORMATION, _UU("EM_WPCAP_REMOTE")); return; } else { // WinPcap is required, and it's in local management mode if (MsIsAdmin()) { // Administrators EmInstallWinPcap(NULL, r); return; } else { // Non-Administrators MsgBox(NULL, MB_ICONINFORMATION, _UU("EM_WPCAP_ROOT")); return; } } } } Dialog(NULL, D_EM_MAIN, EmMainDlg, r); }
HINSTANCE InstallPcdDriverInternal() { char tmp[MAX_PATH]; bool install_driver = true; HINSTANCE h; char *dll_filename; // Confirm whether the see.sys is installed in system32\drivers folder Format(tmp, sizeof(tmp), "%s\\drivers\\see.sys", MsGetSystem32Dir()); if (IsFileExists(tmp)) { // If driver file is exist, try to get build number from registry if (LoadPcdDriverBuild() >= CEDAR_BUILD) { // Already latest driver is installed install_driver = false; } } if (install_driver) { char *src_filename = BRIDGE_WIN32_PCD_SYS; // If need to install the driver, confirm user is administrator if (MsIsAdmin() == false) { // Non administrator can't install driver return NULL; } if (MsIsX64()) { src_filename = BRIDGE_WIN32_PCD_SYS_X64; } if (MsIsIA64()) { src_filename = BRIDGE_WIN32_PCD_SYS_IA64; } // Copy see.sys if (FileCopy(src_filename, tmp) == false) { return NULL; } // Save build number SavePcdDriverBuild(CEDAR_BUILD); } dll_filename = BRIDGE_WIN32_PCD_DLL; if (Is64()) { if (MsIsX64()) { dll_filename = BRIDGE_WIN32_PCD_DLL_X64; } else if (MsIsIA64()) { dll_filename = BRIDGE_WIN32_PCD_DLL_IA64; } } // Try to load see.dll and initialize h = MsLoadLibrary(dll_filename); if (h == NULL) { return NULL; } return h; }
// Initialize the IPsec helper module for Windows 7 IPSEC_WIN7 *IPsecWin7Init() { IPSEC_WIN7 *w; FWPM_SESSION0 session; UINT ret; FWPM_FILTER0 filter; UINT64 weight = MAXUINT64; Debug("IPsecWin7Init()\n"); if (MsIsVista() == false) { return NULL; } if (MsIsAdmin() == false) { return NULL; } if (IPsecWin7InitApi() == false) { return NULL; } // Driver Initialization if (IPsecWin7InitDriver() == false) { return NULL; } // Open the WFP (Dynamic Session) Zero(&session, sizeof(session)); session.flags = FWPM_SESSION_FLAG_DYNAMIC; w = ZeroMalloc(sizeof(IPSEC_WIN7)); ret = api->FwpmEngineOpen0(NULL, RPC_C_AUTHN_DEFAULT, NULL, &session, &w->hEngine); if (ret) { Debug("FwpmEngineOpen0 Failed.\n"); IPsecWin7Free(w); return NULL; } // Create the Filter (IPv4) Zero(&filter, sizeof(filter)); filter.flags = FWPM_FILTER_FLAG_PERMIT_IF_CALLOUT_UNREGISTERED; filter.layerKey = FWPM_LAYER_INBOUND_IPPACKET_V4; filter.weight.type = FWP_UINT64; filter.weight.uint64 = &weight; filter.action.type = FWP_ACTION_CALLOUT_UNKNOWN; filter.action.calloutKey = GUID_WFP_CALLOUT_DRIVER_V4; filter.displayData.name = IPSEC_WIN7_FILTER_TITLE_V4; ret = api->FwpmFilterAdd0(w->hEngine, &filter, NULL, &w->FilterIPv4Id); if (ret) { Debug("FwpmFilterAdd0 for IPv4 Failed: 0x%X\n", ret); } else { Debug("FwpmFilterAdd0 for IPv4 Ok.\n"); } // Create the Filter (IPv6) Zero(&filter, sizeof(filter)); filter.flags = FWPM_FILTER_FLAG_PERMIT_IF_CALLOUT_UNREGISTERED; filter.layerKey = FWPM_LAYER_INBOUND_IPPACKET_V6; filter.weight.type = FWP_UINT64; filter.weight.uint64 = &weight; filter.action.type = FWP_ACTION_CALLOUT_UNKNOWN; filter.action.calloutKey = GUID_WFP_CALLOUT_DRIVER_V6; filter.displayData.name = IPSEC_WIN7_FILTER_TITLE_V6; ret = api->FwpmFilterAdd0(w->hEngine, &filter, NULL, &w->FilterIPv6Id); if (ret) { Debug("FwpmFilterAdd0 for IPv6 Failed: 0x%X\n", ret); } else { Debug("FwpmFilterAdd0 for IPv6 Ok.\n"); } // Open the device of the driver as a file w->hDriverFile = CreateFileA(WFP_DEVICE_FILE_NAME, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if (w->hDriverFile == NULL || w->hDriverFile == INVALID_HANDLE_VALUE) { Debug("CreateFileA(\"%s\") Failed.\n", WFP_DEVICE_FILE_NAME); IPsecWin7Free(w); return NULL; } IPsecWin7UpdateHostIPAddressList(w); Debug("IPsecWin7Init() Ok.\n"); return w; }