Linux/wine

From Omnia
Jump to navigation Jump to search

Wine

sudo dpkg --add-architecture i386
sudo apt update
sudo apt install --install-recommends winehq-staging

Rebuild Wine Prefix (~/.wine)

wineboot -u

Test new wine prefix:

WINEPREFIX=~/my_new_prefix wine your_executable.exe

Test wine with executable:

xvfb-run -a wine your_executable.exe

Reconfig your wine prfix:

rm -rf .wine
winecfg
# or if headless...
xvfg-run wincfg

Debug Wine

If you are still stuck, you can generate a cleaner log file to parse by running your app with standard Wine debugging output:

WINEDEBUG=-all,err+all wine your_application.exe

Clean Prefix

# Remove the broken configuration directory
rm -rf ~/.wine
# Initialize a clean, default 64-bit prefix
wineboot --init

-- Explicit Clean 64 --

# Create a fresh 64-bit testing environment
WINEPREFIX=~/.wine_test WINEARCH=win64 wineboot --init
# Run the test program in that environment
WINEPREFIX=~/.wine_test wine winetest.exe

Wine cmd.exe Test

wine cmd.exe

Wine Console Test

winetest.cpp ::

#include <iostream>
#include <windows.h>
#include <fstream>
#include <string>

int main() {
    std::cout << "========================================\n";
    std::cout << "       Wine Windows Console Test        \n";
    std::cout << "========================================\n\n";

    // 1. Test Windows API Version Detection
    std::cout << "[1] Checking Windows API Memory Status...\n";
    MEMORYSTATUSEX memInfo;
    memInfo.dwLength = sizeof(MEMORYSTATUSEX);
    if (GlobalMemoryStatusEx(&memInfo)) {
        std::cout << "    -> Success! Total Physical Memory: " 
                  << memInfo.ullTotalPhys / (1024 * 1024) << " MB\n\n";
    } else {
        std::cout << "    -> Failed to retrieve memory status.\n\n";
    }

    // 2. Test Environment Variables
    std::cout << "[2] Checking Environment Variables...\n";
    char username[256];
    DWORD username_len = sizeof(username);
    if (GetUserNameA(username, &username_len)) {
        std::cout << "    -> Current User: " << username << "\n\n";
    } else {
        std::cout << "    -> Failed to get username.\n\n";
    }

    // 3. Test File System Write/Read under Wine
    std::cout << "[3] Testing File System I/O...\n";
    std::string testFilename = "wine_test_file.txt";
    
    std::ofstream outFile(testFilename);
    if (outFile.is_open()) {
        outFile << "Wine compatibility test successful!";
        outFile.close();
        std::cout << "    -> Successfully wrote to " << testFilename << "\n";
        
        std::ifstream inFile(testFilename);
        std::string fileContent;
        if (std::getline(inFile, fileContent)) {
            std::cout << "    -> Successfully read: \"" << fileContent << "\"\n";
        }
        inFile.close();
        
        // Clean up
        DeleteFileA(testFilename.c_str());
    } else {
        std::cout << "    -> Failed file I/O test.\n";
    }
    std::cout << "\n";

    // 4. Test Registry Read (Optional but good for Wine)
    std::cout << "[4] Testing Registry Access (HKLM)...\n";
    HKEY hKey;
    if (RegOpenKeyExA(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", 0, KEY_READ, &hKey) == ERROR_SUCCESS) {
        char prodName[256];
        DWORD bufferSize = sizeof(prodName);
        if (RegQueryValueExA(hKey, "ProductName", NULL, NULL, (LPBYTE)prodName, &bufferSize) == ERROR_SUCCESS) {
            std::cout << "    -> Reported OS: " << prodName << "\n\n";
        } else {
            std::cout << "    -> Opened key, but failed to read ProductName.\n\n";
        }
        RegCloseKey(hKey);
    } else {
        std::cout << "    -> Failed to open registry key.\n\n";
    }

    std::cout << "Tests completed. Press ENTER to exit.";
    std::cin.get();
    return 0;
}


On Linux cross compile with:

x86_64-w64-mingw32-g++ -o winetest.exe winetest.cpp -static
# apt install g++-mingw-w64-x86-64-posix  # version 13.2.0-6ubuntu1+26.1, or
# apt install g++-mingw-w64-x86-64-win32  # version 13.2.0-6ubuntu1+26.1


On Windows compile with:

cl /EHsc winetest.cpp

Rune in wine:

wine winetest.exe
xvfb-run -a wine winetest.exe

Issues

/dev/dri permission issue

Errors in wine log:

$ wine winetest.exe
...
libEGL warning: failed to open /dev/dri/renderD128: Permission denied
libEGL warning: failed to open /dev/dri/renderD128: Permission denied
libEGL warning: failed to open /dev/dri/card1: Permission denied
libEGL warning: failed to open /dev/dri/renderD128: Permission denied
libEGL warning: failed to open /dev/dri/renderD128: Permission denied
libEGL warning: failed to open /dev/dri/card1: Permission denied

Probably benign, but if you want, you can add the user to the "video" and "render" group, and that should fix both of these. (it did for me)

sudo usermod -aG video,render steam
$ grep steam /etc/group
video:x:44:steam
render:x:109:steam
steam:x:1005:

-- option 2 - force software rendering

Best for headless

LIBGL_ALWAYS_SOFTWARE=1 xvfb-run winecfg

explorer process failed to start

Error in wine logs:

$ wine winetest.exe
...
00f0:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
00f0:err:winediag:nodrv_CreateWindow L"The explorer process failed to start."
00f0:err:systray:initialize_systray Could not create tray window

I ignored these, although running with xvfb-run got rid of these, but had other issues


Could not get DRI3 device

When running with xvfb-run...

$ xvfb-run wine winetest.exe
...
libEGL warning: DRI3 error: Could not get DRI3 device
libEGL warning: Ensure your X server supports DRI3 to get accelerated rendering

X connection to :99 broken (explicit kill or server shutdown).
X connection to :99 broken (explicit kill or server shutdown).
X connection to :99 broken (explicit kill or server shutdown).

I ignored these... but....

Running with "-a" option did seem to fix most of these, just left a single "explicit kill" message only...

$ xvfb-run -a wine winetest.exe
...
X connection to :99 broken (explicit kill or server shutdown).

keywords