AndreRH / hangover

Hangover runs simple Win32 applications on arm64 Linux
GNU Lesser General Public License v2.1
1.24k stars 91 forks source link

Trying to run Hangover inside a docker container on my Raspberry PI #114

Closed devedse closed 1 year ago

devedse commented 3 years ago

System Details

Platform I'm running on: Docker image on Raspberry PI 4 8GB (Rasperry PI OS 64 bit) Platform I used for compilation: Docker image on Raspberry PI 4 8GB (Rasperry PI OS 64 bit) Toolchain: I basically used your dockerfile used in Github actions

Problems Description

I'm currently working on a tool that does image optimization inside a docker container. It makes use of Windows executables since not all of them are available on Windows. I created a docker container for this which makes use of Wine to actually call the executables which works fine. (My repo: https://github.com/devedse/DeveImageOptimizer/)

I thought, wouldn't it be cool to be able to run this on my Raspberry PI (it's of course not going to be very fast, but I like to search the boundaries of what's technologically possible).

That's when I found out about hangover.

I created the following docker file (with some sections commented out so that I could more easily play around with it):


#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS base
ARG TARGETPLATFORM
ENV NOTESTS 1
ENV PKG_CONFIG aarch64-linux-gnu-pkg-config
ENV CROSS_TRIPLE aarch64-linux-gnu
ENV HANGOVER_WINE_CC aarch64-linux-gnu-clang
ENV HANGOVER_WINE_CXX aarch64-linux-gnu-clang++
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
        echo hallo amd64 ; \
        dpkg --add-architecture i386 && apt-get update && apt-get install wine wget -y ; \
    elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        echo hallo arm64 ; \
        apt-get update && apt-get install -y \
            unzip wget python python3 bzip2 pkg-config xz-utils tar \
            binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu \
        &&  apt clean \
        &&  rm -rf /var/lib/apt/lists/* ; \

        cat /etc/apt/sources.list | grep -v "^#"  | sed "s/^deb /deb [arch=amd64] /g" > /tmp/amd64.list && \
        cat /tmp/amd64.list | sed "s/\[arch=amd64\]/[arch=arm64]/g" > /tmp/arm64.list && \
        cat /tmp/amd64.list /tmp/arm64.list > /etc/apt/sources.list && \
        dpkg --add-architecture arm64 ; \

        cat /etc/apt/sources.list ; \

        apt-get update && apt-get install -y --no-install-recommends \
            ca-certificates \
            python \
            flex bison \
            libfreetype6-dev \
            libltdl-dev \
            libxcb1-dev \
            libx11-dev \
            librsvg2-bin \
            gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 \
            automake autoconf pkg-config libtool \
            automake1.11 autoconf2.13 autoconf2.64 \
            gtk-doc-tools git gperf groff p7zip-full \
            gettext \
            make \
            clang \
            dpkg-dev \
            libglib2.0-dev:arm64 \
            libfreetype6-dev:arm64 \
            libltdl-dev:arm64 \
            libxcb1-dev:arm64 \
            libx11-dev:arm64 \
        &&  apt clean \
        &&  rm -rf /var/lib/apt/lists/* \
        &&  ln -s /usr/bin/autoconf /usr/bin/autoconf-2.69 \
        &&  ln -s /usr/bin/autoheader /usr/bin/autoheader-2.69 ; \

        ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-clang; ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-clang++ ; \
        #now this is quite hacky, but we use winegcc for qemu as compiler and it always defaults to gcc, whereas we need clang ; \
        rm -f /usr/bin/aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-g++ ; \
        ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-gcc; ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-g++ ; \

    elif [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
        echo hallo armv7 ; \
    else \
        echo $TARGETPLATFORM ; \
    fi
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        git clone --recurse-submodules -j8 https://github.com/AndreRH/hangover.git /root/hangover ; \
        cd /root/hangover ; \
        make -C /root/hangover -f Makefile ; \
    fi
RUN wget -O /root/FileOptimizerSetup.exe https://sourceforge.net/projects/nikkhokkho/files/latest/download
#The following lines work fine on a x64 image. My goal is to get this working on ARM too.
#RUN wine /root/FileOptimizerSetup.exe /S
#RUN rm /root/FileOptimizerSetup.exe
ENV FILEOPTIMIZERPATH="/root/.wine/drive_c/Program Files/FileOptimizer/FileOptimizer64.exe"
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim-amd64 AS build
WORKDIR /src
COPY ["NuGet.config", "NuGet.config"]
COPY ["DeveImageOptimizer.ConsoleApp/DeveImageOptimizer.ConsoleApp.csproj", "DeveImageOptimizer.ConsoleApp/"]
COPY ["DeveImageOptimizer/DeveImageOptimizer.csproj", "DeveImageOptimizer/"]
RUN dotnet restore "DeveImageOptimizer.ConsoleApp/DeveImageOptimizer.ConsoleApp.csproj"
COPY . .
WORKDIR "/src/DeveImageOptimizer.ConsoleApp"
#RUN dotnet build "DeveImageOptimizer.ConsoleApp.csproj" -c Release -o /app/build

FROM build AS publish
ARG BUILD_VERSION
ARG VER=${BUILD_VERSION:-1.0.0}
#RUN dotnet publish "DeveImageOptimizer.ConsoleApp.csproj" -c Release -o /app/publish /p:Version=$VER

FROM base AS final
WORKDIR /app
#COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "DeveImageOptimizer.ConsoleApp.dll"]

For just testing hangover I guess everything below the line where I download FileOptimizer can be ignored.

If you place this dockerfile in DeveImageOptimizer.ConsoleApp/Dockerfile2 and build this image on ARM64 (my Raspberry PI) it takes about 6 hours but after that it seemed to be complete.

docker build -f DeveImageOptimizer.ConsoleApp/Dockerfile2 -t testimage .

I simply started the image using the following command:

docker run --rm -it --entrypoint /bin/bash testimage

After this I had a working image with a /root/hangover/build folder. On the Readme.MD it's specified you need to run /root/hangover/build/wine-host/loader/wine64 however on my build I could only find ....../loader/wine

Based on what was further described in the readme I tried running some simple programs from the wine-guest32 and wine-guest64 directories. However this resulted in some errors:

/root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover/build/wine-guest32/programs/xcopy/xcopy.exe

00a4:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
00a4:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
00a4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
00a4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
00a4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
00a4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
00a4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
00a4:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
00a4:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
00a4:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
32 bit environment set up, Large Address Aware: NO.
00a4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__p___wargv imported from L"Z:\\root\\hangover\\build\\wine-guest32\\programs\\xcopy\\xcopy.exe", setting to 0x7fb0eaecc5
00a4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._initialize_wide_environment imported from L"Z:\\root\\hangover\\build\\wine-guest32\\programs\\xcopy\\xcopy.exe", setting to 0x7fb0eaecc5
00a4:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
00a4:fixme:qemu_msvcrt:qemu__configure_wide_argv Unverified!
00a4:err:virtual:virtual_setup_exception stack overflow 1360 bytes in thread 00a4 addr 0x7bc4c5d4 stack 0x120ab0 (0x120000-0x121000-0x220000)

/root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover/build/wine-guest64/programs/xcopy/xcopy.exe

00b4:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
00b4:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
00b4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
00b4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
00b4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
00b4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
00b4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
00b4:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
00b4:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
00b4:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
00b4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__p___wargv imported from L"Z:\\root\\hangover\\build\\wine-guest64\\programs\\xcopy\\xcopy.exe", setting to 0x7fbb5e5cc5
00b4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._initialize_wide_environment imported from L"Z:\\root\\hangover\\build\\wine-guest64\\programs\\xcopy\\xcopy.exe", setting to 0x7fbb5e5cc5
00b4:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
00b4:fixme:qemu_msvcrt:qemu__configure_wide_argv Unverified!
00b4:err:qemu:cpu_loop Unhandled trap 3, exiting.
RAX=0000000000000000 RBX=0000000000000000 RCX=000000000064ff40 RDX=0000000000000663
RSI=0000000000000000 RDI=0000000000000000 RBP=0000000000000000 RSP=000000000064ff68
R8 =0000000000000000 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000000
R12=0000000000000000 R13=0000000000000000 R14=0000000000000000 R15=0000000000000000
RIP=0000007fbb5e5cc6 RFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0
ES =0000 0000000000000000 00000000 00000000
CS =0033 0000000000000000 ffffffff 00effb00 DPL=3 CS64 [-RA]
SS =002b 0000000000000000 ffffffff 00cff300 DPL=3 DS   [-WA]
DS =0000 0000000000000000 00000000 00000000
FS =0000 0000000000000000 00000000 00000000
GS =0000 0000007fba360000 00000000 00000000
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT=     0000000000013590 0000007f
IDT=     00000000000124f0 000001ff
CR0=80010001 CR2=0000000000000000 CR3=0000000000000000 CR4=00000220
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000500

And also when trying to run my the setup file I would actually like to install, FileOptimizerFull.exe I run into similar problems:

/root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/FileOptimizerSetup.exe /S

00c4:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
00c4:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
00c4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
00c4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
00c4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
00c4:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
00c4:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
00c4:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
00c4:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
00c4:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
32 bit environment set up, Large Address Aware: NO.
00c4:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
00c4:fixme:qemu_kernel32:qemu_SetDefaultDllDirectories Unverified!
00c4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._wopen imported from L"C:\\windows\\system32\\SETUPAPI.dll", setting to 0x7fbe091cc5
00c4:fixme:qemu_kernel32:qemu_IsWow64Process Not sure yet if we qualify as Wow64.
00c4:fixme:qemu_module:qemu_ldr_module_g2h A host L"combase.dll" has been found, but no wrapper named L"qemu_combase.dll".
00c4:fixme:qemu_module:qemu_ldr_module_g2h A host L"combase.dll" has been found, but no wrapper named L"qemu_combase.dll".
00c4:fixme:qemu_ntdll:qemu_toupper Unverified!
00c4:fixme:qemu_ntdll:qemu_RtlUpcaseUnicodeChar Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_kernel32:qemu_GetUserDefaultUILanguage Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_kernel32:qemu_Wow64EnableWow64FsRedirection Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
00c4:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be created for context 0x1
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!
00c4:fixme:qemu_user32:qemu_CharPrevW Unverified!

Hopefully someone can give me some insight in how to resolve this 😄

devedse commented 3 years ago

I also tried downloading the arm compiled version from here: https://github.com/AndreRH/hangover/actions/runs/615456472

I simply downloaded the buildfolder and extracted it to /root/hangover2/build.

When running commands against this version I got different errors again: /root/hangover2/build/wine-host/loader/wine /root/hangover2/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover2/build/wine-guest64/programs/xcopy/xcopy.exe

err:environ:read_nls_file failed to load 11/20127
err:environ:read_nls_file failed to load 10/0
Segmentation fault (core dumped)

/root/hangover2/build/wine-host/loader/wine /root/hangover2/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover2/build/wine-guest32/programs/xcopy/xcopy.exe

err:environ:read_nls_file failed to load 11/20127
err:environ:read_nls_file failed to load 10/0
Segmentation fault (core dumped)

/root/hangover2/build/wine-host/loader/wine /root/hangover2/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/FileOptimizerSetup.exe /S

err:environ:read_nls_file failed to load 11/20127
err:environ:read_nls_file failed to load 10/0
Segmentation fault (core dumped)
devedse commented 3 years ago

Just some related question, yesterday I created a new github actions build that actually builds the image using the ARM64 architecture (using Qemu): https://github.com/devedse/DeveImageOptimizer/actions/runs/669813962

It however seemed to stop after 6 hours. I was comparing it with your builds which do complete after about 2.5 hours. It seems that for whatever reason your builds run quite a bit faster. I suppose this is due to them being build on x64 rather then ARM, could this be true?

And if this is the case, should I build hangover on a x64 image and then copy it over into my ARM image? Or is it better to build it on ARM too?

AndreRH commented 3 years ago

Hi, interesting project! First, let's talk about the major issue: 00c4:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 00c4:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly. Wine is missing a correct X11 setup in the docker image...

Regarding your /root/hangover2 approach, the artifact you downloaded only includes the build folder, but for various reasons it expects to sit in a hangover checkout with the source files. same setup as it has in /root/hangover, so you might be able to just copy everything over from there.

Regarding building in qemu, yes, that's horrible slow and exceeded the time allowed for github actions...

devedse commented 3 years ago

@AndreRH , thanks for your quick response.

First, let's talk about the major issue: 00c4:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded. 00c4:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly. Wine is missing a correct X11 setup in the docker image...

I did try to run normal wine on an x86 docker container which also showed similar warnings but worked correctly. Also with the "FileOptimizerFull.exe /S" command quite a few warnings/errors were shown but the end result was that the .exe file installed correctly. The main reason I chose to test it with xcopy is because I would expect it not to need a $DISPLAY to actually run this CLI application.

You can check out my X86 wine install of file optimizer here: https://github.com/devedse/DeveImageOptimizer/runs/2154784314?check_suite_focus=true Search for the following lines:

#8 3.565  92050K .......... .......... .......... ..                   100% 16.9M=2.3s
#8 3.568 
#8 3.569 2021-03-20 09:32:19 (39.0 MB/s) - '/root/FileOptimizerSetup.exe' saved [94292719/94292719]
#8 3.569 
#8 3.576 wine: created the configuration directory '/root/.wine'
#8 3.579 0009:err:file:init_redirects cannot open L"C:\\windows" (c000000f)
#8 3.766 0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
#8 3.767 0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}
#8 3.767 0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002
#8 3.767 0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002
#8 3.767 0012:err:ole:get_local_server_stream Failed: 80004002
#8 3.773 000b:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
#8 3.773 000b:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
#8 3.790 0014:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
#8 3.790 0014:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
#8 3.790 0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
#8 3.791 0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
#8 3.792 0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
#8 3.793 0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 14007
#8 3.793 0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x800736b7
#8 3.793 0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 800736b7
#8 3.793 0014:err:ole:get_local_server_stream Failed: 800736b7
#8 3.799 0010:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
#8 3.799 0010:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
#8 6.465 Could not load wine-gecko. HTML rendering will be disabled.
#8 7.433 0026:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
#8 7.433 0026:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
#8 9.673 Could not load wine-gecko. HTML rendering will be disabled.
#8 10.13 wine: configuration in '/root/.wine' has been updated.
#8 DONE 32.5s

To me it feels like something else is going wrong, but I can't figure out what it is.

Regarding your /root/hangover2 approach, the artifact you downloaded only includes the build folder, but for various reasons it expects to sit in a hangover checkout with the source files. same setup as it has in /root/hangover, so you might be able to just copy everything over from there.

I'll try this, thanks for the suggestions :)

Regarding building in qemu, yes, that's horrible slow and exceeded the time allowed for github actions...

So you're saying that (with your dockerfile) the build output should be the same when you run it on an x86 image and on an arm image?

stefand commented 3 years ago

00b4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__p___wargv imported from L"Z:\root\hangover\build\wine-guest64\programs\xcopy\xcopy.exe", setting to 0x7fbb5e5cc5 00b4:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._initialize_wide_environment imported from L"Z:\root> RIP=0000007fbb5e5cc6 RFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0

Here you are running into my terrible, terrible way of qemu telling you that an unimplemented function got called. The PE loader will set any unimplemented function to a byte containing 0xcc. You see the RIP pointing to the next instruction after the breakpoint.

I don't see any obvious issue in your FileOptimizerSetup output. I'll give it a try myself. And I need to silence those CharPrevW spam lines some day.

devedse commented 3 years ago

@stefand, is xcopy supposed not to work? (If you're saying its calling unimplemented functions) And if so, is there another program I can use to better test if everything is working?

devedse commented 3 years ago

@AndreRH I just copied over the build directory into a newly cloned /root/hangover3 directory. After running this the errors seem to be the same as with my own build version (which I guess is good since I could simply include your compiled version rather then compiling myself):

/root/hangover3/build/wine-host/loader/wine /root/hangover3/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover3/build/wine-guest32/programs/xcopy/xcopy.exe

010c:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
010c:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
010c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
010c:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
010c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
010c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
010c:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
010c:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
010c:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
010c:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
32 bit environment set up, Large Address Aware: NO.
010c:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__p___wargv imported from L"Z:\\root\\hangover3\\build\\wine-guest32\\programs\\xcopy\\xcopy.exe", setting to 0x7f9004f6f5
010c:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._initialize_wide_environment imported from L"Z:\\root\\hangover3\\build\\wine-guest32\\programs\\xcopy\\xcopy.exe", setting to 0x7f9004f6f5
010c:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
010c:fixme:qemu_msvcrt:qemu__configure_wide_argv Unverified!
010c:err:virtual:virtual_setup_exception stack overflow 1360 bytes in thread 010c addr 0x7bc4c5d4 stack 0x120ab0 (0x120000-0x121000-0x220000)

/root/hangover3/build/wine-host/loader/wine /root/hangover3/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover3/build/wine-guest64/programs/xcopy/xcopy.exe

00fc:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
00fc:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
00fc:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
00fc:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
00fc:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
00fc:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
00fc:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
00fc:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
00fc:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
00fc:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
00fc:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__p___wargv imported from L"Z:\\root\\hangover3\\build\\wine-guest64\\programs\\xcopy\\xcopy.exe", setting to 0x7fb49876f5
00fc:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._initialize_wide_environment imported from L"Z:\\root\\hangover3\\build\\wine-guest64\\programs\\xcopy\\xcopy.exe", setting to 0x7fb49876f5
00fc:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
00fc:fixme:qemu_msvcrt:qemu__configure_wide_argv Unverified!
00fc:err:qemu:cpu_loop Unhandled trap 3, exiting.
RAX=0000000000000000 RBX=0000000000000000 RCX=000000000064ff40 RDX=0000000000000663
RSI=0000000000000000 RDI=0000000000000000 RBP=0000000000000000 RSP=000000000064ff68
R8 =0000000000000000 R9 =0000000000000000 R10=0000000000000000 R11=0000000000000000
R12=0000000000000000 R13=0000000000000000 R14=0000000000000000 R15=0000000000000000
RIP=0000007fb49876f6 RFL=00000202 [-------] CPL=3 II=0 A20=1 SMM=0 HLT=0
ES =0000 0000000000000000 00000000 00000000
CS =0033 0000000000000000 ffffffff 00effb00 DPL=3 CS64 [-RA]
SS =002b 0000000000000000 ffffffff 00cff300 DPL=3 DS   [-WA]
DS =0000 0000000000000000 00000000 00000000
FS =0000 0000000000000000 00000000 00000000
GS =0000 0000007fb3950000 00000000 00000000
LDT=0000 0000000000000000 0000ffff 00008200 DPL=0 LDT
TR =0000 0000000000000000 0000ffff 00008b00 DPL=0 TSS64-busy
GDT=     0000000000011ab0 0000007f
IDT=     0000000000012dd0 000001ff
CR0=80010001 CR2=0000000000000000 CR3=0000000000000000 CR4=00000220
DR0=0000000000000000 DR1=0000000000000000 DR2=0000000000000000 DR3=0000000000000000
DR6=00000000ffff0ff0 DR7=0000000000000400
EFER=0000000000000500

Would it be possible to create github releases with the actual /build folder output? That way I would be able to simply do a wget on the build output and extract it.

Currently the output is only being pushed to github actions which can't be easily downloaded using wget.

I've set this up previously using this task: https://github.com/devedse/DeveMazeGeneratorCore/blob/master/.github/workflows/githubactionsbuilds.yml

    - name: Release
      uses: softprops/action-gh-release@v1
      with:
        tag_name: 1.0.${{needs.generate_version_number.outputs.build_number}}
        files: |
          ./Scripts/Output/DeveMazeGeneratorCore.7z
          ./Scripts/Output/DeveMazeGeneratorCore.zip
          ./DeveMazeGeneratorCore/bin/Release/*.nupkg
          ./DeveMazeGeneratorCore/bin/Release/*.snupkg
      env:
        GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

What would probably need to happen to make it all work a bit nicer is to have only 1 workflow which does all 3 builds, and if all complete successfully the release would be created.

Edit: If you're interested in this, I could probably take a look and submit a PR. (I'd still want to get my actual FileOptimizer stuff working first though :smile:)

AndreRH commented 3 years ago

Sounds good. That's the plan for releases, the normal runs also vanish after 90 days

devedse commented 3 years ago

What software are you guys testing with to see if it's working? (As xcopy doesn't seem to be working for me)

devedse commented 3 years ago

Do you guys use discord / slack to maybe connect to each other a bit quicker?

stefand commented 3 years ago

My usual test to find out if the basic functionality is Wine's notepad - but that is a GUI program. I have fixes for xcopy coming. It used to work once, but since Wine has been migrating from ELF builds of its internal programs to PE builds that are linked against ucrtbase.dll those programs started hitting missing functionality in hangover's thunks.

I am hanging out in #winehackers on freenode. The dxvk guys run a discord bridge to that channel if you want to use it. But beware that hangover is a pet project for both of us, so the time available is limited anyhow.

stefand commented 3 years ago

I've just pushed fixes that make "xcopy /?" run for both 32 and 64 bit xcopy. I haven't tested actual copying functionality. Please remember to update the submodules.

stefand commented 3 years ago

Oh also the build system is kinda bad with incremental rebuilds, so I recommend to rm -rf build/

devedse commented 3 years ago

Yeah my ImageOptimizer is only a side project for me as well, so no hurry :). I'll try to setup builds for you guys so that I can also more easily integrate that in my docker container. That way I don't have to wait 6 hours every time to build a new image if you've made some changes.

stefand commented 3 years ago

The installer runs fine for me and FileOptimizer starts OK as well. However, it doesn't optimize any files because it can't start subprocesses. The Wine hack to start qemu for x86 apps needs to be updated for the recent move of CreateProcess to ntdll.

I suspect two problems: Either the installer doesn't work without an X server after all, even in silent mode, or you cancelled it while it was working (it takes some time here due to uncompressing and slow I/O) or it installed OK and you didn't realize it. Did you check for the installed files in C:\Program Files?

Screenshot_20210321_182151

devedse commented 3 years ago

I suspect two problems: Either the installer doesn't work without an X server after all, even in silent mode, or you cancelled it while it was working (it takes some time here due to uncompressing and slow I/O) or it installed OK and you didn't realize it. Did you check for the installed files in C:\Program Files?

I just tried running the command again and checked the Program Files folder (I expected this to be in /root/.wine/ but I'm not sure if this is correc). I couldn't find the installed data though. When running this with the latest version of wine in a docker container on x86 it does work correctly though.

Anyway here's the output of running it inside my ARM docker container:

root@825383bd11ee:~# /root/hangover3/build/wine-host/loader/wine /root/hangover3/build/qemu/x86_64-win                                                                                                                                                            dows-user/qemu-x86_64.exe.so /root/FileOptimizerSetup.exe /S
011c:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be load                                                                                                                                                            ed.
011c:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set                                                                                                                                                             correctly.
011c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
011c:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
011c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
011c:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
011c:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
011c:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
011c:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
011c:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth                                                                                                                                                             >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
32 bit environment set up, Large Address Aware: NO.
011c:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
011c:fixme:qemu_kernel32:qemu_SetDefaultDllDirectories Unverified!
011c:fixme:qemu_module:import_dll No implementation for ucrtbase.dll._wopen imported from L"C:\\window                                                                                                                                                            s\\system32\\SETUPAPI.dll", setting to 0x7f8a5ba6f5
011c:fixme:qemu_kernel32:qemu_IsWow64Process Not sure yet if we qualify as Wow64.
011c:fixme:qemu_module:qemu_ldr_module_g2h A host L"combase.dll" has been found, but no wrapper named                                                                                                                                                             L"qemu_combase.dll".
011c:fixme:qemu_module:qemu_ldr_module_g2h A host L"combase.dll" has been found, but no wrapper named                                                                                                                                                             L"qemu_combase.dll".
011c:fixme:qemu_ntdll:qemu_toupper Unverified!
011c:fixme:qemu_ntdll:qemu_RtlUpcaseUnicodeChar Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_kernel32:qemu_GetUserDefaultUILanguage Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_kernel32:qemu_Wow64EnableWow64FsRedirection Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:err:ole:com_get_class_object class {00021401-0000-0000-c000-000000000046} not registered
011c:err:ole:com_get_class_object no class object {00021401-0000-0000-c000-000000000046} could be crea                                                                                                                                                            ted for context 0x1
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
011c:fixme:qemu_user32:qemu_CharPrevW Unverified!
root@825383bd11ee:~# cd /root/.wine/
root@825383bd11ee:~/.wine# ls
dosdevices  drive_c  system.reg  user.reg
root@825383bd11ee:~/.wine# cd drive_c
root@825383bd11ee:~/.wine/drive_c# ls
'Program Files'   users   windows
root@825383bd11ee:~/.wine/drive_c# cd Program\ Files/
root@825383bd11ee:~/.wine/drive_c/Program Files# ls
'Common Files'  'Internet Explorer'  'Windows Media Player'  'Windows NT'
root@825383bd11ee:~/.wine/drive_c/Program Files#

I also tried running it in a docker container running on x86 with normal wine installed.

root@4c7fbc826260:~# wine FileOptimizerSetup.exe /S
wine: created the configuration directory '/root/.wine'
0009:err:file:init_redirects cannot open L"C:\\windows" (c000000f)
0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
0012:err:ole:marshal_object couldn't get IPSFactory buffer for interface {6d5140c1-7436-11ce-8034-00aa006009fa}
0012:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x80004002
0012:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 80004002
0012:err:ole:get_local_server_stream Failed: 80004002
0010:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0010:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0014:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0014:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
0014:err:ole:marshal_object couldn't get IPSFactory buffer for interface {00000131-0000-0000-c000-000000000046}
0014:err:ole:apartment_createwindowifneeded CreateWindow failed with error 14007
0014:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hres=0x800736b7
0014:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, 800736b7
0014:err:ole:get_local_server_stream Failed: 800736b7
000b:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
000b:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
Could not load wine-gecko. HTML rendering will be disabled.
0025:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0025:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
Could not load wine-gecko. HTML rendering will be disabled.
wine: configuration in '/root/.wine' has been updated

With the files actually being installed:

root@4c7fbc826260:~/.wine# cd drive_c/
root@4c7fbc826260:~/.wine/drive_c# ls
'Program Files'  'Program Files (x86)'   ProgramData   users   windows
root@4c7fbc826260:~/.wine/drive_c# cd 'Program Files'
root@4c7fbc826260:~/.wine/drive_c/Program Files# ls
'Common Files'   FileOptimizer  'Internet Explorer'  'Windows Media Player'  'Windows NT'
devedse commented 3 years ago

I just downloaded the new compiled arm buildfolder.zip and extracted that in a new /root/hangover4 folder which I freshly cloned with subfolders. When I ran this against xcopy though I got a new error:

/root/hangover4/build/wine-host/loader/wine /root/hangover4/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover4/build/wine-guest32/programs/xcopy/xcopy.exe /?
wine client error:0: version mismatch 658/686.
Your wineserver binary was not upgraded correctly,
or you have an older one somewhere in your PATH.
Or maybe the wrong wineserver is still running?

I kindoff assumed I would be able to extract the build folder in a newly cloned hangover directory and it would work fine, but it feels like it isn't. Do you really need to do the compilation locally to get it working? Or should you be able to simply extract the compiled output to the build folder and have everything working?

Edit: Nvm, I resolved this by running: /root/hangover3/build/wine-host/server/wineserver -k

Edit2: I now got xcopy running :smile: using your latest compiled output :smile: : /root/hangover4/build/wine-host/loader/wine /root/hangover4/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /root/hangover4/build/wine-guest32/programs/xcopy/xcopy.exe /?

0050:err:explorer:initialize_display_settings Failed to query current display settings for L"\\\\.\\DISPLAY1".
0050:err:virtual:virtual_setup_exception stack overflow 2080 bytes in thread 0050 addr 0x7bc4c160 stack 0x1307e0 (0x130000-0x131000-0x230000)
0048:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0048:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0048:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
0048:err:ole:apartment_createwindowifneeded CreateWindow failed with error 0
0048:err:ole:apartment_createwindowifneeded CreateWindow failed with error 14007
0048:err:ole:StdMarshalImpl_MarshalInterface Failed to create ifstub, hr 0x800736b7
0048:err:ole:CoMarshalInterface Failed to marshal the interface {6d5140c1-7436-11ce-8034-00aa006009fa}, hr 0x800736b7
0048:err:ole:apartment_get_local_server_stream Failed: 0x800736b7
0048:err:virtual:virtual_setup_exception stack overflow 1648 bytes in thread 0048 addr 0x7bc4c160 stack 0x130990 (0x130000-0x131000-0x230000)
002c:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
002c:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0040:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0040:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0040:err:setupapi:SetupDefaultQueueCallbackW copy error 1812 L"@C:\\windows\\system32\\drivers\\wineusb.sys,-1" -> L"C:\\windows\\inf\\wineusb.inf"
008c:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
008c:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
00a4:err:virtual:virtual_setup_exception stack overflow 2368 bytes in thread 00a4 addr 0x7bc4c160 stack 0x5606c0 (0x560000-0x561000-0x660000)
007c:err:service:process_send_command service protocol error - failed to read pipe r = 0  count = 0!
002c:err:setupapi:SetupDiInstallDevice Failed to start service L"winebus" for device L"ROOT\\WINE\\WINEBUS", error 1053.
wine: configuration in L"/root/.wine" has been updated.
0024:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0024:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0024:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
0024:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
0024:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
0024:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
0024:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
0024:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
0024:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
0024:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
32 bit environment set up, Large Address Aware: NO.
0024:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
0024:fixme:qemu_msvcrt:qemu__get_initial_wide_environment Unverified!
XCOPY - Copies source files or directory trees to a destination.

Syntax:
XCOPY source [destination] [/I] [/S] [/Q] [/F] [/L] [/W] [/T] [/N] [/U]
             [/R] [/H] [/C] [/P] [/A] [/M] [/E] [/D] [/Y] [/-Y]

Where:

[/I]  Assume directory if destination does not exist and copying two or
        more files.
[/S]  Copy directories and subdirectories.
[/E]  Copy directories and subdirectories, including any empty ones.
[/Q]  Do not list names during copy; that is, be quiet.
[/F]  Show full source and destination names during copy.
[/L]  Simulate operation, showing names which would be copied.
[/W]  Prompts before beginning the copy operation.
[/T]  Creates empty directory structure but does not copy files.
[/Y]  Suppress prompting when overwriting files.
[/-Y] Enable prompting when overwriting files.
[/P]  Prompts on each source file before copying.
[/N]  Copy using short names.
[/U]  Copy only files which already exist in destination.
[/R]  Overwrite any read-only files.
[/H]  Include hidden and system files in the copy.
[/C]  Continue even if an error occurs during the copy.
[/A]  Only copy files with archive attribute set.
[/M]  Only copy files with archive attribute set, removes the
        archive attribute.
[/K]  Copy file attributes; without this, attributes are not preserved.
[/D | /D:m-d-y] Copy new files or those modified after the supplied date.
                If no date is supplied, only copy if destination is older
                than source.

I do hope we can figure out why FileOptimizerFull setup is not working for me, but it is for you.

Edit3: I was just looking further through the c_drive directory and did find a start menu folder for FileOptimizer: image Sadly still no 'Program Files' folder.

devedse commented 3 years ago

An update: The installer now works!

Apparently using the new build output in my /root/hangover4 folder I was able to successfully install FileOptimzer! :smile:, for me it doesn't matter then direct calls don't work since I'll be manually calling the other binaries myself.

I'll keep you guys up to date on the progress of the rest.

Edit: I just tried running some of the tools directly from the command line and it was a bit of a hit or miss. ECT.exe and 7z.exe didn't work due to dependencies missing it seems, whereas Leanify.exe seemed to work fine. Is there a way to get dependencies on msvcrt.dll resolved?


root@825383bd11ee:~/.wine/drive_c/Program Files/FileOptimizer/Plugins64# /root/hangover4/build/wine-host/loader/wine /root/hangover4/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so "/root/.wine/drive_c/Program Files/FileOptimizer/Plugins64/ECT.exe"
0150:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0150:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0150:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
0150:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
0150:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
0150:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
0150:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
0150:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
0150:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
0150:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
0150:err:qemu_module:find_forwarded_export Host module L"msvcrt.dll" not loaded.
0150:fixme:qemu_module:import_dll No implementation for msvcrt.dll.__pioinfo imported from L"C:\\Program Files\\FileOptimizer\\Plugins64\\ECT.exe", setting to 0x7f9480a6f5
0150:fixme:qemu_module:import_dll No implementation for msvcrt.dll._sopen imported from L"C:\\Program Files\\FileOptimizer\\Plugins64\\ECT.exe", setting to 0x7f9480a6f5
0150:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
0150:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
0150:fixme:qemu_kernel32:qemu_GetThreadPriority Unverified!
No compatible files found
root@825383bd11ee:~/.wine/drive_c/Program Files/FileOptimizer/Plugins64# /root/hangover4/build/wine-host/loader/wine /root/hangover4/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so "/root/.wine/drive_c/Program Files/FileOptimizer/Plugins64/7z.exe"
0160:err:winediag:nodrv_CreateWindow Application tried to create a window, but no driver could be loaded.
0160:err:winediag:nodrv_CreateWindow Make sure that your X server is running and that $DISPLAY is set correctly.
0160:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20A window.
0160:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20A.
0160:err:qemu_riched20:qemu_dll_register Failed to instantiate a RichEdit50A window.
0160:err:qemu_riched20:qemu_dll_register Failed to instantiate a RICHEDIT_CLASS20W window.
0160:err:qemu_riched20:qemu_dll_register Failed to set WNDPROC of RICHEDIT_CLASS20W.
0160:err:qemu_riched20:qemu_dll_register Failed to instantiate a MSFTEDIT_CLASS window.
0160:err:secur32:SECUR32_initSchannelSP TLS library not found, SSL connections will fail
0160:err:winediag:SECUR32_initNTLMSP ntlm_auth was not found or is outdated. Make sure that ntlm_auth >= 3.0.25 is in your path. Usually, you can find it in the winbind package of your distribution.
0160:fixme:qemu_module:import_dll No implementation for ucrtbase.dll.__stdio_common_vswprintf_s imported from L"C:\\windows\\system32\\OLEAUT32.dll", setting to 0x7fab1bb6f5
0160:fixme:qemu_module:import_dll No implementation for msvcrt.dll._c_exit imported from L"C:\\Program Files\\FileOptimizer\\Plugins64\\7z.exe", setting to 0x7fab1bb6f5
0160:err:qemu_module:find_forwarded_export Host module L"msvcrt.dll" not loaded.
0160:fixme:qemu_module:import_dll No implementation for msvcrt.dll._iob imported from L"C:\\Program Files\\FileOptimizer\\Plugins64\\7z.exe", setting to 0x7fab1bb6f5
0160:fixme:qemu_ntdll:qemu_RtlAddVectoredExceptionHandler Unverified!
0160:fixme:qemu_kernel32:qemu_SetConsoleCtrlHandler Only partial support.
0160:fixme:qemu_kernel32:qemu_SetFileApisToOEM Unverified!
0160:fixme:qemu_msvcrt:qemu_fputs Unverified!
0160:err:virtual:virtual_setup_exception stack overflow 2384 bytes in thread 0160 addr 0x7bc4c160 stack 0x1306b0 (0x130000-0x131000-0x230000)

I just tried running these in an x86 wine docker container too which worked fine:

image

stefand commented 3 years ago

I pushed a fix for the immediate 7z.exe problem. I can now unpack and compress files, but when I pass an incorrect command line parameter it crashes and gets stuck in an exception loop. I guess it throws a C++ exception that it handles internally and hangover's exception handling code has some problem with that.

I don't immediately see what problem ECT has. I can reproduce that it doesn't run right, but unlike 7z it isn't immediately obvious why.

devedse commented 3 years ago

Thanks for the 7z fix, hopefully the other one can also be solved.

Did you already have some time to look at my pull request for automated builds? https://github.com/AndreRH/hangover/pull/115

Btw, I did see that one of the builds is currently failing for you: https://github.com/AndreRH/hangover/actions/runs/675637516

AndreRH commented 3 years ago

The Wine hack to start qemu for x86 apps needs to be updated for the recent move of CreateProcess to ntdll.

That was done today: https://github.com/AndreRH/wine/tree/2d8f779203e42f8c2f842393da3062f6c9aeb8fe/programs/hangover

devedse commented 3 years ago

Thanks @AndreRH ,

As I mentioned in the IRC chat I'm running into some trouble creating a docker container without actually compiling the code. For some reason simply unzipping the latest build shows me errors while if I do the 6 hour compile again on my raspberry pi it works fine.

If you want, I created 2 containers and pushed them to docker hub, one where I just extracted the zipfile (:beforemake) and one where I executed the make command after (:aftermake): https://hub.docker.com/repository/docker/devedse/deveimageoptimizerconsoleapptest

devedse commented 3 years ago

Apparently with the latest build I managed to get it working for xcopy again :).

This is the dockerfile I'm using currently to create my own image:


#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS base
ARG TARGETPLATFORM
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        git clone --recurse-submodules -j8 https://github.com/devedse/hangover.git /root/hangover ; \
    fi
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
    wget -O /root/buildfolder_build_arm64.tar.gz --no-verbose https://github.com/devedse/hangover/releases/latest/download/buildfolder_build_arm64.tar.gz ; \
    tar -C /root/hangover -zxvf /root/buildfolder_build_arm64.tar.gz ; \
fi
RUN wget -O /root/FileOptimizerSetup.exe https://sourceforge.net/projects/nikkhokkho/files/latest/download

ENV NOTESTS 1
ENV PKG_CONFIG aarch64-linux-gnu-pkg-config
ENV CROSS_TRIPLE aarch64-linux-gnu
ENV HANGOVER_WINE_CC aarch64-linux-gnu-clang
ENV HANGOVER_WINE_CXX aarch64-linux-gnu-clang++
RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; then \
        echo hallo amd64 ; \
        dpkg --add-architecture i386 && apt-get update && apt-get install wine wget -y ; \
    elif [ "$TARGETPLATFORM" = "linux/arm64" ]; then \
        echo hallo arm64 ; \
        apt-get update && apt-get install -y \
            unzip wget python python3 bzip2 pkg-config xz-utils tar htop \
            binutils-aarch64-linux-gnu gcc-aarch64-linux-gnu \
        &&  apt clean \
        &&  rm -rf /var/lib/apt/lists/* ; \

        cat /etc/apt/sources.list | grep -v "^#"  | sed "s/^deb /deb [arch=amd64] /g" > /tmp/amd64.list && \
        cat /tmp/amd64.list | sed "s/\[arch=amd64\]/[arch=arm64]/g" > /tmp/arm64.list && \
        cat /tmp/amd64.list /tmp/arm64.list > /etc/apt/sources.list && \
        dpkg --add-architecture arm64 ; \

        cat /etc/apt/sources.list ; \

        apt-get update && apt-get install -y --no-install-recommends \
            ca-certificates \
            python \
            flex bison \
            libfreetype6-dev \
            libltdl-dev \
            libxcb1-dev \
            libx11-dev \
            librsvg2-bin \
            gcc-mingw-w64-x86-64 gcc-mingw-w64-i686 \
            automake autoconf pkg-config libtool \
            automake1.11 autoconf2.13 autoconf2.64 \
            gtk-doc-tools git gperf groff p7zip-full \
            gettext \
            make \
            clang \
            dpkg-dev \
            libglib2.0-dev:arm64 \
            libfreetype6-dev:arm64 \
            libltdl-dev:arm64 \
            libxcb1-dev:arm64 \
            libx11-dev:arm64 \
        &&  apt clean \
        &&  rm -rf /var/lib/apt/lists/* \
        &&  ln -s /usr/bin/autoconf /usr/bin/autoconf-2.69 \
        &&  ln -s /usr/bin/autoheader /usr/bin/autoheader-2.69 ; \

        ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-clang; ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-clang++ ; \
        #now this is quite hacky, but we use winegcc for qemu as compiler and it always defaults to gcc, whereas we need clang ; \
        rm -f /usr/bin/aarch64-linux-gnu-gcc /usr/bin/aarch64-linux-gnu-g++ ; \
        ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-gcc; ln -s /usr/bin/clang /usr/bin/aarch64-linux-gnu-g++ ; \
    elif [ "$TARGETPLATFORM" = "linux/arm/v7" ]; then \
        echo hallo armv7 ; \
    else \
        echo $TARGETPLATFORM ; \
    fi

Do you know if there's any steps I should be able to skip when creating an image with just the build output? (I think I wouldn't need the whole compiler stuff).

The thing is that if I simply continue with this image my whole apt-get shows some errors when I run things:

root@a1d6710fa154:~# apt-get update

Get:1 http://deb.debian.org/debian buster InRelease [121 kB]
Get:2 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
Get:3 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
Get:4 http://security.debian.org/debian-security buster/updates/main amd64 Packages [271 kB]
Get:5 http://security.debian.org/debian-security buster/updates/main arm64 Packages [266 kB]
Get:6 http://deb.debian.org/debian buster/main arm64 Packages [7736 kB]
Get:7 http://deb.debian.org/debian buster/main amd64 Packages [7907 kB]
Get:8 http://deb.debian.org/debian buster-updates/main arm64 Packages [9480 B]
Get:9 http://deb.debian.org/debian buster-updates/main amd64 Packages [9504 B]
Fetched 16.4 MB in 5s (3002 kB/s)
Reading package lists... Done
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:2 and /etc/apt/sources.list:5
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list:4
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:3 and /etc/apt/sources.list:6
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list:4
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:2 and /etc/apt/sources.list:5
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:3 and /etc/apt/sources.list:6

And installing nano for example:

root@a1d6710fa154:~# apt-get install nano

Reading package lists... Done
Building dependency tree
Reading state information... Done
Suggested packages:
  spell
The following NEW packages will be installed:
  nano
0 upgraded, 1 newly installed, 0 to remove and 8 not upgraded.
Need to get 541 kB of archives.
After this operation, 2290 kB of additional disk space will be used.
Get:1 http://deb.debian.org/debian buster/main arm64 nano arm64 3.2-3 [541 kB]
Fetched 541 kB in 0s (16.0 MB/s)
debconf: delaying package configuration, since apt-utils is not installed
Selecting previously unselected package nano.
(Reading database ... 41775 files and directories currently installed.)
Preparing to unpack .../archives/nano_3.2-3_arm64.deb ...
Unpacking nano (3.2-3) ...
Setting up nano (3.2-3) ...
update-alternatives: using /bin/nano to provide /usr/bin/editor (editor) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/editor.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group editor) doesn't exist
update-alternatives: using /bin/nano to provide /usr/bin/pico (pico) in auto mode
update-alternatives: warning: skip creation of /usr/share/man/man1/pico.1.gz because associated file /usr/share/man/man1/nano.1.gz (of link group pico) doesn't exist
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:1 and /etc/apt/sources.list:4
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:2 and /etc/apt/sources.list:5
W: Target Packages (main/binary-all/Packages) is configured multiple times in /etc/apt/sources.list:3 and /etc/apt/sources.list:6
devedse commented 3 years ago

I was now actually playing around with getting my C# application working. I did get everything running which is really great! But I still have one strange issue.

When I freshly start my docker container with hangover and directly run my C# application. It gets stuck while trying to run the first application using hangover.

If I run it again, the same thing happens.

However if I do the following call:

/root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so

And then execute my C# application, everything works fine.

I've made a screenshot of my problem: image

Edit: I've somewhat managed to workaround this by including the following code in my dockerfile (https://github.com/devedse/DeveImageOptimizer/blob/master/DeveImageOptimizer.ConsoleApp/Linux.Dockerfile#L116). It doesn't always work though:

# We call the sleep64.exe here, it doesn't actually seem to work but it loads in wine, which makes all subsequent calls faster :)
wget https://github.com/jackdp/sleep/releases/download/v1.0/sleep64.exe ; \
echo '#!/bin/bash\n\
nohup /root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so /app/sleep64.exe 49d &\n\
dotnet DeveImageOptimizer.ConsoleApp.dll' > /app/go.sh && chmod +x /app/go.sh ; \

Edit2: I did check if there's any wine processes running using htop. And it seems that if you manually execute some commands in the docker container you can manage to get them in a state where they remain alive. However if you just do this in the dockerfile then the processes seem to get killed.

This really needs some more investigation but I can't really figure out where to start.

devedse commented 3 years ago

I also ran my C# application where it actually logs the output of the internal applications as well: image

It seems to get stuck on the error that it can't find the file.

It seems that for some reason the path with the slashes gets converted to the wrong slashes somewhere in the jhead.exe application.

The strange thing is though that if I run the following command /root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so\ it still runs into this error but the program continues as expected.

devedse commented 3 years ago

I did also run a test where I compare the speed of running my x64 docker container where the complete container runs in emulation using https://github.com/dbhi/qus vs running my own C# application as an ARM build with hangover.

x64 docker container + QUS (Everything runs in emulation): image

ARM docker container + hangover (my own application which does a pixel by pixel comparison runs in native ARM, the rest runs in hangover emulation): image

What you can see here is that the image comparison step (happening in my own C# code which is compiled as ARM) happens in about 2 seconds rather then 46 in the x64 emulated version. What I do find strange though is that all the other tooling, which are exactly the same .exe files, actually run about twice as slow. So in the end the whole process took about the same time.

Could this maybe be explainable by me running the wine executable rather then the wine64 executable? If this is the case, currently the wine64 executable is missing from the build, is there a way to compile this with the ARM build?

devedse commented 3 years ago

I just spoke a little bit on this topic with stefand in IRC, however I also wanted to add my comment here.

The thing my C# application does is basically invoke 6 tools to optimize an image and then do a pixel by pixel comparison with the original to see if everything went fine.

The strange thing is though that if I let my C# application execute the JHEAD.exe command it gets stuck. Even if I restart my C# application. However if I manually call it, it works:

/root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so "/root/.wine/drive_c/Program Files/FileOptimizer/Plugins64/JHEAD.exe" -autorot -zt  "/app/TestImage.jpg"

So for some reason, when I execute this command from inside my C# application something breaks. Everytime I first call /root/hangover/build/wine-host/loader/wine /root/hangover/build/qemu/x86_64-windows-user/qemu-x86_64.exe.so before calling my C# application, my C# application works as well.

devedse commented 3 years ago

Docker image gets stuck if ran with -t rather then -it

I've managed to get quite far with actually building / running a docker image based on hangover now. I successfully managed to optimize some images. I'm running into another strange thing though:

If I create an AMD64 image based on normal wine (without hangover) and run my image optimizer, everything runs fine with the docker -t ... command: https://github.com/devedse/DeveImageOptimizer/runs/2356947349?check_suite_focus=true

The image I created with hangover running on ARM64 for my RaspberryPI does run fine on my raspberry pi with the docker -it ... command for docker. It does not work with only docker -t ... though.

I've added a build that shows this behavior: https://github.com/devedse/DeveImageOptimizer/runs/2356947209?check_suite_focus=true

I did try to run the docker container in github actions using -it but that doesn't seem to be allowed as you need a real terminal for that.

For some reason the build just hangs (I suppose waiting on terminal input) on the leanify.exe command. This doesn't happen on the normal AMD64 + wine container.

Summary of all my problems

So basically here's a summary of all my issues that aren't solved, hopefully @stefand or @AndreRH you can take a look at this sometime :) (no hurry but I would like to look into these at one point in time). Most of the details are described somewhere in this post:

  1. The strange issue where it seems you'd have to run some hangover command first in the container because if you don't do that the other commands ran from my C# application get stuck. I did update the comment with some more findings but I can't really figure out how to continue. https://github.com/AndreRH/hangover/issues/114#issuecomment-816303677
  2. Hangover seems to be quite a lot slower in my case then running the docker AMD64 image with emulation enabled. https://github.com/AndreRH/hangover/issues/114#issuecomment-816312197
  3. Hangover inside docker only runs correctly for all applications with -it rather then only -t. https://github.com/AndreRH/hangover/issues/114#issuecomment-823965595
  4. [SOLVED] I ran into some issues where internal tools (leanify.exe) wouldn't be able to find a file. I managed to solve this one by adding more quotes and slashes here and there. https://github.com/AndreRH/hangover/issues/114#issuecomment-816307680
  5. [Question] Currently when you use Hangover in the build of an image when using setup-qemu-action for ARM64 emulation it fails on a SegmentationFault. Apparently the current docker builds use QEMU 5.0.1 which isn't working for Hangover. If you don't specifically invoke Hangover in the docker build this is fine, but once you do invoke it you'd get the segmentation fault. See: https://github.com/docker/setup-qemu-action/issues/28
  6. I saw that a new release was made: https://github.com/AndreRH/hangover/releases It does however not include the build output like we discussed in the PullRequest. Let me know if you guys are still interested in me changing the build/PR in a way that suits your needs. https://github.com/AndreRH/hangover/pull/115
AndreRH commented 1 year ago

irrelevant with new Hangover approach