Wineでは、LAA(Large Address Awareness)はどのように機能しますか?

Wineでは、LAA(Large Address Awareness)はどのように機能しますか?

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;
 

おすすめ記事