同樣程式碼在 Win7 正常,XP 上呼叫 GetExtendedTcpTable 返回錯誤碼 122 (ERROR_INSUFFICIENT_BUFFER)。
XP 版本的 GetExtendedTcpTable 對緩衝區大小計算方式與 Vista/Win7 不同。首次呼叫時傳入的緩衝區過小,函式會透過第二個參數 pdwSize 返回所需大小,但 XP 可能不正確更新此值,或需兩次呼叫才能取得正確大小。
NULL 緩衝區與 pdwSize 變數,取得所需大小。DWORD size = 0;
GetExtendedTcpTable(NULL, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0);
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER) {
size = (DWORD)(size * 1.1); // 預留餘量
PVOID buf = malloc(size);
if (GetExtendedTcpTable(buf, &size, TRUE, AF_INET, TCP_TABLE_OWNER_PID_ALL, 0) == NO_ERROR) {
// 解析 buf
}
free(buf);
}
pdwSize 返回值,動態調整緩衝區。遵循「兩次呼叫」模式,可兼容 XP 至最新 Windows 版本的 TCP 表查詢。