Release 0.3.0
Fri Sep 3 11:52:18 1993 Bob Amstadt
* [windows/timer.c]
Changed to use CallWindowProc() rather directly calling callback.
* [windows/event.c]
Implemented SetCapture() and ReleaseCapture()
* [windows/keyboard.c]
Created stub for GetKeyState()
* [objects/linedda.c]
Created stub for LineDDA()
* [if1632/callback.c]
Created callback handler for LineDDA callback procedure.
* [if1632/callback.c]
Created FreeProcInstance()
Fri Sep 3 08:36:52 1993 David Metcalfe
* [loader/signal.c]
Patch to and code for INT 1A
Thu Sep 2 00:31:54 1993 Alexandre Julliard
* [objects/font.c] [objects/text.c]
More text support: implemented justification and underlining.
* [windows/clipping.c] [objects/clipping.c]
Moved low-level clipping functions to objects/clipping.c.
* [windows/clipping.c] [windows/event.c] [windows/message.c]
Implemented window update regions.
* [windows/dc.c] [objects/dcvalues.c]
Moved some device-independent DC functions to objects/dcvalues.c.
* [windows/graphics.c]
Implemented InvertRect() and GetPixel().
Sat Aug 28 08:40:23 1993 Eric Youngdale
* [include/neexe.h] [loader/wine.c]
Added code to handle relocation type 4.
* [loader/signal.h] [loader/wine.c] [loader/selector.c]
Added support for dos interrupts.
Thu 26 Aug 19:15:00 1993 Eric Youngdale
* [loader/selector.c]
Fixed bug dealing with loading DLLs.
Thu Aug 26 19:22:40 1993 Alexandre Julliard
* [include/gdi.h] [objects/font.c] [windows/dc.c]
Beginning of real font support.
* [windows/graphics.c]
Implemented PatBlt().
* [memory/global.c]
Corrected a bug with linked list handling in GlobalAlloc().
* [objects/bitmap.c]
Corrected a bug in BITMAP_SelectObject().
Tue Aug 24 19:22:40 1993 David Metcalfe
* [controls/Command*] [controls/Label*] [controls[MenuButto*]
[controls/SmeMenuButt*]
Change code to support & as a special character in menu item text.
Tue Aug 24 19:22:40 1993 Alexandre Julliard
* [include/gdi.h] [windows/dc.c]
Heavily modified the DC structure for better device-independence.
* [objects/bitmap.c]
Implemented bitmap dimensions.
* [windows/dc.c] [windows/dce.c]
Implemented DC state saving and restoring.
* [windows/dc.c]
Implemented ROP mode.
* [windows/graphics.c]
Implemented FillRect().
Mon Aug 23 22:08:34 1993 Bob Amstadt (bob at pooh)
* [misc/xt.c]
Fixed bug in InvalidateRect(). Solitaire attempted to
clear window before it was realized.
* [loader/resource.c]
Began rewrite of LoadBitmap().
* [loader/wine.c]
Fixed code which set Argv and Argc global variables.
* [loader/selector.c]
Added code to set up command line arguments.
* [include/neexe.h]
Fixed error in PSP structure.
Tue Aug 17 20:41:12 1993 Alexandre Julliard
* [include/gdi.h] [windows/dc.c]
Implemented device capabilities.
* [objects/region.c]
Implemented EqualRgn() and CombineRgn().
* [windows/clipping.c]
Implemented Save/RestoreVisRgn().
* [windows/graphics.c]
Implemented PaintRgn() and FillRgn().
* [windows/mapping.c]
Implemented mapping modes.
Tue Aug 10 14:07:38 1993 Alexandre Julliard
* [if1632/user.spec] [misc/rect.c]
Implemented rectangle API functions.
* [if1632/gdi.spec] [include/gdi.h] [objects/region.c]
Implemented regions.
* [windows/class.c]
Corrected a typo in UnregisterClass().
* [windows/clipping.c] [windows/dc.c]
Implemented DC clipping and visible region.
Tue Aug 10 20:57:56 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c]
SetMenu(), GetMenu(), CheckMenuItem() implemented
Thu Aug 5 22:33:22 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c]
Many improvements menus. LoadMenu() should work.
Wed Aug 4 14:55:36 1993 Alexandre Julliard
* [objects/dib.c]
Started the implementation of device-independent bitmaps.
* [objects/bitmap.c]
Added support for multiple bitmap depths.
* [objects/brush.c]
Implemented pattern brushes.
* [windows/dc.c] [windows/graphics.c]
Implemented some GDI graphics primitives.
Tue Aug 3 21:16:47 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c] [include/menu.h]
Code to load class menus from executable file.
* [if1632/user.spec]
Fixed specification of SendMessage() and PostMessage.
Mon Jul 26 21:53:24 1993 Alexandre Julliard
* [if1632/call.S]
Corrected a bug in KERNEL_InitTask().
* [include/windows.h]
Added a lot of constants.
* [loader/selector.c]
Corrected a bug in segment allocation in CreateSelectors().
* [objects/bitmap.c]
Implemented SelectObject() for bitmaps.
* [objects/brush.c]
Implemented hatched brushes and SelectObject().
* [objects/gdiobj.c]
Removed linked list (not needed).
* [objects/palette.c]
Implemented system palette creation and misc. palette API functions.
* [windows/timer.c]
Implemented timers.
* [windows/dc.c]
Implemented memory device contexts.
Tue Jul 20 10:38:59 1993 Bob Amstadt (bob at pooh)
* [dos.c]
Split DOS3Call() out of kernel.c. Added support for get date
and time functions.
* [call.S]
Added function ReturnFromRegisterFunc() to allow DOS calls
to return values in registers.
* [regfunc.h]
Macros to access registers saved on stack.
Tue Jul 20 10:38:59 1993 Alexandre Julliard
* [win.c]
Corrected allocation of the WM_CREATE data structure.
* [dce.c] [dce.h]
Implemented DCE handling.
* [bitmap.c] [brush.c] [dc.c] [font.c] [gdi.h] [gdi.spec]
[gdiobj.c] [palette.c] [pen.c]
Implemented the GDI objects data structures and allocation.
* [windows.h]
Added several structures and constants for GDI objects.
Mon Jul 19 12:51:10 1993 Bob Amstadt (bob at pooh)
* [ldtlib.c]
Modified system calls to match Linus' new interface for
the LDT modification.
* [win.c]
Fixed bug with WM_CREATE message.
* [heap.c] [kernel.spec]
Completed local heap allocation functions.
* [global.c]
Created function GlobalQuickAlloc() for easy allocation from DLLs
diff --git a/loader/signal.c b/loader/signal.c
new file mode 100644
index 0000000..39f4080
--- /dev/null
+++ b/loader/signal.c
@@ -0,0 +1,216 @@
+#include <signal.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <time.h>
+
+#include <syscall.h>
+#include <signal.h>
+#include <errno.h>
+#include <linux/sched.h>
+#include <asm/system.h>
+
+extern void ___sig_restore();
+extern void ___masksig_restore();
+
+/* Similar to the sigaction function in libc, except it leaves alone the
+ restorer field */
+
+static int
+wine_sigaction(int sig,struct sigaction * new, struct sigaction * old)
+{
+ __asm__("int $0x80":"=a" (sig)
+ :"0" (SYS_sigaction),"b" (sig),"c" (new),"d" (old));
+ if (sig>=0)
+ return 0;
+ errno = -sig;
+ return -1;
+}
+
+char * cstack[4096];
+struct sigaction segv_act;
+
+struct sigcontext_struct {
+ unsigned short gs, __gsh;
+ unsigned short fs, __fsh;
+ unsigned short es, __esh;
+ unsigned short ds, __dsh;
+ unsigned long edi;
+ unsigned long esi;
+ unsigned long ebp;
+ unsigned long esp;
+ unsigned long ebx;
+ unsigned long edx;
+ unsigned long ecx;
+ unsigned long eax;
+ unsigned long trapno;
+ unsigned long err;
+ unsigned long eip;
+ unsigned short cs, __csh;
+ unsigned long eflags;
+ unsigned long esp_at_signal;
+ unsigned short ss, __ssh;
+ unsigned long i387;
+ unsigned long oldmask;
+ unsigned long cr2;
+};
+
+static void
+GetTimeDate(int time_flag, struct sigcontext_struct * context)
+{
+ struct tm *now;
+ time_t ltime;
+
+ ltime = time(NULL);
+ now = localtime(<ime);
+ if (time_flag)
+ {
+ context->ecx = (now->tm_hour << 8) | now->tm_min;
+ context->edx = now->tm_sec << 8;
+ }
+ else
+ {
+ context->ecx = now->tm_year + 1900;
+ context->edx = ((now->tm_mon + 1) << 8) | now->tm_mday;
+ context->eax &= 0xff00;
+ context->eax |= now->tm_wday;
+ }
+}
+
+/* We handle all int21 calls here. There is some duplicate code from
+ misc/dos.c that I am unsure how to deal with, since the locations
+ that we store the registers are all different */
+
+static int
+do_int21(struct sigcontext_struct * context){
+ fprintf(stderr,"Doing int21 %x ", (context->eax >> 8) & 0xff);
+ switch((context->eax >> 8) & 0xff){
+ case 0x30:
+ context->eax = 0x0303; /* Hey folks, this is DOS V3.3! */
+ context->ebx = 0;
+ context->ecx = 0;
+ break;
+
+ /* Ignore any attempt to set a segment vector */
+ case 0x25:
+ return 1;
+
+ case 0x35: /* Return a NULL segment selector - this will bomb
+ if anyone ever tries to use it */
+ context->es = 0;
+ context->ebx = 0;
+ break;
+
+ case 0x2a:
+ GetTimeDate(0, context);
+ /* Function does not return */
+
+ case 0x2c:
+ GetTimeDate(1, context);
+ /* Function does not return */
+
+ case 0x4c:
+ exit(context->eax & 0xff);
+
+
+ default:
+ fprintf(stderr,"Unable to handle int 0x21 %x\n", context->eax);
+ return 1;
+ };
+ return 1;
+}
+
+static int
+do_int1A(struct sigcontext_struct * context){
+ time_t ltime;
+ int ticks;
+
+ switch((context->eax >> 8) & 0xff){
+ case 0:
+ ltime = time(NULL);
+ ticks = (int) (ltime * HZ);
+ context->ecx = ticks >> 16;
+ context->edx = ticks & 0x0000FFFF;
+ context->eax = 0; /* No midnight rollover */
+ break;
+
+ default:
+ fprintf(stderr,"Unable to handle int 0x1A %x\n", context->eax);
+ return 1;
+ };
+ return 1;
+}
+
+static void win_segfault(int signal, struct sigcontext_struct context){
+ unsigned char * instr;
+ unsigned char intno;
+ unsigned int * dump;
+ int i;
+
+ /* First take care of a few preliminaries */
+ if(signal != SIGSEGV) exit(1);
+ if((context.cs & 7) != 7){
+ fprintf(stderr,
+ "Segmentation fault in Wine program (%x:%x)."
+ " Please debug\n",
+ context.cs, context.eip);
+ goto oops;
+ };
+
+ /* Now take a look at the actual instruction where the program
+ bombed */
+ instr = (char *) ((context.cs << 16) | (context.eip & 0xffff));
+
+ if(*instr != 0xcd) {
+ fprintf(stderr,
+ "Unexpected Windows program segfault"
+ " - opcode = %x\n", *instr);
+#if 0
+ return;
+#else
+ goto oops;
+#endif
+ };
+
+ instr++;
+ intno = *instr;
+ switch(intno){
+ case 0x21:
+ if(!do_int21(&context)) goto oops;
+ break;
+ case 0x1A:
+ if(!do_int1A(&context)) goto oops;
+ break;
+ default:
+ fprintf(stderr,"Unexpected Windows interrupt %x\n", intno);
+ goto oops;
+ };
+
+ /* OK, done handling the interrupt */
+
+ context.eip += 2; /* Bypass the int instruction */
+ return;
+
+ oops:
+ fprintf(stderr,"In win_segfault %x:%x\n", context.cs, context.eip);
+ fprintf(stderr,"Stack: %x:%x\n", context.ss, context.esp_at_signal);
+ dump = (int*) &context;
+ for(i=0; i<22; i++)
+ {
+ fprintf(stderr," %8.8x", *dump++);
+ if ((i % 8) == 7)
+ fprintf(stderr,"\n");
+ }
+ fprintf(stderr,"\n");
+ exit(1);
+}
+
+int
+init_wine_signals(){
+ segv_act.sa_handler = (__sighandler_t) win_segfault;
+ /* Point to the top of the stack, minus 4 just in case, and make
+ it aligned */
+ segv_act.sa_restorer =
+ (void (*)()) (((unsigned int)(cstack + sizeof(cstack) - 4)) & ~3);
+ wine_sigaction(SIGSEGV, &segv_act, NULL);
+}
+