Vitaly Lipatov : Use sizeof instead of constant for buffer size. <lav at etersoft.ru>

Alexander Nicolaysen Sørnes : Handle backspace key in shellview. <alex at thehandofagony.com>
Gerald Pfeifer : Avoid checking for <0 for unsigned variables. <gerald at pfeifer.com>
Thomas Weidenmueller : Use SHStrDupW in IShellFolder2:: GetDetailsOf to allocate returned string. <thomas at reactsoft.com>
Rob Shearman : Fix the length calculation of the pidl in ILSaveToStream by using the helper function ILGetSize . <rob at codeweavers.com>
Rob Shearman : Fix a memory leak in Stream_WriteLocationInfo. <rob at codeweavers.com>
Lei Zhang : Don't crash if $HOME is not set. <thestig at google.com>
Alexandre Julliard : Pass some of the ShellExecute flags through InvokeCommand. <julliard at winehq.org>
Juan Lang : Don't overwrite the caller's buffer when doing a dde connection. <juan.lang at gmail.com>
Juan Lang : Remove a bad comment. <juan.lang at gmail.com>
Juan Lang : Use more restricted registry rights when quering values. <juan.lang at gmail.com>
Rob Shearman : Add a stub for LinkWindow_RegisterClass. <rob at codeweavers.com>
Rob Shearman : Add a stub for LinkWindow_UnregisterClass. <rob at codeweavers.com>
Michael Stefaniuc : Fix a mem leak on an error path. Found by Smatch. <mstefani at redhat.de>
Marcus Meissner : GetModuleFileNameW gets number of WCHARs not bytes. <marcus at jet.franken.de>
Lei Zhang : rename My Video to My Videos. <thestig at google.com>

svn path=/trunk/; revision=31071
This commit is contained in:
Christoph von Wittich 2007-12-08 13:03:24 +00:00
parent f8072187ba
commit 3d376e1acb
12 changed files with 73 additions and 47 deletions

View file

@ -65,7 +65,7 @@ BOOL HCR_MapTypeToValueW(LPCWSTR szExtension, LPWSTR szFileType, LONG len, BOOL
lstrcpynW(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH); lstrcpynW(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH);
if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey)) if (RegOpenKeyExW(HKEY_CLASSES_ROOT, szTemp, 0, KEY_READ, &hkey))
{ {
return FALSE; return FALSE;
} }
@ -99,7 +99,7 @@ BOOL HCR_MapTypeToValueA(LPCSTR szExtension, LPSTR szFileType, LONG len, BOOL bP
lstrcpynA(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH); lstrcpynA(szTemp + (bPrependDot?1:0), szExtension, MAX_EXTENSION_LENGTH);
if (RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, 0x02000000, &hkey)) if (RegOpenKeyExA(HKEY_CLASSES_ROOT, szTemp, 0, KEY_READ, &hkey))
{ {
return FALSE; return FALSE;
} }
@ -182,7 +182,7 @@ BOOL HCR_GetExecuteCommandW( HKEY hkeyClass, LPCWSTR szClass, LPCWSTR szVerb, LP
TRACE("%p %s %s %p\n", hkeyClass, debugstr_w(szClass), debugstr_w(szVerb), szDest); TRACE("%p %s %s %p\n", hkeyClass, debugstr_w(szClass), debugstr_w(szVerb), szDest);
if (szClass) if (szClass)
RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, 0x02000000, &hkeyClass); RegOpenKeyExW(HKEY_CLASSES_ROOT, szClass, 0, KEY_READ, &hkeyClass);
if (!hkeyClass) if (!hkeyClass)
return FALSE; return FALSE;
ret = FALSE; ret = FALSE;
@ -280,7 +280,7 @@ BOOL HCR_GetDefaultIconW(LPCWSTR szClass, LPWSTR szDest, DWORD len, int* picon_i
lstrcpynW(sTemp, szClass, MAX_PATH); lstrcpynW(sTemp, szClass, MAX_PATH);
lstrcatW(sTemp, swDefaultIcon); lstrcatW(sTemp, swDefaultIcon);
if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) if (!RegOpenKeyExW(HKEY_CLASSES_ROOT, sTemp, 0, KEY_READ, &hkey))
{ {
ret = HCR_RegGetDefaultIconW(hkey, szDest, len, picon_idx); ret = HCR_RegGetDefaultIconW(hkey, szDest, len, picon_idx);
RegCloseKey(hkey); RegCloseKey(hkey);
@ -304,7 +304,7 @@ BOOL HCR_GetDefaultIconA(LPCSTR szClass, LPSTR szDest, DWORD len, int* picon_idx
sprintf(sTemp, "%s\\DefaultIcon",szClass); sprintf(sTemp, "%s\\DefaultIcon",szClass);
if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, 0x02000000, &hkey)) if (!RegOpenKeyExA(HKEY_CLASSES_ROOT, sTemp, 0, KEY_READ, &hkey))
{ {
ret = HCR_RegGetDefaultIconA(hkey, szDest, len, picon_idx); ret = HCR_RegGetDefaultIconA(hkey, szDest, len, picon_idx);
RegCloseKey(hkey); RegCloseKey(hkey);

View file

@ -416,7 +416,7 @@ BEGIN
IDS_SENDTO "SendTo" IDS_SENDTO "SendTo"
IDS_STARTMENU "Start Menu" IDS_STARTMENU "Start Menu"
IDS_MYMUSIC "My Music" IDS_MYMUSIC "My Music"
IDS_MYVIDEO "My Video" IDS_MYVIDEO "My Videos"
IDS_DESKTOPDIRECTORY "Desktop" IDS_DESKTOPDIRECTORY "Desktop"
IDS_NETHOOD "NetHood" IDS_NETHOOD "NetHood"
IDS_TEMPLATES "Templates" IDS_TEMPLATES "Templates"
@ -433,7 +433,7 @@ BEGIN
IDS_ADMINTOOLS "Start Menu\\Programs\\Administrative Tools" IDS_ADMINTOOLS "Start Menu\\Programs\\Administrative Tools"
IDS_COMMON_MUSIC "Documents\\My Music" IDS_COMMON_MUSIC "Documents\\My Music"
IDS_COMMON_PICTURES "Documents\\My Pictures" IDS_COMMON_PICTURES "Documents\\My Pictures"
IDS_COMMON_VIDEO "Documents\\My Video" IDS_COMMON_VIDEO "Documents\\My Videos"
IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning" IDS_CDBURN_AREA "Local Settings\\Application Data\\Microsoft\\CD Burning"
IDS_DRIVE_FIXED "Local Disk" IDS_DRIVE_FIXED "Local Disk"

View file

@ -341,7 +341,6 @@ HRESULT WINAPI ILLoadFromStream (IStream * pStream, LPITEMIDLIST * ppPidl)
*/ */
HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl) HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
{ {
LPCITEMIDLIST pidl;
WORD wLen = 0; WORD wLen = 0;
HRESULT ret = E_FAIL; HRESULT ret = E_FAIL;
@ -349,12 +348,7 @@ HRESULT WINAPI ILSaveToStream (IStream * pStream, LPCITEMIDLIST pPidl)
IStream_AddRef (pStream); IStream_AddRef (pStream);
pidl = pPidl; wLen = ILGetSize(pPidl);
while (pidl->mkid.cb)
{
wLen += sizeof(WORD) + pidl->mkid.cb;
pidl = ILGetNext(pidl);
}
if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL))) if (SUCCEEDED(IStream_Write(pStream, (LPVOID)&wLen, 2, NULL)))
{ {

View file

@ -469,7 +469,7 @@ static HRESULT WINAPI RecycleBin_GetDefaultColumnState(IShellFolder2 *iface, UIN
{ {
RecycleBin *This = (RecycleBin *)iface; RecycleBin *This = (RecycleBin *)iface;
TRACE("(%p, %d, %p)\n", This, iColumn, pcsFlags); TRACE("(%p, %d, %p)\n", This, iColumn, pcsFlags);
if (iColumn < 0 || iColumn >= COLUMNS_COUNT) if (iColumn >= COLUMNS_COUNT)
return E_INVALIDARG; return E_INVALIDARG;
*pcsFlags = RecycleBinColumns[iColumn].pcsFlags; *pcsFlags = RecycleBinColumns[iColumn].pcsFlags;
return S_OK; return S_OK;
@ -488,7 +488,7 @@ static HRESULT WINAPI RecycleBin_GetDetailsOf(IShellFolder2 *iface, LPCITEMIDLIS
WCHAR buffer[MAX_PATH]; WCHAR buffer[MAX_PATH];
TRACE("(%p, %p, %d, %p)\n", This, pidl, iColumn, pDetails); TRACE("(%p, %p, %d, %p)\n", This, pidl, iColumn, pDetails);
if (iColumn < 0 || iColumn >= COLUMNS_COUNT) if (iColumn >= COLUMNS_COUNT)
return E_FAIL; return E_FAIL;
pDetails->fmt = RecycleBinColumns[iColumn].fmt; pDetails->fmt = RecycleBinColumns[iColumn].fmt;
pDetails->cxChar = RecycleBinColumns[iColumn].cxChars; pDetails->cxChar = RecycleBinColumns[iColumn].cxChars;
@ -527,15 +527,14 @@ static HRESULT WINAPI RecycleBin_GetDetailsOf(IShellFolder2 *iface, LPCITEMIDLIS
} }
pDetails->str.uType = STRRET_WSTR; pDetails->str.uType = STRRET_WSTR;
pDetails->str.u.pOleStr = StrDupW(buffer); return SHStrDupW(buffer, &pDetails->str.u.pOleStr);
return (pDetails->str.u.pOleStr != NULL ? S_OK : E_OUTOFMEMORY);
} }
static HRESULT WINAPI RecycleBin_MapColumnToSCID(IShellFolder2 *iface, UINT iColumn, SHCOLUMNID *pscid) static HRESULT WINAPI RecycleBin_MapColumnToSCID(IShellFolder2 *iface, UINT iColumn, SHCOLUMNID *pscid)
{ {
RecycleBin *This = (RecycleBin *)iface; RecycleBin *This = (RecycleBin *)iface;
TRACE("(%p, %d, %p)\n", This, iColumn, pscid); TRACE("(%p, %d, %p)\n", This, iColumn, pscid);
if (iColumn<0 || iColumn>=COLUMNS_COUNT) if (iColumn>=COLUMNS_COUNT)
return E_INVALIDARG; return E_INVALIDARG;
pscid->fmtid = *RecycleBinColumns[iColumn].fmtId; pscid->fmtid = *RecycleBinColumns[iColumn].fmtId;
pscid->pid = RecycleBinColumns[iColumn].pid; pscid->pid = RecycleBinColumns[iColumn].pid;

View file

@ -213,6 +213,8 @@
251 stdcall -noname PathRemoveArgs(ptr) PathRemoveArgsAW 251 stdcall -noname PathRemoveArgs(ptr) PathRemoveArgsAW
255 stdcall Options_RunDLLA(ptr ptr str long) 255 stdcall Options_RunDLLA(ptr ptr str long)
256 stdcall @(ptr ptr) SHELL32_256 256 stdcall @(ptr ptr) SHELL32_256
258 stdcall -noname LinkWindow_RegisterClass()
259 stdcall -noname LinkWindow_UnregisterClass()
260 stdcall Options_RunDLLW(ptr ptr wstr long) 260 stdcall Options_RunDLLW(ptr ptr wstr long)
#299 stub Shl1632_ThunkData32 #299 stub Shl1632_ThunkData32
#300 stub Shl3216_ThunkData32 #300 stub Shl3216_ThunkData32

View file

@ -101,7 +101,7 @@ LPWSTR* WINAPI CommandLineToArgvW(LPCWSTR lpCmdline, int* numargs)
argv=GlobalLock(hargv); argv=GlobalLock(hargv);
for (;;) for (;;)
{ {
len = GetModuleFileNameW(0, (LPWSTR)(argv+1), size-sizeof(LPWSTR)); len = GetModuleFileNameW(0, (LPWSTR)(argv+1), (size-sizeof(LPWSTR))/sizeof(WCHAR));
if (!len) if (!len)
{ {
GlobalFree(hargv); GlobalFree(hargv);

View file

@ -993,6 +993,7 @@ static HRESULT Stream_WriteLocationInfo( IStream* stm, LPCWSTR path,
LOCATION_INFO *loc; LOCATION_INFO *loc;
LPSTR szLabel, szPath, szFinalPath; LPSTR szLabel, szPath, szFinalPath;
ULONG count = 0; ULONG count = 0;
HRESULT hr;
TRACE("%p %s %p\n", stm, debugstr_w(path), volume); TRACE("%p %s %p\n", stm, debugstr_w(path), volume);
@ -1034,7 +1035,10 @@ static HRESULT Stream_WriteLocationInfo( IStream* stm, LPCWSTR path,
szPath, path_size, NULL, NULL ); szPath, path_size, NULL, NULL );
szFinalPath[0] = 0; szFinalPath[0] = 0;
return IStream_Write( stm, loc, total_size, &count ); hr = IStream_Write( stm, loc, total_size, &count );
HeapFree(GetProcessHeap(), 0, loc);
return hr;
} }
static EXP_DARWIN_LINK* shelllink_build_darwinid( LPCWSTR string, DWORD magic ) static EXP_DARWIN_LINK* shelllink_build_darwinid( LPCWSTR string, DWORD magic )
@ -2826,7 +2830,7 @@ ShellLink_InvokeCommand( IContextMenu* iface, LPCMINVOKECOMMANDINFO lpici )
memset( &sei, 0, sizeof sei ); memset( &sei, 0, sizeof sei );
sei.cbSize = sizeof sei; sei.cbSize = sizeof sei;
sei.fMask = SEE_MASK_UNICODE | SEE_MASK_NOCLOSEPROCESS; sei.fMask = SEE_MASK_UNICODE | (lpici->fMask & (SEE_MASK_NOASYNC|SEE_MASK_ASYNCOK|SEE_MASK_FLAG_NO_UI));
sei.lpFile = path; sei.lpFile = path;
sei.nShow = This->iShowCmd; sei.nShow = This->iShowCmd;
sei.lpIDList = This->pPidl; sei.lpIDList = This->pPidl;

View file

@ -2070,6 +2070,24 @@ HRESULT WINAPI SHSetLocalizedName(LPWSTR pszPath, LPCWSTR pszResModule, int idsR
return S_OK; return S_OK;
} }
/*************************************************************************
* LinkWindow_RegisterClass (SHELL32.258)
*/
BOOL WINAPI LinkWindow_RegisterClass(void)
{
FIXME("()\n");
return TRUE;
}
/*************************************************************************
* LinkWindow_UnregisterClass (SHELL32.259)
*/
BOOL WINAPI LinkWindow_UnregisterClass(void)
{
FIXME("()\n");
return TRUE;
}
/************************************************************************* /*************************************************************************
* Options_RunDLL (SHELL32.@) * Options_RunDLL (SHELL32.@)
*/ */

View file

@ -2066,8 +2066,6 @@ static void _SHCreateSymbolicLinks(void)
} }
} }
HeapFree(GetProcessHeap(), 0, pszPersonal);
/* Create symbolic links for 'My Pictures', 'My Video' and 'My Music'. */ /* Create symbolic links for 'My Pictures', 'My Video' and 'My Music'. */
for (i=0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) { for (i=0; i < sizeof(aidsMyStuff)/sizeof(aidsMyStuff[0]); i++) {
/* Create the current 'My Whatever' folder and get it's unix path. */ /* Create the current 'My Whatever' folder and get it's unix path. */
@ -2095,7 +2093,12 @@ static void _SHCreateSymbolicLinks(void)
} }
/* Last but not least, the Desktop folder */ /* Last but not least, the Desktop folder */
strcpy(szDesktopTarget, pszHome); if (pszHome)
strcpy(szDesktopTarget, pszHome);
else
strcpy(szDesktopTarget, pszPersonal);
HeapFree(GetProcessHeap(), 0, pszPersonal);
if (_SHAppendToUnixPath(szDesktopTarget, DesktopW) && if (_SHAppendToUnixPath(szDesktopTarget, DesktopW) &&
!stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode)) !stat(szDesktopTarget, &statFolder) && S_ISDIR(statFolder.st_mode))
{ {

View file

@ -708,6 +708,7 @@ static HRESULT WINAPI ISF_MyComputer_fnGetDisplayNameOf (IShellFolder2 *iface,
{ {
/* Neither a shell namespace extension nor a drive letter. */ /* Neither a shell namespace extension nor a drive letter. */
ERR("Wrong pidl type\n"); ERR("Wrong pidl type\n");
CoTaskMemFree(pszPath);
return E_INVALIDARG; return E_INVALIDARG;
} }
} }

View file

@ -632,11 +632,7 @@ UINT SHELL_FindExecutable(LPCWSTR lpPath, LPCWSTR lpFile, LPCWSTR lpOperation,
* attached */ * attached */
TRACE("found %s\n", debugstr_w(lpResult)); TRACE("found %s\n", debugstr_w(lpResult));
return 33; return 33;
/* Greater than 32 to indicate success */
/* Greater than 32 to indicate success FIXME According to the
* docs, I should be returning a handle for the
* executable. Does this mean I'm supposed to open the
* executable file or something? More RTFM, I guess... */
} }
tok = p; tok = p;
} }
@ -756,7 +752,8 @@ static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec,
{ {
static const WCHAR wApplication[] = {'\\','a','p','p','l','i','c','a','t','i','o','n',0}; static const WCHAR wApplication[] = {'\\','a','p','p','l','i','c','a','t','i','o','n',0};
static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0}; static const WCHAR wTopic[] = {'\\','t','o','p','i','c',0};
WCHAR * endkey = key + strlenW(key); WCHAR regkey[256];
WCHAR * endkey = regkey + strlenW(key);
WCHAR app[256], topic[256], ifexec[256], res[256]; WCHAR app[256], topic[256], ifexec[256], res[256];
LONG applen, topiclen, ifexeclen; LONG applen, topiclen, ifexeclen;
WCHAR * exec; WCHAR * exec;
@ -769,9 +766,10 @@ static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec,
unsigned ret = SE_ERR_NOASSOC; unsigned ret = SE_ERR_NOASSOC;
BOOL unicode = !(GetVersion() & 0x80000000); BOOL unicode = !(GetVersion() & 0x80000000);
strcpyW(regkey, key);
strcpyW(endkey, wApplication); strcpyW(endkey, wApplication);
applen = sizeof(app); applen = sizeof(app);
if (RegQueryValueW(HKEY_CLASSES_ROOT, key, app, &applen) != ERROR_SUCCESS) if (RegQueryValueW(HKEY_CLASSES_ROOT, regkey, app, &applen) != ERROR_SUCCESS)
{ {
WCHAR command[1024], fullpath[MAX_PATH]; WCHAR command[1024], fullpath[MAX_PATH];
static const WCHAR wSo[] = { '.','s','o',0 }; static const WCHAR wSo[] = { '.','s','o',0 };
@ -822,7 +820,7 @@ static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec,
strcpyW(endkey, wTopic); strcpyW(endkey, wTopic);
topiclen = sizeof(topic); topiclen = sizeof(topic);
if (RegQueryValueW(HKEY_CLASSES_ROOT, key, topic, &topiclen) != ERROR_SUCCESS) if (RegQueryValueW(HKEY_CLASSES_ROOT, regkey, topic, &topiclen) != ERROR_SUCCESS)
{ {
static const WCHAR wSystem[] = {'S','y','s','t','e','m',0}; static const WCHAR wSystem[] = {'S','y','s','t','e','m',0};
strcpyW(topic, wSystem); strcpyW(topic, wSystem);
@ -864,7 +862,7 @@ static unsigned dde_connect(WCHAR* key, const WCHAR* start, WCHAR* ddeexec,
} }
strcpyW(endkey, wIfexec); strcpyW(endkey, wIfexec);
ifexeclen = sizeof(ifexec); ifexeclen = sizeof(ifexec);
if (RegQueryValueW(HKEY_CLASSES_ROOT, key, ifexec, &ifexeclen) == ERROR_SUCCESS) if (RegQueryValueW(HKEY_CLASSES_ROOT, regkey, ifexec, &ifexeclen) == ERROR_SUCCESS)
{ {
exec = ifexec; exec = ifexec;
} }
@ -1172,7 +1170,7 @@ static HRESULT shellex_run_context_menu_default( IShellExtInit *obj,
memset( &ici, 0, sizeof ici ); memset( &ici, 0, sizeof ici );
ici.cbSize = sizeof ici; ici.cbSize = sizeof ici;
ici.fMask = CMIC_MASK_UNICODE; ici.fMask = CMIC_MASK_UNICODE | (sei->fMask & (SEE_MASK_NOASYNC|SEE_MASK_ASYNCOK|SEE_MASK_FLAG_NO_UI));
ici.nShow = sei->nShow; ici.nShow = sei->nShow;
ici.lpVerb = MAKEINTRESOURCEA( def ); ici.lpVerb = MAKEINTRESOURCEA( def );
ici.hwnd = sei->hwnd; ici.hwnd = sei->hwnd;
@ -1268,7 +1266,7 @@ static LONG ShellExecute_FromContextMenu( LPSHELLEXECUTEINFOW sei )
i = 0; i = 0;
while ( 1 ) while ( 1 )
{ {
r = RegEnumKeyW( hkeycm, i++, szguid, 39 ); r = RegEnumKeyW( hkeycm, i++, szguid, sizeof(szguid)/sizeof(szguid[0]) );
if ( r != ERROR_SUCCESS ) if ( r != ERROR_SUCCESS )
break; break;

View file

@ -1541,18 +1541,25 @@ static LRESULT ShellView_OnNotify(IShellViewImpl * This, UINT CtlID, LPNMHDR lpn
/* free pidl array memory */ /* free pidl array memory */
HeapFree(GetProcessHeap(), 0, pItems); HeapFree(GetProcessHeap(), 0, pItems);
} }
/* Initiate a refresh */ /* Initiate a refresh */
else if(plvKeyDown->wVKey == VK_F5) else if(plvKeyDown->wVKey == VK_F5)
{ {
IShellView_Refresh((IShellView*)This); IShellView_Refresh((IShellView*)This);
} }
else if(plvKeyDown->wVKey == VK_BACK)
else {
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey); LPSHELLBROWSER lpSb;
} if((lpSb = (LPSHELLBROWSER)SendMessageW(This->hWndParent, CWM_GETISHELLBROWSER, 0, 0)))
break; {
IShellBrowser_BrowseObject(lpSb, NULL, SBSP_PARENT);
}
}
else
FIXME("LVN_KEYDOWN key=0x%08x\n",plvKeyDown->wVKey);
}
break;
default: default:
TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code); TRACE("-- %p WM_COMMAND %x unhandled\n", This, lpnmh->code);