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( ¶ms.CurrentDirectory.DosPath, system_dir + 4 );
init_unicode_string( ¶ms.ImagePathName, appnameW + 4 );
init_unicode_string( ¶ms.CommandLine, cmdlineW );
init_unicode_string( ¶ms.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, ¶ms.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, ¶ms,
&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, ¶ms,
&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();