--- dlls/ntdll/directory.c | 9 ++++++-- dlls/ntdll/signal_i386.c | 30 +++++++++++++++++++++++++++++ libs/wine/ldt.c | 48 +++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 85 insertions(+), 2 deletions(-) --- a/dlls/ntdll/directory.c +++ b/dlls/ntdll/directory.c @@ -3207,14 +3207,18 @@ static NTSTATUS read_changes_apc( void *user, PIO_STATUS_BLOCK iosb, NTSTATUS status, void **apc ) { struct read_changes_info *info = user; - char data[PATH_MAX]; + char *data; + data_size_t data_size = 4096; NTSTATUS ret; int size; SERVER_START_REQ( read_change ) { req->handle = wine_server_obj_handle( info->FileHandle ); - wine_server_set_reply( req, data, PATH_MAX ); + data = RtlAllocateHeap( GetProcessHeap(), 0, data_size + 1 ); + if (!data) return STATUS_NO_MEMORY; + + wine_server_set_reply( req, data, data_size ); ret = wine_server_call( req ); size = wine_server_reply_size( reply ); } @@ -3271,6 +3275,7 @@ size = 0; } + RtlFreeHeap( GetProcessHeap(), 0, data ); iosb->u.Status = ret; iosb->Information = size; *apc = read_changes_user_apc; --- a/libs/wine/ldt.c +++ b/libs/wine/ldt.c @@ -80,6 +80,11 @@ #endif /* linux */ +#ifdef __GNU__ +#include +#include +#endif /* GNU */ + #if defined(__svr4__) || defined(_SCO_DS) #include #ifndef __sun__ @@ -203,6 +208,49 @@ #elif defined(__APPLE__) if ((ret = i386_set_ldt(index, (union ldt_entry *)entry, 1)) < 0) perror("i386_set_ldt"); +#elif defined(__GNU__) + { + /* +mach/i386/mach_i386.defs: +type descriptor_t = struct[2] of int; +type descriptor_list_t = array[*] of descriptor_t; + +include/winnt.h: +typedef struct _LDT_ENTRY { + WORD LimitLow; + WORD BaseLow; + union { + struct { + BYTE BaseMid; + BYTE Flags1; + BYTE Flags2; + BYTE BaseHi; + } Bytes; + struct { + unsigned BaseMid: 8; + unsigned Type : 5; + unsigned Dpl : 2; + unsigned Pres : 1; + unsigned LimitHi : 4; + unsigned Sys : 1; + unsigned Reserved_0 : 1; + unsigned Default_Big : 1; + unsigned Granularity : 1; + unsigned BaseHi : 8; + } Bits; + } HighWord; +} LDT_ENTRY, *PLDT_ENTRY; + + */ + LDT_ENTRY entry_copy = *entry; + ret = i386_set_ldt(mach_thread_self(), sel, (descriptor_list_t)&entry_copy, 1); + if (ret != KERN_SUCCESS) + { + perror("i386_set_ldt"); + fprintf( stderr, "i386_set_ldt failed\n" ); + exit(1); + } + } #else fprintf( stderr, "No LDT support on this platform\n" ); exit(1); --- a/dlls/ntdll/signal_i386.c +++ b/dlls/ntdll/signal_i386.c @@ -235,6 +235,36 @@ #define FPU_sig(context) NULL /* FIXME */ #define FPUX_sig(context) NULL /* FIXME */ +#elif defined (__GNU__) + +#include + +typedef ucontext_t SIGCONTEXT; + +#define EAX_sig(context) ((context)->uc_mcontext.gregs[REG_EAX]) +#define EBX_sig(context) ((context)->uc_mcontext.gregs[REG_EBX]) +#define ECX_sig(context) ((context)->uc_mcontext.gregs[REG_ECX]) +#define EDX_sig(context) ((context)->uc_mcontext.gregs[REG_EDX]) +#define ESI_sig(context) ((context)->uc_mcontext.gregs[REG_ESI]) +#define EDI_sig(context) ((context)->uc_mcontext.gregs[REG_EDI]) +#define EBP_sig(context) ((context)->uc_mcontext.gregs[REG_EBP]) +#define ESP_sig(context) ((context)->uc_mcontext.gregs[REG_ESP]) + +#define CS_sig(context) ((context)->uc_mcontext.gregs[REG_CS]) +#define DS_sig(context) ((context)->uc_mcontext.gregs[REG_DS]) +#define ES_sig(context) ((context)->uc_mcontext.gregs[REG_ES]) +#define SS_sig(context) ((context)->uc_mcontext.gregs[REG_SS]) +#define FS_sig(context) ((context)->uc_mcontext.gregs[REG_FS]) +#define GS_sig(context) ((context)->uc_mcontext.gregs[REG_GS]) + +#define EFL_sig(context) ((context)->uc_mcontext.gregs[REG_EFL]) +#define EIP_sig(context) ((context)->uc_mcontext.gregs[REG_EIP]) +#define TRAP_sig(context) ((context)->uc_mcontext.gregs[REG_TRAPNO]) +#define ERROR_sig(context) ((context)->uc_mcontext.gregs[REG_ERR]) + +#define FPU_sig(context) ((FLOATING_SAVE_AREA*)(&(context)->uc_mcontext.fpregs.fp_reg_set.fpchip_state)) +#define FPUX_sig(context) NULL + #elif defined (__OpenBSD__) typedef struct sigcontext SIGCONTEXT;