// Get the proxy server settings from the registry string of IE bool GetProxyServerNameAndPortFromIeProxyRegStr(char *name, UINT name_size, UINT *port, char *str, char *server_type) { #ifdef OS_WIN32 TOKEN_LIST *t; UINT i; bool ret = false; // Validate arguments if (name == NULL || port == NULL || str == NULL || server_type == NULL) { return false; } t = ParseToken(str, ";"); for (i = 0;i < t->NumTokens;i++) { char *s = t->Token[i]; UINT i; Trim(s); i = SearchStrEx(s, "=", 0, false); if (i != INFINITE) { char tmp[MAX_PATH]; StrCpy(name, name_size, s); name[i] = 0; if (StrCmpi(name, server_type) == 0) { char *host; StrCpy(tmp, sizeof(tmp), s + i + 1); if (ParseHostPort(tmp, &host, port, 0)) { StrCpy(name, name_size, host); Free(host); if (*port != 0) { ret = true; } break; } } } } FreeToken(t); return ret; #else // OS_WIN32 return true; #endif // OS_WIN32 }
// String replaceing UINT ReplaceStrEx(char *dst, UINT size, char *string, char *old_keyword, char *new_keyword, bool case_sensitive) { UINT i, j, num; UINT len_string, len_old, len_new; UINT len_ret; UINT wp; char *ret; // Validate arguments if (string == NULL || old_keyword == NULL || new_keyword == NULL) { return 0; } // Get the length of the string len_string = StrLen(string); len_old = StrLen(old_keyword); len_new = StrLen(new_keyword); // Calculate the final string length len_ret = CalcReplaceStrEx(string, old_keyword, new_keyword, case_sensitive); // Memory allocation ret = Malloc(len_ret + 1); ret[len_ret] = '\0'; // Search and Replace i = 0; j = 0; num = 0; wp = 0; while (true) { i = SearchStrEx(string, old_keyword, i, case_sensitive); if (i == INFINITE) { Copy(ret + wp, string + j, len_string - j); wp += len_string - j; break; } num++; Copy(ret + wp, string + j, i - j); wp += i - j; Copy(ret + wp, new_keyword, len_new); wp += len_new; i += len_old; j = i; } // Copy of the search results StrCpy(dst, size, ret); // Memory release Free(ret); return num; }
// 文字列の置換 UINT ReplaceStrEx(char *dst, UINT size, char *string, char *old_keyword, char *new_keyword, bool case_sensitive) { UINT i, j, num; UINT len_string, len_old, len_new; UINT len_ret; UINT wp; char *ret; // 引数チェック if (string == NULL || old_keyword == NULL || new_keyword == NULL) { return 0; } // 文字列長の取得 len_string = StrLen(string); len_old = StrLen(old_keyword); len_new = StrLen(new_keyword); // 最終文字列長の計算 len_ret = CalcReplaceStrEx(string, old_keyword, new_keyword, case_sensitive); // メモリ確保 ret = Malloc(len_ret + 1); ret[len_ret] = '\0'; // 検索と置換 i = 0; j = 0; num = 0; wp = 0; while (true) { i = SearchStrEx(string, old_keyword, i, case_sensitive); if (i == INFINITE) { Copy(ret + wp, string + j, len_string - j); wp += len_string - j; break; } num++; Copy(ret + wp, string + j, i - j); wp += i - j; Copy(ret + wp, new_keyword, len_new); wp += len_new; i += len_old; j = i; } // 検索結果のコピー StrCpy(dst, size, ret); // メモリ解放 Free(ret); return num; }
// Open a secure device SECURE *OpenSec(UINT id) { SECURE_DEVICE *dev = GetSecureDevice(id); SECURE *sec; UINT err; if (dev == NULL) { return NULL; } sec = ZeroMalloc(sizeof(SECURE)); sec->lock = NewLock(); sec->Error = SEC_ERROR_NOERROR; sec->Dev = dev; // Get whether it's a ePass or not if (SearchStrEx(dev->DeviceName, "epass", 0, false) != INFINITE) { sec->IsEPass1000 = true; } // Load the module if (LoadSecModule(sec) == false) { CloseSec(sec); return NULL; } // Get the slot list sec->NumSlot = 0; if ((err = sec->Api->C_GetSlotList(true, NULL, &sec->NumSlot)) != CKR_OK || sec->NumSlot == 0) { // Failure FreeSecModule(sec); CloseSec(sec); return NULL; } sec->SlotIdList = (UINT *)ZeroMalloc(sizeof(UINT *) * sec->NumSlot); if (sec->Api->C_GetSlotList(TRUE, sec->SlotIdList, &sec->NumSlot) != CKR_OK) { // Failure Free(sec->SlotIdList); sec->SlotIdList = NULL; FreeSecModule(sec); CloseSec(sec); return NULL; } return sec; }
bool InStrEx(char *str, char *keyword, bool case_sensitive) { // Validate arguments if (IsEmptyStr(str) || IsEmptyStr(keyword)) { return false; } if (SearchStrEx(str, keyword, 0, case_sensitive) == INFINITE) { return false; } return true; }
// Search for the ASCII string in the binary data sequence UINT SearchAsciiInBinary(void *data, UINT size, char *str, bool case_sensitive) { UINT ret = INFINITE; char *tmp; // Validate arguments if (data == NULL || size == 0 || str == NULL) { return INFINITE; } tmp = ZeroMalloc(size + 1); Copy(tmp, data, size); ret = SearchStrEx(tmp, str, 0, case_sensitive); Free(tmp); return ret; }
// Calculate the length of the result of string replacement UINT CalcReplaceStrEx(char *string, char *old_keyword, char *new_keyword, bool case_sensitive) { UINT i, num; UINT len_string, len_old, len_new; // Validate arguments if (string == NULL || old_keyword == NULL || new_keyword == NULL) { return 0; } // Get the length of the string len_string = StrLen(string); len_old = StrLen(old_keyword); len_new = StrLen(new_keyword); if (len_old == len_new) { return len_string; } // Search num = 0; i = 0; while (true) { i = SearchStrEx(string, old_keyword, i, case_sensitive); if (i == INFINITE) { break; } i += len_old; num++; } // Calculation return len_string + len_new * num - len_old * num; }
// 文字列の置換後の文字列長を計算する UINT CalcReplaceStrEx(char *string, char *old_keyword, char *new_keyword, bool case_sensitive) { UINT i, num; UINT len_string, len_old, len_new; // 引数チェック if (string == NULL || old_keyword == NULL || new_keyword == NULL) { return 0; } // 文字列長の取得 len_string = StrLen(string); len_old = StrLen(old_keyword); len_new = StrLen(new_keyword); if (len_old == len_new) { return len_string; } // 検索処理 num = 0; i = 0; while (true) { i = SearchStrEx(string, old_keyword, i, case_sensitive); if (i == INFINITE) { break; } i += len_old; num++; } // 計算 return len_string + len_new * num - len_old * num; }
// Search for a string (distinguish between upper / lower case) UINT SearchStr(char *string, char *keyword, UINT start) { return SearchStrEx(string, keyword, start, true); }
LIST *GetEthAdapterListInternal() { LIST *o; LIST *ret; UINT size; char *buf; UINT i, j; char *qos_tag = " (Microsoft's Packet Scheduler)"; SU *su = NULL; LIST *su_adapter_list = NULL; // Try to use SeLow if (enable_selow) { su = SuInit(); } o = NewListFast(CompareWpAdapter); size = 200000; buf = ZeroMalloc(size); // Try to enumerate with SeLow if (su != NULL) { su_adapter_list = SuGetAdapterList(su); if (su_adapter_list == NULL) { // Fail to enumerate SuFree(su); su = NULL; //WHERE; is_using_selow = false; } else { //WHERE; is_using_selow = true; } } else { is_using_selow = false; } if (su_adapter_list != NULL) { // If 1 or more adapters are enumerated by SeLow, create adapter list object UINT i; for (i = 0;i < LIST_NUM(su_adapter_list);i++) { SU_ADAPTER_LIST *t = LIST_DATA(su_adapter_list, i); WP_ADAPTER *a = ZeroMalloc(sizeof(WP_ADAPTER)); StrCpy(a->Name, sizeof(a->Name), t->Name); StrCpy(a->Guid, sizeof(a->Guid), t->Guid); StrCpy(a->Title, sizeof(a->Title), t->Info.FriendlyName); TrimCrlf(a->Title); Trim(a->Title); TrimCrlf(a->Title); Trim(a->Title); if (EndWith(a->Title, qos_tag)) { a->Title[StrLen(a->Title) - StrLen(qos_tag)] = 0; TrimCrlf(a->Title); Trim(a->Title); TrimCrlf(a->Title); Trim(a->Title); } Add(o, a); } } else { // When SeLow is not used, create adapter list with SEE or WinPcap if (wp->PacketGetAdapterNames(buf, &size) == false) { Free(buf); return o; } i = 0; if (OS_IS_WINDOWS_NT(GetOsInfo()->OsType)) { // Windows NT if (size >= 2 && buf[0] != 0 && buf[1] != 0) { goto ANSI_STR; } while (true) { wchar_t tmp[MAX_SIZE]; WP_ADAPTER *a; UniStrCpy(tmp, sizeof(tmp), L""); if (*((wchar_t *)(&buf[i])) == 0) { i += sizeof(wchar_t); break; } for (;*((wchar_t *)(&buf[i])) != 0;i += sizeof(wchar_t)) { wchar_t str[2]; str[0] = *((wchar_t *)(&buf[i])); str[1] = 0; UniStrCat(tmp, sizeof(tmp), str); } i += sizeof(wchar_t); a = ZeroMalloc(sizeof(WP_ADAPTER)); UniToStr(a->Name, sizeof(a->Name), tmp); Add(o, a); } } else { // Windows 9x ANSI_STR: while (true) { char tmp[MAX_SIZE]; WP_ADAPTER *a; StrCpy(tmp, sizeof(tmp), ""); if (*((char *)(&buf[i])) == 0) { i += sizeof(char); break; } for (;*((char *)(&buf[i])) != 0;i += sizeof(char)) { char str[2]; str[0] = *((char *)(&buf[i])); str[1] = 0; StrCat(tmp, sizeof(tmp), str); } i += sizeof(char); a = ZeroMalloc(sizeof(WP_ADAPTER)); StrCpy(a->Name, sizeof(a->Name), tmp); Add(o, a); } } for (j = 0;j < LIST_NUM(o);j++) { WP_ADAPTER *a = LIST_DATA(o, j); StrCpy(a->Title, sizeof(a->Title), &buf[i]); i += StrSize(a->Title); // If device description is "Unknown" in Win9x, skip 1 byte if (OS_IS_WINDOWS_9X(GetOsInfo()->OsType)) { if (StrCmp(a->Title, "Unknown") == 0) { if (buf[i] == 0) { i+=sizeof(char); } } } TrimCrlf(a->Title); Trim(a->Title); TrimCrlf(a->Title); Trim(a->Title); if (EndWith(a->Title, qos_tag)) { a->Title[StrLen(a->Title) - StrLen(qos_tag)] = 0; TrimCrlf(a->Title); Trim(a->Title); TrimCrlf(a->Title); Trim(a->Title); } } } for (j = 0;j < LIST_NUM(o);j++) { // Extract GUID WP_ADAPTER *a = LIST_DATA(o, j); if (IsEmptyStr(a->Guid)) { StrCpy(a->Guid, sizeof(a->Guid), a->Name); ReplaceStr(a->Guid, sizeof(a->Guid), a->Guid, "\\Device\\SEE_", ""); ReplaceStr(a->Guid, sizeof(a->Guid), a->Guid, "\\Device\\NPF_", ""); ReplaceStr(a->Guid, sizeof(a->Guid), a->Guid, "\\Device\\PCD_", ""); } } // Sort if (su_adapter_list != NULL) { // Since adapter list made by SeLow is already sorted, don't sort here Sort(o); } ret = NewListFast(CompareWpAdapter); for (i = 0;i < LIST_NUM(o);i++) { WP_ADAPTER *a = LIST_DATA(o, i); ADAPTER *ad; bool is_ethernet = false; bool ok = false; if (SearchStrEx(a->Title, "ppp", 0, false) != INFINITE || SearchStrEx(a->Title, "wan", 0, false) != INFINITE || SearchStrEx(a->Title, "dialup", 0, false) != INFINITE || SearchStrEx(a->Title, "pptp", 0, false) != INFINITE || SearchStrEx(a->Title, "telepho", 0, false) != INFINITE || SearchStrEx(a->Title, "modem", 0, false) != INFINITE || SearchStrEx(a->Title, "ras", 0, false) != INFINITE) { Free(a); continue; } // Determine whether the adapter type is Ethernet if (su == NULL) { // Determine with See ad = wp->PacketOpenAdapter(a->Name); if (ad != NULL) { NetType type; if (wp->PacketGetNetType(ad, &type)) { if (type.LinkType == 0) { is_ethernet = true; } } wp->PacketCloseAdapter(ad); } } else { // In using SeLow, all devices should be Ethernet device is_ethernet = true; } if (is_ethernet) { // Add only Ethernet device char tmp[MAX_SIZE]; UINT k; StrCpy(tmp, sizeof(tmp), a->Title); for (k = 0;;k++) { if (k == 0) { StrCpy(tmp, sizeof(tmp), a->Title); } else { Format(tmp, sizeof(tmp), "%s (%u)", a->Title, k + 1); } ok = true; for (j = 0;j < LIST_NUM(ret);j++) { WP_ADAPTER *aa = LIST_DATA(ret, j); if (StrCmpi(aa->Title, tmp) == 0) { ok = false; } } if (ok) { break; } } StrCpy(a->Title, sizeof(a->Title), tmp); a->Id = Win32EthGenIdFromGuid(a->Guid); Add(ret, a); } if (ok == false) { Free(a); } } Free(buf); Sort(ret); ReleaseList(o); if (su != NULL) { SuFreeAdapterList(su_adapter_list); SuFree(su); } return ret; }
// Parse the URL bool ParseUrl(URL_DATA *data, char *str, bool is_post, char *referrer) { char tmp[MAX_SIZE * 3]; char server_port[MAX_HOST_NAME_LEN + 16]; char *s = NULL; char *host; UINT port; UINT i; // Validate arguments if (data == NULL || str == NULL) { return false; } Zero(data, sizeof(URL_DATA)); if (is_post) { StrCpy(data->Method, sizeof(data->Method), WPC_HTTP_POST_NAME); } else { StrCpy(data->Method, sizeof(data->Method), WPC_HTTP_GET_NAME); } if (referrer != NULL) { StrCpy(data->Referer, sizeof(data->Referer), referrer); } StrCpy(tmp, sizeof(tmp), str); Trim(tmp); // Determine the protocol if (StartWith(tmp, "http://")) { data->Secure = false; s = &tmp[7]; } else if (StartWith(tmp, "https://")) { data->Secure = true; s = &tmp[8]; } else { if (SearchStrEx(tmp, "://", 0, false) != INFINITE) { return false; } data->Secure = false; s = &tmp[0]; } // Get the "server name:port number" StrCpy(server_port, sizeof(server_port), s); i = SearchStrEx(server_port, "/", 0, false); if (i != INFINITE) { server_port[i] = 0; s += StrLen(server_port); StrCpy(data->Target, sizeof(data->Target), s); } else { StrCpy(data->Target, sizeof(data->Target), "/"); } if (ParseHostPort(server_port, &host, &port, data->Secure ? 443 : 80) == false) { return false; } StrCpy(data->HostName, sizeof(data->HostName), host); data->Port = port; Free(host); if ((data->Secure && data->Port == 443) || (data->Secure == false && data->Port == 80)) { StrCpy(data->HeaderHostName, sizeof(data->HeaderHostName), data->HostName); } else { Format(data->HeaderHostName, sizeof(data->HeaderHostName), "%s:%u", data->HostName, data->Port); } return true; }
// Get the internet connection settings of the system void GetSystemInternetSetting(INTERNET_SETTING *setting) { #ifdef OS_WIN32 bool use_proxy; // Validate arguments if (setting == NULL) { return; } Zero(setting, sizeof(INTERNET_SETTING)); use_proxy = MsRegReadInt(REG_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "ProxyEnable"); if (use_proxy) { char *str = MsRegReadStr(REG_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings", "ProxyServer"); if (str != NULL) { char name[MAX_HOST_NAME_LEN + 1]; UINT port; if (GetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name), &port, str, "https")) { setting->ProxyType = PROXY_HTTP; StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name); setting->ProxyPort = port; } else if (GetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name), &port, str, "http")) { setting->ProxyType = PROXY_HTTP; StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name); setting->ProxyPort = port; } else if (GetProxyServerNameAndPortFromIeProxyRegStr(name, sizeof(name), &port, str, "socks")) { setting->ProxyType = PROXY_SOCKS; StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), name); setting->ProxyPort = port; } else { if (SearchStrEx(str, "=", 0, false) == INFINITE) { char *host; UINT port; if (ParseHostPort(str, &host, &port, 0)) { if (port != 0) { setting->ProxyType = PROXY_HTTP; StrCpy(setting->ProxyHostName, sizeof(setting->ProxyHostName), host); setting->ProxyPort = port; } Free(host); } } } Free(str); } } #else // OS_WIN32 Zero(setting, sizeof(INTERNET_SETTING)); #endif // OS_WIN32 }