alroyso 4 months ago
parent
commit
f2258ebd78
1 changed files with 33 additions and 19 deletions
  1. 33 19
      windows/wl_base_help_plugin.cpp

+ 33 - 19
windows/wl_base_help_plugin.cpp

@@ -8,10 +8,10 @@
 #include <RasError.h>
 #include <vector>
 #include <iostream>
-
+#include "raserror.h"
 #pragma comment(lib, "wininet")
 #pragma comment(lib, "Rasapi32")
-
+#pragma comment(lib, "rasapi32.lib")
 
 #include <string>
 // For getPlatformVersion; remove unless needed for your plugin implementation.
@@ -235,34 +235,48 @@ void KillProcess(const std::wstring& processName) {
 
 
 bool isDialUpEnabled() {
-    RASCONN rasConn[256];
-    DWORD dwSize = sizeof(rasConn);
+    DWORD dwCb = 0;
+    DWORD dwRet = ERROR_SUCCESS;
     DWORD dwConnections = 0;
-    rasConn[0].dwSize = sizeof(RASCONN);
+    LPRASCONN lpRasConn = NULL;
 
-    // 调用 RasEnumConnections 检查是否有拨号连接
-    if (RasEnumConnections(rasConn, &dwSize, &dwConnections) == ERROR_SUCCESS) {
-        std::wcout << L"连接数: " << dwConnections << std::endl;
+    // 第一次调用 RasEnumConnections 来获取所需的缓冲区大小
+    dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
 
-        // 如果没有任何连接,直接返回 false
-        if (dwConnections == 0) {
+    if (dwRet == ERROR_BUFFER_TOO_SMALL) {
+        // 分配内存来保存 RAS 连接信息
+        lpRasConn = (LPRASCONN)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwCb);
+        if (lpRasConn == NULL) {
+            wprintf(L"HeapAlloc failed!\n");
             return false;
         }
 
-        for (DWORD i = 0; i < dwConnections; i++) {
-            std::wcout << L"连接类型: " << rasConn[i].szDeviceType << std::endl;
-
-            // 检查连接类型是否为 PPP 或 PPPoE
-            if (wcscmp(rasConn[i].szDeviceType, L"RASDT_PPP") == 0 ||
-                wcscmp(rasConn[i].szDeviceType, L"RASDT_PPPoE") == 0) {
-                return true;  // 检测到 PPP 或 PPPoE 连接
+        // 初始化结构体大小
+        lpRasConn[0].dwSize = sizeof(RASCONN);
+
+        // 再次调用 RasEnumConnections 以填充连接信息
+        dwRet = RasEnumConnections(lpRasConn, &dwCb, &dwConnections);
+
+        // 检查是否成功,并且有连接
+        if (ERROR_SUCCESS == dwRet && dwConnections > 0) {
+            // 遍历连接,检查是否有 PPP 或 PPPoE 类型的拨号连接
+            for (DWORD i = 0; i < dwConnections; i++) {
+                if (wcscmp(lpRasConn[i].szDeviceType, L"RASDT_PPP") == 0 ||
+                    wcscmp(lpRasConn[i].szDeviceType, L"RASDT_PPPoE") == 0) {
+                    // 释放内存后返回 true,表示有拨号连接
+                    HeapFree(GetProcessHeap(), 0, lpRasConn);
+                    return true;
+                }
             }
         }
+
+        // 释放内存
+        HeapFree(GetProcessHeap(), 0, lpRasConn);
     }
-    // 没有找到符合条件的连接类型,返回 false
+
+    // 没有找到符合条件的拨号连接,返回 false
     return false;
 }
-
 namespace wl_base_help {
 
 // static