Changeset 506


Ignore:
Timestamp:
Aug 16, 1999, 3:56:54 PM (26 years ago)
Author:
sandervl
Message:

* empty log message *

Location:
trunk
Files:
2 added
7 edited

Legend:

Unmodified
Added
Removed
  • trunk/changelog

    r505 r506  
    1  /* $Id: changelog,v 1.85 1999-08-16 10:32:47 phaller Exp $ */
     1 /* $Id: changelog,v 1.86 1999-08-16 13:56:54 sandervl Exp $ */
     2 99-08-16: Sander van Leeuwen <sandervl@xs4all.nl>
     3        - PE loader: Started with rewrite
    24
    35 99-08-16: Patrick Haller <phaller@gmx.net>
     
    57
    68 99-08-16: Christoph Bratschi <cbratschi@datacomm.ch>
    7         - USER32: uitools.cpp update
     9        - USER32: uitools.cpp update
    810
    911 99-08-15: Christoph Bratschi <cbratschi@datacomm.ch>
     
    1416
    1517 99-08-14: Sander van Leeuwen <sandervl@xs4all.nl>
    16         - INCLUDE\win\windows.h: Include odin.h if __WIN32OS2__ is defined
     18        - INCLUDE\win\windows.h: Include odin.h if __WIN32OS2__ is defined
    1719
    1820 99-08-13: Sander van Leeuwen <sandervl@xs4all.nl>
    19         - KERNEL32: Export heap functions by ordinal
    20         - src\makefile: compile lz32 before version (dependency)
     21        - KERNEL32: Export heap functions by ordinal
     22        - src\makefile: compile lz32 before version (dependency)
    2123
    2224 99-08-12: Patrick Haller <phaller@gmx.net>
    23         - VERSION: enhanced plus odinwrap macros
     25        - VERSION: enhanced plus odinwrap macros
    2426
    2527 99-08-11: Patrick Haller <phaller@gmx.net>
    26         - ODINCRT: ordinal exports
    27         - ADVAPI32:odinwrap macros (partially)
     28        - ODINCRT: ordinal exports
     29        - ADVAPI32:odinwrap macros (partially)
    2830        - LZ32:    odinwrap macros
    2931
    3032 99-08-10: Sander van Leeuwen <sandervl@xs4all.nl>
    31         - USER32/NEW: Fixed makefile (link with odincrt)
     33        - USER32/NEW: Fixed makefile (link with odincrt)
    3234
    3335 99-08-10: Patrick Haller <phaller@gmx.net>
    34         - LZ32: added preliminary support for independend LZ32 library
     36        - LZ32: added preliminary support for independend LZ32 library
    3537
    3638 99-08-09: Patrick Haller <phaller@gmx.net>, Achim Hasenmueller <achimha@innotek.de>, Markus Montkowski
    37         - ODINCRT: providing a extensible wrapping layer for VAC++ runtime functions
    38                    change is non-intrusive for existing source.
     39        - ODINCRT: providing a extensible wrapping layer for VAC++ runtime functions
     40                   change is non-intrusive for existing source.
    3941
    4042 99-08-06: Patrick Haller <phaller@gmx.net>
    41         - USER32:    added stubs so NT4's WINFILE can load
    42         - SHELL32:   added stubs so NT4's WINFILE can load
    43         - NTDLL:     added stubs so NT4's WINFILE can load
     43        - USER32:    added stubs so NT4's WINFILE can load
     44        - SHELL32:   added stubs so NT4's WINFILE can load
     45        - NTDLL:     added stubs so NT4's WINFILE can load
    4446
    4547 99-08-05: Patrick Haller <phaller@gmx.net>
    46         - KERNEL32:  interactive control over UnhandledExceptionFilter
     48        - KERNEL32:  interactive control over UnhandledExceptionFilter
    4749        - KERNEL32:  FormatMessageAW fixed. Do not mix ODIN's heap functions with VAC heap functions
    48         - KERNEL32:  added WINE-style string functions in Heapstring.cpp
    49         - SHELL3232: RestartDialog @59 stub added. IE2 can load now with NT4's URL.DLL.
     50        - KERNEL32:  added WINE-style string functions in Heapstring.cpp
     51        - SHELL3232: RestartDialog @59 stub added. IE2 can load now with NT4's URL.DLL.
    5052
    5153 99-08-05: Sander van Leeuwen <sandervl@xs4all.nl>
    52         - KERNEL32:  Bitmap conversion bugfix; always recalculate bitmap size
    53                      (bitmap in donut.exe (ddraw sample) contains wrong size)
     54        - KERNEL32:  Bitmap conversion bugfix; always recalculate bitmap size
     55                     (bitmap in donut.exe (ddraw sample) contains wrong size)
    5456
    5557 99-08-04: Patrick Haller <phaller@gmx.net>
    56         - KERNEL32:  fix for filename handling in kernel32/profile
    57         - KERNEL32:  fix for PROFILE_CopyEntry in kernel32/profile
     58        - KERNEL32:  fix for filename handling in kernel32/profile
     59        - KERNEL32:  fix for PROFILE_CopyEntry in kernel32/profile
    5860
    5961 99-08-04: Sander van Leeuwen <sandervl@xs4all.nl>
    60         - PE2LX: Bugfix for icon conversion (heap corruption for ra95.exe; as
     62        - PE2LX: Bugfix for icon conversion (heap corruption for ra95.exe; as
    6163                 reported by Patrick Haller)
    62 
     64 
    6365 99-08-04: Patrick Haller <phaller@gmx.net>
    64         - KERNEL32: Heap modification
    65         - KERNEL32: Windows 3 style profile support ported from WINE (removes Open32)
     66        - KERNEL32: Heap modification
     67        - KERNEL32: Windows 3 style profile support ported from WINE (removes Open32)
    6668
    6769 99-08-03: Rene Pronk <R.Pronk@twi.tudelft.nl>
    68         - USER32: Ported DrawTextExA/W & DrawStateA/W
     70        - USER32: Ported DrawTextExA/W & DrawStateA/W
    6971
    7072 99-07-27: Przemysˆaw Dobrowolski <dobrawka@asua.org.pl>
    71         - KERNEL32: Implemented GetComputerNameA/W
     73        - KERNEL32: Implemented GetComputerNameA/W
    7274
    7375 99-07-25: Sander van Leeuwen <sandervl@xs4all.nl>
    74         - USER32/NEW: Lots of changes; Solitaire displays cards correctly
    75                       Status bar correctly drawn
    76                       Mouse msg translation still wrong.
    77                       Paint not correct.
     76        - USER32/NEW: Lots of changes; Solitaire displays cards correctly
     77                      Status bar correctly drawn
     78                      Mouse msg translation still wrong.
     79                      Paint not correct.
    7880
    7981 99-07-25: Sander van Leeuwen <sandervl@xs4all.nl>
    80         - KERNEL32: GetLocateInfoA bugfix
    81         - USER32/NEW: Lots of changes; now Solitaire starts, but draws cards incorrectly
     82        - KERNEL32: GetLocateInfoA bugfix
     83        - USER32/NEW: Lots of changes; now Solitaire starts, but draws cards incorrectly
    8284
    8385 99-07-23: Yuri Dario <mc6530@mclink.it>
    84         - misc: Changes for compilation with VAC 3.6.5
     86        - misc: Changes for compilation with VAC 3.6.5
    8587
    8688 99-07-23: Edgar Buerkle <100566.557@compuserve.com>
    87         - VERSION:  VerQueryValueA/W Wine implementation ported
     89        - VERSION:  VerQueryValueA/W Wine implementation ported
    8890
    8991 99-07-22: Przemysˆaw Dobrowolski <dobrawka@asua.org.pl>
    90         - KERNEL32: Complete implementation of GetLocaleInfoA/W
     92        - KERNEL32: Complete implementation of GetLocaleInfoA/W
    9193
    9294 99-07-22: Edgar Buerkle <100566.557@compuserve.com>
    93         - KERNEL32: Fix for OS2GetResource (os2util.cpp)
    94         - PE2LX: Use unique resource id for version resource.
    95         - USER32: MapOEMToRealKey fix
     95        - KERNEL32: Fix for OS2GetResource (os2util.cpp)
     96        - PE2LX: Use unique resource id for version resource.
     97        - USER32: MapOEMToRealKey fix
    9698
    9799 99-07-22: Sander van Leeuwen <sandervl@xs4all.nl>
    98         - DDRAW: Now compiles
    99         - COMCTL32: Create library with correct api names
     100        - DDRAW: Now compiles
     101        - COMCTL32: Create library with correct api names
    100102
    101103 99-07-21: Edgar Buerkle <100566.557@compuserve.com>
    102         - KERNEL32: Fix for LoadResource; should return pointer to resource data
     104        - KERNEL32: Fix for LoadResource; should return pointer to resource data
    103105                    LockResource just returns the pointer returned by LoadResource
    104106
    105107 99-07-20: Sander van Leeuwen <sandervl@xs4all.nl>
    106         - USER32/NEW: Added support for window icons and accelerators.
    107                       Accelerators don't work yet.
    108         - PE2LX: Save icons in different format (BITMAPINFOHEADER2)
     108        - USER32/NEW: Added support for window icons and accelerators.
     109                      Accelerators don't work yet.
     110        - PE2LX: Save icons in different format (BITMAPINFOHEADER2)           
    109111
    110112 99-07-19: Sander van Leeuwen <sandervl@xs4all.nl>
    111         - KERNEL32: Added method for retrieving converted OS/2 resource
     113        - KERNEL32: Added method for retrieving converted OS/2 resource
    112114                    (which will be changed later on)
    113         - USER32/NEW: CreateWindowEx now works and menus are displayed
     115        - USER32/NEW: CreateWindowEx now works and menus are displayed
    114116
    115117 99-07-17: Sander van Leeuwen <sandervl@xs4all.nl>
    116118        - KERNEL32: Exports for getting TEB & THDB added
    117 
     119       
    118120 99-07-15: Sander van Leeuwen <sandervl@xs4all.nl>
    119121        - USER32/NEW: Unicode & window handle translation bugfixes
     
    124126
    125127 99-07-13: Sander van Leeuwen <sandervl@xs4all.nl>
    126         - USER32/NEW: *VERY* preliminary/alpha code for Open32 replacement in user32
     128        - USER32/NEW: *VERY* preliminary/alpha code for Open32 replacement in user32
    127129                      Compiles, but not tested at all.
    128130
     
    131133
    132134 99-07-10: Edgar Buerkle <100566.557@compuserve.com>
    133         - USER32: Fixes for CreateWindowExW and several unicode menu apis
     135        - USER32: Fixes for CreateWindowExW and several unicode menu apis
    134136
    135137 99-07-07: Sander van Leeuwen <sandervl@xs4all.nl>
    136         - KERNEL32/PE2LX: Added support for TLS sections
    137         - KERNEL32: Added thread attach/detach messages for dlls
    138                     Fixed some bugs, cleaned up code
    139           NOTE: THIS CHANGE BREAKS ALL PREVIOUSLY CONVERTED APPLICATIONS
    140                 RECOMPILE ALL DLLS AND CONVERT EVERYTHING AGAIN!!!!!!!!!
    141                 THIS CHANGE ALSO BREAKS WIN32K!
     138        - KERNEL32/PE2LX: Added support for TLS sections
     139        - KERNEL32: Added thread attach/detach messages for dlls
     140                    Fixed some bugs, cleaned up code
     141          NOTE: THIS CHANGE BREAKS ALL PREVIOUSLY CONVERTED APPLICATIONS
     142                RECOMPILE ALL DLLS AND CONVERT EVERYTHING AGAIN!!!!!!!!!
     143                THIS CHANGE ALSO BREAKS WIN32K!
    142144
    143145 99-07-06: Patrick Haller <phaller@gmx.net>
    144         - KERNEL32: major enhancement of handlemanager
     146        - KERNEL32: major enhancement of handlemanager
    145147
    146148 99-07-06: Edgar Buerkle <100566.557@compuserve.com>
    147         - PE2LX: Finished support for codepages
     149        - PE2LX: Finished support for codepages
    148150
    149151 99-07-05: Patrick Haller <phaller@gmx.net>
  • trunk/include/winexe.h

    r10 r506  
    1 /* $Id: winexe.h,v 1.2 1999-05-27 15:17:59 phaller Exp $ */
     1/* $Id: winexe.h,v 1.3 1999-08-16 13:55:27 sandervl Exp $ */
    22
    33/*
     
    1919
    2020typedef ULONG (* WIN32API WIN32EXEENTRY)();
     21
     22class Win32Exe;
     23typedef Win32Exe *(* WIN32API WIN32CTOR)(char *);
    2124
    2225class Win32Exe : public Win32Image
  • trunk/src/kernel32/KERNEL32.DEF

    r493 r506  
    1 ; $Id: KERNEL32.DEF,v 1.19 1999-08-13 18:38:19 sandervl Exp $
     1; $Id: KERNEL32.DEF,v 1.20 1999-08-16 13:54:32 sandervl Exp $
    22
    33;Created by BLAST for IBM's compiler
     
    980980   GetThreadTHDB        = _GetThreadTHDB@0                         @1235
    981981
     982   CreateWin32Exe       = _CreateWin32Exe@4                        @1236
     983
    982984; HEAP Management (heap.cpp, heapstring.cpp)
    983985    HEAP_xalloc                = _HEAP_xalloc@12                   @1240
  • trunk/src/kernel32/winexe.cpp

    r281 r506  
    1 /* $Id: winexe.cpp,v 1.8 1999-07-07 08:11:10 sandervl Exp $ */
     1/* $Id: winexe.cpp,v 1.9 1999-08-16 13:54:32 sandervl Exp $ */
    22
    33/*
     
    3434Win32Exe *WinExe = NULL;
    3535
     36//******************************************************************************
     37//Called by ring 3 pe loader to create win32 executable
     38//******************************************************************************
     39Win32Exe* WIN32API CreateWin32Exe(char *szFileName)
     40{
     41  return new Win32Exe(szFileName);
     42}
    3643//******************************************************************************
    3744//******************************************************************************
  • trunk/src/peldr/makefile

    r458 r506  
    1 # $Id: makefile,v 1.4 1999-08-09 21:03:19 phaller Exp $
     1# $Id: makefile,v 1.5 1999-08-16 13:54:06 sandervl Exp $
    22
    33#
     
    1717CFLAGS = $(CFLAGS) -Ge+ /Gd-  -I$(PDWIN32_INCLUDE)
    1818CXXFLAGS = $(CXXFLAGS) -Ge+ /Gd- -I$(PDWIN32_INCLUDE)
    19 LDFLAGS = $(LDFLAGS) -Ge+ /B"/pmtype:pm /stack:0x30000 /NOBASE /Map" \
    20           ..\..\lib\kernel32.lib os2386.lib ..\..\lib\odincrt.lib cppom30.lib
     19LDFLAGSEXE = $(LDFLAGS) -Ge+ /B"/pmtype:pm /stack:0x30000 /NOBASE /Map" \
     20             $(PDWIN32_LIB)\peldr.lib os2386.lib $(PDWIN32_LIB)\odincrt.lib cppom30.lib
    2121
    2222TARGET = pe
     23TARGETDLL = peldr
    2324
    2425OBJS =  pe.obj
     26OBJSDLL =  initterm.obj
    2527
    26 all: $(TARGET).exe
     28all: $(TARGETDLL).dll $(TARGETDLL).lib $(TARGET).exe
    2729
    2830
    2931$(TARGET).exe: $(OBJS)
    30         $(LD) $(LDFLAGS) -Fe$@ $(OBJS)
     32        $(LD) $(LDFLAGSEXE) -Fe$@ $(OBJS)
    3133        $(CP) $(TARGET).exe $(PDWIN32_BIN)
    3234
     35$(TARGETDLL).dll: $(OBJSDLL) $(TARGETDLL).def
     36        $(LD) $(LDFLAGS) -Fe$@ $(OBJSDLL) sbsstub.obj $(TARGETDLL).def OS2386.LIB CPPOM30.LIB
     37        $(CP) $@ $(PDWIN32_BIN)
     38
     39$(TARGETDLL).lib: $(TARGETDLL).dll
     40        $(IMPLIB) $(IMPLIBFLAGS) $@ $(TARGETDLL).dll
     41        $(CP) $@ $(PDWIN32_LIB)
    3342
    3443
     44initterm.obj: initterm.cpp
    3545misc.obj: misc.cpp
    3646pe.obj: pe.cpp pe.h $(PDWIN32_INCLUDE)\winimage.h $(PDWIN32_INCLUDE)\winexe.h
     
    3949        $(RM) *.obj *.lib *.dll *~ *.map *.pch *.exe
    4050        $(RM) $(PDWIN32_BIN)\$(TARGET).exe
     51        $(RM) $(PDWIN32_BIN)\$(TARGETDLL).dll
     52        $(RM) $(PDWIN32_LIB)\$(TARGETDLL).lib
  • trunk/src/peldr/pe.cpp

    r131 r506  
    1 /* $Id: pe.cpp,v 1.4 1999-06-20 14:02:13 sandervl Exp $ */
     1/* $Id: pe.cpp,v 1.5 1999-08-16 13:54:07 sandervl Exp $ */
    22
    3 /*
    4  *
    5  * Project Odin Software License can be found in LICENSE.TXT
    6  *
    7  */
    83/*
    94 * PELDR main exe loader code
    105 *
    116 * Copyright 1998 Sander van Leeuwen (sandervl@xs4all.nl)
     7 *
     8 *
     9 * Project Odin Software License can be found in LICENSE.TXT
    1210 *
    1311 */
     
    1614#define INCL_DOSPROCESS          /* DOS Process values       */
    1715#define INCL_DOSMISC             /* DOS Miscellanous values  */
     16#define INCL_DOSMODULEMGR
    1817#define INCL_WIN
    19 #include <os2wrap.h>    //Odin32 OS/2 api wrappers
     18#include <os2.h>
     19#include <bseord.h>
    2020#include <stdio.h>
    2121#include <string.h>
     
    2828#include <windll.h>
    2929#include <wprocess.h>
     30#include "pe.h"
    3031
    3132char INFO_BANNER[]      = "Usage: PE winexe commandline";
     
    4041char fullpath[CCHMAXPATH];
    4142
    42 void UpCase(char *mixedcase);
     43typedef HAB  (* APIENTRY WININITIALIZEPROC)(ULONG flOptions);
     44typedef BOOL (* APIENTRY WINTERMINATEPROC)(HAB hab);
     45typedef HMQ  (* APIENTRY WINCREATEMSGQUEUEPROC) (HAB hab, LONG cmsg);
     46typedef BOOL (* APIENTRY WINDESTROYMSGQUEUEPROC) (HMQ hmq);
     47typedef ULONG (* APIENTRY WINMESSAGEBOXPROC) (HWND hwndParent,
     48                                              HWND hwndOwner,
     49                                              PCSZ  pszText,
     50                                              PCSZ  pszCaption,
     51                                              ULONG idWindow,
     52                                              ULONG flStyle);
     53
     54WININITIALIZEPROC      MyWinInitialize      = 0;
     55WINTERMINATEPROC       MyWinTerminate       = 0;
     56WINCREATEMSGQUEUEPROC  MyWinCreateMsgQueue  = 0;
     57WINDESTROYMSGQUEUEPROC MyWinDestroyMsgQueue = 0;
     58WINMESSAGEBOXPROC      MyWinMessageBox      = 0;
     59
     60WIN32CTOR              CreateWin32Exe       = 0;
    4361
    4462int main(int argc, char *argv[])
     
    5169 PTIB   ptib;
    5270 Win32Exe *WinExe;
    53  APIRET rc;
     71 APIRET  rc;
     72 HMODULE hmodPMWin, hmodKernel32;
    5473
    55   if ((hab = WinInitialize(0)) == 0L) /* Initialize PM     */
    56         return(1);
     74  printf("memory allocated at %X\n", ReserveMem());
    5775
    58   hmq = WinCreateMsgQueue(hab, 0);
     76  rc = DosLoadModule(exeName, sizeof(exeName), "PMWIN.DLL", &hmodPMWin);
     77  rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32INITIALIZE, NULL, (PFN *)&MyWinInitialize);
     78  rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32TERMINATE, NULL, (PFN *)&MyWinTerminate);
     79  rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32CREATEMSGQUEUE, NULL, (PFN *)&MyWinCreateMsgQueue);
     80  rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32DESTROYMSGQUEUE, NULL, (PFN *)&MyWinDestroyMsgQueue);
     81  rc = DosQueryProcAddr(hmodPMWin, ORD_WIN32MESSAGEBOX, NULL, (PFN *)&MyWinMessageBox);
    5982
     83  rc = DosLoadModule(exeName, sizeof(exeName), "KERNEL32.DLL", &hmodKernel32);
     84  rc = DosQueryProcAddr(hmodKernel32, 0, "CreateWin32Exe", (PFN *)&CreateWin32Exe);
     85
     86  if ((hab = MyWinInitialize(0)) == 0L) /* Initialize PM     */
     87        return(1);
     88
     89  hmq = MyWinCreateMsgQueue(hab, 0);
     90 
    6091  if(argc < 2) {
    61         WinMessageBox(HWND_DESKTOP, NULL, INFO_BANNER, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
    62         return(0);
     92        MyWinMessageBox(HWND_DESKTOP, NULL, INFO_BANNER, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
     93        return(0);
    6394  }
    6495
    6596  strcpy(exeName, argv[1]);
    66   UpCase(exeName);
     97  strupr(exeName);
    6798  if(strstr(exeName, ".EXE") == NULL) {
    6899        strcat(exeName, ".EXE");
    69100  }
    70   WinExe = new Win32Exe(exeName);
     101  WinExe = CreateWin32Exe(exeName);
    71102  if(WinExe == NULL) {
    72         WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szMemErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
     103        MyWinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szMemErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
    73104        return(1);
    74105  }
    75106  rc = DosGetInfoBlocks(&ptib, &ppib);
    76107  if(rc) {
    77         WinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szInteralErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
     108        MyWinMessageBox(HWND_DESKTOP, HWND_DESKTOP, szInteralErrorMsg, szErrorTitle, 0, MB_OK | MB_ERROR | MB_MOVEABLE);
    78109        delete WinExe;
    79110        return(1);
     
    107138  delete WinExe;
    108139
    109   if(hmq) WinDestroyMsgQueue( hmq );             /* Tidy up...                   */
    110   WinTerminate( hab );                   /* Terminate the application    */
     140  if(hmq) MyWinDestroyMsgQueue( hmq );             /* Tidy up...                   */
     141  MyWinTerminate( hab );                   /* Terminate the application    */
     142
     143  DosFreeModule(hmodPMWin);
     144  DosFreeModule(hmodKernel32);
    111145  return(0);
    112146}
    113147//******************************************************************************
    114148//******************************************************************************
    115 void UpCase(char *mixedcase)
    116 {
    117  int i;
    118 
    119   for(i=0;i<strlen(mixedcase);i++) {
    120         if(mixedcase[i] >= 'a' && mixedcase[i] <= 'z') {
    121                 mixedcase[i] += 'A' - 'a';
    122         }
    123   }
    124 }
    125 //******************************************************************************
    126 //******************************************************************************
  • trunk/src/peldr/pe.h

    r96 r506  
    1 /* $Id: pe.h,v 1.3 1999-06-10 16:56:36 phaller Exp $ */
     1/* $Id: pe.h,v 1.4 1999-08-16 13:54:07 sandervl Exp $ */
    22
    33/*
     
    2323extern char szInteralErrorMsg[];
    2424
    25 #define DWORD  ULONG
    26 #define LPVOID VOID *
    27 #define WORD   USHORT
    28 #define UNALIGNED
    29 #define PDWORD DWORD *
    30 #define PWORD  WORD *
    31 #define NTAPI
    32 #define BOOLEAN ULONG
    33 #define WCHAR   USHORT
    34 #define HANDLE  ULONG
    35 
    36 #define WIN32API __stdcall
     25ULONG SYSTEM ReserveMem();
    3726
    3827#endif // NOIMAGE
Note: See TracChangeset for help on using the changeset viewer.