Dosbox

Software potřebné k práci s elektronikou

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#256 Příspěvek od asdf »

Takze server bezi. Tak prosim jeste v wine-10.0/server/request.c upravit funkci call_req_handler takhle:

Kód: Vybrat vše

/* call a request handler */
static void call_req_handler( struct thread *thread )
{
    union generic_reply reply;
    enum request req = thread->req.request_header.req;
fprintf(stderr, "pokus server request call_req_handler 1: %d\n", (int) req);

    current = thread;
    current->reply_size = 0;
    clear_error();
    memset( &reply, 0, sizeof(reply) );

    if (debug_level) trace_request();

    if (req < REQ_NB_REQUESTS)
        req_handlers[req]( &current->req, &reply );
    else
        set_error( STATUS_NOT_IMPLEMENTED );

    if (current)
    {
        if (current->reply_fd)
        {
            reply.reply_header.error = current->error;
            reply.reply_header.reply_size = current->reply_size;
            if (debug_level) trace_reply( req, &reply );
            send_reply( &reply );
        }
        else
        {
            current->exit_code = 1;
            kill_thread( current, 1 );  /* no way to continue without reply fd */
        }
    }
    current = NULL;
}
Ze abysme videli, co si klient a server posilaji.
A zase spustit make, smazat ~/.wine a spustit: ./wine cmd
Uživatelský avatar
Mahoney
Příspěvky: 759
Registrován: 26 říj 2019, 00:00

#257 Příspěvek od Mahoney »

@RayeR: Vývojáři Windows mají ještě horší pinožení, akorát se to nedostává na světlo světa. Navíc to nemají otevřené a nemají komunitu, takže to není auditovatelné a člověk nikdy neví co je patch a co workaround, natož aby si to sám opravil (nebo s někým).

Navíc to bylo jednu dobu i tak, že vyšel patch na chybu a další dvě až tři způsobil.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#258 Příspěvek od lesana87 »

Těch volání jsou tři půlky. Dovolila jsem si tam přidat do preloaderu výpis, co se preloaduje. Zajímavé je, že se spouštějí dva explorer.exe paralelně. A pak to udělá dvě + dvě dělení nulou.
Naposledy upravil(a) lesana87 dne 24 led 2026, 17:57, celkem upraveno 1 x.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#259 Příspěvek od asdf »

Ja blb jsem si tam dal logovani jen na zacatku a ted nevim, jestli se to vraci, nebo spadne. Tak prosim v tom wine-10.0/server/request.c pridat logy:

Kód: Vybrat vše

/* call a request handler */
static void call_req_handler( struct thread *thread )
{
    union generic_reply reply;
    enum request req = thread->req.request_header.req;
fprintf(stderr, "pokus server request call_req_handler 1: %d\n", (int) req);

    current = thread;
    current->reply_size = 0;
    clear_error();
    memset( &reply, 0, sizeof(reply) );

    if (debug_level) trace_request();

fprintf(stderr, "pokus server request call_req_handler 2\n");
    if (req < REQ_NB_REQUESTS)
        req_handlers[req]( &current->req, &reply );
    else
        set_error( STATUS_NOT_IMPLEMENTED );
fprintf(stderr, "pokus server request call_req_handler 3\n");

    if (current)
    {
        if (current->reply_fd)
        {
            reply.reply_header.error = current->error;
            reply.reply_header.reply_size = current->reply_size;
            if (debug_level) trace_reply( req, &reply );
            send_reply( &reply );
        }
        else
        {
            current->exit_code = 1;
            kill_thread( current, 1 );  /* no way to continue without reply fd */
        }
    }
    current = NULL;
fprintf(stderr, "pokus server request call_req_handler 4\n");
}
A do wine-10.0/server/event.c pridat takhle:

Kód: Vybrat vše

/* create an event */
DECL_HANDLER(create_event)
{
    struct event *event;
    struct unicode_str name;
    struct object *root;
    const struct security_descriptor *sd;
    const struct object_attributes *objattr = get_req_object_attributes( &sd, &name, &root );

fprintf(stderr, "pokus server event handler:create_event 1\n");
    if (!objattr) return;

fprintf(stderr, "pokus server event handler:create_event 2\n");
    if ((event = create_event( root, &name, objattr->attributes,
                               req->manual_reset, req->initial_state, sd )))
    {
fprintf(stderr, "pokus server event handler:create_event 3\n");
        if (get_error() == STATUS_OBJECT_NAME_EXISTS)
            reply->handle = alloc_handle( current->process, event, req->access, objattr->attributes );
        else
            reply->handle = alloc_handle_no_access_check( current->process, event,
                                                          req->access, objattr->attributes );
        release_object( event );
    }
fprintf(stderr, "pokus server event handler:create_event 4\n");

    if (root) release_object( root );
fprintf(stderr, "pokus server event handler:create_event 5\n");
}
Akorat tech vypisu ted bude 12 pulek. :)
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#260 Příspěvek od lesana87 »

To jsem zvědavá, co z toho vykoukáš, já tam nic nevidím. :oops:
Naposledy upravil(a) lesana87 dne 24 led 2026, 21:58, celkem upraveno 1 x.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#261 Příspěvek od asdf »

Ále, vidím v tom, že se to normálně vrací, takže to asi nepadá v serveru, ale v nějakým klientu. Asi v tom exploreru, jak jsi říkala.
Uživatelský avatar
Celeron
Příspěvky: 20512
Registrován: 02 dub 2011, 00:00
Bydliště: Nový Bydžov

#262 Příspěvek od Celeron »

Dosboxisti, je nějakej způsob, jak z dosovskýho účetního programu, kterej má svý drivery na HP LJ4 poslat z Dosboxu tisk na tiskárnu USB? Mám tady dosovskej Penden od Letochy a dosud jsem tisknul přes LPT1 na Minoltě co měla Centronic. Jenže ta nenávratně dodělala a jak známo, novější tiskárny Centronic nemají a vetšina PC už taky nemá LPT1.
Zkoušel jsem v configu Dosboxu všecko možný, třeba přidat:
[parallel]
parallel1=file
parallel1=disabled
parallel1=disabled
parallel1=disabled

[printer]
printer=true
printeroutput=FILE
aby to tisklo do souboru ale nedařba. Nějaká jiná možnost než někde splašit něco s Centronixem? PC s LPT je zatím živý.
Díky!
Jirka

Proč mi nemůže všechno chodit hned ?!!
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#263 Příspěvek od asdf »

Zkusil bych oznacit nektera mista, odkud se ten server vola, tj. pred NtCreateEvent.

Prosim pridat do wine-10.0/dlls/ntdll/unix/registry.c:

Kód: Vybrat vše

/******************************************************************************
 *              NtNotifyChangeMultipleKeys  (NTDLL.@)
 */
NTSTATUS WINAPI NtNotifyChangeMultipleKeys( HANDLE key, ULONG count, OBJECT_ATTRIBUTES *attr,
                                            HANDLE event, PIO_APC_ROUTINE apc, void *apc_context,
                                            IO_STATUS_BLOCK *io, ULONG filter, BOOLEAN subtree,
                                            void *buffer, ULONG length, BOOLEAN async )
{
    unsigned int ret;

    TRACE( "(%p,%u,%p,%p,%p,%p,%p,0x%08x, 0x%08x,%p,0x%08x,0x%08x)\n",
           key, (int)count, attr, event, apc, apc_context, io,
           (int)filter, async, buffer, (int)length, subtree );

    if (count || attr || apc || apc_context || buffer || length)
        FIXME( "Unimplemented optional parameter\n" );

    if (!async)
    {
        OBJECT_ATTRIBUTES attr;
        InitializeObjectAttributes( &attr, NULL, 0, NULL, NULL );
fprintf(stderr, "pokus create_event ntdll registry\n");
        ret = NtCreateEvent( &event, EVENT_ALL_ACCESS, &attr, SynchronizationEvent, FALSE );
        if (ret) return ret;
    }

    SERVER_START_REQ( set_registry_notification )
    {
        req->hkey    = wine_server_obj_handle( key );
        req->event   = wine_server_obj_handle( event );
        req->subtree = subtree;
        req->filter  = filter;
        ret = wine_server_call( req );
    }
    SERVER_END_REQ;

    if (!async)
    {
        if (ret == STATUS_PENDING) ret = NtWaitForSingleObject( event, FALSE, NULL );
        NtClose( event );
    }
    return ret;
}
Pak do wine-10.0/dlls/ntdll/unix/env.c:

Kód: Vybrat vše

/***********************************************************************
 *           run_wineboot
 */
static void run_wineboot( WCHAR *env, SIZE_T size )
{
    static const WCHAR eventW[] = {'\\','K','e','r','n','e','l','O','b','j','e','c','t','s',
        '\\','_','_','w','i','n','e','b','o','o','t','_','e','v','e','n','t',0};
    static const WCHAR appnameW[] = {'\\','?','?','\\','C',':','\\','w','i','n','d','o','w','s',
        '\\','s','y','s','t','e','m','3','2','\\','w','i','n','e','b','o','o','t','.','e','x','e',0};
    static const WCHAR cmdlineW[] = {'"','C',':','\\','w','i','n','d','o','w','s','\\',
        's','y','s','t','e','m','3','2','\\','w','i','n','e','b','o','o','t','.','e','x','e','"',
        ' ','-','-','i','n','i','t',0};
    RTL_USER_PROCESS_PARAMETERS params = { sizeof(params), sizeof(params) };
    PS_ATTRIBUTE_LIST ps_attr;
    PS_CREATE_INFO create_info;
    HANDLE process, thread, handles[2];
    UNICODE_STRING nameW;
    OBJECT_ATTRIBUTES attr;
    LARGE_INTEGER timeout;
    unsigned int status;
    int count = 1;

    init_unicode_string( &nameW, eventW );
    InitializeObjectAttributes( &attr, &nameW, OBJ_OPENIF, 0, NULL );
fprintf(stderr, "pokus create_event ntdll env\n");
    status = NtCreateEvent( &handles[0], EVENT_ALL_ACCESS, &attr, NotificationEvent, 0 );
    if (status == STATUS_OBJECT_NAME_EXISTS) goto wait;
    if (status)
    {
        ERR( "failed to create wineboot event, expect trouble\n" );
        return;
    }

    env[size] = 0;
    params.Flags           = PROCESS_PARAMS_FLAG_NORMALIZED;
    params.Environment     = env;
    params.EnvironmentSize = size;
    init_unicode_string( &params.CurrentDirectory.DosPath, system_dir + 4 );
    init_unicode_string( &params.ImagePathName, appnameW + 4 );
    init_unicode_string( &params.CommandLine, cmdlineW );
    init_unicode_string( &params.WindowTitle, appnameW + 4 );
    init_unicode_string( &nameW, appnameW );

    ps_attr.TotalLength = sizeof(ps_attr);
    ps_attr.Attributes[0].Attribute    = PS_ATTRIBUTE_IMAGE_NAME;
    ps_attr.Attributes[0].Size         = sizeof(appnameW) - sizeof(WCHAR);
    ps_attr.Attributes[0].ValuePtr     = (WCHAR *)appnameW;
    ps_attr.Attributes[0].ReturnLength = NULL;

    wine_server_fd_to_handle( 2, GENERIC_WRITE | SYNCHRONIZE, OBJ_INHERIT, &params.hStdError );

    if (NtCurrentTeb64() && !NtCurrentTeb64()->TlsSlots[WOW64_TLS_FILESYSREDIR])
    {
        NtCurrentTeb64()->TlsSlots[WOW64_TLS_FILESYSREDIR] = TRUE;
        status = NtCreateUserProcess( &process, &thread, PROCESS_ALL_ACCESS, THREAD_ALL_ACCESS,
                                      NULL, NULL, 0, THREAD_CREATE_FLAGS_CREATE_SUSPENDED, &params,
                                      &create_info, &ps_attr );
        NtCurrentTeb64()->TlsSlots[WOW64_TLS_FILESYSREDIR] = FALSE;
    }
    else
        status = NtCreateUserProcess( &process, &thread, PROCESS_ALL_ACCESS, THREAD_ALL_ACCESS,
                                      NULL, NULL, 0, THREAD_CREATE_FLAGS_CREATE_SUSPENDED, &params,
                                      &create_info, &ps_attr );
    NtClose( params.hStdError );

    if (status)
    {
        ERR( "failed to start wineboot %x\n", status );
        NtClose( handles[0] );
        return;
    }
    NtResumeThread( thread, NULL );
    NtClose( thread );
    handles[count++] = process;

wait:
    timeout.QuadPart = (ULONGLONG)5 * 60 * 1000 * -10000;
    if (NtWaitForMultipleObjects( count, handles, TRUE, FALSE, &timeout ) == WAIT_TIMEOUT)
        ERR( "boot event wait timed out\n" );
    while (count) NtClose( handles[--count] );
}
A do wine-10.0/dlls/ntdll/unix/sync.c:

Kód: Vybrat vše

static union tid_alert_entry *get_tid_alert_entry( HANDLE tid )
{
    unsigned int block_idx, idx = handle_to_index( tid, &block_idx );
    union tid_alert_entry *entry;

    if (block_idx > ARRAY_SIZE(tid_alert_blocks))
    {
        FIXME( "tid %p is too high\n", tid );
        return NULL;
    }

    if (!tid_alert_blocks[block_idx])
    {
        static const size_t size = TID_ALERT_BLOCK_SIZE * sizeof(union tid_alert_entry);
        void *ptr = anon_mmap_alloc( size, PROT_READ | PROT_WRITE );
        if (ptr == MAP_FAILED) return NULL;
        if (InterlockedCompareExchangePointer( (void **)&tid_alert_blocks[block_idx], ptr, NULL ))
            munmap( ptr, size ); /* someone beat us to it */
    }

    entry = &tid_alert_blocks[block_idx][idx % TID_ALERT_BLOCK_SIZE];

#ifdef USE_FUTEX
    return entry;
#elif defined(HAVE_KQUEUE)
    if (!entry->kq)
    {
        int kq = kqueue();
        static const struct kevent init_event =
        {
            .ident = 1,
            .filter = EVFILT_USER,
            .flags = EV_ADD | EV_CLEAR,
            .fflags = 0,
            .data = 0,
            .udata = NULL
        };

        if (kq == -1)
        {
            ERR( "kqueue failed with error: %d (%s)\n", errno, strerror( errno ) );
            return NULL;
        }

        if (kevent( kq, &init_event, 1, NULL, 0, NULL) == -1)
        {
            ERR( "kevent creation failed with error: %d (%s)\n", errno, strerror( errno ) );
            close( kq );
            return NULL;
        }

        if (InterlockedCompareExchange( (LONG *)&entry->kq, kq, 0 ))
            close( kq );
    }
#else
    if (!entry->event)
    {
        HANDLE event;

fprintf(stderr, "pokus create_event ntdll sync\n");
        if (NtCreateEvent( &event, EVENT_ALL_ACCESS, NULL, SynchronizationEvent, FALSE ))
            return NULL;
        if (InterlockedCompareExchangePointer( &entry->event, event, NULL ))
            NtClose( event );
    }
#endif

    return entry;
}
A jeste do wine-10.0/programs/wineboot/wineboot.c radka 1902:

Kód: Vybrat vše

    /* create event to be inherited by services.exe */
    InitializeObjectAttributes( &attr, &nameW, OBJ_OPENIF | OBJ_INHERIT, 0, NULL );
fprintf(stderr, "pokus create_event wineboot wineboot\n");
    NtCreateEvent( &event, EVENT_ALL_ACCESS, &attr, NotificationEvent, 0 );

    ResetEvent( event );  /* in case this is a restart */

    create_user_shared_data();
    create_hardware_registry_keys();
    create_dynamic_registry_keys();
    create_computer_name_keys();
    wininit();
    pendingRename();
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#264 Příspěvek od lesana87 »

8O
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#265 Příspěvek od asdf »

Ono se to volá ještě z pár jiných míst, ale tam mi nefungovalo to fprintf. Uvidíme, jestli se chytí.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#266 Příspěvek od lesana87 »

Tu je kára.
Naposledy upravil(a) lesana87 dne 25 led 2026, 16:26, celkem upraveno 1 x.
Uživatelský avatar
Mahoney
Příspěvky: 759
Registrován: 26 říj 2019, 00:00

#267 Příspěvek od Mahoney »

A napadlo vás podívat se na Wine bugzillu, jestli na to není patch?
https://bugs.winehq.org/
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#268 Příspěvek od asdf »

Lesana: Ten to ryje. Tak se nechytl. Budu ještě zkoumat.
Mahoney: Tak jsem tam trochu koukl, ale nic nenašel.
Uživatelský avatar
lesana87
Příspěvky: 4397
Registrován: 20 zář 2014, 00:00

#269 Příspěvek od lesana87 »

Projela jsem ten seznam celej a nic podobnýho jsem tam nenašla.
Uživatelský avatar
asdf
Příspěvky: 707
Registrován: 06 říj 2022, 00:00
Kontaktovat uživatele:

#270 Příspěvek od asdf »

Tak u me se to vola z wine-10.0/dlls/kernelbase/sync.c. Prosim tam pridat log na radku 579:

Kód: Vybrat vše

/***********************************************************************
 *           CreateEventExW    (kernelbase.@)
 */
HANDLE WINAPI DECLSPEC_HOTPATCH CreateEventExW( SECURITY_ATTRIBUTES *sa, LPCWSTR name,
                                                DWORD flags, DWORD access )
{
    HANDLE ret = 0;
    UNICODE_STRING nameW;
    OBJECT_ATTRIBUTES attr;
    NTSTATUS status;

    /* one buggy program needs this
     * ("Van Dale Groot woordenboek der Nederlandse taal")
     */
    __TRY
    {
        get_create_object_attributes( &attr, &nameW, sa, name );
    }
    __EXCEPT_PAGE_FAULT
    {
        SetLastError( ERROR_INVALID_PARAMETER);
        return 0;
    }
    __ENDTRY

MESSAGE("pokus create_event kernelbase sync\n");
    status = NtCreateEvent( &ret, access, &attr,
                            (flags & CREATE_EVENT_MANUAL_RESET) ? NotificationEvent : SynchronizationEvent,
                            (flags & CREATE_EVENT_INITIAL_SET) != 0 );
    if (status == STATUS_OBJECT_NAME_EXISTS)
        SetLastError( ERROR_ALREADY_EXISTS );
    else
        SetLastError( RtlNtStatusToDosError(status) );
    return ret;
}
A pak zase prosim make, smazat ~/.wine a ./wine cmd.
Odpovědět

Zpět na „Software“