Release 960818

Sun Aug 18 12:17:54 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [files/drive.c]
	Added 'Filesystem' option in drives configuration.

	* [files/dos_fs.c] 
	Added handling of case-insensitive filesystems.

	* [memory/selector.c] [include/stackframe.h]
	Removed MAKE_SEGPTR.

	* [misc/commdlg.c] [multimedia/mcistring.c]
	Replaced MAKE_SEGPTR by the SEGPTR_* macros.

	* [objects/bitblt.c] [windows/graphics.c]
	Use an intermediary pixmap to avoid some BadMatch errors on
	XGetImage().

Sun Aug 18 09:21:27 1996  Albrecht Kleine  <kleine@ak.sax.de>

	* [windows/message.c]
	Added handling of WM_NC...mouse messages in JOURNALRECORD hook.

	* [misc/ver.c]
	Fixed a bad string result in VerQueryValue[16|32A|32W].

Fri Aug 16 19:55:04 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [if1632/crtdll.spec] [misc/crtdll.c]
	More additions to get win95 programs further down the road.

	* [if1632/kernel.spec] [loader/module.c]
	GetModuleName() added.
	LoadModule(): params->showCmd can be NULL.

	* [if1632/kernel32.spec] [if1632/thunk.c]
	ThunkConnect32() stub added.

	* [loader/resource.c]
	Entries include lastentry.

	* [misc/shell.c] [files/file.c]
	Made progman work again.

Fri Aug 16 09:00:00 1996  Alex Korobka <alex@phm30.pharm.sunysb.edu>
	
	* [windows/defwnd.c] [windows/winpos.c] [windows/painting.c]
	Icon painting fixes.

	* [windows/winpos.c] [windows/painting.c]
	Enforce and follow hrgnUpdate more closely to cut down on
	redundant RedrawWindow() calls.

	* [windows/event.c]
	Process ConfigureNotify only for managed windows.

	* [windows/winpos.c]
	Do not redraw parent if the window was hidden before SetWindowPos().

	* [windows/nonclient.c]
	Omit some nonclient decoration painting for managed windows.

	* [controls/menu.c] [windows/mdi.c] [windows/nonclient.c]
	Implemented WM_NEXTMENU.

	* [controls/listbox.c]
	Multicolumn listboxes return WVR_VREDRAW on WM_NCCALCSIZE.

	* [misc/shell.c]
	Added .ICO file handling to ExtractIcon().
diff --git a/misc/commdlg.c b/misc/commdlg.c
index bc1a62e..43ca13d 100644
--- a/misc/commdlg.c
+++ b/misc/commdlg.c
@@ -9,7 +9,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include "win.h"
-#include "user.h"
+#include "heap.h"
 #include "message.h"
 #include "commdlg.h"
 #include "dlgs.h"
@@ -17,7 +17,6 @@
 #include "resource.h"
 #include "dos_fs.h"
 #include "drive.h"
-#include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
 
@@ -165,15 +164,22 @@
  */
 static BOOL FILEDLG_ScanDir(HWND hWnd, LPSTR newPath)
 {
-  char str[512],str2[512];
+    BOOL32 ret = FALSE;
+    int len;
+    char *str = SEGPTR_ALLOC(512);
+    if (!str) return TRUE;
 
-  strncpy(str,newPath,511); str[511]=0;
-  GetDlgItemText32A( hWnd, edt1, str2, sizeof(str2) );
-  strncat(str,str2,511-strlen(str)); str[511]=0;
-  if (!DlgDirList(hWnd, MAKE_SEGPTR(str), lst1, 0, 0x0000)) return FALSE;
-  strcpy( str, "*.*" );
-  DlgDirList(hWnd, MAKE_SEGPTR(str), lst2, stc1, 0x8010);
-  return TRUE;
+    lstrcpyn32A( str, newPath, 512 );
+    len = strlen(str);
+    GetDlgItemText32A( hWnd, edt1, str + len, 512 - len );
+    if (DlgDirList(hWnd, SEGPTR_GET(str), lst1, 0, 0x0000))
+    {
+        strcpy( str, "*.*" );
+        DlgDirList(hWnd, SEGPTR_GET(str), lst2, stc1, 0x8010 );
+        ret = TRUE;
+    }
+    SEGPTR_FREE(str);
+    return ret;
 }
 
 /***********************************************************************
@@ -209,19 +215,20 @@
 static LONG FILEDLG_WMDrawItem(HWND hWnd, WPARAM wParam, LPARAM lParam,int savedlg)
 {
     LPDRAWITEMSTRUCT16 lpdis = (LPDRAWITEMSTRUCT16)PTR_SEG_TO_LIN(lParam);
-    char str[512];
+    char *str;
     HBRUSH hBrush;
     HBITMAP hBitmap, hPrevBitmap;
     BITMAP16 bm;
     HDC hMemDC;
 
-    str[0]=0;
-    if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1) {
+    if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst1)
+    {
+        if (!(str = SEGPTR_ALLOC(512))) return FALSE;
 	hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
 	SelectObject(lpdis->hDC, hBrush);
 	FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
 	SendMessage16(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, 
-                      (LPARAM)MAKE_SEGPTR(str));
+                      (LPARAM)SEGPTR_GET(str));
 
 	if (savedlg)       /* use _gray_ text in FileSaveDlg */
 	  if (!lpdis->itemState)
@@ -235,15 +242,18 @@
 	if (lpdis->itemState != 0) {
 	    InvertRect16(lpdis->hDC, &lpdis->rcItem);
 	}
+        SEGPTR_FREE(str);
 	return TRUE;
     }
     
-    if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2) {
+    if (lpdis->CtlType == ODT_LISTBOX && lpdis->CtlID == lst2)
+    {
+        if (!(str = SEGPTR_ALLOC(512))) return FALSE;
 	hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
 	SelectObject(lpdis->hDC, hBrush);
 	FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
 	SendMessage16(lpdis->hwndItem, LB_GETTEXT, lpdis->itemID, 
-                      (LPARAM)MAKE_SEGPTR(str));
+                      (LPARAM)SEGPTR_GET(str));
 
 	hBitmap = hFolder;
 	GetObject16( hBitmap, sizeof(bm), &bm );
@@ -255,17 +265,18 @@
 	       bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 	SelectObject(hMemDC, hPrevBitmap);
 	DeleteDC(hMemDC);
-	if (lpdis->itemState != 0) {
-	    InvertRect16(lpdis->hDC, &lpdis->rcItem);
-	}
+	if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
+        SEGPTR_FREE(str);
 	return TRUE;
     }
-    if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2) {
+    if (lpdis->CtlType == ODT_COMBOBOX && lpdis->CtlID == cmb2)
+    {
+        if (!(str = SEGPTR_ALLOC(512))) return FALSE;
 	hBrush = SelectObject(lpdis->hDC, GetStockObject(LTGRAY_BRUSH));
 	SelectObject(lpdis->hDC, hBrush);
 	FillRect16(lpdis->hDC, &lpdis->rcItem, hBrush);
 	SendMessage16(lpdis->hwndItem, CB_GETLBTEXT, lpdis->itemID, 
-                      (LPARAM)MAKE_SEGPTR(str));
+                      (LPARAM)SEGPTR_GET(str));
         switch(DRIVE_GetType( str[2] - 'a' ))
         {
         case TYPE_FLOPPY:  hBitmap = hFloppy; break;
@@ -283,9 +294,8 @@
 	       bm.bmWidth, bm.bmHeight, hMemDC, 0, 0, SRCCOPY);
 	SelectObject(hMemDC, hPrevBitmap);
 	DeleteDC(hMemDC);
-	if (lpdis->itemState != 0) {
-	    InvertRect16(lpdis->hDC, &lpdis->rcItem);
-	}
+	if (lpdis->itemState != 0) InvertRect16(lpdis->hDC, &lpdis->rcItem);
+        SEGPTR_FREE(str);
 	return TRUE;
     }
     return FALSE;
@@ -323,8 +333,7 @@
 
 static LONG FILEDLG_WMInitDialog(HWND hWnd, WPARAM wParam, LPARAM lParam) 
 {
-  int n;
-  int i;
+  int i, n;
   LPOPENFILENAME lpofn;
   char tmpstr[512];
   LPSTR pstr;
@@ -335,33 +344,35 @@
   if (lpofn->lpstrCustomFilter)
     {
       pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrCustomFilter);
+      n = 0;
       dprintf_commdlg(stddeb,"lpstrCustomFilter = %p\n", pstr);
       while(*pstr)
 	{
-	  n = strlen(pstr);
-	  strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
-	  dprintf_commdlg(stddeb,"lpstrCustomFilter // add tmpstr='%s' ", tmpstr);
-          i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
-	  pstr += n + 1;
-	  n = strlen(pstr);
+	  dprintf_commdlg(stddeb,"lpstrCustomFilter // add str='%s' ",pstr);
+          i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+                                   (LPARAM)lpofn->lpstrCustomFilter + n );
+          n += strlen(pstr) + 1;
+	  pstr += strlen(pstr) + 1;
 	  dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
           SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
-	  pstr += n + 1;
+          n += strlen(pstr) + 1;
+	  pstr += strlen(pstr) + 1;
 	}
     }
   /* read filter information */
   pstr = (LPSTR)PTR_SEG_TO_LIN(lpofn->lpstrFilter);
+  n = 0;
   while(*pstr)
     {
-      n = strlen(pstr);
-      strncpy(tmpstr, pstr, 511); tmpstr[511]=0;
-      dprintf_commdlg(stddeb,"lpstrFilter // add tmpstr='%s' ", tmpstr);
-      i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0, (LPARAM)MAKE_SEGPTR(tmpstr));
-      pstr += n + 1;
-      n = strlen(pstr);
+      dprintf_commdlg(stddeb,"lpstrFilter // add str='%s' ", pstr);
+      i = SendDlgItemMessage16(hWnd, cmb1, CB_ADDSTRING, 0,
+                               (LPARAM)lpofn->lpstrFilter + n );
+      n += strlen(pstr) + 1;
+      pstr += strlen(pstr) + 1;
       dprintf_commdlg(stddeb,"associated to '%s'\n", pstr);
       SendDlgItemMessage16(hWnd, cmb1, CB_SETITEMDATA, i, (LPARAM)pstr);
-      pstr += n + 1;
+      n += strlen(pstr) + 1;
+      pstr += strlen(pstr) + 1;
     }
   /* set default filter */
   if (lpofn->nFilterIndex == 0 && lpofn->lpstrCustomFilter == (SEGPTR)NULL)
@@ -374,8 +385,10 @@
   			lpofn->nFilterIndex, tmpstr);
   SetDlgItemText32A( hWnd, edt1, tmpstr );
   /* get drive list */
-  *tmpstr = 0;
-  DlgDirListComboBox16(hWnd, (LPSTR)MAKE_SEGPTR(tmpstr), cmb2, 0, 0xC000);
+  pstr = SEGPTR_ALLOC(1);
+  *pstr = 0;
+  DlgDirListComboBox16(hWnd, SEGPTR_GET(pstr), cmb2, 0, 0xC000);
+  SEGPTR_FREE(pstr);
   /* read initial directory */
   if (PTR_SEG_TO_LIN(lpofn->lpstrInitialDir) != NULL) 
     {
@@ -398,7 +411,7 @@
     ShowWindow(GetDlgItem(hWnd, chx1), SW_HIDE); 
   if (FILEDLG_HookCallChk(lpofn))
      return (BOOL)CallWindowProc16(lpofn->lpfnHook, 
-               hWnd,  WM_INITDIALOG, wParam,(LPARAM)MAKE_SEGPTR(lpofn));
+                                   hWnd,  WM_INITDIALOG, wParam, lParam );
   else  
      return TRUE;
 }
@@ -419,7 +432,7 @@
   control = wParam;
   notification = HIWORD(lParam);
     
-  lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
+  lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
   switch (control)
     {
     case lst1: /* file list */
@@ -428,10 +441,13 @@
 	goto almost_ok;
       lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL, 0, 0);
       if (lRet == LB_ERR) return TRUE;
-      SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
-			 (LPARAM)MAKE_SEGPTR(tmpstr));
-      SetDlgItemText32A( hWnd, edt1, tmpstr );
-
+      if ((pstr = SEGPTR_ALLOC(512)))
+      {
+          SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
+                               (LPARAM)SEGPTR_GET(pstr));
+          SetDlgItemText32A( hWnd, edt1, pstr );
+          SEGPTR_FREE(pstr);
+      }
       if (FILEDLG_HookCallChk(lpofn))
        CallWindowProc16(lpofn->lpfnHook, hWnd,
                   RegisterWindowMessage32A( LBSELCHSTRING ),
@@ -444,8 +460,11 @@
 	{
 	  lRet = SendDlgItemMessage16(hWnd, lst2, LB_GETCURSEL, 0, 0);
 	  if (lRet == LB_ERR) return TRUE;
+          pstr = SEGPTR_ALLOC(512);
 	  SendDlgItemMessage16(hWnd, lst2, LB_GETTEXT, lRet,
-			     (LPARAM)MAKE_SEGPTR(tmpstr));
+			     (LPARAM)SEGPTR_GET(pstr));
+          strcpy( tmpstr, pstr );
+          SEGPTR_FREE(pstr);
 	  if (tmpstr[0] == '[')
 	    {
 	      tmpstr[strlen(tmpstr) - 1] = 0;
@@ -466,8 +485,11 @@
       FILEDLG_StripEditControl(hWnd);
       lRet = SendDlgItemMessage16(hWnd, cmb2, CB_GETCURSEL, 0, 0L);
       if (lRet == LB_ERR) return 0;
-      SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet, (LPARAM)MAKE_SEGPTR(tmpstr));
-      sprintf(tmpstr, "%c:", tmpstr[2]);
+      pstr = SEGPTR_ALLOC(512);
+      SendDlgItemMessage16(hWnd, cmb2, CB_GETLBTEXT, lRet,
+                           (LPARAM)SEGPTR_GET(pstr));
+      sprintf(tmpstr, "%c:", pstr[2]);
+      SEGPTR_FREE(pstr);
     reset_scan:
       lRet = SendDlgItemMessage16(hWnd, cmb1, CB_GETCURSEL, 0, 0);
       if (lRet == LB_ERR)
@@ -561,15 +583,12 @@
 	{
 	  lRet = SendDlgItemMessage16(hWnd, lst1, LB_GETCURSEL, 0, 0);
 	  SendDlgItemMessage16(hWnd, lst1, LB_GETTEXT, lRet,
-			     (LPARAM)MAKE_SEGPTR(tmpstr));
-          dprintf_commdlg(stddeb,"strcpy'ing '%s'\n",tmpstr); fflush(stdout);
-	  strcpy(PTR_SEG_TO_LIN(lpofn->lpstrFileTitle), tmpstr);
+                               lpofn->lpstrFileTitle );
 	}
       if (FILEDLG_HookCallChk(lpofn))
       {
        lRet= (BOOL)CallWindowProc16(lpofn->lpfnHook,
-               hWnd, RegisterWindowMessage32A( FILEOKSTRING ),
-               0, (LPARAM)MAKE_SEGPTR(lpofn));                        
+               hWnd, RegisterWindowMessage32A( FILEOKSTRING ), 0, lParam );
        if (lRet)       
        {
          *lpofn=ofn2; /* restore old state */
@@ -594,7 +613,7 @@
  */
 LRESULT FileOpenDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {  
- LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
@@ -637,7 +656,7 @@
  */
 LRESULT FileSaveDlgProc(HWND hWnd, UINT wMsg, WPARAM wParam, LPARAM lParam)
 {
- LPOPENFILENAME lpofn = (LPOPENFILENAME)GetWindowLong32A(hWnd, DWL_USER);
+ LPOPENFILENAME lpofn = (LPOPENFILENAME)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
  
  if (wMsg!=WM_INITDIALOG)
   if (FILEDLG_HookCallChk(lpofn))
@@ -791,7 +810,7 @@
     int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
     int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
 
-    lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
+    lpfr = (LPFINDREPLACE)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
     switch (wParam) {
 	case IDOK:
 	    GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@@ -806,12 +825,14 @@
 		else lpfr->Flags &= ~FR_MATCHCASE;
             lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
 	    lpfr->Flags |= FR_FINDNEXT;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    return TRUE;
 	case IDCANCEL:
             lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
 	    lpfr->Flags |= FR_DIALOGTERM;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    DestroyWindow(hWnd);
 	    return TRUE;
 	case pshHelp:
@@ -883,7 +904,7 @@
     int uFindReplaceMessage = RegisterWindowMessage32A( FINDMSGSTRING );
     int uHelpMessage = RegisterWindowMessage32A( HELPMSGSTRING );
 
-    lpfr = (LPFINDREPLACE)GetWindowLong32A(hWnd, DWL_USER);
+    lpfr = (LPFINDREPLACE)PTR_SEG_TO_LIN(GetWindowLong32A(hWnd, DWL_USER));
     switch (wParam) {
 	case IDOK:
 	    GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@@ -896,12 +917,14 @@
 		else lpfr->Flags &= ~FR_MATCHCASE;
             lpfr->Flags &= ~(FR_REPLACE | FR_REPLACEALL | FR_DIALOGTERM);
 	    lpfr->Flags |= FR_FINDNEXT;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    return TRUE;
 	case IDCANCEL:
             lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_REPLACEALL);
 	    lpfr->Flags |= FR_DIALOGTERM;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    DestroyWindow(hWnd);
 	    return TRUE;
 	case psh1:
@@ -915,7 +938,8 @@
 		else lpfr->Flags &= ~FR_MATCHCASE;
             lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACEALL | FR_DIALOGTERM);
 	    lpfr->Flags |= FR_REPLACE;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    return TRUE;
 	case psh2:
 	    GetDlgItemText16(hWnd, edt1, lpfr->lpstrFindWhat, lpfr->wFindWhatLen);
@@ -928,7 +952,8 @@
 		else lpfr->Flags &= ~FR_MATCHCASE;
             lpfr->Flags &= ~(FR_FINDNEXT | FR_REPLACE | FR_DIALOGTERM);
 	    lpfr->Flags |= FR_REPLACEALL;
-	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0, (LPARAM)MAKE_SEGPTR(lpfr));
+	    SendMessage16(lpfr->hwndOwner, uFindReplaceMessage, 0,
+                          GetWindowLong32A(hWnd, DWL_USER) );
 	    return TRUE;
 	case pshHelp:
 	    /* FIXME : should lpfr structure be passed as an argument ??? */
@@ -2254,7 +2279,8 @@
    if (!(nFontType & 0x0004))   /* this means 'TRUETYPE_FONTTYPE' */
      return 1;   
 
-  i=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(lplf->lfFaceName));
+  i=SendMessage16(hwnd,CB_ADDSTRING,0,
+                  (LPARAM)logfont + ((char *)lplf->lfFaceName - (char *)lplf));
   if (i!=CB_ERR)
   {
     w=(lplf->lfCharSet << 8) | lplf->lfPitchAndFamily;
@@ -2297,7 +2323,9 @@
      if (lptm->tmWeight==fontstyles[i].weight &&
          lptm->tmItalic==fontstyles[i].italic)    /* font successful created ? */
      {
-       j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(fontstyles[i].stname));
+       char *str = SEGPTR_STRDUP(fontstyles[i].stname);
+       j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(str) );
+       SEGPTR_FREE(str);
        if (j==CB_ERR) return 1;
        j=SendMessage16(hwnd, CB_SETITEMDATA, j, 
                                  MAKELONG(fontstyles[i].weight,fontstyles[i].italic));
@@ -2312,10 +2340,11 @@
  */
 static int SetFontSizesToCombo3(HWND hwnd, LPLOGFONT16 lplf, LPCHOOSEFONT lpcf)
 {
-  int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
+  static const int sizes[]={8,9,10,11,12,14,16,18,20,22,24,26,28,36,48,72,0};
   int h,i,j;
-  char buffer[20];
+  char *buffer;
   
+  if (!(buffer = SEGPTR_ALLOC(20))) return 1;
   for (i=0;sizes[i] && !lplf->lfHeight;i++)
   {
    h=lplf->lfHeight ? lplf->lfHeight : sizes[i];
@@ -2324,16 +2353,20 @@
            ((lpcf->Flags & CF_LIMITSIZE) && (h >= lpcf->nSizeMin) && (h <= lpcf->nSizeMax)))
    {
       sprintf(buffer,"%2d",h);
-      j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)MAKE_SEGPTR(buffer));
+      j=SendMessage16(hwnd,CB_FINDSTRING,-1,(LPARAM)SEGPTR_GET(buffer));
       if (j==CB_ERR)
       {
-        j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR(buffer));
-        if (j==CB_ERR) return 1;
-        j=SendMessage16(hwnd, CB_SETITEMDATA, j, h); 
-        if (j==CB_ERR) return 1;
+        j=SendMessage16(hwnd,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(buffer));
+        if (j!=CB_ERR) j = SendMessage16(hwnd, CB_SETITEMDATA, j, h); 
+        if (j==CB_ERR)
+        {
+            SEGPTR_FREE(buffer);
+            return 1;
+        }
       }
    }  
   }  
+  SEGPTR_FREE(buffer);
  return 0;
 }
 
@@ -2409,7 +2442,10 @@
     for (res=1,i=0;res && i<TEXT_COLORS;i++)
     {
       /* FIXME: load color name from resource:  res=LoadString(...,i+....,buffer,.....); */
-      j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)MAKE_SEGPTR("[color name]"));
+      char *name = SEGPTR_ALLOC(20);
+      strcpy( name, "[color name]" );
+      j=SendDlgItemMessage16(hDlg,cmb4,CB_ADDSTRING,0,(LPARAM)SEGPTR_GET(name));
+      SEGPTR_FREE(name);
       SendDlgItemMessage16(hDlg,cmb4, CB_SETITEMDATA,j,textcolors[j]);
       /* look for a fitting value in color combobox */
       if (textcolors[j]==lpcf->rgbColors)
@@ -2509,7 +2545,7 @@
 LRESULT CFn_WMDrawItem(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
   HBRUSH hBrush;
-  char buffer[40];
+  char *buffer;
   BITMAP16 bm;
   COLORREF cr;
   RECT16 rect;
@@ -2534,11 +2570,12 @@
      return TRUE;	/* this should never happen */
 
    rect=lpdi->rcItem;
+   buffer = SEGPTR_ALLOC(40);
    switch (lpdi->CtlID)
    {
     case cmb1:	/* dprintf_commdlg(stddeb,"WM_Drawitem cmb1\n"); */
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
-			(LPARAM)MAKE_SEGPTR(buffer));	          
+			(LPARAM)SEGPTR_GET(buffer));	          
 		GetObject16( hBitmapTT, sizeof(bm), &bm );
 		TextOut16(lpdi->hDC, lpdi->rcItem.left + bm.bmWidth + 10,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
@@ -2559,14 +2596,14 @@
     case cmb2:
     case cmb3:	/* dprintf_commdlg(stddeb,"WM_DRAWITEN cmb2,cmb3\n"); */
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
-			(LPARAM)MAKE_SEGPTR(buffer));
+			(LPARAM)SEGPTR_GET(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
 		break;
 
     case cmb4:	/* dprintf_commdlg(stddeb,"WM_DRAWITEM cmb4 (=COLOR)\n"); */
 		SendMessage16(lpdi->hwndItem, CB_GETLBTEXT, lpdi->itemID,
-    		    (LPARAM)MAKE_SEGPTR(buffer));
+    		    (LPARAM)SEGPTR_GET(buffer));
 		TextOut16(lpdi->hDC, lpdi->rcItem.left +  25+5,
                           lpdi->rcItem.top, buffer, lstrlen16(buffer));
 		cr = SendMessage16(lpdi->hwndItem, CB_GETITEMDATA, lpdi->itemID,0L);
@@ -2587,6 +2624,7 @@
 
     default:	return TRUE;	/* this should never happen */
    }
+   SEGPTR_FREE(buffer);
    if (lpdi->itemState ==ODS_SELECTED)
      InvertRect16(lpdi->hDC, &rect);
  }
@@ -2614,7 +2652,6 @@
  */
 LRESULT CFn_WMCommand(HWND hDlg, WPARAM wParam, LPARAM lParam)
 {
-  char buffer[200];
   HFONT hFont/*,hFontOld*/;
   int i,j;
   long l;
@@ -2636,11 +2673,14 @@
 		      if (i!=CB_ERR)
 		      {
 		        HCURSOR16 hcursor=SetCursor(LoadCursor16(0,IDC_WAIT));
-                        SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
-	                dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",buffer);
-       		        EnumFontFamilies(hdc,buffer,FontStyleEnumProc,
+                        char *str = SEGPTR_ALLOC(256);
+                        SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+                                             (LPARAM)SEGPTR_GET(str));
+	                dprintf_commdlg(stddeb,"WM_COMMAND/cmb1 =>%s\n",str);
+       		        EnumFontFamilies(hdc,str,FontStyleEnumProc,
 		             MAKELONG(GetDlgItem(hDlg,cmb2),GetDlgItem(hDlg,cmb3)));
-		        SetCursor(hcursor);        
+		        SetCursor(hcursor);     
+                        SEGPTR_FREE(str);
 		      }
 		      if (!(lpcf->Flags & CF_PRINTERFONTS && lpcf->hDC))
  		        ReleaseDC(hDlg,hdc);
@@ -2657,13 +2697,15 @@
 	case cmb2:
 	case cmb3:if (HIWORD(lParam)==CBN_SELCHANGE || HIWORD(lParam)== BN_CLICKED )
 	          {
+                    char *str = SEGPTR_ALLOC(256);
                     dprintf_commdlg(stddeb,"WM_COMMAND/cmb2,3 =%08lX\n", lParam);
 		    i=SendDlgItemMessage16(hDlg,cmb1,CB_GETCURSEL,0,0);
 		    if (i==CB_ERR)
-                      i=GetDlgItemText32A( hDlg, cmb1, buffer, sizeof(buffer) );
+                      i=GetDlgItemText32A( hDlg, cmb1, str, 256 );
                     else
                     {
-		      SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,(LPARAM)MAKE_SEGPTR(buffer));
+		      SendDlgItemMessage16(hDlg,cmb1,CB_GETLBTEXT,i,
+                                           (LPARAM)SEGPTR_GET(str));
 		      l=SendDlgItemMessage16(hDlg,cmb1,CB_GETITEMDATA,i,0);
 		      j=HIWORD(l);
 		      lpcf->nFontType = LOWORD(l);
@@ -2673,7 +2715,8 @@
 		      lpxx->lfPitchAndFamily=j&0xff;
 		      lpxx->lfCharSet=j>>8;
                     }
-                    strcpy(lpxx->lfFaceName,buffer);
+                    strcpy(lpxx->lfFaceName,str);
+                    SEGPTR_FREE(str);
 		    i=SendDlgItemMessage16(hDlg,cmb2,CB_GETCURSEL,0,0);
 		    if (i!=CB_ERR)
 		    {
@@ -2725,7 +2768,9 @@
 	             EndDialog(hDlg, TRUE);
 	          else
 	          {
-	           sprintf(buffer,"Select a font size among %d and %d points.",lpcf->nSizeMin,lpcf->nSizeMax);
+                   char buffer[80];
+	           sprintf(buffer,"Select a font size between %d and %d points.",
+                           lpcf->nSizeMin,lpcf->nSizeMax);
 	           MessageBox(hDlg,buffer,NULL,MB_OK);
 	          } 
 		  return(TRUE);
diff --git a/misc/crtdll.c b/misc/crtdll.c
index e73d8c2..9139d00 100644
--- a/misc/crtdll.c
+++ b/misc/crtdll.c
@@ -8,6 +8,7 @@
 
 #include <stdio.h>
 #include <stdlib.h>
+#include <string.h>
 #include <unistd.h>
 #include <time.h>
 #include <ctype.h>
@@ -176,3 +177,44 @@
 CRTDLL_putchar(INT32 x) {
 	putchar(x);
 }
+
+int
+CRTDLL__mbsicmp(unsigned char *x,unsigned char *y)
+{
+	do {
+		if (!*x)
+			return !!*y;
+		if (!*y)
+			return !!*x;
+		/* FIXME: MBCS handling... */
+		if (*x!=*y)
+			return 1;
+                x++;
+                y++;
+	} while (1);
+}
+
+unsigned char*
+CRTDLL__mbsinc(unsigned char *x)
+{
+    /* FIXME: mbcs */
+    return x++;
+}
+
+int
+CRTDLL_vsprintf(DWORD *args)
+{
+    return vsprintf((char *)args[0],(char *)args[1],args+2);
+}
+
+unsigned char*
+CRTDLL__mbscpy(unsigned char *x,unsigned char *y)
+{
+    return strcpy(x,y);
+}
+
+unsigned char*
+CRTDLL__mbscat(unsigned char *x,unsigned char *y)
+{
+    return strcat(x,y);
+}
diff --git a/misc/lstr.c b/misc/lstr.c
index 9f2d01c..318e3da 100644
--- a/misc/lstr.c
+++ b/misc/lstr.c
@@ -14,7 +14,6 @@
 #include "windows.h"
 #include "ldt.h"
 #include "module.h"
-#include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
diff --git a/misc/lzexpand.c b/misc/lzexpand.c
index 45b3655..cdf314d 100644
--- a/misc/lzexpand.c
+++ b/misc/lzexpand.c
@@ -16,8 +16,8 @@
 #include <sys/stat.h>
 #include "windows.h"
 #include "file.h"
+#include "ldt.h"
 #include "lzexpand.h"
-#include "stackframe.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
diff --git a/misc/main.c b/misc/main.c
index c02aaea..e2bc1f5 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -55,10 +55,7 @@
 "Jan Willamowius, Carl Williams, Karl Guenter Wuensch, Eric Youngdale, "
 "and James Youngman. ";
 
-const struct _langentry {
-	char *name;
-	WORD langid;
-} languages[] =
+const WINE_LANGUAGE_DEF Languages[] =
 {
     {"En",0x0409},	/* LANG_En */
     {"Es",0x040A},	/* LANG_Es */
@@ -289,19 +286,20 @@
  */
 static void MAIN_ParseLanguageOption( char *arg )
 {
-    const struct _langentry *p = languages;
+    const WINE_LANGUAGE_DEF *p = Languages;
 
     Options.language = LANG_En;  /* First language */
     for (;p->name;p++)
     {
-        if (!lstrcmpi32A( p->name, arg )) {
+        if (!lstrcmpi32A( p->name, arg ))
+        {
 	    WINE_LanguageId = p->langid;
 	    return;
 	}
         Options.language++;
     }
     fprintf( stderr, "Invalid language specified '%s'. Supported languages are: ", arg );
-    for (p = languages; p->name; p++) fprintf( stderr, "%s ", p->name );
+    for (p = Languages; p->name; p++) fprintf( stderr, "%s ", p->name );
     fprintf( stderr, "\n" );
     exit(1);
 }
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index 5a59bc32..297ca18 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -73,12 +73,14 @@
     int retLen;
     dprintf_ole(stddeb,"GetLocaleInfoA(%8lX,%8lX,%p,%4X)\n",
 			lcid,LCType,buf,len);
+#if 0
 	/* Wine is supporting only the default locale */
 	if(lcid!=GetUserDefaultLCID())
 	{
 		dprintf_ole(stdnimp,"GetLocaleInfoA: Unknown locale\n");
 		return 0;
 	}
+#endif
 	/* As an option, we could obtain the value from win.ini.
 	   This would not match the Wine compile-time option.
 	   Also, not all identifiers are available from win.ini */
@@ -424,6 +426,131 @@
 /* LOCVAL(LOCALE_INEGSEPBYSPACE) */
     break; /* LANG(Da) */
 
+    case LANG_En:
+/* This definitions apply to Germany only. Users in Austria 
+   or Switzerland might want to modify them */
+LOCVAL(LOCALE_ILANGUAGE,"9")
+LOCVAL(LOCALE_SLANGUAGE,"English")
+LOCVAL(LOCALE_SENGLANGUAGE,"English")
+LOCVAL(LOCALE_SABBREVLANGNAME,"enu")
+LOCVAL(LOCALE_SNATIVELANGNAME,"English")
+LOCVAL(LOCALE_ICOUNTRY,"11")
+LOCVAL(LOCALE_SCOUNTRY,"Deutschland")
+LOCVAL(LOCALE_SENGCOUNTRY,"Deutschland")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"De")
+LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49")
+/* Dunno
+LOCVAL(LOCALE_IDEFAULTCODEPAGE)
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE)
+*/
+LOCVAL(LOCALE_SLIST,";")
+LOCVAL(LOCALE_IMEASURE,"0")
+LOCVAL(LOCALE_SDECIMAL,",")
+LOCVAL(LOCALE_STHOUSAND,".")
+/*
+LOCVAL(LOCALE_SGROUPING)
+*/
+LOCVAL(LOCALE_IDIGITS,"2")
+LOCVAL(LOCALE_ILZERO,"1")
+/*
+LOCVAL(LOCALE_INEGNUMBER)
+Is this "0123456789" ??
+LOCVAL(LOCALE_SNATIVEDIGITS)
+*/
+LOCVAL(LOCALE_SCURRENCY,"DM")
+/*
+LOCVAL(LOCALE_SINTLSYMBOL)
+LOCVAL(LOCALE_SMONDECIMALSEP)
+LOCVAL(LOCALE_SMONTHOUSANDSEP)
+LOCVAL(LOCALE_SMONGROUPING)
+*/
+LOCVAL(LOCALE_ICURRDIGITS,"2")
+/*
+LOCVAL(LOCALE_IINTLCURRDIGITS)
+*/
+LOCVAL(LOCALE_ICURRENCY,"3")
+LOCVAL(LOCALE_INEGCURR,"8")
+LOCVAL(LOCALE_SDATE,".")
+LOCVAL(LOCALE_STIME,":")
+LOCVAL(LOCALE_SSHORTDATE,"dd.MM.yyyy")
+LOCVAL(LOCALE_SLONGDATE,"ddd, d. MMMM yyyy")
+/*
+LOCVAL(LOCALE_STIMEFORMAT)
+*/
+LOCVAL(LOCALE_IDATE,"1")
+/*
+LOCVAL(LOCALE_ILDATE)
+*/
+LOCVAL(LOCALE_ITIME,"1")
+/*
+LOCVAL(LOCALE_ITIMEMARKPOSN)
+LOCVAL(LOCALE_ICENTURY)
+*/
+LOCVAL(LOCALE_ITLZERO,"1")
+/*
+LOCVAL(LOCALE_IDAYLZERO)
+LOCVAL(LOCALE_IMONLZERO)
+LOCVAL(LOCALE_S1159)
+LOCVAL(LOCALE_S2359)
+LOCVAL(LOCALE_ICALENDARTYPE)
+LOCVAL(LOCALE_IOPTIONALCALENDAR)
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK)
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR)
+*/
+LOCVAL(LOCALE_SDAYNAME1,"Montag")
+LOCVAL(LOCALE_SDAYNAME2,"Dienstag")
+LOCVAL(LOCALE_SDAYNAME3,"Mittwoch")
+LOCVAL(LOCALE_SDAYNAME4,"Donnerstag")
+LOCVAL(LOCALE_SDAYNAME5,"Freitag")
+LOCVAL(LOCALE_SDAYNAME6,"Sonnabend")
+LOCVAL(LOCALE_SDAYNAME7,"Sonntag")
+LOCVAL(LOCALE_SABBREVDAYNAME1,"Mo")
+LOCVAL(LOCALE_SABBREVDAYNAME2,"Di")
+LOCVAL(LOCALE_SABBREVDAYNAME3,"Mi")
+LOCVAL(LOCALE_SABBREVDAYNAME4,"Do")
+LOCVAL(LOCALE_SABBREVDAYNAME5,"Fr")
+LOCVAL(LOCALE_SABBREVDAYNAME6,"Sa")
+LOCVAL(LOCALE_SABBREVDAYNAME7,"So")
+LOCVAL(LOCALE_SMONTHNAME1,"Januar")
+LOCVAL(LOCALE_SMONTHNAME2,"Februar")
+LOCVAL(LOCALE_SMONTHNAME3,"März")
+LOCVAL(LOCALE_SMONTHNAME4,"April")
+LOCVAL(LOCALE_SMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SMONTHNAME6,"Juni")
+LOCVAL(LOCALE_SMONTHNAME7,"Juli")
+LOCVAL(LOCALE_SMONTHNAME8,"August")
+LOCVAL(LOCALE_SMONTHNAME9,"September")
+LOCVAL(LOCALE_SMONTHNAME10,"Oktober")
+LOCVAL(LOCALE_SMONTHNAME11,"November")
+LOCVAL(LOCALE_SMONTHNAME12,"Dezember")
+LOCVAL(LOCALE_SMONTHNAME13,"")
+LOCVAL(LOCALE_SABBREVMONTHNAME1,"Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2,"Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3,"Mär")
+LOCVAL(LOCALE_SABBREVMONTHNAME4,"Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5,"Mai")
+LOCVAL(LOCALE_SABBREVMONTHNAME6,"Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7,"Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8,"Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9,"Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10,"Okt")
+LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dez")
+LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
+/*
+LOCVAL(LOCALE_SPOSITIVESIGN)
+LOCVAL(LOCALE_SNEGATIVESIGN)
+LOCVAL(LOCALE_IPOSSIGNPOSN)
+LOCVAL(LOCALE_INEGSIGNPOSN)
+LOCVAL(LOCALE_IPOSSYMPRECEDES)
+LOCVAL(LOCALE_IPOSSEPBYSPACE)
+LOCVAL(LOCALE_INEGSYMPRECEDES)
+LOCVAL(LOCALE_INEGSEPBYSPACE)
+*/
+    break;  /* LANG(En) */
+
     case LANG_Eo:
 /* LOCVAL(LOCALE_ILANGUAGE,"9") ISO numerical ID for language TODO */
 LOCVAL(LOCALE_SLANGUAGE,"Esperanto")
@@ -437,8 +564,8 @@
 /* LOCVAL(LOCALE_SNATIVECTRYNAME,"Deutschland") */
 /* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") ISO ID of lang TODO */
 /* LOCVAL(LOCALE_IDEFAULTCOUNTRY,"49") */
-LOCVAL(LOCALE_IDEFAULTCODEPAGE,3) /* is this right? TODO */
-LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,3) /* is this right? TODO */
+LOCVAL(LOCALE_IDEFAULTCODEPAGE,"3") /* is this right? TODO */
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE,"3") /* is this right? TODO */
 LOCVAL(LOCALE_SLIST,";")
 LOCVAL(LOCALE_IMEASURE,"0")
 LOCVAL(LOCALE_SDECIMAL,",")
@@ -772,6 +899,209 @@
 */
     break;  /* LANG(It) */
 
+    case 0x0409:
+LOCVAL(LOCALE_ILANGUAGE, "0409")
+LOCVAL(LOCALE_SLANGUAGE, "English (United States)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ENU")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "1")
+LOCVAL(LOCALE_SCOUNTRY, "United States")
+LOCVAL(LOCALE_SENGCOUNTRY, "United States")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "USA")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United States")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0409")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "1")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "437")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "1")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "$")
+LOCVAL(LOCALE_SINTLSYMBOL, "USD")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "0")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "M/d/yy")
+LOCVAL(LOCALE_SLONGDATE, "dddd, MMMM dd, yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "h:mm:ss tt")
+LOCVAL(LOCALE_IDATE, "0")
+LOCVAL(LOCALE_ILDATE, "0")
+LOCVAL(LOCALE_ITIME, "0")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "0")
+LOCVAL(LOCALE_IDAYLZERO, "0")
+LOCVAL(LOCALE_IMONLZERO, "0")
+LOCVAL(LOCALE_S1159, "AM")
+LOCVAL(LOCALE_S2359, "PM")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "6")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "0")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+    break; /* LANG(0x0409) (U.S. English) */
+
+    case 0x0809:
+LOCVAL(LOCALE_ILANGUAGE, "0809")
+LOCVAL(LOCALE_SLANGUAGE, "English (United Kingdom)")
+LOCVAL(LOCALE_SENGLANGUAGE, "English")
+LOCVAL(LOCALE_SABBREVLANGNAME, "ENG")
+LOCVAL(LOCALE_SNATIVELANGNAME, "English")
+LOCVAL(LOCALE_ICOUNTRY, "44")
+LOCVAL(LOCALE_SCOUNTRY, "United Kingdom")
+LOCVAL(LOCALE_SENGCOUNTRY, "United Kingdom")
+LOCVAL(LOCALE_SABBREVCTRYNAME, "GBR")
+LOCVAL(LOCALE_SNATIVECTRYNAME, "United Kingdom")
+LOCVAL(LOCALE_IDEFAULTLANGUAGE, "0809")
+LOCVAL(LOCALE_IDEFAULTCOUNTRY, "44")
+LOCVAL(LOCALE_IDEFAULTCODEPAGE, "850")
+LOCVAL(LOCALE_IDEFAULTANSICODEPAGE, "1252")
+LOCVAL(LOCALE_SLIST, ",")
+LOCVAL(LOCALE_IMEASURE, "0")
+LOCVAL(LOCALE_SDECIMAL, ".")
+LOCVAL(LOCALE_STHOUSAND, ",")
+LOCVAL(LOCALE_SGROUPING, "3;0")
+LOCVAL(LOCALE_IDIGITS, "2")
+LOCVAL(LOCALE_ILZERO, "1")
+LOCVAL(LOCALE_INEGNUMBER, "1")
+LOCVAL(LOCALE_SNATIVEDIGITS, "0123456789")
+LOCVAL(LOCALE_SCURRENCY, "£")
+LOCVAL(LOCALE_SINTLSYMBOL, "GBP")
+LOCVAL(LOCALE_SMONDECIMALSEP, ".")
+LOCVAL(LOCALE_SMONTHOUSANDSEP, ",")
+LOCVAL(LOCALE_SMONGROUPING, "3;0")
+LOCVAL(LOCALE_ICURRDIGITS, "2")
+LOCVAL(LOCALE_IINTLCURRDIGITS, "2")
+LOCVAL(LOCALE_ICURRENCY, "0")
+LOCVAL(LOCALE_INEGCURR, "1")
+LOCVAL(LOCALE_SDATE, "/")
+LOCVAL(LOCALE_STIME, ":")
+LOCVAL(LOCALE_SSHORTDATE, "dd/MM/yy")
+LOCVAL(LOCALE_SLONGDATE, "dd MMMM yyyy")
+LOCVAL(LOCALE_STIMEFORMAT, "HH:mm:ss")
+LOCVAL(LOCALE_IDATE, "1")
+LOCVAL(LOCALE_ILDATE, "1")
+LOCVAL(LOCALE_ITIME, "1")
+LOCVAL(LOCALE_ITIMEMARKPOSN, "0")
+LOCVAL(LOCALE_ICENTURY, "0")
+LOCVAL(LOCALE_ITLZERO, "1")
+LOCVAL(LOCALE_IDAYLZERO, "1")
+LOCVAL(LOCALE_IMONLZERO, "1")
+LOCVAL(LOCALE_S1159, "")
+LOCVAL(LOCALE_S2359, "")
+LOCVAL(LOCALE_ICALENDARTYPE, "1")
+LOCVAL(LOCALE_IOPTIONALCALENDAR, "0")
+LOCVAL(LOCALE_IFIRSTDAYOFWEEK, "0")
+LOCVAL(LOCALE_IFIRSTWEEKOFYEAR, "0")
+LOCVAL(LOCALE_SDAYNAME1, "Monday")
+LOCVAL(LOCALE_SDAYNAME2, "Tuesday")
+LOCVAL(LOCALE_SDAYNAME3, "Wednesday")
+LOCVAL(LOCALE_SDAYNAME4, "Thursday")
+LOCVAL(LOCALE_SDAYNAME5, "Friday")
+LOCVAL(LOCALE_SDAYNAME6, "Saturday")
+LOCVAL(LOCALE_SDAYNAME7, "Sunday")
+LOCVAL(LOCALE_SABBREVDAYNAME1, "Mon")
+LOCVAL(LOCALE_SABBREVDAYNAME2, "Tue")
+LOCVAL(LOCALE_SABBREVDAYNAME3, "Wed")
+LOCVAL(LOCALE_SABBREVDAYNAME4, "Thu")
+LOCVAL(LOCALE_SABBREVDAYNAME5, "Fri")
+LOCVAL(LOCALE_SABBREVDAYNAME6, "Sat")
+LOCVAL(LOCALE_SABBREVDAYNAME7, "Sun")
+LOCVAL(LOCALE_SMONTHNAME1, "January")
+LOCVAL(LOCALE_SMONTHNAME2, "February")
+LOCVAL(LOCALE_SMONTHNAME3, "March")
+LOCVAL(LOCALE_SMONTHNAME4, "April")
+LOCVAL(LOCALE_SMONTHNAME5, "May")
+LOCVAL(LOCALE_SMONTHNAME6, "June")
+LOCVAL(LOCALE_SMONTHNAME7, "July")
+LOCVAL(LOCALE_SMONTHNAME8, "August")
+LOCVAL(LOCALE_SMONTHNAME9, "September")
+LOCVAL(LOCALE_SMONTHNAME10, "October")
+LOCVAL(LOCALE_SMONTHNAME11, "November")
+LOCVAL(LOCALE_SMONTHNAME12, "December")
+LOCVAL(LOCALE_SMONTHNAME13, "")
+LOCVAL(LOCALE_SABBREVMONTHNAME1, "Jan")
+LOCVAL(LOCALE_SABBREVMONTHNAME2, "Feb")
+LOCVAL(LOCALE_SABBREVMONTHNAME3, "Mar")
+LOCVAL(LOCALE_SABBREVMONTHNAME4, "Apr")
+LOCVAL(LOCALE_SABBREVMONTHNAME5, "May")
+LOCVAL(LOCALE_SABBREVMONTHNAME6, "Jun")
+LOCVAL(LOCALE_SABBREVMONTHNAME7, "Jul")
+LOCVAL(LOCALE_SABBREVMONTHNAME8, "Aug")
+LOCVAL(LOCALE_SABBREVMONTHNAME9, "Sep")
+LOCVAL(LOCALE_SABBREVMONTHNAME10, "Oct")
+LOCVAL(LOCALE_SABBREVMONTHNAME11, "Nov")
+LOCVAL(LOCALE_SABBREVMONTHNAME12, "Dec")
+LOCVAL(LOCALE_SABBREVMONTHNAME13, "")
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
+    break; /* LANG(0x0809) (U.K. English) */
 
 /*Insert other languages here*/
 
@@ -792,6 +1122,20 @@
 	return retLen;
 }
 
+/***********************************************************************
+ *         GetLocaleInfo32W             (KERNEL32.230)
+ * Is the last parameter really WORD for Win16?
+ */
+INT32 GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
+{
+	int i;
+	LPSTR abuf = (LPSTR) wbuf;
+	INT32 n = GetLocaleInfoA(lcid, LCType, abuf, len);
+	for (i = n; i > 0; --i) {
+		wbuf[i] = abuf[i];
+	}
+	return n;
+}
 
 /***********************************************************************
  *           CompareString16       (OLE2NLS.8)
diff --git a/misc/shell.c b/misc/shell.c
index 0f146e1..dd7aa3b 100644
--- a/misc/shell.c
+++ b/misc/shell.c
@@ -14,11 +14,38 @@
 #include "resource.h"
 #include "dlgs.h"
 #include "win.h"
+#include "cursoricon.h"
 #include "stddebug.h"
 #include "debug.h"
 #include "xmalloc.h"
 #include "winreg.h"
 
+/* .ICO file ICONDIR definitions */
+
+#pragma pack(1)
+
+typedef struct
+{
+    BYTE        bWidth;          /* Width, in pixels, of the image	*/
+    BYTE        bHeight;         /* Height, in pixels, of the image	*/
+    BYTE        bColorCount;     /* Number of colors in image (0 if >=8bpp) */
+    BYTE        bReserved;       /* Reserved ( must be 0)		*/
+    WORD        wPlanes;         /* Color Planes			*/
+    WORD        wBitCount;       /* Bits per pixel			*/
+    DWORD       dwBytesInRes;    /* How many bytes in this resource?	*/
+    DWORD       dwImageOffset;   /* Where in the file is this image?	*/
+} icoICONDIRENTRY, *LPicoICONDIRENTRY;
+
+typedef struct
+{
+    WORD            idReserved;   /* Reserved (must be 0)		*/
+    WORD            idType;       /* Resource Type (1 for icons)	*/
+    WORD            idCount;      /* How many images?			*/
+    icoICONDIRENTRY idEntries[1]; /* An entry for each image (idCount of 'em) */
+} icoICONDIR, *LPicoICONDIR;
+
+#pragma pack(4)
+
 extern HANDLE 	CURSORICON_LoadHandler( HANDLE, HINSTANCE, BOOL);
 extern WORD 	GetIconID( HANDLE hResource, DWORD resType );
 
@@ -124,7 +151,7 @@
     HINSTANCE retval=31;    /* default - 'No association was found' */
     char *tok;              /* token pointer */
     int i;                  /* random counter */
-    char xlpFile[256];          /* result of SearchPath */
+    char xlpFile[256];      /* result of SearchPath */
 
     dprintf_exec(stddeb, "SHELL_FindExecutable: File %s, Dir %s\n", 
 		 (lpFile != NULL?lpFile:"-"), 
@@ -140,6 +167,10 @@
     }
     if (SearchPath32A(lpDirectory,lpFile,NULL,sizeof(xlpFile),xlpFile,NULL))
     	lpFile = xlpFile;
+    else {
+    	if (SearchPath32A(lpDirectory,lpFile,".exe",sizeof(xlpFile),xlpFile,NULL))
+	    lpFile = xlpFile;
+    }
 
     /* First thing we need is the file's extension */
     extension = strrchr( xlpFile, '.' ); /* Assume last "." is the one; */
@@ -376,7 +407,7 @@
  *
  * FIXME: Implement GetPEResourceTable in w32sys.c and call it here.
  */
-BYTE* SHELL_GetResourceTable(HFILE hFile)
+static BYTE* SHELL_GetResourceTable(HFILE hFile)
 {
   struct mz_header_s mz_header;
   struct ne_header_s ne_header;
@@ -391,7 +422,7 @@
       return NULL;
 
   if (ne_header.ne_magic == PE_SIGNATURE) 
-     { fprintf(stdnimp,"Win32 FIXME: file %s line %i\n", __FILE__, __LINE__ );
+     { fprintf(stdnimp,"Win32s FIXME: file %s line %i\n", __FILE__, __LINE__ );
        return NULL; }
 
   if (ne_header.ne_magic != NE_SIGNATURE) return NULL;
@@ -417,7 +448,7 @@
 /*************************************************************************
  *			SHELL_LoadResource
  */
-HANDLE	SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
+static HANDLE	SHELL_LoadResource(HINSTANCE hInst, HFILE hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
 {
  BYTE*	ptr;
  HANDLE handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
@@ -432,6 +463,74 @@
 }
 
 /*************************************************************************
+ *                      ICO_LoadIcon
+ */
+static HANDLE   ICO_LoadIcon(HINSTANCE hInst, HFILE hFile, LPicoICONDIRENTRY lpiIDE)
+{
+ BYTE*  ptr;
+ HANDLE handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
+
+ if( (ptr = (BYTE*)GlobalLock16( handle )) )
+   {
+    _llseek( hFile, lpiIDE->dwImageOffset, SEEK_SET);
+     FILE_Read( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
+     return handle;
+   }
+ return (HANDLE)0;
+}
+
+/*************************************************************************
+ *                      ICO_GetIconDirectory
+ *
+ *  Read .ico file and build phony ICONDIR struct for GetIconID
+ */
+static HANDLE ICO_GetIconDirectory(HINSTANCE hInst, HFILE hFile, LPicoICONDIR* lplpiID ) 
+{
+  WORD		id[3];	/* idReserved, idType, idCount */
+  LPicoICONDIR	lpiID;
+  int		i;
+ 
+  _llseek( hFile, 0, SEEK_SET );
+  if( FILE_Read(hFile,(char*)id,sizeof(id)) != sizeof(id) ) return 0;
+
+  /* check .ICO header 
+   *
+   * - see http://www.microsoft.com/win32dev/ui/icons.htm
+   */
+
+  if( id[0] || id[1] != 1 || !id[2] ) return 0;
+
+  i = id[2]*sizeof(icoICONDIRENTRY) + sizeof(id);
+
+  lpiID = (LPicoICONDIR)xmalloc(i);
+
+  if( FILE_Read(hFile,(char*)lpiID->idEntries,i) == i )
+  {  
+     HANDLE	handle = DirectResAlloc( hInst, 0x10,
+					 id[2]*sizeof(ICONDIRENTRY) + sizeof(id) );
+     if( handle ) 
+     {
+       CURSORICONDIR*     lpID = (CURSORICONDIR*)GlobalLock16( handle );
+       lpID->idReserved = lpiID->idReserved = id[0];
+       lpID->idType = lpiID->idType = id[1];
+       lpID->idCount = lpiID->idCount = id[2];
+       for( i=0; i < lpiID->idCount; i++ )
+         {
+	    memcpy((void*)(lpID->idEntries + i), 
+		   (void*)(lpiID->idEntries + i), sizeof(ICONDIRENTRY) - 2);
+	    lpID->idEntries[i].icon.wResId = i;
+         }
+      *lplpiID = lpiID;
+       return handle;
+     }
+  }
+  /* fail */
+
+  free(lpiID);
+  return 0;
+}
+
+/*************************************************************************
  *			InternalExtractIcon		[SHELL.39]
  *
  * This abortion is called directly by Progman
@@ -449,79 +548,87 @@
 
   if( hFile == HFILE_ERROR || !n ) return 0;
 
-  hRet = GlobalAlloc16( GMEM_FIXED, sizeof(HICON16)*n);
+  hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
   RetPtr = (HICON16*)GlobalLock16(hRet);
 
  *RetPtr = (n == 0xFFFF)? 0: 1;				/* error return values */
 
   pData = SHELL_GetResourceTable(hFile);
   if( pData ) 
+  {
+    HICON16	 hIcon = 0;
+    BOOL	 icoFile = FALSE;
+    UINT         iconDirCount = 0;
+    UINT         iconCount = 0;
+    NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
+    NE_NAMEINFO* pIconStorage = NULL;
+    NE_NAMEINFO* pIconDir = NULL;
+    LPicoICONDIR lpiID = NULL;
+ 
     if( pData == (BYTE*)-1 )
       {
-	/* FIXME: possible .ICO file */
+	/* check for .ICO file */
 
-	fprintf(stddeb,"InternalExtractIcon: cannot handle file %s\n", lpszExeFileName);
+	hIcon = ICO_GetIconDirectory(hInstance, hFile, &lpiID);
+	if( hIcon )
+	  { icoFile = TRUE; iconDirCount = 1; iconCount = lpiID->idCount; }
       }
-    else						/* got resource table */
+    else while( pTInfo->type_id && !(pIconStorage && pIconDir) )
       {
-	UINT	     iconDirCount = 0;
-	UINT	     iconCount = 0;
-	NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
-	NE_NAMEINFO* pIconStorage = NULL;
-	NE_NAMEINFO* pIconDir = NULL;
-
 	/* find icon directory and icon repository */
 
-        while( pTInfo->type_id && !(pIconStorage && pIconDir) )
+	if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON ) 
 	  {
-	   if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON ) 
-	       {
-		 iconDirCount = pTInfo->count;
-	         pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
-		 dprintf_reg(stddeb,"\tfound directory - %i icon families\n", iconDirCount);
-	       }
-	   if( pTInfo->type_id == NE_RSCTYPE_ICON ) 
-	       { 
-		 iconCount = pTInfo->count;
-		 pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
-		 dprintf_reg(stddeb,"\ttotal icons - %i\n", iconCount);
-	       }
-  	   pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
-          }
-
-	/* load resources and create icons */
-
-        if( pIconStorage && pIconDir )
-
-            if( nIconIndex == (UINT)-1 ) RetPtr[0] = iconDirCount;
-	    else if( nIconIndex < iconDirCount )
-	      {
-		  HICON16 hIcon;
-		  UINT   i, icon;
-
-		  if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
-
-		  for( i = nIconIndex; i < nIconIndex + n; i++ ) 
-		     {
-		       hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + i, 
-								  *(WORD*)pData );
-		       RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
-		       GlobalFree16(hIcon); 
-		     }
-
-		  for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
-		     {
-		       hIcon = 0;
-		       for( i = 0; i < iconCount; i++ )
-			  if( pIconStorage[i].id == (RetPtr[icon-nIconIndex] | 0x8000) )
-			      hIcon = SHELL_LoadResource( hInstance, hFile, pIconStorage + i,
-									     *(WORD*)pData );
-	               RetPtr[icon-nIconIndex] = (hIcon)?CURSORICON_LoadHandler( hIcon, hInstance, FALSE ):0;
-		     }
-	      }
-	free(pData);
+	     iconDirCount = pTInfo->count;
+	     pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
+	     dprintf_reg(stddeb,"\tfound directory - %i icon families\n", iconDirCount);
+	  }
+	if( pTInfo->type_id == NE_RSCTYPE_ICON ) 
+	  { 
+	     iconCount = pTInfo->count;
+	     pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
+	     dprintf_reg(stddeb,"\ttotal icons - %i\n", iconCount);
+	  }
+  	pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
       }
 
+    /* load resources and create icons */
+
+    if( (pIconStorage && pIconDir) || icoFile )
+      if( nIconIndex == (UINT)-1 ) RetPtr[0] = iconDirCount;
+      else if( nIconIndex < iconDirCount )
+        {
+	   UINT   i, icon;
+
+	   if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
+
+	   for( i = nIconIndex; i < nIconIndex + n; i++ ) 
+	     {
+	       /* .ICO files have only one icon directory */
+
+	       if( !icoFile )
+	         hIcon = SHELL_LoadResource( hInstance, hFile, pIconDir + i, 
+							    *(WORD*)pData );
+	       RetPtr[i-nIconIndex] = GetIconID( hIcon, 3 );
+	       GlobalFree16(hIcon); 
+             }
+
+	   for( icon = nIconIndex; icon < nIconIndex + n; icon++ )
+	     {
+	       hIcon = 0;
+	       if( icoFile )
+		 hIcon = ICO_LoadIcon( hInstance, hFile, lpiID->idEntries + RetPtr[icon-nIconIndex]);
+	       else
+	         for( i = 0; i < iconCount; i++ )
+		    if( pIconStorage[i].id == (RetPtr[icon-nIconIndex] | 0x8000) )
+		      hIcon = SHELL_LoadResource( hInstance, hFile, pIconStorage + i,
+								     *(WORD*)pData );
+	       RetPtr[icon-nIconIndex] = (hIcon)?CURSORICON_LoadHandler( hIcon, hInstance, FALSE ):0;
+	     }
+        }
+    if( icoFile ) free(lpiID);
+    else free(pData);
+ } 
  _lclose( hFile );
  
   /* return array with icon handles */
diff --git a/misc/spy.c b/misc/spy.c
index 1681c9e..1a58dd4 100644
--- a/misc/spy.c
+++ b/misc/spy.c
@@ -20,11 +20,11 @@
 
 static const char * const MessageTypeNames[SPY_MAX_MSGNUM + 1] =
 {
-    "WM_NULL",			/* 0x00 */
+    "wm_null",			/* 0x00 */
     "WM_CREATE",	
     "WM_DESTROY",    
     "WM_MOVE",
-    "WM_SIZEWAIT",
+    "wm_sizewait",
     "WM_SIZE",
     "WM_ACTIVATE",
     "WM_SETFOCUS",
@@ -43,7 +43,7 @@
     "WM_ERASEBKGND",
     "WM_SYSCOLORCHANGE",
     "WM_ENDSESSION",
-    "WM_SYSTEMERROR",
+    "wm_systemerror",
     "WM_SHOWWINDOW",
     "WM_CTLCOLOR",
     "WM_WININICHANGE",
@@ -57,11 +57,11 @@
     "WM_CHILDACTIVATE",
     "WM_QUEUESYNC",
     "WM_GETMINMAXINFO",
-    "WM_UNUSED3",
-    "WM_PAINTICON",
+    "wm_unused3",
+    "wm_painticon",
     "WM_ICONERASEBKGND",
     "WM_NEXTDLGCTL",
-    "WM_ALTTABACTIVE",
+    "wm_alttabactive",
     "WM_SPOOLERSTATUS",
     "WM_DRAWITEM",
     "WM_MEASUREITEM",
@@ -72,25 +72,27 @@
     "WM_GETFONT",
     "WM_SETHOTKEY", 
     "WM_GETHOTKEY", 
-    "WM_FILESYSCHANGE", 
-    "WM_ISACTIVEICON",
-    "WM_QUERYPARKICON",
+    "wm_filesyschange", 
+    "wm_isactiveicon",
+    "wm_queryparkicon",
     "WM_QUERYDRAGICON",
-    "WM_QUERYSAVESTATE",
+    "wm_querysavestate",
     "WM_COMPAREITEM", 
-    "WM_TESTING",
+    "wm_testing",
     NULL, 
-    "WM_OTHERWINDOWCREATED", 
-    "WM_OTHERWINDOWDESTROYED", 
-    "WM_ACTIVATESHELLWINDOW",
+    "wm_otherwindowcreated", 
+    "wm_otherwindowdestroyed", 
+    "wm_activateshellwindow",
     NULL,
 
     NULL, 		        /* 0x40 */
-    "WM_COMPACTING", NULL, NULL, 
+    "wm_compacting", NULL, NULL, 
     "WM_COMMNOTIFY", NULL, 
     "WM_WINDOWPOSCHANGING",	/* 0x0046 */
     "WM_WINDOWPOSCHANGED",	/* 0x0047 */
-    "WM_POWER", NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_POWER", NULL, 
+    "WM_COPYDATA", 
+    "WM_CANCELJOURNAL", NULL, NULL, NULL, NULL,
 
     NULL, 		        /* 0x0050 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
@@ -112,8 +114,8 @@
     "WM_NCPAINT",          	/* 0x0085 */
     "WM_NCACTIVATE",       	/* 0x0086 */
     "WM_GETDLGCODE",		/* 0x0087 */
-    "WM_SYNCPAINT", 
-    "WM_SYNCTASK", NULL, NULL, NULL, NULL, NULL, NULL,
+    "wm_syncpaint", 
+    "wm_synctask", NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0090 */
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -265,7 +267,7 @@
     "WM_PARENTNOTIFY",		/* 0x0210 */
     "WM_ENTERMENULOOP",         /* 0x0211 */
     "WM_EXITMENULOOP",          /* 0x0212 */
-    "WM_NEXTMENU", 		/* 0x0213 */
+    "wm_nextmenu", 		/* 0x0213 */
                             NULL, NULL, NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
@@ -292,7 +294,7 @@
     "WM_ENTERSIZEMOVE",		/* 0x0231 */
     "WM_EXITSIZEMOVE",		/* 0x0232 */
     "WM_DROPFILES", 		/* 0x0233 */
-    NULL, NULL, NULL, NULL, 
+    "WM_MDIREFRESHMENU", NULL, NULL, NULL, 
     /* 0x0238*/
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
     
@@ -350,8 +352,9 @@
     "WM_QUERYNEWPALETTE",	/* 0x030f*/
 
     "WM_PALETTEISCHANGING",
-    "WM_PALETTECHANGED", 	/* 0x0311 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
+    "WM_PALETTECHANGED",
+    "WM_HOTKEY", 		/* 0x0312 */
+	  NULL, NULL, NULL, NULL, NULL, NULL, 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, 
 
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
@@ -371,7 +374,13 @@
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     /* 0x0380 */
-    NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
+    "WM_PENWINFIRST", 
+    "WM_RCRESULT", 
+    "WM_HOOKRCRESULT", 
+    "WM_GLOBALRCCHANGE", 
+    "WM_SKB", 
+    "WM_HEDITCTL", 
+					NULL, NULL,
     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
 
     "WM_COALESCE_FIRST", 
diff --git a/misc/ver.c b/misc/ver.c
index 5a47d12..e785cb5 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -674,10 +674,8 @@
 	db=(struct db*)b;
 	*buflen	= db->datalen;
 	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&3);
-	/* now look up what the resp. SEGPTR would be ... 
-	 * we could use MAKE_SEGPTR , but we don't need to
-	 */
+	b	= b+4+((strlen(db->name)+4)&~3);
+	/* now look up what the resp. SEGPTR would be ... */
 	*buffer	= (b-block)+segblock;
 	fprintf(stderr,"	-> %s=%s\n",subblock,b);
 	return 1;
@@ -703,7 +701,7 @@
 	db=(struct db*)b;
 	*buflen	= db->datalen;
 	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&3);
+	b	= b+4+((strlen(db->name)+4)&~3);
 	*buffer	= b;
 	fprintf(stderr,"	-> %s=%s\n",subblock,b);
 	return 1;
@@ -733,7 +731,7 @@
 	db=(struct db*)b;
 	*buflen	= db->datalen;
 	/* let b point to data area */
-	b	= b+4+((strlen(db->name)+4)&3);
+	b	= b+4+((strlen(db->name)+4)&~3);
 	*buffer	= b;
 	fprintf(stderr,"	-> %s=%s\n",sb,b);
 	free(sb);