fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot
, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

fix(windows): skip hybrid GPU hook on single-GPU systems - #4938

Closed
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu
Closed

fix(windows): skip hybrid GPU hook on single-GPU systems#4938
SeMmyT wants to merge 1 commit into
LizardByte:masterfrom
SeMmyT:fix/skip-hybrid-hook-single-gpu

Conversation

@SeMmyT

Copy link
Copy Markdown

Summary

  • Skip the NtGdiDdDDIGetCachedHybridQueryValue MinHook on single-GPU systems where it's unnecessary
  • Prevents a crash loop (0xc0000005 in dxgi.dll) on Windows 11 24H2 build 29558+
  • Adds proper error handling for MinHook API return values

Problem

The hybrid GPU workaround hook introduced in #3530 causes an access violation in dxgi.dll on recent Windows 11 builds (24H2, build 29558+) with single-GPU systems. The crash is deterministic — always at offset 0x6cb2f in dxgi.dll — and creates an infinite crash loop where the service wrapper restarts sunshine.exe every ~6 seconds.

Crash signature:

Faulting module: dxgi.dll (10.0.29558.1000)
Exception: 0xc0000005 (ACCESS_VIOLATION)
Offset: 0x000000000006cb2f

Root cause: the hook spoofs D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED as the return value, but the updated dxgi.dll in build 29558 doesn't handle this state correctly on a code path that only executes when the hook is active.

Fix

Before installing the hook, enumerate DXGI adapters to detect if the system has multiple physical GPUs:

  • Multi-GPU: install the hook as before (needed to prevent output reparenting)
  • Single-GPU: skip the hook entirely (no reparenting issue exists)

Adapters are deduplicated by VendorId + DeviceId since the same physical GPU can appear as multiple DXGI adapters.

Also adds:

  • Error handling for MH_Initialize() and MH_CreateHookApi() return values
  • Logging for hook installation status (success, skip, or failure)

Test Plan

  • Verified on RTX 4070 Ti single-GPU, Windows 11 24H2 build 29558, NVIDIA 591.86
  • Should be tested on multi-GPU/hybrid systems to ensure hook is still applied

🤖 Generated with Claude Code

…xgi.dll crash
The NtGdiDdDDIGetCachedHybridQueryValue hook was introduced in LizardByte#3530 to prevent
DXGI output reparenting on multi-GPU/hybrid systems. On single-GPU systems, this
hook is unnecessary and causes an access violation (0xc0000005) in dxgi.dll at a
consistent offset on Windows 11 24H2 build 29558+.
The crash occurs because dxgi.dll's internal code path doesn't correctly handle
the spoofed D3DKMT_GPU_PREFERENCE_STATE_UNSPECIFIED value on newer Windows builds,
resulting in a crash loop where the service wrapper continuously restarts the process.
This fix:
- Enumerates DXGI adapters before installing the hook to detect single vs multi-GPU
- Deduplicates adapters by VendorId+DeviceId (same physical GPU can appear as
multiple DXGI adapters due to cross-adapter copies)
- Skips the hook entirely on single-GPU systems where output reparenting is not
a concern
- Adds error handling for MH_Initialize and MH_CreateHookApi return values
- Adds logging for hook installation status
Tested on: RTX 4070 Ti (single GPU), Windows 11 24H2 build 29558, NVIDIA 591.86
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Guided-By: SeMmy
@sonarqubecloud

Copy link
Copy Markdown

Quality Gate FailedQuality Gate failed

Failed conditions
1 New issue
1 New Code Smells (required ≤ 0)

See analysis details on SonarQube Cloud

Catch issues before they fail your Quality Gate with our IDE extension SonarQube for IDE

@ReenigneArcherReenigneArcher added the ai PR has signs of heavy ai usage (either indicated by user or assumed) label Apr 2, 2026
@ReenigneArcher

Copy link
Copy Markdown
Member

Thank you for the PR submission, but I noticed you didn't use our PR template.

Please update the PR to use the correct template. You can find it at https://github.com/LizardByte/.github/blob/master/.github/pull_request_template.md?plain=1

@cgutman

Copy link
Copy Markdown
Collaborator

Did you take a look at dxgi.dll and see if either:

  • This bug is specific to single GPU systems
  • There's another way for the hook to do its job without triggering the bug

If the bug is not specific to single GPU systems, we're just kicking the can down the road. We're going to have complaints from users with multi-GPU systems where skipping the hook is not an option.

@LizardByte-bot

Copy link
Copy Markdown
Member

It looks like this PR has been idle for 90 days. If it's still something you're working on or would like to pursue, please leave a comment or update your branch. Otherwise, we'll be closing this PR in 10 days to reduce our backlog. Thanks!

@LizardByte-bot

Copy link
Copy Markdown
Member

This PR was closed because it has been stalled for 10 days with no activity.

Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

aiPR has signs of heavy ai usage (either indicated by user or assumed)stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants

@SeMmyT@ReenigneArcher@cgutman@LizardByte-bot