Slackware 11: After Wine update applications crash if WINEDEBUG not set

Victor ErV2005 at rambler.ru
Sun Jun 24 14:12:53 CDT 2007


On Saturday 23 June 2007 09:06, Victor wrote:
> After upgrading wine (from 0.9.37 to 0.9.38 or from 0.9.38 to 0.9.39 - I'm
> not sure) many graphical applications started crashing if WINEDEBUG+=all or
> WINEDEBUG+=relay not set.
I was able to find where crash occurs, but didn't yet find why this happens.
I've used one of my own ddraw test applications (written for windows) that 
produces same result - crashes if WINEDEBUG+=relay is not set, and works if 
it is set. Source code is at the end of message. (If someone need it, I can 
send a windows executable since it is 3584 bytes big.)
For Wine - 0.9.39:
When initializing DirectDraw by using DirectDrawCreateEx, DDRAW_Create calls 
LoadLibraryA with argument "wined3d". Crash occurs during LoadLibraryA call, 
not in wined3d, but in ntdll/loader.c, in get_modref() function, at 
the "return cached_modref = CONTAINING_RECORD(mod, WINE_MODREF, ldr);" line.
It looks like (somewhere between LoadLibraryA and get_modref()) there is  a 
problem with a "if (TRACE_ON())", but I'm not sure if this so, and where 
should I look for this problem. And I still don't know why it worked before 
and suddenly stopped working.  Any suggestions about location of this bug?

With best regards, Victor Eremin.

--Test application source code (C++)--
#include <windows.h>
#include <ddraw.h>
#include <GFSrel.h>
//#include <_smallapp.h>

#define WNDCLASSNAME TEXT("DDrawDraft")
#define WNDCAPTION TEXT("DDraw draft application")
#define HRC(hr, msg) if (FAILED(hr)){MessageBox(0, TEXT("Error!"), 
TEXT("Error!")/*TEXT(msg)*/, MB_ICONERROR|MB_OK); 
OutputDebugString(TEXT(msg)); return;}

static bool g_bRunning = true;
LPDIRECTDRAW7 g_lpDDraw = 0;
LPDIRECTDRAWSURFACE7 g_lpPrimary = 0;


LRESULT WINAPI WndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam){
	switch(Msg){
		case (WM_DESTROY):{
			g_bRunning = false;
			PostQuitMessage(0);
			return 0;
		}
        default:
            return DefWindowProc(hWnd, Msg, wParam, lParam);
	}
}

//int WINAPI WinMain(HINSTANCE hInst, HINSTANCE, LPSTR, int){
//void WinMainCRTStartup(void){
void entry_point(void){
	HINSTANCE hInst = GetModuleHandle(0);
    WNDCLASS wc = {
        CS_VREDRAW|CS_HREDRAW,
        WndProc, 0, 0,
        hInst,
        LoadIcon(0, IDI_APPLICATION),
        LoadCursor(0, IDC_ARROW),
        0,//(HBRUSH)GetStockObject(LTGRAY_BRUSH),
        0,
        WNDCLASSNAME
    };

    RegisterClass(&wc);

    HWND hWnd = 
    CreateWindow(
                                WNDCLASSNAME,
                                WNDCAPTION, 
                                WS_POPUP,//OVERLAPPEDWINDOW,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                CW_USEDEFAULT,
                                0, 0, hInst, 0
                                );
    UpdateWindow(hWnd);
    ShowWindow(hWnd, SW_SHOW);

	HRESULT hr = DirectDrawCreateEx(0, (LPVOID*)&g_lpDDraw, IID_IDirectDraw7, 0);
	HRC(hr, "DirectDrawCreateEx");
	hr = g_lpDDraw->SetCooperativeLevel(hWnd, DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN);
	HRC(hr, "SetCooperativeLevel");

	hr = g_lpDDraw->SetDisplayMode(640, 480, 8, 0, 0);
	HRC(hr, "SetDisplayMode");

	DDSURFACEDESC2 surf_desc;
	//ZeroMemory((LPVOID*)&surf_desc, sizeof(surf_desc));
	fill_char((void*)&surf_desc, 0, sizeof(surf_desc));
	surf_desc.dwSize = sizeof(surf_desc);
	surf_desc.dwFlags = DDSD_CAPS|DDSD_BACKBUFFERCOUNT;
	surf_desc.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|
DDSCAPS_COMPLEX;
	surf_desc.dwBackBufferCount = 1;
	hr = g_lpDDraw->CreateSurface(&surf_desc, &g_lpPrimary, 0);
	HRC(hr, "CreatePrimary");

	MSG msg;
    while (g_bRunning){
        if (PeekMessage(&msg, hWnd, 0, 0, PM_REMOVE)){
            TranslateMessage(&msg);
            DispatchMessage(&msg);
        }
        else{
            //idle						  
		}
    }

  	if (g_lpDDraw){
		g_lpDDraw->RestoreDisplayMode();
	}
	SREL(g_lpPrimary);
	SREL(g_lpDDraw);
	UnregisterClass(WNDCLASSNAME, hInst);

    //return 0;
}



More information about the wine-devel mailing list