shell32: rename a 16-Bit File (shell)

Detlef Riekenberg wine.dev at web.de
Wed Jan 31 16:43:19 CST 2007


Janatorial: 16-Bit Separation


Changelog:
- shell32: rename a 16-Bit File (shell.c)


-- 
 
By by ... Detlef

-------------- next part --------------
>From 9a50884d61af95e3a4e3041817fd89b367cc6aac Mon Sep 17 00:00:00 2001
From: Detlef Riekenberg <wine.dev at web.de>
Date: Wed, 31 Jan 2007 23:40:12 +0100
Subject: [PATCH] shell32: rename a 16-Bit File (shell.c)
---
 dlls/shell32/Makefile.in |    2 
 dlls/shell32/shell.c     |  637 ----------------------------------------------
 dlls/shell32/shell16.c   |  637 ++++++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 638 insertions(+), 638 deletions(-)

diff --git a/dlls/shell32/Makefile.in b/dlls/shell32/Makefile.in
index 0520276..bbe67d6 100644
--- a/dlls/shell32/Makefile.in
+++ b/dlls/shell32/Makefile.in
@@ -73,7 +73,7 @@ RC_BINARIES = \
 	shortcut.ico \
 	trash_file.ico
 
-C_SRCS16  = shell.c
+C_SRCS16  = shell16.c
 RC_SRCS16 = version16.rc
 SPEC_SRCS16 = shell.spec
 
diff --git a/dlls/shell32/shell.c b/dlls/shell32/shell.c
deleted file mode 100644
index e8f3fc1..0000000
--- a/dlls/shell32/shell.c
+++ /dev/null
@@ -1,637 +0,0 @@
-/*
- * 				Shell Library Functions
- *
- * Copyright 1998 Marcus Meissner
- * Copyright 2000 Juergen Schmied
- * Copyright 2002 Eric Pouech
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
- */
-
-#include "config.h"
-#include "wine/port.h"
-
-#include <stdarg.h>
-#include <stdlib.h>
-#include <string.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
-#include <ctype.h>
-
-#include "windef.h"
-#include "winbase.h"
-#include "winerror.h"
-#include "winreg.h"
-#include "wownt32.h"
-#include "dlgs.h"
-#include "shellapi.h"
-#include "winuser.h"
-#include "wingdi.h"
-#include "shlobj.h"
-#include "shlwapi.h"
-#include "ddeml.h"
-
-#include "wine/winbase16.h"
-#include "wine/winuser16.h"
-#include "shell32_main.h"
-
-#include "wine/debug.h"
-
-WINE_DEFAULT_DEBUG_CHANNEL(shell);
-
-
-typedef struct {     /* structure for dropped files */
- WORD     wSize;
- POINT16  ptMousePos;
- BOOL16   fInNonClientArea;
- /* memory block with filenames follows */
-} DROPFILESTRUCT16, *LPDROPFILESTRUCT16;
-
-static const char lpstrMsgWndCreated[] = "OTHERWINDOWCREATED";
-static const char lpstrMsgWndDestroyed[] = "OTHERWINDOWDESTROYED";
-static const char lpstrMsgShellActivate[] = "ACTIVATESHELLWINDOW";
-
-static HWND	SHELL_hWnd = 0;
-static HHOOK	SHELL_hHook = 0;
-static UINT	uMsgWndCreated = 0;
-static UINT	uMsgWndDestroyed = 0;
-static UINT	uMsgShellActivate = 0;
-
-/***********************************************************************
- * DllEntryPoint [SHELL.101]
- *
- * Initialization code for shell.dll. Automatically loads the
- * 32-bit shell32.dll to allow thunking up to 32-bit code.
- *
- * RETURNS
- *  Success: TRUE. Initialization completed successfully.
- *  Failure: FALSE.
- */
-BOOL WINAPI SHELL_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst,
-				WORD ds, WORD HeapSize, DWORD res1, WORD res2)
-{
-    return TRUE;
-}
-
-/*************************************************************************
- *				DragAcceptFiles		[SHELL.9]
- */
-void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b)
-{
-  DragAcceptFiles(HWND_32(hWnd), b);
-}
-
-/*************************************************************************
- *				DragQueryFile		[SHELL.11]
- */
-UINT16 WINAPI DragQueryFile16(
-	HDROP16 hDrop,
-	WORD wFile,
-	LPSTR lpszFile,
-	WORD wLength)
-{
- 	LPSTR lpDrop;
-	UINT i = 0;
-	LPDROPFILESTRUCT16 lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
-
-	TRACE("(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength);
-
-	if(!lpDropFileStruct) goto end;
-
-	lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
-
-	while (i++ < wFile)
-	{
-	  while (*lpDrop++); /* skip filename */
-	  if (!*lpDrop)
-	  {
-	    i = (wFile == 0xFFFF) ? i : 0;
-	    goto end;
-	  }
-	}
-
-	i = strlen(lpDrop);
-	i++;
-	if (!lpszFile ) goto end;   /* needed buffer size */
-	i = (wLength > i) ? i : wLength;
-	lstrcpynA (lpszFile,  lpDrop,  i);
-end:
-	GlobalUnlock16(hDrop);
-	return i;
-}
-
-/*************************************************************************
- *				DragFinish		[SHELL.12]
- */
-void WINAPI DragFinish16(HDROP16 h)
-{
-    TRACE("\n");
-    GlobalFree16((HGLOBAL16)h);
-}
-
-
-/*************************************************************************
- *				DragQueryPoint		[SHELL.13]
- */
-BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p)
-{
-  LPDROPFILESTRUCT16 lpDropFileStruct;
-  BOOL16           bRet;
-  TRACE("\n");
-  lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
-
-  memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT16));
-  bRet = lpDropFileStruct->fInNonClientArea;
-
-  GlobalUnlock16(hDrop);
-  return bRet;
-}
-
-/*************************************************************************
- *             FindExecutable   (SHELL.21)
- */
-HINSTANCE16 WINAPI FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
-                                     LPSTR lpResult )
-{ return HINSTANCE_16(FindExecutableA( lpFile, lpDirectory, lpResult ));
-}
-
-/*************************************************************************
- *             AboutDlgProc   (SHELL.33)
- */
-BOOL16 WINAPI AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam,
-                               LPARAM lParam )
-{ return (BOOL16)AboutDlgProc( HWND_32(hWnd), msg, wParam, lParam );
-}
-
-
-/*************************************************************************
- *             ShellAbout   (SHELL.22)
- */
-BOOL16 WINAPI ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
-                            HICON16 hIcon )
-{ return ShellAboutA( HWND_32(hWnd), szApp, szOtherStuff, HICON_32(hIcon) );
-}
-
-/*************************************************************************
- *			InternalExtractIcon		[SHELL.39]
- *
- * This abortion is called directly by Progman
- */
-HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance,
-                                     LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n )
-{
-    HGLOBAL16 hRet = 0;
-    HICON16 *RetPtr = NULL;
-    OFSTRUCT ofs;
-
-	TRACE("(%04x,file %s,start %d,extract %d\n",
-		       hInstance, lpszExeFileName, nIconIndex, n);
-
-	if (!n)
-	  return 0;
-
-	hRet = GlobalAlloc16(GMEM_FIXED | GMEM_ZEROINIT, sizeof(*RetPtr) * n);
-	RetPtr = (HICON16*)GlobalLock16(hRet);
-
-	if (nIconIndex == (UINT16)-1)  /* get number of icons */
-	{
-	  RetPtr[0] = PrivateExtractIconsA(ofs.szPathName, 0, 0, 0, NULL, NULL, 0, LR_DEFAULTCOLOR);
-	}
-	else
-	{
-	  UINT ret;
-	  HICON *icons;
-
-	  icons = HeapAlloc(GetProcessHeap(), 0, n * sizeof(*icons));
-	  ret = PrivateExtractIconsA(ofs.szPathName, nIconIndex,
-	                             GetSystemMetrics(SM_CXICON),
-	                             GetSystemMetrics(SM_CYICON),
-	                             icons, NULL, n, LR_DEFAULTCOLOR);
-	  if ((ret != 0xffffffff) && ret)
-	  {
-	    int i;
-	    for (i = 0; i < n; i++) RetPtr[i] = HICON_16(icons[i]);
-	  }
-	  else
-	  {
-	    GlobalFree16(hRet);
-	    hRet = 0;
-	  }
-	  HeapFree(GetProcessHeap(), 0, icons);
-	}
-	return hRet;
-}
-
-/*************************************************************************
- *             ExtractIcon   (SHELL.34)
- */
-HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
-	UINT16 nIconIndex )
-{   TRACE("\n");
-    return HICON_16(ExtractIconA(HINSTANCE_32(hInstance), lpszExeFileName, nIconIndex));
-}
-
-/*************************************************************************
- *             ExtractIconEx   (SHELL.40)
- */
-HICON16 WINAPI ExtractIconEx16(
-	LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge,
-	HICON16 *phiconSmall, UINT16 nIcons
-) {
-    HICON	*ilarge,*ismall;
-    UINT16	ret;
-    int		i;
-
-    if (phiconLarge)
-    	ilarge = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
-    else
-    	ilarge = NULL;
-    if (phiconSmall)
-    	ismall = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
-    else
-    	ismall = NULL;
-    ret = HICON_16(ExtractIconExA(lpszFile,nIconIndex,ilarge,ismall,nIcons));
-    if (ilarge) {
-    	for (i=0;i<nIcons;i++)
-	    phiconLarge[i]=HICON_16(ilarge[i]);
-	HeapFree(GetProcessHeap(),0,ilarge);
-    }
-    if (ismall) {
-    	for (i=0;i<nIcons;i++)
-	    phiconSmall[i]=HICON_16(ismall[i]);
-	HeapFree(GetProcessHeap(),0,ismall);
-    }
-    return ret;
-}
-
-/*************************************************************************
- *				ExtractAssociatedIcon	[SHELL.36]
- *
- * Return icon for given file (either from file itself or from associated
- * executable) and patch parameters if needed.
- */
-HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
-{
-    return HICON_16(ExtractAssociatedIconA(HINSTANCE_32(hInst), lpIconPath,
-		    lpiIcon));
-}
-
-/*************************************************************************
- *				FindEnvironmentString	[SHELL.38]
- *
- * Returns a pointer into the DOS environment... Ugh.
- */
-static LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
-{ UINT16 l;
-
-  TRACE("\n");
-
-  l = strlen(entry);
-  for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
-  { if( strncasecmp(lpEnv, entry, l) )
-      continue;
-	if( !*(lpEnv+l) )
-	    return (lpEnv + l); 		/* empty entry */
-	else if ( *(lpEnv+l)== '=' )
-	    return (lpEnv + l + 1);
-    }
-    return NULL;
-}
-
-/**********************************************************************/
-
-SEGPTR WINAPI FindEnvironmentString16(LPSTR str)
-{ SEGPTR  spEnv;
-  LPSTR lpEnv,lpString;
-  TRACE("\n");
-
-  spEnv = GetDOSEnvironment16();
-
-  lpEnv = MapSL(spEnv);
-  lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL;
-
-    if( lpString )		/*  offset should be small enough */
-	return spEnv + (lpString - lpEnv);
-    return (SEGPTR)NULL;
-}
-
-/*************************************************************************
- *              		DoEnvironmentSubst      [SHELL.37]
- *
- * Replace %KEYWORD% in the str with the value of variable KEYWORD
- * from "DOS" environment. If it is not found the %KEYWORD% is left
- * intact. If the buffer is too small, str is not modified.
- *
- * PARAMS
- *  str        [I] '\0' terminated string with %keyword%.
- *             [O] '\0' terminated string with %keyword% substituted.
- *  length     [I] size of str.
- *
- * RETURNS
- *  str length in the LOWORD and 1 in HIWORD if subst was successful.
- */
-DWORD WINAPI DoEnvironmentSubst16(LPSTR str,WORD length)
-{
-  LPSTR   lpEnv = MapSL(GetDOSEnvironment16());
-  LPSTR   lpstr = str;
-  LPSTR   lpend;
-  LPSTR   lpBuffer = HeapAlloc( GetProcessHeap(), 0, length);
-  WORD    bufCnt = 0;
-  WORD    envKeyLen;
-  LPSTR   lpKey;
-  WORD    retStatus = 0;
-  WORD    retLength = length;
-
-  CharToOemA(str,str);
-
-  TRACE("accept %s\n", str);
-
-  while( *lpstr && bufCnt <= length - 1 ) {
-     if ( *lpstr != '%' ) {
-        lpBuffer[bufCnt++] = *lpstr++;
-        continue;
-     }
-
-     for( lpend = lpstr + 1; *lpend && *lpend != '%'; lpend++) /**/;
-
-     envKeyLen = lpend - lpstr - 1;
-     if( *lpend != '%' || envKeyLen == 0)
-        goto err; /* "%\0" or "%%" found; back off and whine */
-
-     *lpend = '\0';
-     lpKey = SHELL_FindString(lpEnv, lpstr+1);
-     *lpend = '%';
-     if( lpKey ) {
-         int l = strlen(lpKey);
-
-         if( bufCnt + l > length - 1 )
-                goto err;
-
-        memcpy(lpBuffer + bufCnt, lpKey, l);
-        bufCnt += l;
-     } else { /* Keyword not found; Leave the %KEYWORD% intact */
-        if( bufCnt + envKeyLen + 2 > length - 1 )
-            goto err;
-
-         memcpy(lpBuffer + bufCnt, lpstr, envKeyLen + 2);
-        bufCnt += envKeyLen + 2;
-     }
-
-     lpstr = lpend + 1;
-  }
-
-  if (!*lpstr && bufCnt <= length - 1) {
-      memcpy(str,lpBuffer, bufCnt);
-      str[bufCnt] = '\0';
-      retLength = bufCnt + 1;
-      retStatus = 1;
-  }
-
-  err:
-  if (!retStatus)
-      WARN("-- Env subst aborted - string too short or invalid input\n");
-  TRACE("-- return %s\n", str);
-
-  OemToCharA(str,str);
-  HeapFree( GetProcessHeap(), 0, lpBuffer);
-
-  return (DWORD)MAKELONG(retLength, retStatus);
-}
-
-/*************************************************************************
- *				SHELL_HookProc
- *
- * 32-bit version of the system-wide WH_SHELL hook.
- */
-static LRESULT WINAPI SHELL_HookProc(INT code, WPARAM wParam, LPARAM lParam)
-{
-    TRACE("%i, %x, %08lx\n", code, wParam, lParam );
-
-    if (SHELL_hWnd)
-    {
-        switch( code )
-        {
-        case HSHELL_WINDOWCREATED:
-            PostMessageA( SHELL_hWnd, uMsgWndCreated, wParam, 0 );
-            break;
-        case HSHELL_WINDOWDESTROYED:
-            PostMessageA( SHELL_hWnd, uMsgWndDestroyed, wParam, 0 );
-            break;
-        case HSHELL_ACTIVATESHELLWINDOW:
-            PostMessageA( SHELL_hWnd, uMsgShellActivate, wParam, 0 );
-            break;
-        }
-    }
-    return CallNextHookEx( SHELL_hHook, code, wParam, lParam );
-}
-
-/*************************************************************************
- *				ShellHookProc		[SHELL.103]
- * System-wide WH_SHELL hook.
- */
-LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam)
-{
-    return SHELL_HookProc( code, wParam, lParam );
-}
-
-/*************************************************************************
- *				RegisterShellHook	[SHELL.102]
- */
-BOOL WINAPI RegisterShellHook16(HWND16 hWnd, UINT16 uAction)
-{
-    TRACE("%04x [%u]\n", hWnd, uAction );
-
-    switch( uAction )
-    {
-    case 2:  /* register hWnd as a shell window */
-        if( !SHELL_hHook )
-        {
-            SHELL_hHook = SetWindowsHookExA( WH_SHELL, SHELL_HookProc,
-                                             GetModuleHandleA("shell32.dll"), 0 );
-            if ( SHELL_hHook )
-            {
-                uMsgWndCreated = RegisterWindowMessageA( lpstrMsgWndCreated );
-                uMsgWndDestroyed = RegisterWindowMessageA( lpstrMsgWndDestroyed );
-                uMsgShellActivate = RegisterWindowMessageA( lpstrMsgShellActivate );
-            }
-            else
-                WARN("-- unable to install ShellHookProc()!\n");
-        }
-
-        if ( SHELL_hHook )
-            return ((SHELL_hWnd = HWND_32(hWnd)) != 0);
-        break;
-
-    default:
-        WARN("-- unknown code %i\n", uAction );
-        SHELL_hWnd = 0; /* just in case */
-    }
-    return FALSE;
-}
-
-
-/***********************************************************************
- *           DriveType   (SHELL.262)
- */
-UINT16 WINAPI DriveType16( UINT16 drive )
-{
-    UINT ret;
-    char path[] = "A:\\";
-    path[0] += drive;
-    ret = GetDriveTypeA(path);
-    switch(ret)  /* some values are not supported in Win16 */
-    {
-    case DRIVE_CDROM:
-        ret = DRIVE_REMOTE;
-        break;
-    case DRIVE_NO_ROOT_DIR:
-        ret = DRIVE_UNKNOWN;
-        break;
-    }
-    return ret;
-}
-
-
-/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by
- * some programs. Do not remove those cases. -MM
- */
-static inline void fix_win16_hkey( HKEY *hkey )
-{
-    if (*hkey == 0 || *hkey == (HKEY)1) *hkey = HKEY_CLASSES_ROOT;
-}
-
-/******************************************************************************
- *           RegOpenKey   [SHELL.1]
- */
-DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, PHKEY retkey )
-{
-    fix_win16_hkey( &hkey );
-    return RegOpenKeyA( hkey, name, retkey );
-}
-
-/******************************************************************************
- *           RegCreateKey   [SHELL.2]
- */
-DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, PHKEY retkey )
-{
-    fix_win16_hkey( &hkey );
-    return RegCreateKeyA( hkey, name, retkey );
-}
-
-/******************************************************************************
- *           RegCloseKey   [SHELL.3]
- */
-DWORD WINAPI RegCloseKey16( HKEY hkey )
-{
-    fix_win16_hkey( &hkey );
-    return RegCloseKey( hkey );
-}
-
-/******************************************************************************
- *           RegDeleteKey   [SHELL.4]
- */
-DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name )
-{
-    fix_win16_hkey( &hkey );
-    return RegDeleteKeyA( hkey, name );
-}
-
-/******************************************************************************
- *           RegSetValue   [SHELL.5]
- */
-DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count )
-{
-    fix_win16_hkey( &hkey );
-    return RegSetValueA( hkey, name, type, data, count );
-}
-
-/******************************************************************************
- *           RegQueryValue   [SHELL.6]
- *
- * NOTES
- *    Is this HACK still applicable?
- *
- * HACK
- *    The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just
- *    mask out the high 16 bit.  This (not so much incidently) hopefully fixes
- *    Aldus FH4)
- */
-DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count
-)
-{
-    fix_win16_hkey( &hkey );
-    if (count) *count &= 0xffff;
-    return RegQueryValueA( hkey, name, data, (LONG*) count );
-}
-
-/******************************************************************************
- *           RegEnumKey   [SHELL.7]
- */
-DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len )
-{
-    fix_win16_hkey( &hkey );
-    return RegEnumKeyA( hkey, index, name, name_len );
-}
-
-/*************************************************************************
- *           SHELL_Execute16 [Internal]
- */
-static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
-			    LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
-{
-    UINT ret;
-    char sCmd[MAX_PATH];
-    WideCharToMultiByte(CP_ACP, 0, lpCmd, -1, sCmd, MAX_PATH, NULL, NULL);
-    ret = WinExec16(sCmd, (UINT16)psei->nShow);
-    psei_out->hInstApp = HINSTANCE_32(ret);
-    return ret;
-}
-
-/*************************************************************************
- *                              ShellExecute            [SHELL.20]
- */
-HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
-                                   LPCSTR lpFile, LPCSTR lpParameters,
-                                   LPCSTR lpDirectory, INT16 iShowCmd )
-{
-    SHELLEXECUTEINFOW seiW;
-    WCHAR *wVerb = NULL, *wFile = NULL, *wParameters = NULL, *wDirectory = NULL;
-    HANDLE hProcess = 0;
-
-    seiW.lpVerb = lpOperation ? __SHCloneStrAtoW(&wVerb, lpOperation) : NULL;
-    seiW.lpFile = lpFile ? __SHCloneStrAtoW(&wFile, lpFile) : NULL;
-    seiW.lpParameters = lpParameters ? __SHCloneStrAtoW(&wParameters, lpParameters) : NULL;
-    seiW.lpDirectory = lpDirectory ? __SHCloneStrAtoW(&wDirectory, lpDirectory) : NULL;
-
-    seiW.cbSize = sizeof(seiW);
-    seiW.fMask = 0;
-    seiW.hwnd = HWND_32(hWnd);
-    seiW.nShow = iShowCmd;
-    seiW.lpIDList = 0;
-    seiW.lpClass = 0;
-    seiW.hkeyClass = 0;
-    seiW.dwHotKey = 0;
-    seiW.hProcess = hProcess;
-
-    SHELL_execute( &seiW, SHELL_Execute16 );
-
-    SHFree(wVerb);
-    SHFree(wFile);
-    SHFree(wParameters);
-    SHFree(wDirectory);
-
-    return HINSTANCE_16(seiW.hInstApp);
-}
diff --git a/dlls/shell32/shell16.c b/dlls/shell32/shell16.c
new file mode 100644
index 0000000..e8f3fc1
--- /dev/null
+++ b/dlls/shell32/shell16.c
@@ -0,0 +1,637 @@
+/*
+ * 				Shell Library Functions
+ *
+ * Copyright 1998 Marcus Meissner
+ * Copyright 2000 Juergen Schmied
+ * Copyright 2002 Eric Pouech
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include "config.h"
+#include "wine/port.h"
+
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+#include <ctype.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winerror.h"
+#include "winreg.h"
+#include "wownt32.h"
+#include "dlgs.h"
+#include "shellapi.h"
+#include "winuser.h"
+#include "wingdi.h"
+#include "shlobj.h"
+#include "shlwapi.h"
+#include "ddeml.h"
+
+#include "wine/winbase16.h"
+#include "wine/winuser16.h"
+#include "shell32_main.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(shell);
+
+
+typedef struct {     /* structure for dropped files */
+ WORD     wSize;
+ POINT16  ptMousePos;
+ BOOL16   fInNonClientArea;
+ /* memory block with filenames follows */
+} DROPFILESTRUCT16, *LPDROPFILESTRUCT16;
+
+static const char lpstrMsgWndCreated[] = "OTHERWINDOWCREATED";
+static const char lpstrMsgWndDestroyed[] = "OTHERWINDOWDESTROYED";
+static const char lpstrMsgShellActivate[] = "ACTIVATESHELLWINDOW";
+
+static HWND	SHELL_hWnd = 0;
+static HHOOK	SHELL_hHook = 0;
+static UINT	uMsgWndCreated = 0;
+static UINT	uMsgWndDestroyed = 0;
+static UINT	uMsgShellActivate = 0;
+
+/***********************************************************************
+ * DllEntryPoint [SHELL.101]
+ *
+ * Initialization code for shell.dll. Automatically loads the
+ * 32-bit shell32.dll to allow thunking up to 32-bit code.
+ *
+ * RETURNS
+ *  Success: TRUE. Initialization completed successfully.
+ *  Failure: FALSE.
+ */
+BOOL WINAPI SHELL_DllEntryPoint(DWORD Reason, HINSTANCE16 hInst,
+				WORD ds, WORD HeapSize, DWORD res1, WORD res2)
+{
+    return TRUE;
+}
+
+/*************************************************************************
+ *				DragAcceptFiles		[SHELL.9]
+ */
+void WINAPI DragAcceptFiles16(HWND16 hWnd, BOOL16 b)
+{
+  DragAcceptFiles(HWND_32(hWnd), b);
+}
+
+/*************************************************************************
+ *				DragQueryFile		[SHELL.11]
+ */
+UINT16 WINAPI DragQueryFile16(
+	HDROP16 hDrop,
+	WORD wFile,
+	LPSTR lpszFile,
+	WORD wLength)
+{
+ 	LPSTR lpDrop;
+	UINT i = 0;
+	LPDROPFILESTRUCT16 lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
+
+	TRACE("(%04x, %x, %p, %u)\n", hDrop,wFile,lpszFile,wLength);
+
+	if(!lpDropFileStruct) goto end;
+
+	lpDrop = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
+
+	while (i++ < wFile)
+	{
+	  while (*lpDrop++); /* skip filename */
+	  if (!*lpDrop)
+	  {
+	    i = (wFile == 0xFFFF) ? i : 0;
+	    goto end;
+	  }
+	}
+
+	i = strlen(lpDrop);
+	i++;
+	if (!lpszFile ) goto end;   /* needed buffer size */
+	i = (wLength > i) ? i : wLength;
+	lstrcpynA (lpszFile,  lpDrop,  i);
+end:
+	GlobalUnlock16(hDrop);
+	return i;
+}
+
+/*************************************************************************
+ *				DragFinish		[SHELL.12]
+ */
+void WINAPI DragFinish16(HDROP16 h)
+{
+    TRACE("\n");
+    GlobalFree16((HGLOBAL16)h);
+}
+
+
+/*************************************************************************
+ *				DragQueryPoint		[SHELL.13]
+ */
+BOOL16 WINAPI DragQueryPoint16(HDROP16 hDrop, POINT16 *p)
+{
+  LPDROPFILESTRUCT16 lpDropFileStruct;
+  BOOL16           bRet;
+  TRACE("\n");
+  lpDropFileStruct = (LPDROPFILESTRUCT16) GlobalLock16(hDrop);
+
+  memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT16));
+  bRet = lpDropFileStruct->fInNonClientArea;
+
+  GlobalUnlock16(hDrop);
+  return bRet;
+}
+
+/*************************************************************************
+ *             FindExecutable   (SHELL.21)
+ */
+HINSTANCE16 WINAPI FindExecutable16( LPCSTR lpFile, LPCSTR lpDirectory,
+                                     LPSTR lpResult )
+{ return HINSTANCE_16(FindExecutableA( lpFile, lpDirectory, lpResult ));
+}
+
+/*************************************************************************
+ *             AboutDlgProc   (SHELL.33)
+ */
+BOOL16 WINAPI AboutDlgProc16( HWND16 hWnd, UINT16 msg, WPARAM16 wParam,
+                               LPARAM lParam )
+{ return (BOOL16)AboutDlgProc( HWND_32(hWnd), msg, wParam, lParam );
+}
+
+
+/*************************************************************************
+ *             ShellAbout   (SHELL.22)
+ */
+BOOL16 WINAPI ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
+                            HICON16 hIcon )
+{ return ShellAboutA( HWND_32(hWnd), szApp, szOtherStuff, HICON_32(hIcon) );
+}
+
+/*************************************************************************
+ *			InternalExtractIcon		[SHELL.39]
+ *
+ * This abortion is called directly by Progman
+ */
+HGLOBAL16 WINAPI InternalExtractIcon16(HINSTANCE16 hInstance,
+                                     LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n )
+{
+    HGLOBAL16 hRet = 0;
+    HICON16 *RetPtr = NULL;
+    OFSTRUCT ofs;
+
+	TRACE("(%04x,file %s,start %d,extract %d\n",
+		       hInstance, lpszExeFileName, nIconIndex, n);
+
+	if (!n)
+	  return 0;
+
+	hRet = GlobalAlloc16(GMEM_FIXED | GMEM_ZEROINIT, sizeof(*RetPtr) * n);
+	RetPtr = (HICON16*)GlobalLock16(hRet);
+
+	if (nIconIndex == (UINT16)-1)  /* get number of icons */
+	{
+	  RetPtr[0] = PrivateExtractIconsA(ofs.szPathName, 0, 0, 0, NULL, NULL, 0, LR_DEFAULTCOLOR);
+	}
+	else
+	{
+	  UINT ret;
+	  HICON *icons;
+
+	  icons = HeapAlloc(GetProcessHeap(), 0, n * sizeof(*icons));
+	  ret = PrivateExtractIconsA(ofs.szPathName, nIconIndex,
+	                             GetSystemMetrics(SM_CXICON),
+	                             GetSystemMetrics(SM_CYICON),
+	                             icons, NULL, n, LR_DEFAULTCOLOR);
+	  if ((ret != 0xffffffff) && ret)
+	  {
+	    int i;
+	    for (i = 0; i < n; i++) RetPtr[i] = HICON_16(icons[i]);
+	  }
+	  else
+	  {
+	    GlobalFree16(hRet);
+	    hRet = 0;
+	  }
+	  HeapFree(GetProcessHeap(), 0, icons);
+	}
+	return hRet;
+}
+
+/*************************************************************************
+ *             ExtractIcon   (SHELL.34)
+ */
+HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
+	UINT16 nIconIndex )
+{   TRACE("\n");
+    return HICON_16(ExtractIconA(HINSTANCE_32(hInstance), lpszExeFileName, nIconIndex));
+}
+
+/*************************************************************************
+ *             ExtractIconEx   (SHELL.40)
+ */
+HICON16 WINAPI ExtractIconEx16(
+	LPCSTR lpszFile, INT16 nIconIndex, HICON16 *phiconLarge,
+	HICON16 *phiconSmall, UINT16 nIcons
+) {
+    HICON	*ilarge,*ismall;
+    UINT16	ret;
+    int		i;
+
+    if (phiconLarge)
+    	ilarge = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
+    else
+    	ilarge = NULL;
+    if (phiconSmall)
+    	ismall = HeapAlloc(GetProcessHeap(),0,nIcons*sizeof(HICON));
+    else
+    	ismall = NULL;
+    ret = HICON_16(ExtractIconExA(lpszFile,nIconIndex,ilarge,ismall,nIcons));
+    if (ilarge) {
+    	for (i=0;i<nIcons;i++)
+	    phiconLarge[i]=HICON_16(ilarge[i]);
+	HeapFree(GetProcessHeap(),0,ilarge);
+    }
+    if (ismall) {
+    	for (i=0;i<nIcons;i++)
+	    phiconSmall[i]=HICON_16(ismall[i]);
+	HeapFree(GetProcessHeap(),0,ismall);
+    }
+    return ret;
+}
+
+/*************************************************************************
+ *				ExtractAssociatedIcon	[SHELL.36]
+ *
+ * Return icon for given file (either from file itself or from associated
+ * executable) and patch parameters if needed.
+ */
+HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
+{
+    return HICON_16(ExtractAssociatedIconA(HINSTANCE_32(hInst), lpIconPath,
+		    lpiIcon));
+}
+
+/*************************************************************************
+ *				FindEnvironmentString	[SHELL.38]
+ *
+ * Returns a pointer into the DOS environment... Ugh.
+ */
+static LPSTR SHELL_FindString(LPSTR lpEnv, LPCSTR entry)
+{ UINT16 l;
+
+  TRACE("\n");
+
+  l = strlen(entry);
+  for( ; *lpEnv ; lpEnv+=strlen(lpEnv)+1 )
+  { if( strncasecmp(lpEnv, entry, l) )
+      continue;
+	if( !*(lpEnv+l) )
+	    return (lpEnv + l); 		/* empty entry */
+	else if ( *(lpEnv+l)== '=' )
+	    return (lpEnv + l + 1);
+    }
+    return NULL;
+}
+
+/**********************************************************************/
+
+SEGPTR WINAPI FindEnvironmentString16(LPSTR str)
+{ SEGPTR  spEnv;
+  LPSTR lpEnv,lpString;
+  TRACE("\n");
+
+  spEnv = GetDOSEnvironment16();
+
+  lpEnv = MapSL(spEnv);
+  lpString = (spEnv)?SHELL_FindString(lpEnv, str):NULL;
+
+    if( lpString )		/*  offset should be small enough */
+	return spEnv + (lpString - lpEnv);
+    return (SEGPTR)NULL;
+}
+
+/*************************************************************************
+ *              		DoEnvironmentSubst      [SHELL.37]
+ *
+ * Replace %KEYWORD% in the str with the value of variable KEYWORD
+ * from "DOS" environment. If it is not found the %KEYWORD% is left
+ * intact. If the buffer is too small, str is not modified.
+ *
+ * PARAMS
+ *  str        [I] '\0' terminated string with %keyword%.
+ *             [O] '\0' terminated string with %keyword% substituted.
+ *  length     [I] size of str.
+ *
+ * RETURNS
+ *  str length in the LOWORD and 1 in HIWORD if subst was successful.
+ */
+DWORD WINAPI DoEnvironmentSubst16(LPSTR str,WORD length)
+{
+  LPSTR   lpEnv = MapSL(GetDOSEnvironment16());
+  LPSTR   lpstr = str;
+  LPSTR   lpend;
+  LPSTR   lpBuffer = HeapAlloc( GetProcessHeap(), 0, length);
+  WORD    bufCnt = 0;
+  WORD    envKeyLen;
+  LPSTR   lpKey;
+  WORD    retStatus = 0;
+  WORD    retLength = length;
+
+  CharToOemA(str,str);
+
+  TRACE("accept %s\n", str);
+
+  while( *lpstr && bufCnt <= length - 1 ) {
+     if ( *lpstr != '%' ) {
+        lpBuffer[bufCnt++] = *lpstr++;
+        continue;
+     }
+
+     for( lpend = lpstr + 1; *lpend && *lpend != '%'; lpend++) /**/;
+
+     envKeyLen = lpend - lpstr - 1;
+     if( *lpend != '%' || envKeyLen == 0)
+        goto err; /* "%\0" or "%%" found; back off and whine */
+
+     *lpend = '\0';
+     lpKey = SHELL_FindString(lpEnv, lpstr+1);
+     *lpend = '%';
+     if( lpKey ) {
+         int l = strlen(lpKey);
+
+         if( bufCnt + l > length - 1 )
+                goto err;
+
+        memcpy(lpBuffer + bufCnt, lpKey, l);
+        bufCnt += l;
+     } else { /* Keyword not found; Leave the %KEYWORD% intact */
+        if( bufCnt + envKeyLen + 2 > length - 1 )
+            goto err;
+
+         memcpy(lpBuffer + bufCnt, lpstr, envKeyLen + 2);
+        bufCnt += envKeyLen + 2;
+     }
+
+     lpstr = lpend + 1;
+  }
+
+  if (!*lpstr && bufCnt <= length - 1) {
+      memcpy(str,lpBuffer, bufCnt);
+      str[bufCnt] = '\0';
+      retLength = bufCnt + 1;
+      retStatus = 1;
+  }
+
+  err:
+  if (!retStatus)
+      WARN("-- Env subst aborted - string too short or invalid input\n");
+  TRACE("-- return %s\n", str);
+
+  OemToCharA(str,str);
+  HeapFree( GetProcessHeap(), 0, lpBuffer);
+
+  return (DWORD)MAKELONG(retLength, retStatus);
+}
+
+/*************************************************************************
+ *				SHELL_HookProc
+ *
+ * 32-bit version of the system-wide WH_SHELL hook.
+ */
+static LRESULT WINAPI SHELL_HookProc(INT code, WPARAM wParam, LPARAM lParam)
+{
+    TRACE("%i, %x, %08lx\n", code, wParam, lParam );
+
+    if (SHELL_hWnd)
+    {
+        switch( code )
+        {
+        case HSHELL_WINDOWCREATED:
+            PostMessageA( SHELL_hWnd, uMsgWndCreated, wParam, 0 );
+            break;
+        case HSHELL_WINDOWDESTROYED:
+            PostMessageA( SHELL_hWnd, uMsgWndDestroyed, wParam, 0 );
+            break;
+        case HSHELL_ACTIVATESHELLWINDOW:
+            PostMessageA( SHELL_hWnd, uMsgShellActivate, wParam, 0 );
+            break;
+        }
+    }
+    return CallNextHookEx( SHELL_hHook, code, wParam, lParam );
+}
+
+/*************************************************************************
+ *				ShellHookProc		[SHELL.103]
+ * System-wide WH_SHELL hook.
+ */
+LRESULT WINAPI ShellHookProc16(INT16 code, WPARAM16 wParam, LPARAM lParam)
+{
+    return SHELL_HookProc( code, wParam, lParam );
+}
+
+/*************************************************************************
+ *				RegisterShellHook	[SHELL.102]
+ */
+BOOL WINAPI RegisterShellHook16(HWND16 hWnd, UINT16 uAction)
+{
+    TRACE("%04x [%u]\n", hWnd, uAction );
+
+    switch( uAction )
+    {
+    case 2:  /* register hWnd as a shell window */
+        if( !SHELL_hHook )
+        {
+            SHELL_hHook = SetWindowsHookExA( WH_SHELL, SHELL_HookProc,
+                                             GetModuleHandleA("shell32.dll"), 0 );
+            if ( SHELL_hHook )
+            {
+                uMsgWndCreated = RegisterWindowMessageA( lpstrMsgWndCreated );
+                uMsgWndDestroyed = RegisterWindowMessageA( lpstrMsgWndDestroyed );
+                uMsgShellActivate = RegisterWindowMessageA( lpstrMsgShellActivate );
+            }
+            else
+                WARN("-- unable to install ShellHookProc()!\n");
+        }
+
+        if ( SHELL_hHook )
+            return ((SHELL_hWnd = HWND_32(hWnd)) != 0);
+        break;
+
+    default:
+        WARN("-- unknown code %i\n", uAction );
+        SHELL_hWnd = 0; /* just in case */
+    }
+    return FALSE;
+}
+
+
+/***********************************************************************
+ *           DriveType   (SHELL.262)
+ */
+UINT16 WINAPI DriveType16( UINT16 drive )
+{
+    UINT ret;
+    char path[] = "A:\\";
+    path[0] += drive;
+    ret = GetDriveTypeA(path);
+    switch(ret)  /* some values are not supported in Win16 */
+    {
+    case DRIVE_CDROM:
+        ret = DRIVE_REMOTE;
+        break;
+    case DRIVE_NO_ROOT_DIR:
+        ret = DRIVE_UNKNOWN;
+        break;
+    }
+    return ret;
+}
+
+
+/* 0 and 1 are valid rootkeys in win16 shell.dll and are used by
+ * some programs. Do not remove those cases. -MM
+ */
+static inline void fix_win16_hkey( HKEY *hkey )
+{
+    if (*hkey == 0 || *hkey == (HKEY)1) *hkey = HKEY_CLASSES_ROOT;
+}
+
+/******************************************************************************
+ *           RegOpenKey   [SHELL.1]
+ */
+DWORD WINAPI RegOpenKey16( HKEY hkey, LPCSTR name, PHKEY retkey )
+{
+    fix_win16_hkey( &hkey );
+    return RegOpenKeyA( hkey, name, retkey );
+}
+
+/******************************************************************************
+ *           RegCreateKey   [SHELL.2]
+ */
+DWORD WINAPI RegCreateKey16( HKEY hkey, LPCSTR name, PHKEY retkey )
+{
+    fix_win16_hkey( &hkey );
+    return RegCreateKeyA( hkey, name, retkey );
+}
+
+/******************************************************************************
+ *           RegCloseKey   [SHELL.3]
+ */
+DWORD WINAPI RegCloseKey16( HKEY hkey )
+{
+    fix_win16_hkey( &hkey );
+    return RegCloseKey( hkey );
+}
+
+/******************************************************************************
+ *           RegDeleteKey   [SHELL.4]
+ */
+DWORD WINAPI RegDeleteKey16( HKEY hkey, LPCSTR name )
+{
+    fix_win16_hkey( &hkey );
+    return RegDeleteKeyA( hkey, name );
+}
+
+/******************************************************************************
+ *           RegSetValue   [SHELL.5]
+ */
+DWORD WINAPI RegSetValue16( HKEY hkey, LPCSTR name, DWORD type, LPCSTR data, DWORD count )
+{
+    fix_win16_hkey( &hkey );
+    return RegSetValueA( hkey, name, type, data, count );
+}
+
+/******************************************************************************
+ *           RegQueryValue   [SHELL.6]
+ *
+ * NOTES
+ *    Is this HACK still applicable?
+ *
+ * HACK
+ *    The 16bit RegQueryValue doesn't handle selectorblocks anyway, so we just
+ *    mask out the high 16 bit.  This (not so much incidently) hopefully fixes
+ *    Aldus FH4)
+ */
+DWORD WINAPI RegQueryValue16( HKEY hkey, LPCSTR name, LPSTR data, LPDWORD count
+)
+{
+    fix_win16_hkey( &hkey );
+    if (count) *count &= 0xffff;
+    return RegQueryValueA( hkey, name, data, (LONG*) count );
+}
+
+/******************************************************************************
+ *           RegEnumKey   [SHELL.7]
+ */
+DWORD WINAPI RegEnumKey16( HKEY hkey, DWORD index, LPSTR name, DWORD name_len )
+{
+    fix_win16_hkey( &hkey );
+    return RegEnumKeyA( hkey, index, name, name_len );
+}
+
+/*************************************************************************
+ *           SHELL_Execute16 [Internal]
+ */
+static UINT SHELL_Execute16(const WCHAR *lpCmd, WCHAR *env, BOOL shWait,
+			    LPSHELLEXECUTEINFOW psei, LPSHELLEXECUTEINFOW psei_out)
+{
+    UINT ret;
+    char sCmd[MAX_PATH];
+    WideCharToMultiByte(CP_ACP, 0, lpCmd, -1, sCmd, MAX_PATH, NULL, NULL);
+    ret = WinExec16(sCmd, (UINT16)psei->nShow);
+    psei_out->hInstApp = HINSTANCE_32(ret);
+    return ret;
+}
+
+/*************************************************************************
+ *                              ShellExecute            [SHELL.20]
+ */
+HINSTANCE16 WINAPI ShellExecute16( HWND16 hWnd, LPCSTR lpOperation,
+                                   LPCSTR lpFile, LPCSTR lpParameters,
+                                   LPCSTR lpDirectory, INT16 iShowCmd )
+{
+    SHELLEXECUTEINFOW seiW;
+    WCHAR *wVerb = NULL, *wFile = NULL, *wParameters = NULL, *wDirectory = NULL;
+    HANDLE hProcess = 0;
+
+    seiW.lpVerb = lpOperation ? __SHCloneStrAtoW(&wVerb, lpOperation) : NULL;
+    seiW.lpFile = lpFile ? __SHCloneStrAtoW(&wFile, lpFile) : NULL;
+    seiW.lpParameters = lpParameters ? __SHCloneStrAtoW(&wParameters, lpParameters) : NULL;
+    seiW.lpDirectory = lpDirectory ? __SHCloneStrAtoW(&wDirectory, lpDirectory) : NULL;
+
+    seiW.cbSize = sizeof(seiW);
+    seiW.fMask = 0;
+    seiW.hwnd = HWND_32(hWnd);
+    seiW.nShow = iShowCmd;
+    seiW.lpIDList = 0;
+    seiW.lpClass = 0;
+    seiW.hkeyClass = 0;
+    seiW.dwHotKey = 0;
+    seiW.hProcess = hProcess;
+
+    SHELL_execute( &seiW, SHELL_Execute16 );
+
+    SHFree(wVerb);
+    SHFree(wFile);
+    SHFree(wParameters);
+    SHFree(wDirectory);
+
+    return HINSTANCE_16(seiW.hInstApp);
+}
-- 
1.4.1



More information about the wine-patches mailing list