2 * Shell Library Functions
13 #include "selectors.h"
16 #include "../rc/sysres.h"
23 LPKEYSTRUCT lphRootKey = NULL,lphTopKey = NULL;
25 static char RootKeyName[]=".classes", TopKeyName[] = "[top-null]";
27 /*************************************************************************
28 * SHELL_RegCheckForRoot() internal use only
30 static LONG SHELL_RegCheckForRoot()
34 if (lphRootKey == NULL){
35 hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
36 lphRootKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
37 if (lphRootKey == NULL) {
38 printf("SHELL_RegCheckForRoot: Couldn't allocate root key!\n");
39 return ERROR_OUTOFMEMORY;
41 lphRootKey->hKey = (HKEY)1;
42 lphRootKey->lpSubKey = RootKeyName;
43 lphRootKey->dwType = 0;
44 lphRootKey->lpValue = NULL;
45 lphRootKey->lpSubLvl = lphRootKey->lpNextKey = lphRootKey->lpPrevKey = NULL;
47 hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
48 lphTopKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
49 if (lphTopKey == NULL) {
50 printf("SHELL_RegCheckForRoot: Couldn't allocate top key!\n");
51 return ERROR_OUTOFMEMORY;
54 lphTopKey->lpSubKey = TopKeyName;
55 lphTopKey->dwType = 0;
56 lphTopKey->lpValue = NULL;
57 lphTopKey->lpSubLvl = lphRootKey;
58 lphTopKey->lpNextKey = lphTopKey->lpPrevKey = NULL;
60 dprintf_reg(stddeb,"SHELL_RegCheckForRoot: Root/Top created\n");
65 /* FIXME: the loading and saving of the registry database is rather messy.
66 * bad input (while reading) may crash wine.
69 _DumpLevel(FILE *f,LPKEYSTRUCT lpTKey,int tabs) {
72 lpKey=lpTKey->lpSubLvl;
75 for (i=0;i<tabs;i++) fprintf(f,"\t");
76 /* implement different dwTypes ... */
78 fprintf(f,"%s=%s\n",lpKey->lpSubKey,lpKey->lpValue);
80 fprintf(f,"%s\n",lpKey->lpSubKey);
83 _DumpLevel(f,lpKey,tabs+1);
84 lpKey=lpKey->lpNextKey;
89 _SaveKey(HKEY hKey,char *where) {
95 perror("registry-fopen");
98 switch ((DWORD)hKey) {
99 case HKEY_CLASSES_ROOT:
104 _DumpLevel(f,lpKey,0);
109 SHELL_SaveRegistry(void) {
111 * -implement win95 additional keytypes here
112 * (HKEY_LOCAL_MACHINE,HKEY_CURRENT_USER or whatever)
113 * -choose better filename(s)
115 _SaveKey((HKEY)HKEY_CLASSES_ROOT,"/tmp/winereg");
120 _LoadLevel(FILE *f,LPKEYSTRUCT lpKey,int tabsexp,char *buf) {
124 LPKEYSTRUCT lpNewKey;
127 if (NULL==fgets(buf,BUFSIZE,f)) {
131 for (i=0;buf[i]=='\t';i++) /*empty*/;
133 if (NULL!=(t=strchr(s,'\n'))) *t='\0';
134 if (NULL!=(t=strchr(s,'\r'))) *t='\0';
136 if (i<tabsexp) return;
139 hNewKey=GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
140 lpNewKey=lpKey->lpSubLvl=(LPKEYSTRUCT)GlobalLock(hNewKey);
141 lpNewKey->hKey = hNewKey;
142 lpNewKey->dwType = 0;
143 lpNewKey->lpSubKey = NULL;
144 lpNewKey->lpValue = NULL;
145 lpNewKey->lpSubLvl = NULL;
146 lpNewKey->lpNextKey = NULL;
147 lpNewKey->lpPrevKey = NULL;
148 if (NULL!=(t=strchr(s,'='))) {
150 lpNewKey->dwType = REG_SZ;
151 lpNewKey->lpSubKey = strdup(s);
152 lpNewKey->lpValue = strdup(t);
154 lpNewKey->dwType = REG_SZ;
155 lpNewKey->lpSubKey = strdup(s);
157 _LoadLevel(f,lpNewKey,tabsexp+1,buf);
159 for (i=0;buf[i]=='\t';i++) /*empty*/;
161 if (i<tabsexp) return;
162 if (buf[0]=='\0') break; /* marks end of file */
163 /* we have a buf now. even when returning from _LoadLevel */
164 hNewKey = GlobalAlloc(GMEM_MOVEABLE,sizeof(KEYSTRUCT));
165 lpNewKey = lpKey->lpNextKey=(LPKEYSTRUCT)GlobalLock(hNewKey);
166 lpNewKey->lpPrevKey = lpKey;
167 lpNewKey->hKey = hNewKey;
168 lpNewKey->dwType = 0;
169 lpNewKey->lpSubKey = NULL;
170 lpNewKey->lpValue = NULL;
171 lpNewKey->lpSubLvl = NULL;
172 lpNewKey->lpNextKey = NULL;
173 if (NULL!=(t=strchr(s,'='))) {
175 lpNewKey->dwType = REG_SZ;
176 lpNewKey->lpSubKey = strdup(s);
177 lpNewKey->lpValue = strdup(t);
179 lpNewKey->dwType = REG_SZ;
180 lpNewKey->lpSubKey = strdup(s);
187 _LoadKey(HKEY hKey,char *from) {
190 char buf[BUFSIZE]; /* FIXME: long enough? */
194 perror("fopen-registry-read");
197 switch ((DWORD)hKey) {
198 case HKEY_CLASSES_ROOT:
203 _LoadLevel(f,lpKey,-1,buf);
207 SHELL_LoadRegistry(void) {
210 dwRet=SHELL_RegCheckForRoot();
211 if (dwRet!=ERROR_SUCCESS)
212 return;/*very bad magic, if we can't even allocate the rootkeys*/
213 _LoadKey((HKEY)HKEY_CLASSES_ROOT,"/tmp/winereg");
216 /*************************************************************************
217 * RegOpenKey [SHELL.1]
219 LONG RegOpenKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
221 LPKEYSTRUCT lpKey,lpNextKey;
226 dwRet = SHELL_RegCheckForRoot();
227 if (dwRet != ERROR_SUCCESS) return dwRet;
228 dprintf_reg(stddeb, "RegOpenKey(%08lX, %p='%s', %p)\n",
229 (DWORD)hKey, lpSubKey, lpSubKey, lphKey);
230 if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
231 switch((DWORD)hKey) {
233 lpKey = lphTopKey; break;
234 case HKEY_CLASSES_ROOT: /* == 1 */
236 lpKey = lphRootKey; break;
238 dprintf_reg(stddeb,"RegOpenKey // specific key = %08lX !\n", (DWORD)hKey);
239 lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
241 if (lpSubKey == NULL || !*lpSubKey) {
243 return ERROR_SUCCESS;
246 ptr = strchr(lpSubKey,'\\');
247 if (!ptr) ptr = lpSubKey + strlen(lpSubKey);
248 strncpy(str,lpSubKey,ptr-lpSubKey);
249 str[ptr-lpSubKey] = 0;
251 if (*lpSubKey) lpSubKey++;
253 lpNextKey = lpKey->lpSubLvl;
254 while(lpKey != NULL && strcmp(lpKey->lpSubKey, str) != 0) {
256 if (lpKey) lpNextKey = lpKey->lpNextKey;
259 dprintf_reg(stddeb,"RegOpenKey: key %s not found!\n",str);
263 *lphKey = lpKey->hKey;
264 return ERROR_SUCCESS;
268 /*************************************************************************
269 * RegCreateKey [SHELL.2]
271 LONG RegCreateKey(HKEY hKey, LPCSTR lpSubKey, HKEY FAR *lphKey)
274 LPKEYSTRUCT lpNewKey;
276 LPKEYSTRUCT lpPrevKey;
281 dwRet = SHELL_RegCheckForRoot();
282 if (dwRet != ERROR_SUCCESS) return dwRet;
283 dprintf_reg(stddeb, "RegCreateKey(%08lX, '%s', %p)\n", (DWORD)hKey, lpSubKey, lphKey);
284 if (lphKey == NULL) return ERROR_INVALID_PARAMETER;
285 switch((DWORD)hKey) {
287 lpKey = lphTopKey; break;
288 case HKEY_CLASSES_ROOT: /* == 1 */
290 lpKey = lphRootKey; break;
292 dprintf_reg(stddeb,"RegCreateKey // specific key = %08lX !\n", (DWORD)hKey);
293 lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
295 if (lpSubKey == NULL || !*lpSubKey) {
297 return ERROR_SUCCESS;
300 dprintf_reg(stddeb, "RegCreateKey: Looking for subkey %s\n", lpSubKey);
301 ptr = strchr(lpSubKey,'\\');
302 if (!ptr) ptr = lpSubKey + strlen(lpSubKey);
303 strncpy(str,lpSubKey,ptr-lpSubKey);
304 str[ptr-lpSubKey] = 0;
306 if (*lpSubKey) lpSubKey++;
309 lpKey = lpKey->lpSubLvl;
310 while(lpKey != NULL && strcmp(lpKey->lpSubKey, str) != 0) {
311 lpKey = lpKey->lpNextKey;
314 hNewKey = GlobalAlloc(GMEM_MOVEABLE, sizeof(KEYSTRUCT));
315 lpNewKey = (LPKEYSTRUCT) GlobalLock(hNewKey);
316 if (lpNewKey == NULL) {
317 printf("RegCreateKey // Can't alloc new key !\n");
318 return ERROR_OUTOFMEMORY;
320 lpNewKey->hKey = hNewKey;
321 lpNewKey->lpSubKey = malloc(strlen(str) + 1);
322 if (lpNewKey->lpSubKey == NULL) {
323 printf("RegCreateKey // Can't alloc key string !\n");
324 return ERROR_OUTOFMEMORY;
326 strcpy(lpNewKey->lpSubKey, str);
327 lpNewKey->lpNextKey = lpPrevKey->lpSubLvl;
328 lpNewKey->lpPrevKey = NULL;
329 lpPrevKey->lpSubLvl = lpNewKey;
331 lpNewKey->dwType = 0;
332 lpNewKey->lpValue = NULL;
333 lpNewKey->lpSubLvl = NULL;
335 dprintf_reg(stddeb,"RegCreateKey // successful '%s' key=%08lX !\n", str, (DWORD)hNewKey);
338 *lphKey = lpKey->hKey;
339 dprintf_reg(stddeb,"RegCreateKey // found '%s', key=%08lX\n", str, (DWORD)*lphKey);
342 return ERROR_SUCCESS;
346 /*************************************************************************
347 * RegCloseKey [SHELL.3]
349 LONG RegCloseKey(HKEY hKey)
351 dprintf_reg(stdnimp, "EMPTY STUB !!! RegCloseKey(%08lX);\n", (DWORD)hKey);
352 return ERROR_SUCCESS;
356 /*************************************************************************
357 * RegDeleteKey [SHELL.4]
359 LONG RegDeleteKey(HKEY hKey, LPCSTR lpSubKey)
361 dprintf_reg(stdnimp, "EMPTY STUB !!! RegDeleteKey(%08lX, '%s');\n",
362 (DWORD)hKey, lpSubKey);
363 return ERROR_SUCCESS;
367 /*************************************************************************
368 * RegSetValue [SHELL.5]
370 LONG RegSetValue(HKEY hKey, LPCSTR lpSubKey, DWORD dwType,
371 LPCSTR lpVal, DWORD dwIgnored)
376 dprintf_reg(stddeb, "RegSetValue(%08lX, '%s', %08lX, '%s', %08lX);\n",
377 (DWORD)hKey, lpSubKey, dwType, lpVal, dwIgnored);
378 /*if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;*/
379 if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
380 if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
381 dprintf_reg(stddeb, "RegSetValue // key not found ... so create it !\n");
382 if ((dwRet = RegCreateKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
383 fprintf(stderr, "RegSetValue // key creation error %08lX !\n", dwRet);
387 lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
388 if (lpKey == NULL) return ERROR_BADKEY;
389 if (lpKey->lpValue != NULL) free(lpKey->lpValue);
390 lpKey->lpValue = xmalloc(strlen(lpVal) + 1);
391 strcpy(lpKey->lpValue, lpVal);
392 dprintf_reg(stddeb,"RegSetValue // successful key='%s' val='%s' !\n", lpSubKey, lpKey->lpValue);
393 return ERROR_SUCCESS;
397 /*************************************************************************
398 * RegQueryValue [SHELL.6]
400 LONG RegQueryValue(HKEY hKey, LPCSTR lpSubKey, LPSTR lpVal, LONG FAR *lpcb)
406 dprintf_reg(stddeb, "RegQueryValue(%08lX, '%s', %p, %p);\n",
407 (DWORD)hKey, lpSubKey, lpVal, lpcb);
408 /*if (lpSubKey == NULL) return ERROR_INVALID_PARAMETER;*/
409 if (lpVal == NULL) return ERROR_INVALID_PARAMETER;
410 if (lpcb == NULL) return ERROR_INVALID_PARAMETER;
411 if (!*lpcb) return ERROR_INVALID_PARAMETER;
413 if ((dwRet = RegOpenKey(hKey, lpSubKey, &hRetKey)) != ERROR_SUCCESS) {
414 fprintf(stderr, "RegQueryValue // key not found !\n");
417 lpKey = (LPKEYSTRUCT)GlobalLock(hRetKey);
418 if (lpKey == NULL) return ERROR_BADKEY;
419 if (lpKey->lpValue != NULL) {
420 if ((size = strlen(lpKey->lpValue)+1) > *lpcb){
421 strncpy(lpVal,lpKey->lpValue,*lpcb-1);
424 strcpy(lpVal,lpKey->lpValue);
431 dprintf_reg(stddeb,"RegQueryValue // return '%s' !\n", lpVal);
432 return ERROR_SUCCESS;
436 /*************************************************************************
437 * RegEnumKey [SHELL.7]
439 LONG RegEnumKey(HKEY hKey, DWORD dwSubKey, LPSTR lpBuf, DWORD dwSize)
445 dwRet = SHELL_RegCheckForRoot();
446 if (dwRet != ERROR_SUCCESS) return dwRet;
447 dprintf_reg(stddeb, "RegEnumKey(%08lX, %ld)\n", (DWORD)hKey, dwSubKey);
448 if (lpBuf == NULL) return ERROR_INVALID_PARAMETER;
449 switch((DWORD)hKey) {
451 lpKey = lphTopKey; break;
452 case HKEY_CLASSES_ROOT: /* == 1 */
454 lpKey = lphRootKey; break;
456 dprintf_reg(stddeb,"RegEnumKey // specific key = %08lX !\n", (DWORD)hKey);
457 lpKey = (LPKEYSTRUCT)GlobalLock(hKey);
459 lpKey = lpKey->lpSubLvl;
460 while(lpKey != NULL){
462 len = MIN(dwSize-1,strlen(lpKey->lpSubKey));
463 strncpy(lpBuf,lpKey->lpSubKey,len);
465 dprintf_reg(stddeb, "RegEnumKey: found %s\n",lpBuf);
466 return ERROR_SUCCESS;
469 lpKey = lpKey->lpNextKey;
471 dprintf_reg(stddeb, "RegEnumKey: key not found!\n");
472 return ERROR_INVALID_PARAMETER;
476 /*************************************************************************
477 * DragAcceptFiles [SHELL.9]
479 void DragAcceptFiles(HWND hWnd, BOOL b)
481 /* flips WS_EX_ACCEPTFILES bit according to the value of b (TRUE or FALSE) */
483 dprintf_reg(stddeb,"DragAcceptFiles("NPFMT", %u) old exStyle %08lx\n",hWnd,b,GetWindowLong(hWnd,GWL_EXSTYLE));
485 SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | b*(LONG)WS_EX_ACCEPTFILES);
489 /*************************************************************************
490 * DragQueryFile [SHELL.11]
492 UINT DragQueryFile(HDROP hDrop, WORD wFile, LPSTR lpszFile, WORD wLength)
494 /* hDrop is a global memory block allocated with GMEM_SHARE
495 with DROPFILESTRUCT as a header and filenames following
496 it, zero length filename is in the end */
498 LPDROPFILESTRUCT lpDropFileStruct;
502 dprintf_reg(stddeb,"DragQueryFile("NPFMT", %i, %p, %u)\n",
503 hDrop,wFile,lpszFile,wLength);
505 lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
506 if(!lpDropFileStruct)
508 dprintf_reg(stddeb,"DragQueryFile: unable to lock handle!\n");
511 lpCurrent = (LPSTR) lpDropFileStruct + lpDropFileStruct->wSize;
516 while(*lpCurrent++); /* skip filename */
518 return (wFile == 0xFFFF)? i : 0;
521 i = strlen(lpCurrent);
522 if(!lpszFile) return i+1; /* needed buffer size */
524 i = ( wLength > i)? i : wLength-1;
525 strncpy(lpszFile,lpCurrent,i);
533 /*************************************************************************
534 * DragFinish [SHELL.12]
536 void DragFinish(HDROP h)
538 GlobalFree((HGLOBAL)h);
542 /*************************************************************************
543 * DragQueryPoint [SHELL.13]
545 BOOL DragQueryPoint(HDROP hDrop, POINT FAR *p)
547 LPDROPFILESTRUCT lpDropFileStruct;
550 lpDropFileStruct = (LPDROPFILESTRUCT) GlobalLock(hDrop);
552 memcpy(p,&lpDropFileStruct->ptMousePos,sizeof(POINT));
553 bRet = lpDropFileStruct->fInNonClientArea;
560 /*************************************************************************
561 * ShellExecute [SHELL.20]
563 HINSTANCE ShellExecute(HWND hWnd, LPCSTR lpOperation, LPCSTR lpFile, LPCSTR lpParameters, LPCSTR lpDirectory, int iShowCmd)
569 /* OK. We are supposed to lookup the program associated with lpFile,
570 * then to execute it using that program. If lpFile is a program,
571 * we have to pass the parameters. If an instance is already running,
572 * we might have to send DDE commands.
574 dprintf_exec(stddeb, "ShellExecute("NPFMT",'%s','%s','%s','%s',%x)\n",
575 hWnd, lpOperation ? lpOperation:"<null>", lpFile ? lpFile:"<null>",
576 lpParameters ? lpParameters : "<null>",
577 lpDirectory ? lpDirectory : "<null>", iShowCmd);
578 if (lpFile==NULL) return 0; /* should not happen */
579 if (lpOperation==NULL) /* default is open */
581 p=strrchr(lpFile,'.');
583 x=p; /* the suffixes in the register database are lowercased */
584 while (*x) {*x=tolower(*x);x++;}
586 if (p==NULL || !strcmp(p,".exe")) {
589 sprintf(cmd,"%s %s",lpFile,lpParameters);
595 if (RegQueryValue((HKEY)HKEY_CLASSES_ROOT,p,subclass,&len)==ERROR_SUCCESS) {
597 fprintf(stddeb,"ShellExecute:subclass with len %ld? (%s), please report.\n",len,subclass);
599 strcat(subclass,"\\shell\\");
600 strcat(subclass,lpOperation);
601 strcat(subclass,"\\command");
602 dprintf_exec(stddeb,"ShellExecute:looking for %s.\n",subclass);
604 if (RegQueryValue((HKEY)HKEY_CLASSES_ROOT,subclass,cmd,&len)==ERROR_SUCCESS) {
606 dprintf_exec(stddeb,"ShellExecute:...got %s\n",cmd);
614 s=xmalloc(len+strlen(lpFile)+10);
615 strncpy(s,cmd,t-cmd);
622 /* does this use %x magic too? */
625 strcat(cmd,lpParameters);
628 fprintf(stddeb,"ShellExecute: No %s\\shell\\%s\\command found for \"%s\" suffix.\n",subclass,lpOperation,p);
629 return (HINSTANCE)14; /* unknown type */
632 fprintf(stddeb,"ShellExecute: No operation found for \"%s\" suffix.\n",p);
633 return (HINSTANCE)14; /* file not found */
636 dprintf_exec(stddeb,"ShellExecute:starting %s\n",cmd);
637 return WinExec(cmd,iShowCmd);
641 /*************************************************************************
642 * FindExecutable [SHELL.21]
644 HINSTANCE FindExecutable(LPCSTR lpFile, LPCSTR lpDirectory, LPSTR lpResult)
646 fprintf(stdnimp, "FindExecutable : Empty Stub !!!\n");
650 static char AppName[128], AppMisc[906];
652 /*************************************************************************
653 * AboutDlgProc [SHELL.33]
655 LRESULT AboutDlgProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
657 char Template[512], AppTitle[512];
662 SendDlgItemMessage(hWnd,stc1,STM_SETICON,lParam,0);
664 SendDlgItemMessage(hWnd,stc1,STM_SETICON,LOWORD(lParam),0);
666 GetWindowText(hWnd, Template, 511);
667 sprintf(AppTitle, Template, AppName);
668 SetWindowText(hWnd, AppTitle);
669 SetWindowText(GetDlgItem(hWnd,100), AppMisc);
675 EndDialog(hWnd, TRUE);
683 /*************************************************************************
684 * ShellAbout [SHELL.22]
686 INT ShellAbout(HWND hWnd, LPCSTR szApp, LPCSTR szOtherStuff, HICON hIcon)
690 DWORD WineProc,Win16Proc,Win32Proc;
691 static int initialized=0;
693 if (szApp) strncpy(AppName, szApp, sizeof(AppName));
695 AppName[sizeof(AppName)-1]=0;
697 if (szOtherStuff) strncpy(AppMisc, szOtherStuff, sizeof(AppMisc));
699 AppMisc[sizeof(AppMisc)-1]=0;
701 if (!hIcon) hIcon = LoadIcon(0,MAKEINTRESOURCE(OIC_WINEICON));
705 WineProc=(DWORD)AboutDlgProc;
706 Win16Proc=(DWORD)GetWndProcEntry16("AboutDlgProc");
707 Win32Proc=(DWORD)RELAY32_GetEntryPoint("WINPROCS32","AboutDlgProc",0);
708 ALIAS_RegisterAlias(WineProc,Win16Proc,Win32Proc);
712 handle = GLOBAL_CreateBlock( GMEM_FIXED,
713 sysres_DIALOG_SHELL_ABOUT_MSGBOX.bytes,
714 sysres_DIALOG_SHELL_ABOUT_MSGBOX.size,
715 GetCurrentPDB(), FALSE, FALSE,
717 if (!handle) return FALSE;
718 bRet = DialogBoxIndirectParam( WIN_GetWindowInstance( hWnd ),
720 GetWndProcEntry16("AboutDlgProc"),
722 GLOBAL_FreeBlock( handle );
726 /*************************************************************************
727 * ExtractIcon [SHELL.34]
729 HICON ExtractIcon(HINSTANCE hInst, LPCSTR lpszExeFileName, UINT nIconIndex)
732 HINSTANCE hInst2 = hInst;
733 dprintf_reg(stddeb, "ExtractIcon("NPFMT", '%s', %d\n",
734 hInst, lpszExeFileName, nIconIndex);
736 if (lpszExeFileName != NULL) {
737 hInst2 = LoadModule(lpszExeFileName,(LPVOID)-1);
739 if (hInst2 != 0 && nIconIndex == (UINT)-1) {
741 count = GetRsrcCount(hInst2, NE_RSCTYPE_GROUP_ICON);
742 dprintf_reg(stddeb, "ExtractIcon // '%s' has %d icons !\n", lpszExeFileName, count);
746 if (hInst2 != hInst && hInst2 != 0) {
753 /*************************************************************************
754 * ExtractAssociatedIcon [SHELL.36]
756 HICON ExtractAssociatedIcon(HINSTANCE hInst,LPSTR lpIconPath, LPWORD lpiIcon)
758 dprintf_reg(stdnimp, "ExtractAssociatedIcon : Empty Stub !!!\n");
762 /*************************************************************************
763 * DoEnvironmentSubst [SHELL.37]
765 DWORD DoEnvironmentSubst(LPSTR str,WORD len)
767 dprintf_reg(stdnimp, "DoEnvironmentSubst(%s,%x): Empyt Stub !!!\n",str,len);
771 /*************************************************************************
772 * RegisterShellHook [SHELL.102]
774 int RegisterShellHook(void *ptr)
776 dprintf_reg(stdnimp, "RegisterShellHook : Empty Stub !!!\n");
781 /*************************************************************************
782 * ShellHookProc [SHELL.103]
784 int ShellHookProc(void)
786 dprintf_reg(stdnimp, "ShellHookProc : Empty Stub !!!\n");