2 * The parameters of many functions changes between different OS versions
3 * (NT uses Unicode strings, 95 uses ASCII strings)
5 * Copyright 1997 Marcus Meissner
11 #include "debugtools.h"
13 #include "winversion.h"
18 #include "shell32_main.h"
20 DEFAULT_DEBUG_CHANNEL(shell)
22 /*************************************************************************
23 * SHChangeNotifyRegister [SHELL32.2]
26 * Idlist is an array of structures and Count specifies how many items in the array
27 * (usually just one I think).
30 SHChangeNotifyRegister(
37 { FIXME("(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
38 hwnd,events1,events2,msg,count,idlist);
41 /*************************************************************************
42 * SHChangeNotifyDeregister [SHELL32.4]
45 SHChangeNotifyDeregister(LONG x1)
46 { FIXME("(0x%08lx):stub.\n",x1);
49 /*************************************************************************
50 * NTSHChangeNotifyRegister [SHELL32.640]
52 * Idlist is an array of structures and Count specifies how many items in the array
53 * (usually just one I think).
55 DWORD WINAPI NTSHChangeNotifyRegister(
62 { FIXME("(0x%04x,0x%08lx,0x%08lx,0x%08lx,0x%08x,%p):stub.\n",
63 hwnd,events1,events2,msg,count,idlist);
66 /*************************************************************************
67 * NTSHChangeNotifyDeregister [SHELL32.641]
69 DWORD WINAPI NTSHChangeNotifyDeregister(LONG x1)
70 { FIXME("(0x%08lx):stub.\n",x1);
74 /*************************************************************************
75 * ParseField [SHELL32.58]
78 DWORD WINAPI ParseFieldA(LPCSTR src, DWORD field, LPSTR dst, DWORD len)
79 { WARN("('%s',0x%08lx,%p,%ld) semi-stub.\n",src,field,dst,len);
81 if (!src || !src[0] || !dst || !len)
87 { if (*src==0x0) return FALSE;
88 if (*src==',') field--;
93 while (*src!=0x00 && *src!=',' && len>0)
94 { *dst=*src; dst++, src++; len--;
101 /*************************************************************************
102 * PickIconDlg [SHELL32.62]
105 DWORD WINAPI PickIconDlg(DWORD x,DWORD y,DWORD z,DWORD a)
106 { FIXME("(%08lx,%08lx,%08lx,%08lx):stub.\n",x,y,z,a);
110 /*************************************************************************
111 * GetFileNameFromBrowse [SHELL32.63]
114 DWORD WINAPI GetFileNameFromBrowse(HWND howner, LPSTR targetbuf, DWORD len, DWORD x, LPCSTR suffix, LPCSTR y, LPCSTR cmd)
115 { FIXME("(%04x,%p,%ld,%08lx,%s,%s,%s):stub.\n",
116 howner,targetbuf,len,x,suffix,y,cmd);
117 /* puts up a Open Dialog and requests input into targetbuf */
118 /* OFN_HIDEREADONLY|OFN_NOCHANGEDIR|OFN_FILEMUSTEXIST|OFN_unknown */
119 lstrcpyA(targetbuf,"x:\\dummy.exe");
123 /*************************************************************************
124 * SHGetSettings [SHELL32.68]
127 * the registry path are for win98 (tested)
128 * and possibly are the same in nt40
130 void WINAPI SHGetSettings(LPSHELLFLAGSTATE lpsfs, DWORD dwMask, DWORD dwx)
134 DWORD dwDataSize = sizeof (DWORD);
136 TRACE("(%p 0x%08lx 0x%08lx)\n",lpsfs,dwMask, dwx);
138 if (RegCreateKeyExA(HKEY_CURRENT_USER, "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Advanced",
139 0, 0, 0, KEY_ALL_ACCESS, 0, &hKey, 0))
142 if ( (SSF_SHOWEXTENSIONS & dwMask) && !RegQueryValueExA(hKey, "HideFileExt", 0, 0, (LPBYTE)&dwData, &dwDataSize))
143 lpsfs->fShowExtensions = ((dwData == 0) ? 0 : 1);
145 if ( (SSF_SHOWINFOTIP & dwMask) && !RegQueryValueExA(hKey, "ShowInfoTip", 0, 0, (LPBYTE)&dwData, &dwDataSize))
146 lpsfs->fShowInfoTip = ((dwData == 0) ? 0 : 1);
148 if ( (SSF_DONTPRETTYPATH & dwMask) && !RegQueryValueExA(hKey, "DontPrettyPath", 0, 0, (LPBYTE)&dwData, &dwDataSize))
149 lpsfs->fDontPrettyPath = ((dwData == 0) ? 0 : 1);
151 if ( (SSF_HIDEICONS & dwMask) && !RegQueryValueExA(hKey, "HideIcons", 0, 0, (LPBYTE)&dwData, &dwDataSize))
152 lpsfs->fHideIcons = ((dwData == 0) ? 0 : 1);
154 if ( (SSF_MAPNETDRVBUTTON & dwMask) && !RegQueryValueExA(hKey, "MapNetDrvBtn", 0, 0, (LPBYTE)&dwData, &dwDataSize))
155 lpsfs->fMapNetDrvBtn = ((dwData == 0) ? 0 : 1);
157 if ( (SSF_SHOWATTRIBCOL & dwMask) && !RegQueryValueExA(hKey, "ShowAttribCol", 0, 0, (LPBYTE)&dwData, &dwDataSize))
158 lpsfs->fShowAttribCol = ((dwData == 0) ? 0 : 1);
160 if (((SSF_SHOWALLOBJECTS | SSF_SHOWSYSFILES) & dwMask) && !RegQueryValueExA(hKey, "Hidden", 0, 0, (LPBYTE)&dwData, &dwDataSize))
162 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
163 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
165 else if (dwData == 1)
166 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 1;
167 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 0;
169 else if (dwData == 2)
170 { if (SSF_SHOWALLOBJECTS & dwMask) lpsfs->fShowAllObjects = 0;
171 if (SSF_SHOWSYSFILES & dwMask) lpsfs->fShowSysFiles = 1;
176 TRACE("-- 0x%04x\n", *(WORD*)lpsfs);
179 /*************************************************************************
180 * SHShellFolderView_Message [SHELL32.73]
183 * hwndCabinet defines the explorer cabinet window that contains the
184 * shellview you need to communicate with
185 * uMsg identifying the SFVM enum to perform
189 * Message SFVM_REARRANGE = 1
190 * This message gets sent when a column gets clicked to instruct the
191 * shell view to re-sort the item list. lParam identifies the column
194 int WINAPI SHShellFolderView_Message(HWND hwndCabinet,UINT uMsg,LPARAM lParam)
195 { FIXME("%04x %08ux %08lx stub\n",hwndCabinet,uMsg,lParam);
199 /*************************************************************************
200 * OleStrToStrN [SHELL32.78]
202 BOOL WINAPI OleStrToStrN (LPSTR lpMulti, INT nMulti, LPCWSTR lpWide, INT nWide)
204 TRACE("%s %x %s %x\n", lpMulti, nMulti, debugstr_w(lpWide), nWide);
205 return WideCharToMultiByte (0, 0, lpWide, nWide, lpMulti, nMulti, NULL, NULL);
208 /*************************************************************************
209 * StrToOleStrN [SHELL32.79]
210 * lpMulti, nMulti, nWide [IN]
213 BOOL WINAPI StrToOleStrNA (LPWSTR lpWide, INT nWide, LPCSTR lpStrA, INT nStr)
215 TRACE("%p %x %s %x\n", lpWide, nWide, lpStrA, nStr);
216 return MultiByteToWideChar (0, 0, lpStrA, nStr, lpWide, nWide);
218 BOOL WINAPI StrToOleStrNW (LPWSTR lpWide, INT nWide, LPCWSTR lpStrW, INT nStr)
220 TRACE("%p %x %s %x\n", lpWide, nWide, debugstr_w(lpStrW), nStr);
222 if (lstrcpynW (lpWide, lpStrW, nWide))
223 { return lstrlenW (lpWide);
228 BOOL WINAPI StrToOleStrNAW (LPWSTR lpWide, INT nWide, LPCVOID lpStr, INT nStr)
230 if (VERSION_OsIsUnicode())
231 return StrToOleStrNW (lpWide, nWide, lpStr, nStr);
232 return StrToOleStrNA (lpWide, nWide, lpStr, nStr);
235 /*************************************************************************
236 * RegisterShellHook [SHELL32.181]
239 * hwnd [I] window handle
243 * exported by ordinal
245 void WINAPI RegisterShellHook(HWND hwnd, DWORD y) {
246 FIXME("(0x%08x,0x%08lx):stub.\n",hwnd,y);
248 /*************************************************************************
249 * ShellMessageBoxW [SHELL32.182]
251 * Format and output errormessage.
253 * idText resource ID of title or LPSTR
254 * idTitle resource ID of title or LPSTR
257 * exported by ordinal
260 ShellMessageBoxW(HMODULE hmod,HWND hwnd,DWORD idText,DWORD idTitle,DWORD uType,LPCVOID arglist)
261 { WCHAR szText[100],szTitle[100],szTemp[256];
262 LPWSTR pszText = &szText[0], pszTitle = &szTitle[0];
263 LPVOID args = &arglist;
265 TRACE("(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n",(DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
267 if (!HIWORD (idTitle))
268 LoadStringW(hmod,idTitle,pszTitle,100);
270 pszTitle = (LPWSTR)idTitle;
272 if (! HIWORD (idText))
273 LoadStringW(hmod,idText,pszText,100);
275 pszText = (LPWSTR)idText;
277 FormatMessageW(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY ,szText,0,0,szTemp,256,args);
278 return MessageBoxW(hwnd,szTemp,szTitle,uType);
281 /*************************************************************************
282 * ShellMessageBoxA [SHELL32.183]
285 ShellMessageBoxA(HMODULE hmod,HWND hwnd,DWORD idText,DWORD idTitle,DWORD uType,LPCVOID arglist)
286 { char szText[100],szTitle[100],szTemp[256];
287 LPSTR pszText = &szText[0], pszTitle = &szTitle[0];
288 LPVOID args = &arglist;
290 TRACE("(%08lx,%08lx,%08lx,%08lx,%08lx,%p)\n", (DWORD)hmod,(DWORD)hwnd,idText,idTitle,uType,arglist);
292 if (!HIWORD (idTitle))
293 LoadStringA(hmod,idTitle,pszTitle,100);
295 pszTitle = (LPSTR)idTitle;
297 if (! HIWORD (idText))
298 LoadStringA(hmod,idText,pszText,100);
300 pszText = (LPSTR)idText;
302 FormatMessageA(FORMAT_MESSAGE_FROM_STRING | FORMAT_MESSAGE_ARGUMENT_ARRAY ,pszText,0,0,szTemp,256,args);
303 return MessageBoxA(hwnd,szTemp,pszTitle,uType);
306 /*************************************************************************
307 * SHRestricted [SHELL32.100]
309 * walks through policy table, queries <app> key, <type> value, returns
310 * queried (DWORD) value.
311 * {0x00001,Explorer,NoRun}
312 * {0x00002,Explorer,NoClose}
313 * {0x00004,Explorer,NoSaveSettings}
314 * {0x00008,Explorer,NoFileMenu}
315 * {0x00010,Explorer,NoSetFolders}
316 * {0x00020,Explorer,NoSetTaskbar}
317 * {0x00040,Explorer,NoDesktop}
318 * {0x00080,Explorer,NoFind}
319 * {0x00100,Explorer,NoDrives}
320 * {0x00200,Explorer,NoDriveAutoRun}
321 * {0x00400,Explorer,NoDriveTypeAutoRun}
322 * {0x00800,Explorer,NoNetHood}
323 * {0x01000,Explorer,NoStartBanner}
324 * {0x02000,Explorer,RestrictRun}
325 * {0x04000,Explorer,NoPrinterTabs}
326 * {0x08000,Explorer,NoDeletePrinter}
327 * {0x10000,Explorer,NoAddPrinter}
328 * {0x20000,Explorer,NoStartMenuSubFolders}
329 * {0x40000,Explorer,MyDocsOnNet}
330 * {0x80000,WinOldApp,NoRealMode}
333 * exported by ordinal
335 DWORD WINAPI SHRestricted (DWORD pol) {
338 FIXME("(%08lx):stub.\n",pol);
339 if (RegOpenKeyA(HKEY_CURRENT_USER,"Software\\Microsoft\\Windows\\CurrentVersion\\Policies",&xhkey))
341 /* FIXME: do nothing for now, just return 0 (== "allowed") */
346 /*************************************************************************
347 * SHCreateDirectory [SHELL32.165]
350 * exported by ordinal
351 * not sure about LPSECURITY_ATTRIBUTES
353 DWORD WINAPI SHCreateDirectory(LPSECURITY_ATTRIBUTES sec,LPCSTR path) {
354 TRACE("(%p,%s):stub.\n",sec,path);
355 if (CreateDirectoryA(path,sec))
357 /* SHChangeNotify(8,1,path,0); */
360 if (SHELL32_79(path,(LPVOID)x))
362 FIXME("(%08lx,%s):stub.\n",x,path);
367 /*************************************************************************
368 * SHFree [SHELL32.195]
371 * free_ptr() - frees memory using IMalloc
372 * exported by ordinal
374 DWORD WINAPI SHFree(LPVOID x) {
377 { *(LPDWORD)0xdeaf0000 = 0;
379 return HeapFree(GetProcessHeap(),0,x);
382 /*************************************************************************
383 * SHAlloc [SHELL32.196]
386 * void *task_alloc(DWORD len), uses SHMalloc allocator
387 * exported by ordinal
389 LPVOID WINAPI SHAlloc(DWORD len) {
390 /* void * ret = (LPVOID)LocalAlloc32(len,LMEM_ZEROINIT);*/ /* chrashes */
391 void * ret = (LPVOID) HeapAlloc(GetProcessHeap(),0,len);
392 TRACE("%lu bytes at %p\n",len, ret);
396 /*************************************************************************
397 * SHRegisterDragDrop [SHELL32.86]
400 * exported by ordinal
402 DWORD WINAPI SHRegisterDragDrop(HWND hWnd,IDropTarget * pDropTarget)
404 FIXME("(0x%08x,%p):stub.\n", hWnd, pDropTarget);
405 return RegisterDragDrop(hWnd, pDropTarget);
408 /*************************************************************************
409 * SHRevokeDragDrop [SHELL32.87]
412 * exported by ordinal
414 DWORD WINAPI SHRevokeDragDrop(DWORD x) {
415 FIXME("(0x%08lx):stub.\n",x);
419 /*************************************************************************
420 * SHDoDragDrop [SHELL32.88]
423 * exported by ordinal
425 DWORD WINAPI SHDoDragDrop(DWORD u, DWORD v, DWORD w, DWORD x, DWORD y, DWORD z) {
426 FIXME("(0x%08lx 0x%08lx 0x%08lx 0x%08lx 0x%08lx 0x%08lx):stub.\n",u,v,w,x,y,z);
430 /*************************************************************************
431 * RunFileDlg [SHELL32.61]
434 * Original name: RunFileDlg (exported by ordinal)
437 RunFileDlg (HWND hwndOwner, DWORD dwParam1, DWORD dwParam2,
438 LPSTR lpszTitle, LPSTR lpszPrompt, UINT uFlags)
440 FIXME("(0x%08x 0x%lx 0x%lx \"%s\" \"%s\" 0x%x):stub.\n",
441 hwndOwner, dwParam1, dwParam2, lpszTitle, lpszPrompt, uFlags);
445 /*************************************************************************
446 * ExitWindowsDialog [SHELL32.60]
449 * exported by ordinal
451 void WINAPI ExitWindowsDialog (HWND hWndOwner)
453 TRACE("(0x%08x)\n", hWndOwner);
454 if (MessageBoxA( hWndOwner, "Do you want to exit WINE?", "Shutdown", MB_YESNO|MB_ICONQUESTION) == IDOK)
455 { SendMessageA ( hWndOwner, WM_QUIT, 0, 0);
459 /*************************************************************************
460 * ArrangeWindows [SHELL32.184]
464 ArrangeWindows (DWORD dwParam1, DWORD dwParam2, DWORD dwParam3,
465 DWORD dwParam4, DWORD dwParam5)
467 FIXME("(0x%lx 0x%lx 0x%lx 0x%lx 0x%lx):stub.\n",
468 dwParam1, dwParam2, dwParam3, dwParam4, dwParam5);
472 /*************************************************************************
473 * SignalFileOpen [SHELL32.103]
476 * exported by ordinal
479 SignalFileOpen (DWORD dwParam1)
481 FIXME("(0x%08lx):stub.\n", dwParam1);
486 /*************************************************************************
487 * SHAddToRecentDocs [SHELL32.234]
490 * uFlags [IN] SHARD_PATH or SHARD_PIDL
491 * pv [IN] string or pidl, NULL clears the list
496 DWORD WINAPI SHAddToRecentDocs (UINT uFlags,LPCVOID pv)
497 { if (SHARD_PIDL==uFlags)
498 { FIXME("(0x%08x,pidl=%p):stub.\n", uFlags,pv);
501 { FIXME("(0x%08x,%s):stub.\n", uFlags,(char*)pv);
505 /*************************************************************************
506 * SHFileOperation [SHELL32.242]
509 DWORD WINAPI SHFileOperationAW(DWORD x)
510 { FIXME("0x%08lx stub\n",x);
515 /*************************************************************************
516 * SHFileOperationA [SHELL32.243]
521 DWORD WINAPI SHFileOperationA (LPSHFILEOPSTRUCTA lpFileOp)
522 { FIXME("(%p):stub.\n", lpFileOp);
525 /*************************************************************************
526 * SHFileOperationW [SHELL32.244]
531 DWORD WINAPI SHFileOperationW (LPSHFILEOPSTRUCTW lpFileOp)
532 { FIXME("(%p):stub.\n", lpFileOp);
536 /*************************************************************************
537 * SHChangeNotify [SHELL32.239]
542 DWORD WINAPI SHChangeNotify (
543 INT wEventId, /* [IN] flags that specifies the event*/
544 UINT uFlags, /* [IN] the meaning of dwItem[1|2]*/
547 { FIXME("(0x%08x,0x%08ux,%p,%p):stub.\n", wEventId,uFlags,dwItem1,dwItem2);
550 /*************************************************************************
551 * SHCreateShellFolderViewEx [SHELL32.174]
554 * see IShellFolder::CreateViewObject
556 HRESULT WINAPI SHCreateShellFolderViewEx(
557 LPSHELLVIEWDATA psvcbi, /*[in ] shelltemplate struct*/
558 LPVOID* ppv) /*[out] IShellView pointer*/
559 { FIXME("(%p,%p):stub.\n", psvcbi,ppv);
562 /*************************************************************************
563 * SHWinHelp [SHELL32.127]
566 HRESULT WINAPI SHWinHelp (DWORD v, DWORD w, DWORD x, DWORD z)
567 { FIXME("0x%08lx 0x%08lx 0x%08lx 0x%08lx stub\n",v,w,x,z);
570 /*************************************************************************
571 * SHRunControlPanel [SHELL32.161]
574 HRESULT WINAPI SHRunControlPanel (DWORD x, DWORD z)
575 { FIXME("0x%08lx 0x%08lx stub\n",x,z);
578 /*************************************************************************
579 * ShellExecuteEx [SHELL32.291]
582 BOOL WINAPI ShellExecuteExAW (LPVOID sei)
583 { if (VERSION_OsIsUnicode())
584 return ShellExecuteExW (sei);
585 return ShellExecuteExA (sei);
587 /*************************************************************************
588 * ShellExecuteExA [SHELL32.292]
591 BOOL WINAPI ShellExecuteExA (LPSHELLEXECUTEINFOA sei)
592 { CHAR szApplicationName[MAX_PATH],szCommandline[MAX_PATH],szPidl[20];
595 STARTUPINFOA startupinfo;
596 PROCESS_INFORMATION processinformation;
598 WARN("mask=0x%08lx hwnd=0x%04x verb=%s file=%s parm=%s dir=%s show=0x%08x class=%s incomplete\n",
599 sei->fMask, sei->hwnd, sei->lpVerb, sei->lpFile,
600 sei->lpParameters, sei->lpDirectory, sei->nShow,
601 (sei->fMask & SEE_MASK_CLASSNAME) ? sei->lpClass : "not used");
603 ZeroMemory(szApplicationName,MAX_PATH);
605 strcpy(szApplicationName, sei->lpFile);
607 ZeroMemory(szCommandline,MAX_PATH);
608 if (sei->lpParameters)
609 strcpy(szCommandline, sei->lpParameters);
611 if (sei->fMask & (SEE_MASK_CLASSKEY | SEE_MASK_INVOKEIDLIST | SEE_MASK_ICON | SEE_MASK_HOTKEY |
612 SEE_MASK_NOCLOSEPROCESS | SEE_MASK_CONNECTNETDRV | SEE_MASK_FLAG_DDEWAIT |
613 SEE_MASK_DOENVSUBST | SEE_MASK_FLAG_NO_UI | SEE_MASK_UNICODE |
614 SEE_MASK_NO_CONSOLE | SEE_MASK_ASYNCOK | SEE_MASK_HMONITOR ))
615 { FIXME("flags ignored: 0x%08lx\n", sei->fMask);
618 if (sei->fMask & SEE_MASK_CLASSNAME)
619 { HCR_GetExecuteCommand(sei->lpClass, (sei->lpVerb) ? sei->lpVerb : "open", szCommandline, 256);
622 /* process the IDList */
623 if ( (sei->fMask & SEE_MASK_INVOKEIDLIST) == SEE_MASK_INVOKEIDLIST) /*0x0c*/
624 { SHGetPathFromIDListA (sei->lpIDList,szApplicationName);
625 TRACE("-- idlist=%p (%s)\n", sei->lpIDList, szApplicationName);
628 { if (sei->fMask & SEE_MASK_IDLIST )
629 { /* %I is the adress of a global item ID*/
630 pos = strstr(szCommandline, "%I");
632 { HGLOBAL hmem = SHAllocShared ( sei->lpIDList, ILGetSize(sei->lpIDList), 0);
633 sprintf(szPidl,":%li",(DWORD)SHLockShared(hmem,0) );
634 SHUnlockShared(hmem);
636 gap = strlen(szPidl);
638 memmove(pos+gap,pos+2,len);
639 memcpy(pos,szPidl,gap);
645 pos = strstr(szCommandline, ",%L"); /* dunno what it means: kill it*/
647 { len = strlen(pos)-2;
649 memmove(pos,pos+3,len);
652 TRACE("execute: %s %s\n",szApplicationName, szCommandline);
654 ZeroMemory(&startupinfo,sizeof(STARTUPINFOA));
655 startupinfo.cb = sizeof(STARTUPINFOA);
657 return CreateProcessA(szApplicationName[0] ? szApplicationName:NULL,
658 szCommandline[0] ? szCommandline : NULL,
659 NULL, NULL, FALSE, 0,
660 NULL, NULL, &startupinfo, &processinformation);
664 /*************************************************************************
665 * ShellExecuteExW [SHELL32.293]
668 BOOL WINAPI ShellExecuteExW (LPSHELLEXECUTEINFOW sei)
669 { SHELLEXECUTEINFOA seiA;
674 memcpy(&seiA, sei, sizeof(SHELLEXECUTEINFOA));
677 seiA.lpVerb = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpVerb);
680 seiA.lpFile = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpFile);
682 if (sei->lpParameters)
683 seiA.lpParameters = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpParameters);
685 if (sei->lpDirectory)
686 seiA.lpDirectory = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpDirectory);
688 if ((sei->fMask & SEE_MASK_CLASSNAME) && sei->lpClass)
689 seiA.lpClass = HEAP_strdupWtoA( GetProcessHeap(), 0, sei->lpClass);
693 ret = ShellExecuteExA(&seiA);
695 if (seiA.lpVerb) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpVerb );
696 if (seiA.lpFile) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpFile );
697 if (seiA.lpParameters) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpParameters );
698 if (seiA.lpDirectory) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpDirectory );
699 if (seiA.lpClass) HeapFree( GetProcessHeap(), 0, (LPSTR) seiA.lpClass );
704 static LPUNKNOWN SHELL32_IExplorerInterface=0;
705 /*************************************************************************
706 * SHSetInstanceExplorer [SHELL32.176]
711 HRESULT WINAPI SHSetInstanceExplorer (LPUNKNOWN lpUnknown)
712 { TRACE("%p\n", lpUnknown);
713 SHELL32_IExplorerInterface = lpUnknown;
714 return (HRESULT) lpUnknown;
716 /*************************************************************************
717 * SHGetInstanceExplorer [SHELL32.256]
720 * gets the interface pointer of the explorer and a reference
722 HRESULT WINAPI SHGetInstanceExplorer (LPUNKNOWN * lpUnknown)
723 { TRACE("%p\n", lpUnknown);
725 *lpUnknown = SHELL32_IExplorerInterface;
727 if (!SHELL32_IExplorerInterface)
730 SHELL32_IExplorerInterface->lpvtbl->fnAddRef(SHELL32_IExplorerInterface);
733 /*************************************************************************
734 * SHFreeUnusedLibraries [SHELL32.123]
739 HRESULT WINAPI SHFreeUnusedLibraries (void)
743 /*************************************************************************
744 * DAD_ShowDragImage [SHELL32.137]
749 HRESULT WINAPI DAD_ShowDragImage (DWORD u)
750 { FIXME("0x%08lx stub\n",u);
753 /*************************************************************************
754 * SHRegCloseKey [NT4.0:SHELL32.505]
757 HRESULT WINAPI SHRegCloseKey (HKEY hkey)
758 { TRACE("0x%04x\n",hkey);
759 return RegCloseKey( hkey );
761 /*************************************************************************
762 * SHRegOpenKeyA [SHELL32.506]
765 HRESULT WINAPI SHRegOpenKeyA(HKEY hKey, LPSTR lpSubKey, LPHKEY phkResult)
767 TRACE("(0x%08x, %s, %p)\n", hKey, debugstr_a(lpSubKey), phkResult);
768 return RegOpenKeyA(hKey, lpSubKey, phkResult);
771 /*************************************************************************
772 * SHRegOpenKeyW [NT4.0:SHELL32.507]
775 HRESULT WINAPI SHRegOpenKeyW (HKEY hkey, LPCWSTR lpszSubKey, LPHKEY retkey)
776 { WARN("0x%04x %s %p\n",hkey,debugstr_w(lpszSubKey),retkey);
777 return RegOpenKeyW( hkey, lpszSubKey, retkey );
779 /*************************************************************************
780 * SHRegQueryValueExA [SHELL32.509]
783 HRESULT WINAPI SHRegQueryValueExA(
791 TRACE("0x%04x %s %p %p %p %p\n", hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
792 return RegQueryValueExA (hkey, lpValueName, lpReserved, lpType, lpData, lpcbData);
794 /*************************************************************************
795 * SHRegQueryValueW [NT4.0:SHELL32.510]
798 HRESULT WINAPI SHRegQueryValueW (HKEY hkey, LPWSTR lpszSubKey,
799 LPWSTR lpszData, LPDWORD lpcbData )
800 { WARN("0x%04x %s %p %p semi-stub\n",
801 hkey, debugstr_w(lpszSubKey), lpszData, lpcbData);
802 return RegQueryValueW( hkey, lpszSubKey, lpszData, lpcbData );
805 /*************************************************************************
806 * SHRegQueryValueExW [NT4.0:SHELL32.511]
809 * if the datatype REG_EXPAND_SZ then expand the string and change
810 * *pdwType to REG_SZ.
812 HRESULT WINAPI SHRegQueryValueExW (HKEY hkey, LPWSTR pszValue, LPDWORD pdwReserved,
813 LPDWORD pdwType, LPVOID pvData, LPDWORD pcbData)
815 WARN("0x%04x %s %p %p %p %p semi-stub\n",
816 hkey, debugstr_w(pszValue), pdwReserved, pdwType, pvData, pcbData);
817 ret = RegQueryValueExW ( hkey, pszValue, pdwReserved, pdwType, pvData, pcbData);
821 /*************************************************************************
822 * ReadCabinetState [NT 4.0:SHELL32.651]
825 HRESULT WINAPI ReadCabinetState(DWORD u, DWORD v)
826 { FIXME("0x%04lx 0x%04lx stub\n",u,v);
829 /*************************************************************************
830 * WriteCabinetState [NT 4.0:SHELL32.652]
833 HRESULT WINAPI WriteCabinetState(DWORD u)
834 { FIXME("0x%04lx stub\n",u);
837 /*************************************************************************
838 * FileIconInit [SHELL32.660]
841 BOOL WINAPI FileIconInit(BOOL bFullInit)
842 { FIXME("(%s)\n", bFullInit ? "true" : "false");
845 /*************************************************************************
846 * IsUserAdmin [NT 4.0:SHELL32.680]
849 HRESULT WINAPI IsUserAdmin(void)
853 /*************************************************************************
854 * StrRetToStrN [SHELL32.96]
856 * converts a STRRET to a normal string
859 * the pidl is for STRRET OFFSET
861 HRESULT WINAPI StrRetToStrN (LPVOID dest, DWORD len, LPSTRRET src, LPITEMIDLIST pidl)
862 { TRACE("dest=0x%p len=0x%lx strret=0x%p pidl=%p stub\n",dest,len,src,pidl);
866 WideCharToMultiByte(CP_ACP, 0, src->u.pOleStr, -1, (LPSTR)dest, len, NULL, NULL);
867 SHFree(src->u.pOleStr);
871 if (VERSION_OsIsUnicode())
872 lstrcpynAtoW((LPWSTR)dest, src->u.cStr, len);
874 strncpy((LPSTR)dest, src->u.cStr, len);
879 { if(VERSION_OsIsUnicode())
880 lstrcpynAtoW((LPWSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
882 strncpy((LPSTR)dest, ((LPCSTR)&pidl->mkid)+src->u.uOffset, len);
887 FIXME("unknown type!\n");
889 { *(LPSTR)dest = '\0';
896 /*************************************************************************
897 * StrChrW [NT 4.0:SHELL32.651]
900 LPWSTR WINAPI StrChrW (LPWSTR str, WCHAR x )
903 TRACE("%s 0x%04x\n",debugstr_w(str),x);
913 /*************************************************************************
914 * StrCmpNIW [NT 4.0:SHELL32.*]
917 INT WINAPI StrCmpNIW ( LPWSTR wstr1, LPWSTR wstr2, INT len)
918 { FIXME("%s %s %i stub\n", debugstr_w(wstr1),debugstr_w(wstr2),len);
922 /*************************************************************************
923 * SHAllocShared [SHELL32.520]
926 * parameter1 is return value from HeapAlloc
927 * parameter2 is equal to the size allocated with HeapAlloc
928 * parameter3 is return value from GetCurrentProcessId
930 * the return value is posted as lParam with 0x402 (WM_USER+2) to somewhere
931 * WM_USER+2 could be the undocumented CWM_SETPATH
932 * the allocated memory contains a pidl
934 HGLOBAL WINAPI SHAllocShared(LPVOID psrc, DWORD size, DWORD procID)
938 TRACE("ptr=%p size=0x%04lx procID=0x%04lx\n",psrc,size,procID);
939 hmem = GlobalAlloc(GMEM_FIXED, size);
943 pmem = GlobalLock (hmem);
948 memcpy (pmem, psrc, size);
952 /*************************************************************************
953 * SHLockShared [SHELL32.521]
956 * parameter1 is return value from SHAllocShared
957 * parameter2 is return value from GetCurrentProcessId
958 * the receiver of (WM_USER+2) trys to lock the HANDLE (?)
959 * the returnvalue seems to be a memoryadress
961 LPVOID WINAPI SHLockShared(HANDLE hmem, DWORD procID)
962 { TRACE("handle=0x%04x procID=0x%04lx\n",hmem,procID);
963 return GlobalLock(hmem);
965 /*************************************************************************
966 * SHUnlockShared [SHELL32.522]
969 * parameter1 is return value from SHLockShared
971 BOOL WINAPI SHUnlockShared(HANDLE pmem)
972 { TRACE("handle=0x%04x\n",pmem);
973 return GlobalUnlock(pmem);
975 /*************************************************************************
976 * SHFreeShared [SHELL32.523]
979 * parameter1 is return value from SHAllocShared
980 * parameter2 is return value from GetCurrentProcessId
982 HANDLE WINAPI SHFreeShared(HANDLE hmem, DWORD procID)
983 { TRACE("handle=0x%04x 0x%04lx\n",hmem,procID);
984 return GlobalFree(hmem);
987 /*************************************************************************
988 * SetAppStartingCursor [SHELL32.99]
991 HRESULT WINAPI SetAppStartingCursor(HWND u, DWORD v)
992 { FIXME("hwnd=0x%04x 0x%04lx stub\n",u,v );
995 /*************************************************************************
996 * SHLoadOLE [SHELL32.151]
999 HRESULT WINAPI SHLoadOLE(DWORD u)
1000 { FIXME("0x%04lx stub\n",u);
1003 /*************************************************************************
1004 * DriveType [SHELL32.64]
1007 HRESULT WINAPI DriveType(DWORD u)
1008 { FIXME("0x%04lx stub\n",u);
1011 /*************************************************************************
1012 * SHAbortInvokeCommand [SHELL32.198]
1015 HRESULT WINAPI SHAbortInvokeCommand(void)
1019 /*************************************************************************
1020 * SHOutOfMemoryMessageBox [SHELL32.126]
1023 HRESULT WINAPI SHOutOfMemoryMessageBox(DWORD u, DWORD v, DWORD w)
1024 { FIXME("0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
1027 /*************************************************************************
1028 * SHFlushClipboard [SHELL32.121]
1031 HRESULT WINAPI SHFlushClipboard(void)
1035 /*************************************************************************
1036 * StrRChrW [SHELL32.320]
1039 LPWSTR WINAPI StrRChrW(LPWSTR lpStart, LPWSTR lpEnd, DWORD wMatch)
1041 TRACE("%s %s 0x%04x\n",debugstr_w(lpStart),debugstr_w(lpEnd), (WCHAR)wMatch );
1043 /* if the end not given, search*/
1051 { if (*lpStart==(WCHAR)wMatch)
1054 } while ( lpStart<=lpEnd );
1057 /*************************************************************************
1058 * StrFormatByteSize [SHLWAPI]
1060 LPSTR WINAPI StrFormatByteSizeA ( DWORD dw, LPSTR pszBuf, UINT cchBuf )
1062 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
1064 { sprintf (buf,"%3.1f bytes", (FLOAT)dw);
1066 else if ( dw<1048576L)
1067 { sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
1069 else if ( dw < 1073741824L)
1070 { sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
1073 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
1075 strncpy (pszBuf, buf, cchBuf);
1078 LPWSTR WINAPI StrFormatByteSizeW ( DWORD dw, LPWSTR pszBuf, UINT cchBuf )
1080 TRACE("%lx %p %i\n", dw, pszBuf, cchBuf);
1082 { sprintf (buf,"%3.1f bytes", (FLOAT)dw);
1084 else if ( dw<1048576L)
1085 { sprintf (buf,"%3.1f KB", (FLOAT)dw/1024);
1087 else if ( dw < 1073741824L)
1088 { sprintf (buf,"%3.1f MB", (FLOAT)dw/1048576L);
1091 { sprintf (buf,"%3.1f GB", (FLOAT)dw/1073741824L);
1093 lstrcpynAtoW (pszBuf, buf, cchBuf);
1096 /*************************************************************************
1097 * SHWaitForFileToOpen [SHELL32.97]
1100 HRESULT WINAPI SHWaitForFileToOpen(DWORD u, DWORD v, DWORD w)
1101 { FIXME("0x%04lx 0x%04lx 0x%04lx stub\n",u,v,w);
1104 /*************************************************************************
1105 * Control_FillCache_RunDLL [SHELL32.8]
1108 HRESULT WINAPI Control_FillCache_RunDLL(HWND hWnd, HANDLE hModule, DWORD w, DWORD x)
1109 { FIXME("0x%04x 0x%04x 0x%04lx 0x%04lx stub\n",hWnd, hModule,w,x);
1112 /*************************************************************************
1113 * RunDLL_CallEntry16 [SHELL32.122]
1114 * the name is propably wrong
1116 HRESULT WINAPI RunDLL_CallEntry16(DWORD v, DWORD w, DWORD x, DWORD y, DWORD z)
1117 { FIXME("0x%04lx 0x%04lx 0x%04lx 0x%04lx 0x%04lx stub\n",v,w,x,y,z);
1121 /************************************************************************
1122 * shell32_654 [SHELL32.654]
1124 * NOTES: first parameter seems to be a pointer (same as passed to WriteCabinetState)
1125 * second one could be a size (0x0c). The size is the same as the structure saved to
1126 * HCU\Software\Microsoft\Windows\CurrentVersion\Explorer\CabinetState
1127 * I'm (js) guessing: this one is just ReadCabinetState ;-)
1129 HRESULT WINAPI shell32_654 (DWORD x, DWORD y)
1130 { FIXME("0x%08lx 0x%08lx stub\n",x,y);
1134 /************************************************************************
1135 * RLBuildListOfPaths [SHELL32.146]
1140 DWORD WINAPI RLBuildListOfPaths ()
1144 /************************************************************************
1145 * StrToOleStr [SHELL32.163]
1148 int WINAPI StrToOleStrA (LPWSTR lpWideCharStr, LPCSTR lpMultiByteString)
1150 TRACE("%p %p(%s)\n",
1151 lpWideCharStr, lpMultiByteString, lpMultiByteString);
1153 return MultiByteToWideChar(0, 0, lpMultiByteString, -1, lpWideCharStr, MAX_PATH);
1156 int WINAPI StrToOleStrW (LPWSTR lpWideCharStr, LPCWSTR lpWString)
1158 TRACE("%p %p(%s)\n",
1159 lpWideCharStr, lpWString, debugstr_w(lpWString));
1161 if (lstrcpyW (lpWideCharStr, lpWString ))
1162 { return lstrlenW (lpWideCharStr);
1167 BOOL WINAPI StrToOleStrAW (LPWSTR lpWideCharStr, LPCVOID lpString)
1169 if (VERSION_OsIsUnicode())
1170 return StrToOleStrW (lpWideCharStr, lpString);
1171 return StrToOleStrA (lpWideCharStr, lpString);
1174 /************************************************************************
1175 * SHValidateUNC [SHELL32.173]
1178 HRESULT WINAPI SHValidateUNC (DWORD x, DWORD y, DWORD z)
1180 FIXME("0x%08lx 0x%08lx 0x%08lx stub\n",x,y,z);
1184 /************************************************************************
1185 * DoEnvironmentSubstW [SHELL32.53]
1188 HRESULT WINAPI DoEnvironmentSubstA(LPSTR x, LPSTR y)
1190 FIXME("%p(%s) %p(%s) stub\n", x, x, y, y);
1194 HRESULT WINAPI DoEnvironmentSubstW(LPWSTR x, LPWSTR y)
1196 FIXME("%p(%s) %p(%s) stub\n", x, debugstr_w(x), y, debugstr_w(y));
1200 HRESULT WINAPI DoEnvironmentSubstAW(LPVOID x, LPVOID y)
1202 if (VERSION_OsIsUnicode())
1203 return DoEnvironmentSubstW(x, y);
1204 return DoEnvironmentSubstA(x, y);