
Wineで32ビットアプリケーション用のラージアドレスアウェアネス(LAA)がどのようにサポートされているかを明確に説明できる人はいますか?
Windowsでは、32ビットアプリケーションの最大RAM制限はデフォルトで2GBですが、実行可能ファイルにLAAフラグを設定して最大4GBまで使用できることを認識しています。
私が理解したように、Wineはデフォルトで32ビットWindowsアプリケーションの2GB制限に準拠し、.exeにLAAフラグが設定されている場合は4GBを許可します。しかし、すべての32ビットWindowsアプリケーションが自動的に4GB LARGE_ADDRESS_AWARE=1
(または同様のもの)を使用するようにWineに設定できるグローバルオプションもあると聞きました。
これが正しい環境変数であるか、誰かが明確にすることができますか?バニラワインにも適用されますか、それともワインステージングにのみ適用されますか? 64ビットのWineプレフィックスで32ビットアプリケーションを実行するときにも必要ですか? Wine User Guideのページがあると思っていましたが、見つかりませんでした。
答え1
WINEで実行したいすべてのx86アプリケーションのパッチをインストールできます。パッチはここにあります。https://ntcore.com/?page_id=371
また、PEファイルにLAAフラグを設定するためのWINEパッチがあります。 githubに含まれるファイルの内容を見ると、探している変数が正しいようですLARGE_ADDRESS_AWARE
https://github.com/randomstuff/pe-set-laa。このパッチ作成者によると、WINEではうまく動作すると言われています。
実行したい項目(ゲームまたはポータブル実行可能ファイル)によっては、一部のアプリケーションのフラグの妥当性にわずかな不一致があるようです。
ソースからWineをビルドするには、このコードを使用してLAAにグローバルにパッチを適用することもできます。
diff --git a/dlls/kernel32/heap.c b/dlls/kernel32/heap.c
index cac73ec..fb214b9 100644
--- a/dlls/kernel32/heap.c
+++ b/dlls/kernel32/heap.c
@@ -1423,6 +1423,7 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )
/* values are limited to 2Gb unless the app has the IMAGE_FILE_LARGE_ADDRESS_AWARE flag */
/* page file sizes are not limited (Adobe Illustrator 8 depends on this) */
+/*
if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE))
{
if (lpBuffer->dwTotalPhys > MAXLONG) lpBuffer->dwTotalPhys = MAXLONG;
@@ -1430,7 +1431,7 @@ VOID WINAPI GlobalMemoryStatus( LPMEMORYSTATUS lpBuffer )
if (lpBuffer->dwTotalVirtual > MAXLONG) lpBuffer->dwTotalVirtual = MAXLONG;
if (lpBuffer->dwAvailVirtual > MAXLONG) lpBuffer->dwAvailVirtual = MAXLONG;
}
-
+*/
/* work around for broken photoshop 4 installer */
if ( lpBuffer->dwAvailPhys + lpBuffer->dwAvailPageFile >= 2U*1024*1024*1024)
lpBuffer->dwAvailPageFile = 2U*1024*1024*1024 - lpBuffer->dwAvailPhys - 1;
diff --git a/dlls/ntdll/virtual.c b/dlls/ntdll/virtual.c
index 4d4bc3b..2c2264c 100644
--- a/dlls/ntdll/virtual.c
+++ b/dlls/ntdll/virtual.c
@@ -1845,7 +1845,7 @@ void virtual_set_large_address_space(void)
{
IMAGE_NT_HEADERS *nt = RtlImageNtHeader( NtCurrentTeb()->Peb->ImageBaseAddress );
- if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)) return;
+ // if (!(nt->FileHeader.Characteristics & IMAGE_FILE_LARGE_ADDRESS_AWARE)) return;
/* no large address space on win9x */
if (NtCurrentTeb()->Peb->OSPlatformId != VER_PLATFORM_WIN32_NT) return;