Cleanup, small fixes, a few new stubs.

This commit is contained in:
Juergen Schmied 1998-11-15 13:28:00 +00:00 committed by Alexandre Julliard
parent cf5faa6421
commit 72b76d1a41
13 changed files with 648 additions and 588 deletions

View File

@ -11,6 +11,7 @@ C_SRCS = \
dataobject.c \
enumidlist.c \
folders.c \
iconcache.c \
pidl.c \
shell32_main.c \
shellole.c \

View File

@ -9,6 +9,8 @@
#include "pidl.h"
#include "shlobj.h"
#include "shell32_main.h"
#include "shresdef.h"
#include "if_macros.h"
#define __T(x) x
#define _T(x) __T(x)
@ -90,7 +92,6 @@ static ULONG WINAPI IContextMenu_Release(LPCONTEXTMENU this)
{ IContextMenu_FreePidlTable(this);
}
HeapFree(GetProcessHeap(),0,this);
return 0;
}
@ -130,7 +131,8 @@ LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER pSFParent, LPCITEMIDLIST *a
/**************************************************************************
* ICM_InsertItem()
*/
static void ICM_InsertItem (HMENU32 hmenu, UINT32 indexMenu, UINT32 wID, UINT32 fType, LPSTR dwTypeData, UINT32 fState)
void WINAPI _InsertMenuItem (HMENU32 hmenu, UINT32 indexMenu, BOOL32 fByPosition,
UINT32 wID, UINT32 fType, LPSTR dwTypeData, UINT32 fState)
{ MENUITEMINFO32A mii;
ZeroMemory(&mii, sizeof(mii));
@ -145,15 +147,15 @@ static void ICM_InsertItem (HMENU32 hmenu, UINT32 indexMenu, UINT32 wID, UINT32
}
mii.wID = wID;
mii.fType = fType;
InsertMenuItem32A( hmenu, indexMenu, TRUE, &mii);
InsertMenuItem32A( hmenu, indexMenu, fByPosition, &mii);
}
/**************************************************************************
* IContextMenu_QueryContextMenu()
*/
static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU32 hmenu,
UINT32 indexMenu,UINT32 idCmdFirst,UINT32 idCmdLast,UINT32 uFlags)
{ BOOL32 fExplore ;
static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU32 hmenu, UINT32 indexMenu,
UINT32 idCmdFirst,UINT32 idCmdLast,UINT32 uFlags)
{ BOOL32 fExplore ;
TRACE(shell,"(%p)->(hmenu=%x indexmenu=%x cmdfirst=%x cmdlast=%x flags=%x )\n",this, hmenu, indexMenu, idCmdFirst, idCmdLast, uFlags);
@ -161,17 +163,17 @@ static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU3
{ if(!this->bAllValues)
{ fExplore = uFlags & CMF_EXPLORE;
if(fExplore)
{ ICM_InsertItem(hmenu, indexMenu++, idCmdFirst+IDM_EXPLORE, MFT_STRING, TEXT("&Explore"), MFS_ENABLED|MFS_DEFAULT);
ICM_InsertItem(hmenu, indexMenu++, idCmdFirst+IDM_OPEN, MFT_STRING, TEXT("&Open"), MFS_ENABLED);
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_EXPLORE, MFT_STRING, TEXT("&Explore"), MFS_ENABLED|MFS_DEFAULT);
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_OPEN, MFT_STRING, TEXT("&Open"), MFS_ENABLED);
}
else
{ ICM_InsertItem(hmenu, indexMenu++, idCmdFirst+IDM_OPEN, MFT_STRING, TEXT("&Open"), MFS_ENABLED|MFS_DEFAULT);
ICM_InsertItem(hmenu, indexMenu++, idCmdFirst+IDM_EXPLORE, MFT_STRING, TEXT("&Explore"), MFS_ENABLED);
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_OPEN, MFT_STRING, TEXT("&Open"), MFS_ENABLED|MFS_DEFAULT);
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_EXPLORE, MFT_STRING, TEXT("&Explore"), MFS_ENABLED);
}
if(uFlags & CMF_CANRENAME)
{ ICM_InsertItem(hmenu, indexMenu++, 0, MFT_SEPARATOR, NULL, 0);
ICM_InsertItem(hmenu, indexMenu++, idCmdFirst+IDM_RENAME, MFT_STRING, TEXT("&Rename"), (IContextMenu_CanRenameItems(this) ? MFS_ENABLED : MFS_DISABLED));
{ _InsertMenuItem(hmenu, indexMenu++, TRUE, 0, MFT_SEPARATOR, NULL, 0);
_InsertMenuItem(hmenu, indexMenu++, TRUE, idCmdFirst+IDM_RENAME, MFT_STRING, TEXT("&Rename"), (IContextMenu_CanRenameItems(this) ? MFS_ENABLED : MFS_DISABLED));
}
}
return MAKE_HRESULT(SEVERITY_SUCCESS, 0, (IDM_LAST + 1));
@ -183,14 +185,36 @@ static HRESULT WINAPI IContextMenu_QueryContextMenu( LPCONTEXTMENU this, HMENU3
* IContextMenu_InvokeCommand()
*/
static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKECOMMANDINFO32 lpcmi)
{ LPITEMIDLIST pidlTemp,pidlFQ;
SHELLEXECUTEINFO32A sei;
{ LPITEMIDLIST pidlTemp,pidlFQ;
LPSHELLBROWSER lpSB;
LPSHELLVIEW lpSV;
HWND32 hWndSV;
SHELLEXECUTEINFO32A sei;
int i;
TRACE(shell,"(%p)->(invcom=%p verb=%p)\n",this,lpcmi,lpcmi->lpVerb);
TRACE(shell,"(%p)->(invcom=%p verb=%p wnd=%x)\n",this,lpcmi,lpcmi->lpVerb, lpcmi->hwnd);
if(HIWORD(lpcmi->lpVerb))
{ //the command is being sent via a verb
{ /* get the active IShellView */
lpSB = (LPSHELLBROWSER)SendMessage32A(lpcmi->hwnd, CWM_GETISHELLBROWSER,0,0);
IShellBrowser_QueryActiveShellView(lpSB, &lpSV);
lpSV->lpvtbl->fnGetWindow(lpSV, &hWndSV);
/* these verbs are used by the filedialogs*/
if (! strcmp(lpcmi->lpVerb,CMDSTR_NEWFOLDER))
{ FIXME(shell,"%s\n",lpcmi->lpVerb);
}
else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWLIST))
{ FIXME(shell,"%s\n",lpcmi->lpVerb);
SendMessage32A(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_LISTVIEW,0),0 );
}
else if (! strcmp(lpcmi->lpVerb,CMDSTR_VIEWDETAILS))
{ FIXME(shell,"%s\n",lpcmi->lpVerb);
SendMessage32A(hWndSV, WM_COMMAND, MAKEWPARAM(FCIDM_SHVIEW_REPORTVIEW,0),0 );
}
else
{ FIXME(shell,"please report: unknown verb %s\n",lpcmi->lpVerb);
}
return NOERROR;
}
@ -209,7 +233,7 @@ static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKEC
}
pidlTemp = ILCombine(this->pSFParent->mpidl, this->aPidls[i]);
pidlFQ = ILCombine(this->pSFParent->mpidlNSRoot, pidlTemp);
pidlFQ = ILCombine(this->pSFParent->pMyPidl, pidlTemp);
SHFree(pidlTemp);
ZeroMemory(&sei, sizeof(sei));
@ -233,7 +257,7 @@ static HRESULT WINAPI IContextMenu_InvokeCommand(LPCONTEXTMENU this, LPCMINVOKEC
case IDM_RENAME:
MessageBeep32(MB_OK);
/*handle rename for the view here*/
break;
break;
}
return NOERROR;
}

View File

@ -246,7 +246,7 @@ static ULONG WINAPI IDataObject_Release(LPDATAOBJECT this)
* NOTES
* get or register the "Shell IDList Array" clipformat
*/
static BOOL32 DATAOBJECT_InitShellIDList()
static BOOL32 DATAOBJECT_InitShellIDList(void)
{ if (cfShellIDList)
{ return(TRUE);
}
@ -261,7 +261,7 @@ static BOOL32 DATAOBJECT_InitShellIDList()
* NOTES
* get or register the "FileGroupDescriptor" clipformat
*/
static BOOL32 DATAOBJECT_InitFileGroupDesc()
static BOOL32 DATAOBJECT_InitFileGroupDesc(void)
{ if (cfFileGroupDesc)
{ return(TRUE);
}
@ -275,7 +275,7 @@ static BOOL32 DATAOBJECT_InitFileGroupDesc()
* NOTES
* get or register the "FileContents" clipformat
*/
static BOOL32 DATAOBJECT_InitFileContents()
static BOOL32 DATAOBJECT_InitFileContents(void)
{ if (cfFileContents)
{ return(TRUE);
}
@ -334,10 +334,10 @@ static HRESULT WINAPI IDataObject_GetData (LPDATAOBJECT this, LPFORMATETC32 pfor
TRACE(shell,"-- %lu %lu %lu\n",size, size1, size2 );
TRACE(shell,"-- %p %p\n",this->pidl, pidl);
TRACE(shell,"-- %p %p %p\n",pcida, (void*)pcida+size,(void*)pcida+size+size1);
TRACE(shell,"-- %p %p %p\n",pcida, (LPBYTE)pcida+size,(LPBYTE)pcida+size+size1);
memcpy ((void*)pcida+size, this->pidl, size1);
memcpy ((void*)pcida+size+size1, pidl, size2);
memcpy ((LPBYTE)pcida+size, this->pidl, size1);
memcpy ((LPBYTE)pcida+size+size1, pidl, size2);
TRACE(shell,"-- after copy\n");
GlobalUnlock32(hmem);

View File

@ -78,11 +78,14 @@ static struct IExtractIcon_VTable eivt =
*/
LPEXTRACTICON IExtractIcon_Constructor(LPCITEMIDLIST pidl)
{ LPEXTRACTICON ei;
ei=(LPEXTRACTICON)HeapAlloc(GetProcessHeap(),0,sizeof(IExtractIcon));
ei->ref=1;
ei->lpvtbl=&eivt;
ei->pidl=ILClone(pidl);
pdump(pidl);
TRACE(shell,"(%p)\n",ei);
return ei;
}
@ -134,19 +137,15 @@ static ULONG WINAPI IExtractIcon_Release(LPEXTRACTICON this)
}
/**************************************************************************
* IExtractIcon_GetIconLocation
* NOTE
* FIXME returns allways the icon no. 3 (closed Folder)
*/
static HRESULT WINAPI IExtractIcon_GetIconLocation(LPEXTRACTICON this, UINT32 uFlags, LPSTR szIconFile, UINT32 cchMax, int * piIndex, UINT32 * pwFlags)
{ FIXME (shell,"(%p) (flags=%u file=%s max=%u %p %p) semi-stub\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
if (!szIconFile)
{ *piIndex = 20;
}
else
{ *piIndex = 3;
}
{ FIXME (shell,"(%p) (flags=%u file=%s max=%u %p %p) semi-stub\n", this, uFlags, szIconFile, cchMax, piIndex, pwFlags);
*piIndex = (int) SHMapPIDLToSystemImageListIndex(0, this->pidl,0);
*pwFlags = GIL_NOTFILENAME;
FIXME (shell,"-- %x\n",*piIndex);
return NOERROR;
}
/**************************************************************************

View File

@ -27,9 +27,9 @@
#include "debug.h"
#include "winreg.h"
#include "imagelist.h"
#include "sysmetrics.h"
#include "commctrl.h"
#include "authors.h"
#include "pidl.h"
#include "shell32_main.h"
@ -95,32 +95,6 @@ void WINAPI Control_RunDLL( HWND32 hwnd, LPCVOID code, LPCSTR cmd, DWORD arg4 )
debugstr_a(cmd), arg4);
}
/*************************************************************************
* Shell_GetImageList [SHELL32.71]
*
* PARAMETERS
* imglist[1|2] [OUT] pointer which recive imagelist handles
*
* NOTES
* undocumented
* I don't know, which pointer is which. They may have to be
* exchanged. (jsch)
*/
BOOL32 WINAPI Shell_GetImageList(HIMAGELIST * imglist1,HIMAGELIST * imglist2)
{ WARN(shell,"(%p,%p):semi-stub.\n",imglist1,imglist2);
if (imglist1)
{ *imglist1=ShellSmallIconList;
}
if (imglist2)
{ *imglist2=ShellBigIconList;
}
return TRUE;
}
HIMAGELIST ShellSmallIconList = 0;
HIMAGELIST ShellBigIconList = 0;
/*************************************************************************
* SHGetFileInfoA [SHELL32.254]
*
@ -552,7 +526,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
{ case FT_DIR:
/* Directory: get the value from the registry, if its not there
create it and the directory*/
if (RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
if (RegQueryValueEx32A(key,buffer,NULL,&type,(LPBYTE)tpath,&tpathlen))
{ GetWindowsDirectory32A(npath,MAX_PATH);
PathAddBackslash32A(npath);
switch (nFolder)
@ -610,7 +584,7 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32 hwndOwner, INT32 nFolder, LPITE
RegCloseKey(key);
return E_OUTOFMEMORY;
}
if (RegSetValueEx32A(key,buffer,0,REG_SZ,npath,sizeof(npath)+1))
if (RegSetValueEx32A(key,buffer,0,REG_SZ,(LPBYTE)npath,sizeof(npath)+1))
{ ERR(shell,"could not create value %s\n",buffer);
RegCloseKey(key);
return E_OUTOFMEMORY;
@ -753,7 +727,9 @@ LRESULT WINAPI AboutDlgProc32( HWND32 hWnd, UINT32 msg, WPARAM32 wParam,
if( lpDragInfo && lpDragInfo->wFlags == DRAGOBJ_DATA )
{ RECT32 rect;
if( __get_dropline( hWnd, &rect ) )
{ POINT32 pt = { lpDragInfo->pt.x, lpDragInfo->pt.y };
{ POINT32 pt;
pt.x=lpDragInfo->pt.x;
pt.x=lpDragInfo->pt.y;
rect.bottom += DROP_FIELD_HEIGHT;
if( PtInRect32( &rect, pt ) )
{ SetWindowLong32A( hWnd, DWL_MSGRESULT, 1 );
@ -891,9 +867,9 @@ void WINAPI FreeIconList( DWORD dw )
DWORD WINAPI SHGetPathFromIDList32A (LPCITEMIDLIST pidl,LPSTR pszPath)
{ STRRET lpName;
LPSHELLFOLDER shellfolder;
CHAR buffer[MAX_PATH],tpath[MAX_PATH];
DWORD type,tpathlen=MAX_PATH,dwdisp;
HKEY key;
CHAR buffer[MAX_PATH],tpath[MAX_PATH];
DWORD type,tpathlen=MAX_PATH,dwdisp;
HKEY key;
TRACE(shell,"(pidl=%p,%p)\n",pidl,pszPath);
@ -905,11 +881,11 @@ DWORD WINAPI SHGetPathFromIDList32A (LPCITEMIDLIST pidl,LPSTR pszPath)
}
type=REG_SZ;
strcpy (buffer,"Desktop"); /*registry name*/
if ( RegQueryValueEx32A(key,buffer,NULL,&type,tpath,&tpathlen))
if ( RegQueryValueEx32A(key,buffer,NULL,&type,(LPBYTE)tpath,&tpathlen))
{ GetWindowsDirectory32A(tpath,MAX_PATH);
PathAddBackslash32A(tpath);
strcat (tpath,"Desktop"); /*folder name*/
RegSetValueEx32A(key,buffer,0,REG_SZ,tpath,tpathlen);
RegSetValueEx32A(key,buffer,0,REG_SZ,(LPBYTE)tpath,tpathlen);
CreateDirectory32A(tpath,NULL);
}
RegCloseKey(key);
@ -942,16 +918,19 @@ DWORD WINAPI SHGetPathFromIDList32W (LPCITEMIDLIST pidl,LPWSTR pszPath)
}
void (CALLBACK* pDLLInitComctl)();
INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
INT32(CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
void (CALLBACK* pDLLInitComctl)(void);
INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
INT32 (CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
HIMAGELIST (CALLBACK * pImageList_Create) (INT32,INT32,UINT32,INT32,INT32);
HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
HDPA (CALLBACK* pDPA_Create) (INT32);
INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
INT32 (CALLBACK* pImageList_GetImageCount)(HIMAGELIST);
HDPA (CALLBACK* pDPA_Create) (INT32);
INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
INT32 (CALLBACK *pDPA_Search) (const HDPA, LPVOID, INT32, PFNDPACOMPARE, LPARAM, UINT32);
/*************************************************************************
* SHELL32 LibMain
@ -963,21 +942,12 @@ BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
HINSTANCE32 shell32_hInstance;
BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{ HICON32 htmpIcon;
UINT32 iiconindex;
UINT32 index;
CHAR szShellPath[MAX_PATH];
HINSTANCE32 hComctl32;
{ HINSTANCE32 hComctl32;
TRACE(shell,"0x%x 0x%lx %p\n", hinstDLL, fdwReason, lpvReserved);
shell32_hInstance = hinstDLL;
GetWindowsDirectory32A(szShellPath,MAX_PATH);
PathAddBackslash32A(szShellPath);
strcat(szShellPath,"system\\shell32.dll");
if (fdwReason==DLL_PROCESS_ATTACH)
{ hComctl32 = LoadLibrary32A("COMCTL32.DLL");
if (hComctl32)
@ -989,12 +959,15 @@ BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRe
pImageList_AddIcon=GetProcAddress32(hComctl32,"ImageList_AddIcon");
pImageList_ReplaceIcon=GetProcAddress32(hComctl32,"ImageList_ReplaceIcon");
pImageList_GetIcon=GetProcAddress32(hComctl32,"ImageList_GetIcon");
pImageList_GetImageCount=GetProcAddress32(hComctl32,"ImageList_GetImageCount");
/* imports by ordinal, pray that it works*/
pDPA_Create=GetProcAddress32(hComctl32, (LPCSTR)328L);
pDPA_Destroy=GetProcAddress32(hComctl32, (LPCSTR)329L);
pDPA_GetPtr=GetProcAddress32(hComctl32, (LPCSTR)332L);
pDPA_InsertPtr=GetProcAddress32(hComctl32, (LPCSTR)334L);
pDPA_Sort=GetProcAddress32(hComctl32, (LPCSTR)338L);
pDPA_Search=GetProcAddress32(hComctl32, (LPCSTR)339L);
FreeLibrary32(hComctl32);
}
@ -1003,29 +976,7 @@ BOOL32 WINAPI Shell32LibMain(HINSTANCE32 hinstDLL, DWORD fdwReason, LPVOID lpvRe
ERR(shell,"P A N I C error getting functionpointers\n");
exit (1);
}
if ( ! ShellSmallIconList )
{ if ( (ShellSmallIconList = pImageList_Create(sysMetrics[SM_CXSMICON],sysMetrics[SM_CYSMICON],ILC_COLORDDB | ILC_MASK,0,0x20)) )
{ for (index=0;index < 40; index++)
{ if ( ! ( htmpIcon = ExtractIcon32A(hinstDLL, szShellPath, index))
|| ( -1 == (iiconindex = pImageList_AddIcon (ShellSmallIconList, htmpIcon))) )
{ ERR(shell,"could not initialize iconlist (is shell32.dll in the system directory?)\n");
break;
}
}
}
}
if ( ! ShellBigIconList )
{ if ( (ShellBigIconList = pImageList_Create(SYSMETRICS_CXSMICON, SYSMETRICS_CYSMICON,ILC_COLORDDB | ILC_MASK,0,0x20)) )
{ for (index=0;index < 40; index++)
{ if ( ! (htmpIcon = ExtractIcon32A( hinstDLL, szShellPath, index))
|| (-1 == (iiconindex = pImageList_AddIcon (ShellBigIconList, htmpIcon))) )
{ ERR(shell,"could not initialize iconlist (is shell32.dll in the system directory?)\n");
break;
}
}
}
}
TRACE(shell,"hIconSmall=%p hIconBig=%p\n",ShellSmallIconList, ShellBigIconList);
SIC_Initialize();
}
return TRUE;
}

View File

@ -16,16 +16,22 @@ extern HIMAGELIST ShellBigIconList;
/*******************************************
* pointer to functions dynamically loaded
*/
extern void (CALLBACK* pDLLInitComctl)();
extern INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
extern INT32(CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
extern void (CALLBACK* pDLLInitComctl)(void);
extern INT32 (CALLBACK* pImageList_AddIcon) (HIMAGELIST himl, HICON32 hIcon);
extern INT32 (CALLBACK* pImageList_ReplaceIcon) (HIMAGELIST, INT32, HICON32);
extern HIMAGELIST (CALLBACK * pImageList_Create) (INT32,INT32,UINT32,INT32,INT32);
extern HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
extern HDPA (CALLBACK* pDPA_Create) (INT32);
extern INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
extern BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
extern LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
extern BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
extern HICON32 (CALLBACK * pImageList_GetIcon) (HIMAGELIST, INT32, UINT32);
extern INT32 (CALLBACK* pImageList_GetImageCount)(HIMAGELIST);
extern HDPA (CALLBACK* pDPA_Create) (INT32);
extern INT32 (CALLBACK* pDPA_InsertPtr) (const HDPA, INT32, LPVOID);
extern BOOL32 (CALLBACK* pDPA_Sort) (const HDPA, PFNDPACOMPARE, LPARAM);
extern LPVOID (CALLBACK* pDPA_GetPtr) (const HDPA, INT32);
extern BOOL32 (CALLBACK* pDPA_Destroy) (const HDPA);
extern INT32 (CALLBACK *pDPA_Search) (const HDPA, LPVOID, INT32, PFNDPACOMPARE, LPARAM, UINT32);
extern BOOL32 WINAPI SIC_Initialize(void);
extern HICON32 WINAPI SIC_GetIcon (LPSTR sSourceFile, DWORD dwSourceIndex, BOOL32 bSmallIcon );
/* FIXME should be moved to a header file. IsEqualGUID
is declared but not exported in compobj.c !!!*/
#define IsEqualGUID(rguid1, rguid2) (!memcmp(rguid1, rguid2, sizeof(GUID)))

View File

@ -211,8 +211,8 @@ DWORD WINAPI SHGetMalloc(LPMALLOC32 *lpmal)
static HRESULT WINAPI IClassFactory_QueryInterface(LPCLASSFACTORY,REFIID,LPVOID*);
static ULONG WINAPI IClassFactory_AddRef(LPCLASSFACTORY);
static ULONG WINAPI IClassFactory_Release(LPCLASSFACTORY);
static HRESULT WINAPI IClassFactory_CreateInstance();
static HRESULT WINAPI IClassFactory_LockServer();
static HRESULT WINAPI IClassFactory_CreateInstance(LPCLASSFACTORY, LPUNKNOWN, REFIID, LPVOID *);
static HRESULT WINAPI IClassFactory_LockServer(LPCLASSFACTORY, BOOL32);
/**************************************************************************
* IClassFactory_VTable
*/
@ -228,7 +228,7 @@ static IClassFactory_VTable clfvt =
* IClassFactory_Constructor
*/
LPCLASSFACTORY IClassFactory_Constructor()
LPCLASSFACTORY IClassFactory_Constructor(void)
{ LPCLASSFACTORY lpclf;
lpclf= (LPCLASSFACTORY)HeapAlloc(GetProcessHeap(),0,sizeof(IClassFactory));
@ -316,7 +316,7 @@ static HRESULT WINAPI IClassFactory_CreateInstance(
{ pObj = (IUnknown *)IContextMenu_Constructor(NULL, NULL, 0);
}
else if (IsEqualIID(riid, &IID_IDataObject))
{ pObj = (IUnknown *)IDataObject_Constructor();
{ pObj = (IUnknown *)IDataObject_Constructor(0,NULL,NULL,0);
}
else
{ ERR(shell,"unknown IID requested\n\tIID:\t%s\n",xriid);

View File

@ -159,7 +159,7 @@ LPCVOID WINAPI PathFindExtension32AW(LPCVOID path)
* NOTES
* append \ if there is none
*/
LPSTR WINAPI PathAddBackslash32A(LPSTR path)
LPSTR WINAPI PathAddBackslash32A(LPCSTR path)
{ int len;
TRACE(shell,"%p->%s\n",path,path);
@ -171,7 +171,7 @@ LPSTR WINAPI PathAddBackslash32A(LPSTR path)
}
return path+len;
}
LPWSTR WINAPI PathAddBackslash32W(LPWSTR path)
LPWSTR WINAPI PathAddBackslash32W(LPCWSTR path)
{ int len;
TRACE(shell,"%p->%s\n",path,debugstr_w(path));
@ -183,7 +183,7 @@ LPWSTR WINAPI PathAddBackslash32W(LPWSTR path)
}
return path+len;
}
LPVOID WINAPI PathAddBackslash32AW(LPVOID path)
LPVOID WINAPI PathAddBackslash32AW(LPCVOID path)
{ if(VERSION_OsIsUnicode())
return PathAddBackslash32W(path);
return PathAddBackslash32A(path);
@ -195,20 +195,20 @@ LPVOID WINAPI PathAddBackslash32AW(LPVOID path)
* NOTES
* remove spaces from beginning and end of passed string
*/
LPSTR WINAPI PathRemoveBlanks(LPSTR str)
{ LPSTR x = str;
TRACE(shell,"%s\n",str);
while (*x==' ') x++;
if (x!=str)
LPSTR WINAPI PathRemoveBlanks(LPCSTR str)
{ LPSTR x = str;
TRACE(shell,"%s\n",str);
while (*x==' ') x++;
if (x!=str)
strcpy(str,x);
if (!*str)
if (!*str)
return str;
x=str+strlen(str)-1;
while (*x==' ')
x=str+strlen(str)-1;
while (*x==' ')
x--;
if (*x==' ')
if (*x==' ')
*x='\0';
return x;
return x;
}
@ -450,6 +450,27 @@ LPVOID WINAPI PathGetArgs(LPVOID cmdline)
}
return (LPVOID) aptr;
}
/*************************************************************************
* PathQuoteSpaces [SHELL32.55]
*
* NOTES
* basename(char *fn);
*/
LPSTR WINAPI PathQuoteSpaces32A(LPCSTR aptr)
{ FIXME(shell,"%s\n",aptr);
return 0;
}
LPWSTR WINAPI PathQuoteSpaces32W(LPCWSTR wptr)
{ FIXME(shell,"L%s\n",debugstr_w(wptr));
return 0;
}
LPVOID WINAPI PathQuoteSpaces32AW (LPCVOID fn)
{ if(VERSION_OsIsUnicode())
return PathQuoteSpaces32W(fn);
return PathQuoteSpaces32A(fn);
}
/*************************************************************************
* PathUnquoteSpaces [SHELL32.56]
@ -558,22 +579,6 @@ BOOL32 WINAPI PathYetAnotherMakeUniqueName(LPDWORD x,LPDWORD y) {
return TRUE;
}
/*************************************************************************
* SHMapPIDLToSystemImageListIndex [SHELL32.77]
*
* PARAMETERS
* x pointer to an instance of IShellFolder
*
* NOTES
* exported by ordinal
*
*/
DWORD WINAPI
SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh,DWORD y,DWORD z)
{ FIXME(shell,"(SF=%p,pidl=%08lx,%08lx):stub.\n",sh,y,z);
return 0;
}
/*************************************************************************
* OleStrToStrN [SHELL32.78]
*
@ -1051,6 +1056,15 @@ HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
* ShellExecuteEx [SHELL32.291]
*
*/
BOOL32 WINAPI ShellExecuteEx32 (LPVOID sei)
{ if (VERSION_OsIsUnicode())
return ShellExecuteEx32W (sei);
return ShellExecuteEx32A (sei);
}
/*************************************************************************
* ShellExecuteEx32A [SHELL32.292]
*
*/
BOOL32 WINAPI ShellExecuteEx32A (LPSHELLEXECUTEINFO32A sei)
{ CHAR szTemp[MAX_PATH];
@ -1071,6 +1085,30 @@ BOOL32 WINAPI ShellExecuteEx32A (LPSHELLEXECUTEINFO32A sei)
return 0;
}
/*************************************************************************
* ShellExecuteEx [SHELL32.293]
*
*/
BOOL32 WINAPI ShellExecuteEx32W (LPSHELLEXECUTEINFO32W sei)
{ WCHAR szTemp[MAX_PATH];
FIXME(shell,"(%p): stub\n",sei);
if (sei->fMask & SEE_MASK_IDLIST)
{ SHGetPathFromIDList32W (sei->lpIDList,szTemp);
TRACE (shell,"-- idlist=%p (%s)\n", sei->lpIDList, debugstr_w(szTemp));
}
if (sei->fMask & SEE_MASK_CLASSNAME)
{ TRACE (shell,"-- classname= %s\n", debugstr_w(sei->lpClass));
}
if (sei->lpVerb)
{ TRACE (shell,"-- action=%s\n", debugstr_w(sei->lpVerb));
}
return 0;
}
/*************************************************************************
* SHSetInstanceExplorer [SHELL32.176]
*
@ -1218,7 +1256,7 @@ BOOL32 WINAPI FileIconInit(BOOL32 bFullInit)
* IsUserAdmin [NT 4.0:SHELL32.680]
*
*/
HRESULT WINAPI IsUserAdmin()
HRESULT WINAPI IsUserAdmin(void)
{ FIXME(shell,"stub\n");
return TRUE;
}
@ -1533,7 +1571,7 @@ HRESULT WINAPI DriveType32(DWORD u)
* SHAbortInvokeCommand [SHELL32.198]
*
*/
HRESULT WINAPI SHAbortInvokeCommand()
HRESULT WINAPI SHAbortInvokeCommand(void)
{ FIXME(shell,"stub\n");
return 1;
}
@ -1549,7 +1587,7 @@ HRESULT WINAPI SHOutOfMemoryMessageBox(DWORD u, DWORD v, DWORD w)
* SHFlushClipboard [SHELL32.121]
*
*/
HRESULT WINAPI SHFlushClipboard()
HRESULT WINAPI SHFlushClipboard(void)
{ FIXME(shell,"stub\n");
return 1;
}
@ -1592,3 +1630,10 @@ LPWSTR WINAPI StrRChrW(LPWSTR lpStart, LPWSTR lpEnd, DWORD wMatch)
} while ( lpStart<=lpEnd );
return wptr;
}
/*************************************************************************
* PathProcessCommand [SHELL32.653]
*/
HRESULT WINAPI PathProcessCommand (DWORD u, DWORD v, DWORD w, DWORD x)
{ FIXME(shell,"0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w,x);
return 0;
}

View File

@ -105,31 +105,32 @@ LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER pParent,LPITEMIDLIST pidl)
sf=(LPSHELLFOLDER)HeapAlloc(GetProcessHeap(),0,sizeof(IShellFolder));
sf->ref=1;
sf->lpvtbl=&sfvt;
sf->mlpszFolder=NULL; /* path of the folder */
sf->sMyPath=NULL; /* path of the folder */
sf->pMyPidl=NULL; /* my qualified pidl */
sf->mpSFParent=pParent; /* parrent shellfolder */
TRACE(shell,"(%p)->(parent=%p, pidl=%p)\n",sf,pParent, pidl);
/* keep a copy of the pidl in the instance*/
sf->mpidl = ILClone(pidl);
sf->mpidlNSRoot = NULL;
if(sf->mpidl) /* do we have a pidl? */
{ dwSize = 0;
if(sf->mpSFParent->mlpszFolder) /* get the size of the parents path */
{ dwSize += strlen(sf->mpSFParent->mlpszFolder) + 1;
TRACE(shell,"-- (%p)->(parent's path=%s)\n",sf, debugstr_a(sf->mpSFParent->mlpszFolder));
if(sf->mpSFParent->sMyPath) /* get the size of the parents path */
{ dwSize += strlen(sf->mpSFParent->sMyPath) + 1;
TRACE(shell,"-- (%p)->(parent's path=%s)\n",sf, debugstr_a(sf->mpSFParent->sMyPath));
}
dwSize += _ILGetFolderText(sf->mpidl,NULL,0); /* add the size of the foldername*/
sf->mlpszFolder = SHAlloc(dwSize);
if(sf->mlpszFolder)
{ *(sf->mlpszFolder)=0x00;
if(sf->mpSFParent->mlpszFolder) /* if the parent has a path, get it*/
{ strcpy(sf->mlpszFolder, sf->mpSFParent->mlpszFolder);
PathAddBackslash32A (sf->mlpszFolder);
sf->sMyPath = SHAlloc(dwSize);
if(sf->sMyPath)
{ *(sf->sMyPath)=0x00;
if(sf->mpSFParent->sMyPath) /* if the parent has a path, get it*/
{ strcpy(sf->sMyPath, sf->mpSFParent->sMyPath);
PathAddBackslash32A (sf->sMyPath);
}
_ILGetFolderText(sf->mpidl, sf->mlpszFolder+strlen(sf->mlpszFolder), dwSize-strlen(sf->mlpszFolder));
TRACE(shell,"-- (%p)->(my path=%s)\n",sf, debugstr_a(sf->mlpszFolder));
sf->pMyPidl = ILCombine(sf->pMyPidl, pidl);
_ILGetFolderText(sf->mpidl, sf->sMyPath+strlen(sf->sMyPath), dwSize-strlen(sf->sMyPath));
TRACE(shell,"-- (%p)->(my path=%s)\n",sf, debugstr_a(sf->sMyPath));
}
}
return sf;
@ -185,14 +186,14 @@ static ULONG WINAPI IShellFolder_Release(LPSHELLFOLDER this)
{ pdesktopfolder=NULL;
TRACE(shell,"-- destroyed IShellFolder(%p) was Desktopfolder\n",this);
}
if(this->mpidlNSRoot)
{ SHFree(this->mpidlNSRoot);
if(this->pMyPidl)
{ SHFree(this->pMyPidl);
}
if(this->mpidl)
{ SHFree(this->mpidl);
}
if(this->mlpszFolder)
{ SHFree(this->mlpszFolder);
if(this->sMyPath)
{ SHFree(this->sMyPath);
}
HeapFree(GetProcessHeap(),0,this);
@ -296,7 +297,7 @@ static HRESULT WINAPI IShellFolder_EnumObjects(
{ TRACE(shell,"(%p)->(HWND=0x%08x flags=0x%08lx pplist=%p)\n",this,hwndOwner,dwFlags,ppEnumIDList);
*ppEnumIDList = NULL;
*ppEnumIDList = IEnumIDList_Constructor (this->mlpszFolder, dwFlags);
*ppEnumIDList = IEnumIDList_Constructor (this->sMyPath, dwFlags);
TRACE(shell,"-- (%p)->(new ID List: %p)\n",this,*ppEnumIDList);
if(!*ppEnumIDList)
{ return E_OUTOFMEMORY;
@ -307,16 +308,15 @@ static HRESULT WINAPI IShellFolder_EnumObjects(
* IShellFolder_Initialize()
* IPersistFolder Method
*/
static HRESULT WINAPI IShellFolder_Initialize(
LPSHELLFOLDER this,
LPCITEMIDLIST pidl)
{ TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
if(this->mpidlNSRoot)
{ SHFree(this->mpidlNSRoot);
this->mpidlNSRoot = NULL;
}
this->mpidlNSRoot=ILClone(pidl);
return S_OK;
static HRESULT WINAPI IShellFolder_Initialize( LPSHELLFOLDER this,LPCITEMIDLIST pidl)
{ TRACE(shell,"(%p)->(pidl=%p)\n",this,pidl);
if(this->pMyPidl)
{ SHFree(this->pMyPidl);
this->pMyPidl = NULL;
}
this->pMyPidl = ILClone(pidl);
return S_OK;
}
/**************************************************************************
@ -327,30 +327,29 @@ static HRESULT WINAPI IShellFolder_Initialize(
* REFIID riid, //[in ] Initial Interface
* LPVOID* ppvObject //[out] Interface*
*/
static HRESULT WINAPI IShellFolder_BindToObject(
LPSHELLFOLDER this,
LPCITEMIDLIST pidl,
LPBC pbcReserved,
REFIID riid,
LPVOID * ppvOut)
static HRESULT WINAPI IShellFolder_BindToObject( LPSHELLFOLDER this, LPCITEMIDLIST pidl,
LPBC pbcReserved, REFIID riid, LPVOID * ppvOut)
{ char xriid[50];
HRESULT hr;
HRESULT hr;
LPSHELLFOLDER pShellFolder;
WINE_StringFromCLSID(riid,xriid);
TRACE(shell,"(%p)->(pidl=%p,%p,\n\tIID:%s,%p)\n",this,pidl,pbcReserved,xriid,ppvOut);
*ppvOut = NULL;
pShellFolder = IShellFolder_Constructor(this, pidl);
if(!pShellFolder)
return E_OUTOFMEMORY;
/* pShellFolder->lpvtbl->fnInitialize(pShellFolder, this->mpidlNSRoot);*/
IShellFolder_Initialize(pShellFolder, this->mpidlNSRoot);
hr = pShellFolder->lpvtbl->fnQueryInterface(pShellFolder, riid, ppvOut);
pShellFolder->lpvtbl->fnRelease(pShellFolder);
*ppvOut = NULL;
pShellFolder = IShellFolder_Constructor(this, pidl);
if(!pShellFolder)
return E_OUTOFMEMORY;
IShellFolder_Initialize(pShellFolder, this->pMyPidl);
hr = pShellFolder->lpvtbl->fnQueryInterface(pShellFolder, riid, ppvOut);
pShellFolder->lpvtbl->fnRelease(pShellFolder);
TRACE(shell,"-- (%p)->(interface=%p)\n",this, ppvOut);
return hr;
return hr;
}
/**************************************************************************
@ -578,8 +577,8 @@ static HRESULT WINAPI IShellFolder_GetUIObjectOf( LPSHELLFOLDER this,HWND32 hwnd
else if(IsEqualIID(riid, &IID_IExtractIcon))
{ if (cidl != 1)
return(E_INVALIDARG);
pidl = ILCombine(this->mpidl, apidl[0]);
pObj = (LPUNKNOWN)IExtractIcon_Constructor(pidl);
pidl = ILCombine(this->pMyPidl,apidl[0]);
pObj = (LPUNKNOWN)IExtractIcon_Constructor( pidl );
SHFree(pidl);
}
else
@ -672,9 +671,9 @@ static HRESULT WINAPI IShellFolder_GetDisplayNameOf( LPSHELLFOLDER this, LPCITEM
{ /* if the IShellFolder has parents, get the path from the
parent and add the ItemName*/
szText[0]=0x00;
if (this->mlpszFolder && strlen (this->mlpszFolder))
{ if (strcmp(this->mlpszFolder,"My Computer"))
{ strcpy (szText,this->mlpszFolder);
if (this->sMyPath && strlen (this->sMyPath))
{ if (strcmp(this->sMyPath,"My Computer"))
{ strcpy (szText,this->sMyPath);
PathAddBackslash32A (szText);
}
}
@ -748,13 +747,13 @@ static BOOL32 WINAPI IShellFolder_GetFolderPath(LPSHELLFOLDER this, LPSTR lpszOu
*lpszOut=0;
if (! this->mlpszFolder)
if (! this->sMyPath)
return FALSE;
dwSize = strlen (this->mlpszFolder) +1;
dwSize = strlen (this->sMyPath) +1;
if ( dwSize > dwOutSize)
return FALSE;
strcpy(lpszOut, this->mlpszFolder);
strcpy(lpszOut, this->sMyPath);
TRACE(shell,"-- (%p)->(return=%s)\n",this, lpszOut);
return TRUE;

View File

@ -253,10 +253,15 @@ HRESULT WINAPI SHGetSpecialFolderLocation(HWND32, INT32, LPITEMIDLIST *);
/****************************************************************************
* string and path functions
*/
LPSTR WINAPI PathAddBackslash32A(LPSTR path);
LPWSTR WINAPI PathAddBackslash32W(LPWSTR path);
LPSTR WINAPI PathAddBackslash32A(LPCSTR path);
LPWSTR WINAPI PathAddBackslash32W(LPCWSTR path);
#define PathAddBackslash WINELIB_NAME_AW(PathAddBackslash)
LPVOID WINAPI PathAddBackslash32AW(LPVOID path);
LPVOID WINAPI PathAddBackslash32AW(LPCVOID path);
LPSTR WINAPI PathQuoteSpaces32A(LPCSTR path);
LPWSTR WINAPI PathQuoteSpaces32W(LPCWSTR path);
#define PathQuoteSpaces WINELIB_NAME_AW(PathQuoteSpaces)
LPVOID WINAPI PathQuoteSpaces32AW(LPCVOID path);
LPSTR WINAPI PathCombine32A(LPSTR szDest, LPCSTR lpszDir, LPCSTR lpszFile);
LPWSTR WINAPI PathCombine32W(LPWSTR szDest, LPCWSTR lpszDir, LPCWSTR lpszFile);
@ -278,10 +283,15 @@ LPCWSTR WINAPI PathFindFilename32W(LPCWSTR path);
#define PathFindFilename WINELIB_NAME_AW(PathFindFilename)
LPCVOID WINAPI PathFindFilename32AW(LPCVOID path);
LPSTR WINAPI PathRemoveBlanks(LPSTR str);
LPSTR WINAPI PathRemoveBlanks(LPCSTR str);
/****************************************************************************
* other functions
*/
HICON32 WINAPI ExtractIconEx32A ( LPSTR, INT32, HICON32 *, HICON32 *, UINT32 );
HICON32 WINAPI ExtractIconEx32W ( LPWSTR, INT32, HICON32 *, HICON32 *, UINT32 );
#define ExtractIconEx WINELIB_NAME_AW(ExtractIconEx)
HICON32 WINAPI ExtractIconEx32AW ( LPVOID, INT32, HICON32 *, HICON32 *, UINT32 );
LPVOID WINAPI SHAlloc(DWORD len);
DWORD WINAPI SHFree(LPVOID x);

View File

@ -534,7 +534,7 @@ typedef enum
{ FVM_ICON = 1,
FVM_SMALLICON = 2,
FVM_LIST = 3,
FVM_DETAILS = 4,
FVM_DETAILS = 4
} FOLDERVIEWMODE;
typedef struct
@ -626,10 +626,10 @@ typedef struct IShellFolder_VTable {
struct tagSHELLFOLDER {
LPSHELLFOLDER_VTABLE lpvtbl;
DWORD ref;
LPSTR mlpszFolder;
LPITEMIDLIST mpidl;
LPITEMIDLIST mpidlNSRoot;
LPSHELLFOLDER mpSFParent;
LPSTR sMyPath;
LPITEMIDLIST pMyPidl;
LPITEMIDLIST mpidl;
LPSHELLFOLDER mpSFParent;
};
extern LPSHELLFOLDER pdesktopfolder;
@ -676,7 +676,15 @@ DWORD WINAPI SHGetDesktopFolder(LPSHELLFOLDER *);
#define FCT_MERGE 0x0001
#define FCT_CONFIGABLE 0x0002
#define FCT_ADDTOEND 0x0004
/* undocumented, found in the web posted by Chris Becke */
#define CWM_SETPATH (WM_USER+2)
#define CWM_WANTIDLE (WM_USER+3)
#define CWM_GETSETCURRENTINFO (WM_USER+4)
#define CWM_SELECTITEM (WM_USER+5)
#define CWM_STOPWAITING (WM_USER+6)
#define CWM_GETISHELLBROWSER (WM_USER+7)
typedef struct IShellBrowser_VTable
{ // *** IUnknown methods ***
STDMETHOD(QueryInterface) (THIS_ REFIID riid, LPVOID * ppvObj) PURE;
@ -703,7 +711,7 @@ typedef struct IShellBrowser_VTable
STDMETHOD(QueryActiveShellView)(THIS_ IShellView ** ppshv) PURE;
STDMETHOD(OnViewWindowActive)(THIS_ IShellView * ppshv) PURE;
STDMETHOD(SetToolbarItems)(THIS_ LPTBBUTTON lpButtons, UINT32 nButtons, UINT32 uFlags) PURE;
} *LPSHELLBROWSER_VTABLE,IShellBrowser_VTable;;
} *LPSHELLBROWSER_VTABLE,IShellBrowser_VTable;
struct tagSHELLBROWSER
{ LPSHELLBROWSER_VTABLE lpvtbl;
@ -741,12 +749,35 @@ struct tagSHELLBROWSER
FCIDM_BROWSERFIRST/LAST for the explorer frame (IShellBrowser)
FCIDM_GLOBAL/LAST for the explorer's submenu IDs
*/
#define FCIDM_SHVIEWFIRST 0x0000
#define FCIDM_SHVIEWLAST 0x7fff
#define FCIDM_BROWSERFIRST 0xa000
#define FCIDM_BROWSERLAST 0xbf00
#define FCIDM_GLOBALFIRST 0x8000
#define FCIDM_GLOBALLAST 0x9fff
#define FCIDM_SHVIEWFIRST 0x0000
/* undocumented */
#define FCIDM_SHVIEW_ARRANGE 0x7001
#define FCIDM_SHVIEW_DELETE 0x7011
#define FCIDM_SHVIEW_PROPERTIES 0x7013
#define FCIDM_SHVIEW_CUT 0x7018
#define FCIDM_SHVIEW_COPY 0x7019
#define FCIDM_SHVIEW_INSERT 0x701A
#define FCIDM_SHVIEW_UNDO 0x701B
#define FCIDM_SHVIEW_INSERTLINK 0x701C
#define FCIDM_SHVIEW_SELECTALL 0x7021
#define FCIDM_SHVIEW_INVERTSELECTION 0x7022
#define FCIDM_SHVIEW_BIGICON 0x7029
#define FCIDM_SHVIEW_SMALLICON 0x702A
#define FCIDM_SHVIEW_LISTVIEW 0x702B
#define FCIDM_SHVIEW_REPORTVIEW 0x702C
#define FCIDM_SHVIEW_AUTOARRANGE 0x7031
#define FCIDM_SHVIEW_SNAPTOGRID 0x7032
#define FCIDM_SHVIEW_HELP 0x7041
#define FCIDM_SHVIEWLAST 0x7fff
#define FCIDM_BROWSERFIRST 0xA000
/* undocumented toolbar items from stddlg's*/
#define FCIDM_TB_SMALLICON 0xA003
#define FCIDM_TB_REPORTVIEW 0xA004
#define FCIDM_BROWSERLAST 0xbf00
#define FCIDM_GLOBALFIRST 0x8000
#define FCIDM_GLOBALLAST 0x9fff
/*
* Global submenu IDs and separator IDs
@ -953,6 +984,9 @@ struct IExtractIcon
};
#undef THIS
DWORD WINAPI SHMapPIDLToSystemImageListIndex(LPSHELLFOLDER sh,LPITEMIDLIST pidl,DWORD z);
/****************************************************************************
* IShellIcon interface
*/
@ -1026,14 +1060,14 @@ struct tagSERVICEPROVIDER
* Class constructors
*/
#ifdef __WINE__
extern LPDATAOBJECT IDataObject_Constructor();
extern LPDATAOBJECT IDataObject_Constructor(HWND32 hwndOwner, LPSHELLFOLDER psf, LPITEMIDLIST * apidl, UINT32 cidl);
extern LPENUMFORMATETC IEnumFORMATETC_Constructor(UINT32, const FORMATETC32 []);
extern LPCLASSFACTORY IClassFactory_Constructor();
extern LPCLASSFACTORY IClassFactory_Constructor(void);
extern LPCONTEXTMENU IContextMenu_Constructor(LPSHELLFOLDER, LPCITEMIDLIST *, UINT32);
extern LPSHELLFOLDER IShellFolder_Constructor(LPSHELLFOLDER,LPITEMIDLIST);
extern LPSHELLVIEW IShellView_Constructor(LPSHELLFOLDER, LPCITEMIDLIST);
extern LPSHELLLINK IShellLink_Constructor();
extern LPSHELLLINK IShellLink_Constructor(void);
extern LPENUMIDLIST IEnumIDList_Constructor(LPCSTR,DWORD);
extern LPEXTRACTICON IExtractIcon_Constructor(LPITEMIDLIST);
#endif

View File

@ -471,53 +471,59 @@ BOOL16 WINAPI ShellAbout16( HWND16 hWnd, LPCSTR szApp, LPCSTR szOtherStuff,
* SHELL_GetResourceTable
*/
static DWORD SHELL_GetResourceTable(HFILE32 hFile,LPBYTE *retptr)
{
IMAGE_DOS_HEADER mz_header;
char magic[4];
int size;
TRACE(shell,"\n");
*retptr = NULL;
_llseek32( hFile, 0, SEEK_SET );
if ( (_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) ||
(mz_header.e_magic != IMAGE_DOS_SIGNATURE)
) { /* .ICO file ? */
if (mz_header.e_cblp == 1) { /* ICONHEADER.idType, must be 1 */
{ IMAGE_DOS_HEADER mz_header;
char magic[4];
int size;
TRACE(shell,"\n");
*retptr = NULL;
_llseek32( hFile, 0, SEEK_SET );
if ((_lread32(hFile,&mz_header,sizeof(mz_header)) != sizeof(mz_header)) || (mz_header.e_magic != IMAGE_DOS_SIGNATURE))
{ /* .ICO file ? */
if (mz_header.e_cblp == 1)
{ /* ICONHEADER.idType, must be 1 */
*retptr = (LPBYTE)-1;
return 1;
}
else
}
else
return 0; /* failed */
}
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
if (_lread32( hFile, magic, sizeof(magic) ) != sizeof(magic))
return 0;
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET);
if (*(DWORD*)magic == IMAGE_NT_SIGNATURE)
return IMAGE_NT_SIGNATURE;
if (*(WORD*)magic == IMAGE_OS2_SIGNATURE) {
IMAGE_OS2_HEADER ne_header;
LPBYTE pTypeInfo = (LPBYTE)-1;
if (_lread32(hFile,&ne_header,sizeof(ne_header))!=sizeof(ne_header))
return 0;
if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE) return 0;
size = ne_header.rname_tab_offset - ne_header.resource_tab_offset;
if( size > sizeof(NE_TYPEINFO) )
{
pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
if( pTypeInfo ) {
_llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
if( _lread32( hFile, (char*)pTypeInfo, size) != size ) {
HeapFree( GetProcessHeap(), 0, pTypeInfo);
pTypeInfo = NULL;
}
}
}
*retptr = pTypeInfo;
return IMAGE_OS2_SIGNATURE;
} else
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET );
if (_lread32( hFile, magic, sizeof(magic) ) != sizeof(magic))
return 0;
_llseek32( hFile, mz_header.e_lfanew, SEEK_SET);
if (*(DWORD*)magic == IMAGE_NT_SIGNATURE)
return IMAGE_NT_SIGNATURE;
if (*(WORD*)magic == IMAGE_OS2_SIGNATURE)
{ IMAGE_OS2_HEADER ne_header;
LPBYTE pTypeInfo = (LPBYTE)-1;
if (_lread32(hFile,&ne_header,sizeof(ne_header))!=sizeof(ne_header))
return 0;
if (ne_header.ne_magic != IMAGE_OS2_SIGNATURE)
return 0;
size = ne_header.rname_tab_offset - ne_header.resource_tab_offset;
if( size > sizeof(NE_TYPEINFO) )
{ pTypeInfo = (BYTE*)HeapAlloc( GetProcessHeap(), 0, size);
if( pTypeInfo )
{ _llseek32(hFile, mz_header.e_lfanew+ne_header.resource_tab_offset, SEEK_SET);
if( _lread32( hFile, (char*)pTypeInfo, size) != size )
{ HeapFree( GetProcessHeap(), 0, pTypeInfo);
pTypeInfo = NULL;
}
}
}
*retptr = pTypeInfo;
return IMAGE_OS2_SIGNATURE;
}
return 0; /* failed */
}
@ -525,30 +531,32 @@ static DWORD SHELL_GetResourceTable(HFILE32 hFile,LPBYTE *retptr)
* SHELL_LoadResource
*/
static HGLOBAL16 SHELL_LoadResource(HINSTANCE16 hInst, HFILE32 hFile, NE_NAMEINFO* pNInfo, WORD sizeShift)
{ BYTE* ptr;
HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
TRACE(shell,"\n");
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{ _llseek32( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
_lread32( hFile, (char*)ptr, pNInfo->length << sizeShift);
return handle;
}
return 0;
{ BYTE* ptr;
HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, (DWORD)pNInfo->length << sizeShift);
TRACE(shell,"\n");
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{ _llseek32( hFile, (DWORD)pNInfo->offset << sizeShift, SEEK_SET);
_lread32( hFile, (char*)ptr, pNInfo->length << sizeShift);
return handle;
}
return 0;
}
/*************************************************************************
* ICO_LoadIcon
*/
static HGLOBAL16 ICO_LoadIcon(HINSTANCE16 hInst, HFILE32 hFile, LPicoICONDIRENTRY lpiIDE)
{ BYTE* ptr;
HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
TRACE(shell,"\n");
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{ _llseek32( hFile, lpiIDE->dwImageOffset, SEEK_SET);
_lread32( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
return handle;
}
return 0;
{ BYTE* ptr;
HGLOBAL16 handle = DirectResAlloc( hInst, 0x10, lpiIDE->dwBytesInRes);
TRACE(shell,"\n");
if( (ptr = (BYTE*)GlobalLock16( handle )) )
{ _llseek32( hFile, lpiIDE->dwImageOffset, SEEK_SET);
_lread32( hFile, (char*)ptr, lpiIDE->dwBytesInRes);
return handle;
}
return 0;
}
/*************************************************************************
@ -605,274 +613,259 @@ static HGLOBAL16 ICO_GetIconDirectory(HINSTANCE16 hInst, HFILE32 hFile, LPicoICO
* This abortion is called directly by Progman
*/
HGLOBAL16 WINAPI InternalExtractIcon(HINSTANCE16 hInstance,
LPCSTR lpszExeFileName, UINT16 nIconIndex,
WORD n )
{
HGLOBAL16 hRet = 0;
HGLOBAL16* RetPtr = NULL;
LPBYTE pData;
OFSTRUCT ofs;
DWORD sig;
HFILE32 hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ );
UINT16 iconDirCount = 0,iconCount = 0;
TRACE(shell,"(%04x,file %s,start %d,extract %d\n",
LPCSTR lpszExeFileName, UINT16 nIconIndex, WORD n )
{ HGLOBAL16 hRet = 0;
HGLOBAL16* RetPtr = NULL;
LPBYTE pData;
OFSTRUCT ofs;
DWORD sig;
HFILE32 hFile = OpenFile32( lpszExeFileName, &ofs, OF_READ );
UINT16 iconDirCount = 0,iconCount = 0;
LPBYTE peimage;
HANDLE32 fmapping;
TRACE(shell,"(%04x,file %s,start %d,extract %d\n",
hInstance, lpszExeFileName, nIconIndex, n);
if( hFile == HFILE_ERROR32 || !n )
return 0;
if( hFile == HFILE_ERROR32 || !n )
return 0;
hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
RetPtr = (HICON16*)GlobalLock16(hRet);
hRet = GlobalAlloc16( GMEM_FIXED | GMEM_ZEROINIT, sizeof(HICON16)*n);
RetPtr = (HICON16*)GlobalLock16(hRet);
*RetPtr = (n == 0xFFFF)? 0: 1; /* error return values */
*RetPtr = (n == 0xFFFF)? 0: 1; /* error return values */
sig = SHELL_GetResourceTable(hFile,&pData);
sig = SHELL_GetResourceTable(hFile,&pData);
if((sig == IMAGE_OS2_SIGNATURE)
|| (sig == 1)) /* .ICO file */
{
HICON16 hIcon = 0;
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
NE_NAMEINFO* pIconStorage = NULL;
NE_NAMEINFO* pIconDir = NULL;
LPicoICONDIR lpiID = NULL;
if( sig==IMAGE_OS2_SIGNATURE || sig==1 ) /* .ICO file */
{ HICON16 hIcon = 0;
NE_TYPEINFO* pTInfo = (NE_TYPEINFO*)(pData + 2);
NE_NAMEINFO* pIconStorage = NULL;
NE_NAMEINFO* pIconDir = NULL;
LPicoICONDIR lpiID = NULL;
if( pData == (BYTE*)-1 )
{
/* check for .ICO file */
hIcon = ICO_GetIconDirectory(hInstance, hFile, &lpiID);
if( hIcon ) { iconDirCount = 1; iconCount = lpiID->idCount; }
}
else while( pTInfo->type_id && !(pIconStorage && pIconDir) )
{
/* find icon directory and icon repository */
if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON )
{
iconDirCount = pTInfo->count;
pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
TRACE(shell,"\tfound directory - %i icon families\n", iconDirCount);
}
if( pTInfo->type_id == NE_RSCTYPE_ICON )
{
iconCount = pTInfo->count;
pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
TRACE(shell,"\ttotal icons - %i\n", iconCount);
}
pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
}
/* load resources and create icons */
if( (pIconStorage && pIconDir) || lpiID )
{
if( nIconIndex == (UINT16)-1 ) RetPtr[0] = iconDirCount;
else if( nIconIndex < iconDirCount )
{
UINT16 i, icon;
if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
for( i = nIconIndex; i < nIconIndex + n; i++ )
{
/* .ICO files have only one icon directory */
if( lpiID == NULL )
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( lpiID )
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 );
if( hIcon )
{
RetPtr[icon-nIconIndex] = LoadIconHandler( hIcon, TRUE );
FarSetOwner( RetPtr[icon-nIconIndex], GetExePtr(hInstance) );
}
else
RetPtr[icon-nIconIndex] = 0;
}
}
}
if( lpiID ) HeapFree( GetProcessHeap(), 0, lpiID);
else HeapFree( GetProcessHeap(), 0, pData);
}
if( sig == IMAGE_NT_SIGNATURE)
{
LPBYTE peimage,idata,igdata;
PIMAGE_DOS_HEADER dheader;
PIMAGE_NT_HEADERS pe_header;
PIMAGE_SECTION_HEADER pe_sections;
PIMAGE_RESOURCE_DIRECTORY rootresdir,iconresdir,icongroupresdir;
PIMAGE_RESOURCE_DATA_ENTRY idataent,igdataent;
HANDLE32 fmapping;
int i,j;
PIMAGE_RESOURCE_DIRECTORY_ENTRY xresent;
CURSORICONDIR **cids;
fmapping = CreateFileMapping32A(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL);
if (fmapping == 0) { /* FIXME, INVALID_HANDLE_VALUE? */
WARN(shell,"failed to create filemap.\n");
_lclose32( hFile);
return 0;
}
peimage = MapViewOfFile(fmapping,FILE_MAP_READ,0,0,0);
if (!peimage) {
WARN(shell,"failed to mmap filemap.\n");
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
dheader = (PIMAGE_DOS_HEADER)peimage;
/* it is a pe header, SHELL_GetResourceTable checked that */
pe_header = (PIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew);
/* probably makes problems with short PE headers... but I haven't seen
* one yet...
*/
pe_sections = (PIMAGE_SECTION_HEADER)(((char*)pe_header)+sizeof(*pe_header));
rootresdir = NULL;
for (i=0;i<pe_header->FileHeader.NumberOfSections;i++) {
if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
continue;
/* FIXME: doesn't work when the resources are not in a seperate section */
if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress) {
rootresdir = (PIMAGE_RESOURCE_DIRECTORY)((char*)peimage+pe_sections[i].PointerToRawData);
break;
}
}
if (!rootresdir) {
WARN(shell,"haven't found section for resource directory.\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
icongroupresdir = GetResDirEntryW(rootresdir,RT_GROUP_ICON32W,
(DWORD)rootresdir,FALSE);
if (!icongroupresdir) {
WARN(shell,"No Icongroupresourcedirectory!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
iconDirCount = icongroupresdir->NumberOfNamedEntries+icongroupresdir->NumberOfIdEntries;
if( nIconIndex == (UINT16)-1 ) {
RetPtr[0] = iconDirCount;
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return hRet;
}
if (nIconIndex >= iconDirCount) {
WARN(shell,"nIconIndex %d is larger than iconDirCount %d\n",
nIconIndex,iconDirCount);
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
GlobalFree16(hRet);
return 0;
}
cids = (CURSORICONDIR**)HeapAlloc(GetProcessHeap(),0,n*sizeof(CURSORICONDIR*));
/* caller just wanted the number of entries */
xresent = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(icongroupresdir+1);
/* assure we don't get too much ... */
if( n > iconDirCount - nIconIndex ) n = iconDirCount - nIconIndex;
/* starting from specified index ... */
xresent = xresent+nIconIndex;
for (i=0;i<n;i++,xresent++) {
CURSORICONDIR *cid;
PIMAGE_RESOURCE_DIRECTORY resdir;
/* go down this resource entry, name */
resdir = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)rootresdir+(xresent->u2.s.OffsetToDirectory));
/* default language (0) */
resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir,TRUE);
igdataent = (PIMAGE_RESOURCE_DATA_ENTRY)resdir;
/* lookup address in mapped image for virtual address */
igdata = NULL;
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
if (igdataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
}
if (!igdata) {
WARN(shell,"no matching real address for icongroup!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
/* found */
cid = (CURSORICONDIR*)igdata;
cids[i] = cid;
RetPtr[i] = LookupIconIdFromDirectoryEx32(igdata,TRUE,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
}
iconresdir=GetResDirEntryW(rootresdir,RT_ICON32W,
(DWORD)rootresdir,FALSE);
if (!iconresdir) {
WARN(shell,"No Iconresourcedirectory!\n");
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return 0;
}
for (i=0;i<n;i++) {
PIMAGE_RESOURCE_DIRECTORY xresdir;
xresdir = GetResDirEntryW(iconresdir,(LPWSTR)RetPtr[i],(DWORD)rootresdir,FALSE);
xresdir = GetResDirEntryW(xresdir,(LPWSTR)0,(DWORD)rootresdir,TRUE);
idataent = (PIMAGE_RESOURCE_DATA_ENTRY)xresdir;
idata = NULL;
/* map virtual to address in image */
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++) {
if (idataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
if( pData == (BYTE*)-1 )
{ hIcon = ICO_GetIconDirectory(hInstance, hFile, &lpiID); /* check for .ICO file */
if( hIcon )
{ iconDirCount = 1; iconCount = lpiID->idCount;
}
if (!idata) {
WARN(shell,"no matching real address found for icondata!\n");
RetPtr[i]=0;
}
else while( pTInfo->type_id && !(pIconStorage && pIconDir) )
{ if( pTInfo->type_id == NE_RSCTYPE_GROUP_ICON ) /* find icon directory and icon repository */
{ iconDirCount = pTInfo->count;
pIconDir = ((NE_NAMEINFO*)(pTInfo + 1));
TRACE(shell,"\tfound directory - %i icon families\n", iconDirCount);
}
if( pTInfo->type_id == NE_RSCTYPE_ICON )
{ iconCount = pTInfo->count;
pIconStorage = ((NE_NAMEINFO*)(pTInfo + 1));
TRACE(shell,"\ttotal icons - %i\n", iconCount);
}
pTInfo = (NE_TYPEINFO *)((char*)(pTInfo+1)+pTInfo->count*sizeof(NE_NAMEINFO));
}
/* load resources and create icons */
if( (pIconStorage && pIconDir) || lpiID )
{ if( nIconIndex == (UINT16)-1 )
{ RetPtr[0] = iconDirCount;
}
else if( nIconIndex < iconDirCount )
{ UINT16 i, icon;
if( n > iconDirCount - nIconIndex )
n = iconDirCount - nIconIndex;
for( i = nIconIndex; i < nIconIndex + n; i++ )
{ /* .ICO files have only one icon directory */
if( lpiID == NULL )
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( lpiID )
{ 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 );
}
}
}
if( hIcon )
{ RetPtr[icon-nIconIndex] = LoadIconHandler( hIcon, TRUE );
FarSetOwner( RetPtr[icon-nIconIndex], GetExePtr(hInstance) );
}
else
{ RetPtr[icon-nIconIndex] = 0;
}
}
}
}
if( lpiID )
HeapFree( GetProcessHeap(), 0, lpiID);
else
HeapFree( GetProcessHeap(), 0, pData);
}
if( sig == IMAGE_NT_SIGNATURE)
{ LPBYTE idata,igdata;
PIMAGE_DOS_HEADER dheader;
PIMAGE_NT_HEADERS pe_header;
PIMAGE_SECTION_HEADER pe_sections;
PIMAGE_RESOURCE_DIRECTORY rootresdir,iconresdir,icongroupresdir;
PIMAGE_RESOURCE_DATA_ENTRY idataent,igdataent;
int i,j;
PIMAGE_RESOURCE_DIRECTORY_ENTRY xresent;
CURSORICONDIR **cids;
fmapping = CreateFileMapping32A(hFile,NULL,PAGE_READONLY|SEC_COMMIT,0,0,NULL);
if (fmapping == 0)
{ /* FIXME, INVALID_HANDLE_VALUE? */
WARN(shell,"failed to create filemap.\n");
hRet = 0;
goto end_2; /* failure */
}
peimage = MapViewOfFile(fmapping,FILE_MAP_READ,0,0,0);
if (!peimage)
{ WARN(shell,"failed to mmap filemap.\n");
hRet = 0;
goto end_2; /* failure */
}
dheader = (PIMAGE_DOS_HEADER)peimage;
/* it is a pe header, SHELL_GetResourceTable checked that */
pe_header = (PIMAGE_NT_HEADERS)(peimage+dheader->e_lfanew);
/* probably makes problems with short PE headers... but I haven't seen
* one yet...
*/
pe_sections = (PIMAGE_SECTION_HEADER)(((char*)pe_header)+sizeof(*pe_header));
rootresdir = NULL;
for (i=0;i<pe_header->FileHeader.NumberOfSections;i++)
{ if (pe_sections[i].Characteristics & IMAGE_SCN_CNT_UNINITIALIZED_DATA)
continue;
/* FIXME: doesn't work when the resources are not in a seperate section */
if (pe_sections[i].VirtualAddress == pe_header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_RESOURCE].VirtualAddress)
{ rootresdir = (PIMAGE_RESOURCE_DIRECTORY)((char*)peimage+pe_sections[i].PointerToRawData);
break;
}
}
if (!rootresdir)
{ WARN(shell,"haven't found section for resource directory.\n");
goto end_4; /* failure */
}
icongroupresdir = GetResDirEntryW(rootresdir,RT_GROUP_ICON32W, (DWORD)rootresdir,FALSE);
if (!icongroupresdir)
{ WARN(shell,"No Icongroupresourcedirectory!\n");
goto end_4; /* failure */
}
iconDirCount = icongroupresdir->NumberOfNamedEntries+icongroupresdir->NumberOfIdEntries;
if( nIconIndex == (UINT16)-1 )
{ RetPtr[0] = iconDirCount;
goto end_3; /* success */
}
if (nIconIndex >= iconDirCount)
{ WARN(shell,"nIconIndex %d is larger than iconDirCount %d\n",nIconIndex,iconDirCount);
GlobalFree16(hRet);
goto end_4; /* failure */
}
cids = (CURSORICONDIR**)HeapAlloc(GetProcessHeap(),0,n*sizeof(CURSORICONDIR*));
/* caller just wanted the number of entries */
xresent = (PIMAGE_RESOURCE_DIRECTORY_ENTRY)(icongroupresdir+1);
/* assure we don't get too much ... */
if( n > iconDirCount - nIconIndex )
{ n = iconDirCount - nIconIndex;
}
/* starting from specified index ... */
xresent = xresent+nIconIndex;
for (i=0;i<n;i++,xresent++)
{ CURSORICONDIR *cid;
PIMAGE_RESOURCE_DIRECTORY resdir;
/* go down this resource entry, name */
resdir = (PIMAGE_RESOURCE_DIRECTORY)((DWORD)rootresdir+(xresent->u2.s.OffsetToDirectory));
/* default language (0) */
resdir = GetResDirEntryW(resdir,(LPWSTR)0,(DWORD)rootresdir,TRUE);
igdataent = (PIMAGE_RESOURCE_DATA_ENTRY)resdir;
/* lookup address in mapped image for virtual address */
igdata = NULL;
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++)
{ if (igdataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (igdataent->OffsetToData+igdataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
igdata = peimage+(igdataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
}
if (!igdata)
{ WARN(shell,"no matching real address for icongroup!\n");
goto end_4; /* failure */
}
/* found */
cid = (CURSORICONDIR*)igdata;
cids[i] = cid;
RetPtr[i] = LookupIconIdFromDirectoryEx32(igdata,TRUE,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
}
iconresdir=GetResDirEntryW(rootresdir,RT_ICON32W,(DWORD)rootresdir,FALSE);
if (!iconresdir)
{ WARN(shell,"No Iconresourcedirectory!\n");
goto end_4; /* failure */
}
for (i=0;i<n;i++)
{ PIMAGE_RESOURCE_DIRECTORY xresdir;
xresdir = GetResDirEntryW(iconresdir,(LPWSTR)(DWORD)RetPtr[i],(DWORD)rootresdir,FALSE);
xresdir = GetResDirEntryW(xresdir,(LPWSTR)0,(DWORD)rootresdir,TRUE);
idataent = (PIMAGE_RESOURCE_DATA_ENTRY)xresdir;
idata = NULL;
/* map virtual to address in image */
for (j=0;j<pe_header->FileHeader.NumberOfSections;j++)
{ if (idataent->OffsetToData < pe_sections[j].VirtualAddress)
continue;
if (idataent->OffsetToData+idataent->Size > pe_sections[j].VirtualAddress+pe_sections[j].SizeOfRawData)
continue;
idata = peimage+(idataent->OffsetToData-pe_sections[j].VirtualAddress+pe_sections[j].PointerToRawData);
}
if (!idata)
{ WARN(shell,"no matching real address found for icondata!\n");
RetPtr[i]=0;
continue;
}
RetPtr[i] = CreateIconFromResourceEx32(idata,idataent->Size,TRUE,0x00030000,SYSMETRICS_CXICON,SYSMETRICS_CYICON,0);
}
goto end_3; /* sucess */
}
UnmapViewOfFile(peimage);
CloseHandle(fmapping);
_lclose32( hFile);
return hRet;
}
_lclose32( hFile );
/* return array with icon handles */
return hRet;
goto end_1; /* return array with icon handles */
/* cleaning up (try & catch would be nicer) */
end_4: hRet = 0; /* failure */
end_3: UnmapViewOfFile(peimage); /* success */
end_2: CloseHandle(fmapping);
end_1: _lclose32( hFile);
return hRet;
}
/*************************************************************************
@ -892,43 +885,41 @@ HICON16 WINAPI ExtractIcon16( HINSTANCE16 hInstance, LPCSTR lpszExeFileName,
* Return icon for given file (either from file itself or from associated
* executable) and patch parameters if needed.
*/
HICON32 WINAPI ExtractAssociatedIcon32A(HINSTANCE32 hInst,LPSTR lpIconPath,
LPWORD lpiIcon)
{ TRACE(shell,"\n");
HICON32 WINAPI ExtractAssociatedIcon32A(HINSTANCE32 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
{ TRACE(shell,"\n");
return ExtractAssociatedIcon16(hInst,lpIconPath,lpiIcon);
}
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst,LPSTR lpIconPath,
LPWORD lpiIcon)
{ HICON16 hIcon;
HICON16 WINAPI ExtractAssociatedIcon16(HINSTANCE16 hInst, LPSTR lpIconPath, LPWORD lpiIcon)
{ HICON16 hIcon;
TRACE(shell,"\n");
TRACE(shell,"\n");
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
if( hIcon < 2 )
{ if( hIcon == 1 ) /* no icons found in given file */
{ char tempPath[0x80];
if( hIcon < 2 )
{ if( hIcon == 1 ) /* no icons found in given file */
{ char tempPath[0x80];
UINT16 uRet = FindExecutable16(lpIconPath,NULL,tempPath);
if( uRet > 32 && tempPath[0] )
{ strcpy(lpIconPath,tempPath);
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
if( hIcon > 2 )
return hIcon;
{ strcpy(lpIconPath,tempPath);
hIcon = ExtractIcon16(hInst, lpIconPath, *lpiIcon);
if( hIcon > 2 )
return hIcon;
}
else hIcon = 0;
}
}
if( hIcon == 1 )
if( hIcon == 1 )
*lpiIcon = 2; /* MSDOS icon - we found .exe but no icons in it */
else
else
*lpiIcon = 6; /* generic icon - found nothing */
GetModuleFileName16(hInst, lpIconPath, 0x80);
hIcon = LoadIcon16( hInst, MAKEINTRESOURCE16(*lpiIcon));
}
return hIcon;
GetModuleFileName16(hInst, lpIconPath, 0x80);
hIcon = LoadIcon16( hInst, MAKEINTRESOURCE16(*lpiIcon));
}
return hIcon;
}
/*************************************************************************

View File

@ -8,18 +8,18 @@ init Shell32LibMain
# This list was updated to dll version 4.72
2 stdcall SHChangeNotifyRegister(long long long long long long) SHChangeNotifyRegister
3 stub CheckEscapesA # exported by name
3 stub CheckEscapesA@8
4 stdcall SHChangeNotifyDeregister (long long) SHChangeNotifyDeregister
5 stub SHChangeNotifyUpdateEntryList@16
6 stub CheckEscapesW # exported by name
7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW # exported by name
8 stub Control_FillCache_RunDLL@16 # exported by name
6 stub CheckEscapesW@8
7 stdcall CommandLineToArgvW(wstr ptr) CommandLineToArgvW
8 stub Control_FillCache_RunDLL@16
9 stub PifMgr_OpenProperties@16
10 stub PifMgr_GetProperties@20
11 stub PifMgr_SetProperties@20
12 stub Control_FillCache_RunDLLA # exported by name
12 stub Control_FillCache_RunDLLA@16
13 stub PifMgr_CloseProperties@8
14 stub Control_FillCache_RunDLLW@16 # exported by name
14 stub Control_FillCache_RunDLLW@16
15 stdcall ILGetDisplayName(ptr ptr) ILGetDisplayName
16 stdcall ILFindLastID(ptr) ILFindLastID
17 stdcall ILRemoveLastID(ptr) ILRemoveLastID
@ -28,7 +28,7 @@ init Shell32LibMain
20 stub ILGlobalClone@4
21 stdcall ILIsEqual (ptr ptr) ILIsEqual
22 stdcall Control_RunDLL(long long long long) Control_RunDLL # exported by name
23 stub ILIsParent@12
23 stdcall ILIsParent (long long long) ILIsParent
24 stdcall ILFindChild (long long) ILFindChild
25 stdcall ILCombine(ptr ptr) ILCombine
26 stub ILLoadFromStream@8
@ -45,26 +45,26 @@ init Shell32LibMain
37 stdcall PathCombine(ptr ptr ptr) PathCombine32AW
38 stub PathStripPath
39 stdcall PathIsUNC(str) PathIsUNC
40 stub PathIsRelative
41 stub Control_RunDLLA # exported by name
42 stub Control_RunDLLW # exported by name
40 stub PathIsRelative@4
41 stub Control_RunDLLA@16
42 stub Control_RunDLLW@16
43 stdcall PathIsExe (ptr) PathIsExe
44 stub DoEnvironmentSubstA # exported by name
44 stub DoEnvironmentSubstA@8
45 stdcall PathFileExists(str) PathFileExists
46 stdcall PathMatchSpec (str str) PathMatchSpec
47 stub PathMakeUniqueName@20
48 stub PathSetDlgItemPath@12
49 stub PathQualify@4
50 stub PathStripToRoot
50 stub PathStripToRoot@4
51 stdcall PathResolve(str long long) PathResolve
52 stdcall PathGetArgs(str) PathGetArgs
53 stub DoEnvironmentSubstW@8 # exported by name
53 stub DoEnvironmentSubstW@8
54 stdcall DragAcceptFiles(long long) DragAcceptFiles32
55 stub PathQuoteSpaces
55 stdcall PathQuoteSpaces (ptr) PathQuoteSpaces32AW
56 stdcall PathUnquoteSpaces(str) PathUnquoteSpaces
57 stdcall PathGetDriveNumber (str) PathGetDriveNumber32
58 stdcall ParseField(str long str long) ParseField
59 stub RestartDialog
59 stub RestartDialog@12
60 stdcall ExitWindowsDialog(long) ExitWindowsDialog
61 stdcall RunFileDlg(long long long str str long) RunFileDlg
62 stdcall PickIconDlg(long long long long) PickIconDlg
@ -194,9 +194,9 @@ init Shell32LibMain
186 stub ExtractAssociatedIconExW # exported by name
187 stub ExtractAssociatedIconW # exported by name
188 stdcall ExtractIconA(long str long) ExtractIcon32A # exported by name
189 stub ExtractIconEx # exported by name
190 stub ExtractIconExA # exported by name
191 stub ExtractIconExW # exported by name
189 stdcall ExtractIconEx(ptr long ptr ptr long) ExtractIconEx32AW
190 stdcall ExtractIconExA(str long ptr ptr long) ExtractIconEx32A
191 stdcall ExtractIconExW(wstr long ptr ptr long) ExtractIconEx32W
192 stub ExtractIconResInfoA # exported by name
193 stub ExtractIconResInfoW # exported by name
194 stdcall ExtractIconW(long wstr long) ExtractIcon32W # exported by name
@ -297,9 +297,9 @@ init Shell32LibMain
288 stdcall ShellAboutA(long str str long) ShellAbout32A
289 stdcall ShellAboutW(long wstr wstr long) ShellAbout32W
290 stdcall ShellExecuteA(long str str str str long) ShellExecute32A
291 stdcall ShellExecuteEx (long) ShellExecuteEx32A
291 stdcall ShellExecuteEx (long) ShellExecuteEx32
292 stdcall ShellExecuteExA (long) ShellExecuteEx32A
293 stub ShellExecuteExW
293 stdcall ShellExecuteExW (long) ShellExecuteEx32W
294 stub ShellExecuteW
295 stub ShellHookProc # exported by name
296 stdcall Shell_NotifyIcon(long ptr) Shell_NotifyIcon
@ -339,7 +339,7 @@ init Shell32LibMain
505 stdcall SHRegCloseKey (long) SHRegCloseKey32
506 stdcall SHRegOpenKeyA (long str long) SHRegOpenKey32A
507 stdcall SHRegOpenKeyW (long wstr long long) SHRegOpenKey32W
507 stdcall SHRegOpenKeyW (long wstr long) SHRegOpenKey32W
508 stub SHRegQueryValueA@16
509 stdcall SHRegQueryValueExA(long str ptr ptr ptr ptr) SHRegQueryValueEx32A
510 stdcall SHRegQueryValueW (long long long long) SHRegQueryValue32W
@ -366,7 +366,7 @@ init Shell32LibMain
650 stub PathIsSameRoot@8
651 stdcall ReadCabinetState (long long) ReadCabinetState
652 stdcall WriteCabinetState (long) WriteCabinetState
653 stub PathProcessCommand@16
653 stdcall PathProcessCommand (long long long long) PathProcessCommand
660 stdcall FileIconInit (long) FileIconInit