Removed +x perm
[openwide.git] / openwidedll.c
blobdf3090bea40b956c02d11a51b57debf13c9aff1b
1 /* --- The following code comes from c:\lcc\lib\wizard\dll.tpl. */
2 /**
3 * @author Luke Hudson
4 * @licence GPL2
5 */
7 #include <windows.h>
8 #include <commctrl.h>
9 #include <shlwapi.h>
10 #include <shellapi.h>
11 #include <shlobj.h>
12 #include <stdarg.h>
13 #include <stdio.h>
14 #include <dlgs.h>
15 #include "openwidedll.h"
16 #include "openwidedllres.h"
17 #include "owDllInc.h"
18 #include "owSharedUtil.h"
21 HINSTANCE ghInst = NULL;
22 HANDLE ghMutex = NULL;
23 POWSharedData gpSharedMem = NULL; // pointer to shared mem
24 HANDLE ghMap = NULL;
25 HHOOK ghMsgHook = NULL, ghSysMsgHook = NULL;
27 OWSharedData gOwShared; // stores copy of shared mem for access to non-pointer datas without extended blocking
31 int addIcon2TB(HWND hwTB, HICON hIcn)
33 HIMAGELIST hImgList = NULL;
34 hImgList = (HIMAGELIST)SendMessage(hwTB, TB_GETIMAGELIST, 0, 0);
35 if (hImgList)
37 // int nImgs = ImageList_GetImageCount(hImgList);
38 int idxNew = ImageList_AddIcon(hImgList, hIcn);
39 if (idxNew == -1)
41 //dbg("%s, Error adding to imglist: %s", __func__, geterrmsg());
42 return -1;
44 else
46 //dbg("%s, Image added at index %d", __func__, idxNew);
47 SendMessage(hwTB, TB_SETIMAGELIST, 0, (LPARAM)hImgList);
48 return idxNew;
51 else
52 return -1;
55 static int addTBButton(HWND hwnd)
57 HWND hwTB = findChildWindow(hwnd, CID_TOOLBAR, TOOLBARCLASSNAME);
59 TBBUTTON tb = { 0 };
60 tb.iBitmap = VIEW_NETCONNECT;
62 int idxNew = -1;
63 HICON hIcn = (HICON)LoadImage(ghInst, MAKEINTRESOURCE(IDI_TBICON), IMAGE_ICON, 16, 16, 0);
64 if (hIcn)
66 idxNew = addIcon2TB(hwTB, hIcn);
67 DestroyIcon(hIcn);
69 if (idxNew >= 0)
70 tb.iBitmap = idxNew;
71 tb.idCommand = OW_TBUTTON_CMDID;
72 tb.fsStyle = BTNS_AUTOSIZE | BTNS_BUTTON | BTNS_SHOWTEXT | BTNS_DROPDOWN; // BTNS_WHOLEDROPDOWN;
73 tb.fsState = TBSTATE_ENABLED;
74 tb.iString = (INT_PTR)"OpenWide by Lingo";
75 SendMessage(hwTB, TB_ADDBUTTONS, 1, (LPARAM) & tb);
77 RECT r;
78 int idxLast = SendMessage(hwTB, TB_BUTTONCOUNT, 0, 0) - 1;
79 if (SendMessage(hwTB, TB_GETITEMRECT, idxLast, (LPARAM) & r))
81 RECT rw;
82 GetWindowRect(hwTB, &rw);
83 MapWindowPoints(hwTB, NULL, (LPPOINT) & r, 2);
84 SetWindowPos(hwTB, NULL, 0, 0, (r.right + 8) - rw.left, rw.bottom - rw.top + 1, SWP_NOMOVE | SWP_NOZORDER);
86 return 1;
89 static void dropMenu(HWND hwnd, HWND hwTB, UINT uiItem)
91 RECT r;
92 SendMessage(hwTB, TB_GETRECT, uiItem, (LPARAM) & r);
93 MapWindowPoints(hwTB, NULL, (LPPOINT) & r, 2);
95 TPMPARAMS tpm = { 0 };
96 tpm.cbSize = sizeof(tpm);
97 tpm.rcExclude = r;
99 HMENU hm = CreatePopupMenu();
100 AppendMenu(hm, MF_STRING, OW_EXPLORE_CMDID, "&Locate current folder with Explorer...");
101 AppendMenu(hm, MF_STRING, OW_SHOWDESK_CMDID, "Show &Desktop [for Gabriel]...");
102 SetMenuDefaultItem(hm, OW_SHOWDESK_CMDID, FALSE);
104 AppendMenu(hm, MF_STRING, OW_ADDFAV_CMDID, "Add &Favourite");
105 SetMenuDefaultItem(hm, OW_ADDFAV_CMDID, FALSE);
106 POWSharedData pow = lockSharedData();
107 if (pow)
109 dbg("%s, Locked shared data ok", __func__);
110 PFavLink pFav = pow->pFaves;
111 if (pFav)
113 MENUITEMINFO mii = { 0 };
114 mii.cbSize = sizeof(mii);
115 AppendMenu(hm, MF_SEPARATOR | MF_DISABLED, 0, NULL);
116 for (int i = 0; i < pow->nFaves; i++)
118 pFav = getNthFave(pow, i);
119 if (!pFav)
120 break;
121 static char szBuf[MAX_PATH + 8];
123 dbgLink("inserting...", pFav);
124 mii.fMask = MIIM_STRING | MIIM_DATA | MIIM_ID;
125 mii.fType = MFT_STRING;
126 wsprintf(szBuf, "%s\tCtrl+%d", pFav->szFav, (pFav->idCmd - OW_FAVOURITE_CMDID) + 1);
127 mii.dwTypeData = szBuf;
128 mii.dwItemData = pFav->idCmd;
129 mii.wID = pFav->idCmd;
131 int iRes = InsertMenuItem(hm, -1, TRUE, &mii);
132 if (iRes == 0)
133 dbg("%s, Failed inserting item: %s", __func__, geterrmsg());
134 //idx = AppendMenu(hm, MF_STRING, iCmd++, pFav->szFav);
137 unlockSharedData(pow);
140 AppendMenu(hm, MF_SEPARATOR | MF_DISABLED, 0, NULL);
141 AppendMenu(hm, MF_STRING, OW_ABOUT_CMDID, "&About OpenWide...");
142 TrackPopupMenuEx(hm, TPM_HORIZONTAL | TPM_RIGHTALIGN | TPM_LEFTBUTTON | TPM_VERTICAL, r.right, r.bottom, hwnd, &tpm);
143 DestroyMenu(hm);
146 int addPlace(HWND hwnd, PFavLink plk)
148 HWND hwTB = GetDlgItem(hwnd, CID_PLACES);
150 TBBUTTON tb = { 0 };
151 tb.iBitmap = giPlacesIcon;
152 tb.idCommand = plk->idCmd;
153 tb.fsStyle = BTNS_BUTTON | BTNS_SHOWTEXT; // BTNS_WHOLEDROPDOWN;
154 tb.fsState = TBSTATE_ENABLED;
155 tb.iString = (INT_PTR)PathFindFileName(plk->szFav);
156 SendMessage(hwTB, TB_ADDBUTTONS, 1, (LPARAM) & tb);
157 return 1;
160 int addFavourite(HWND hwnd)
162 //static char szBuf[2*MAX_PATH+1];
163 assert( IsWindow(hwnd));
165 char *szBuf = (char *)GlobalAlloc(GPTR, 2 * MAX_PATH + 1);
166 if( !szBuf )
167 return 0;
168 if( SendMessage(hwnd, CDM_GETFOLDERPATH, 2*MAX_PATH, (LPARAM)szBuf) > 0 )
170 if( !faveExists(szBuf) )
172 PFavLink plNew = newFav(szBuf);
173 if( plNew )
174 addPlace(hwnd, plNew);
175 else
176 dbg("%s, failed to create new fave", __func__);
178 else
179 dbg("%s, Fave: '%s' exists already", __func__, szBuf);
180 return 1;
182 GlobalFree(szBuf);
183 return 0;
186 int openWide(HWND hwnd)
188 dbg("DLL: openWide(%p)", hwnd);
189 // set placement
190 int w = gOwShared.szDim.cx;
191 int h = gOwShared.szDim.cy;
192 int x = gOwShared.ptOrg.x;
193 int y = gOwShared.ptOrg.y;
194 SetWindowPos(hwnd, NULL, x, y, w, h, SWP_NOZORDER);
196 // set view mode
197 HWND hwDirCtl = GetDlgItem(hwnd, CID_DIRLISTPARENT);
198 WORD vCmdID = viewToCmdID(gOwShared.iView);
199 // dbg("Sending message to set view, cmd id %d", vCmdID);
200 SendMessage(hwDirCtl, WM_COMMAND, MAKEWPARAM(vCmdID, 0), 0);
202 focusDlgItem(hwnd, gOwShared.iFocus);
204 // debug hook, to find menu cmd IDs
205 #ifdef HOOK_SYSMSG
206 dbg("Hooking SYSMSG...");
207 ghSysMsgHook = SetWindowsHookEx(
208 WH_SYSMSGFILTER,
209 SysMsgProc,
210 ghInst,
211 0 //GetCurrentThreadId() // Only install for THIS thread!!!
213 dbg("Hooking returned %p", ghSysMsgHook);
214 #endif
215 DragAcceptFiles(hwnd, TRUE);
216 //SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) | WS_CAPTION | WS_SYSMENU);
218 HMENU hm = GetSystemMenu(hwnd, FALSE);
219 AppendMenu(hm, MF_SEPARATOR | MF_DISABLED, 0, NULL);
220 AppendMenu(hm, MF_STRING, OW_EXPLORE_CMDID, "&Locate current folder with Explorer...");
221 AppendMenu(hm, MF_STRING, OW_ABOUT_CMDID, "&About OpenWide...");
223 addTBButton(hwnd);
225 HWND hwShellCtl = GetDlgItem(hwnd, CID_DIRLISTPARENT);
226 hwShellCtl = GetDlgItem(hwShellCtl, 1);
227 ListView_SetExtendedListViewStyleEx(hwShellCtl, OW_LISTVIEW_STYLE, OW_LISTVIEW_STYLE );
229 HWND hwOv = createOverlayWindow(hwnd);
230 dbg("Created overlay window: %p", hwOv);
231 SetWindowPos(hwOv, HWND_TOP, 0,0,0,0, SWP_NOMOVE | SWP_NOSIZE);
232 SetActiveWindow(hwnd);
233 DragAcceptFiles(hwOv, TRUE);*/
234 return 1;
237 void showDesktop(HWND hwnd)
239 char * szDesk = GlobalAlloc(GPTR, MAX_PATH+1);
240 if( szDesk && SHGetSpecialFolderPath(hwnd, szDesk, CSIDL_DESKTOPDIRECTORY,FALSE) )
242 char *szOld = getDlgItemText(hwnd, CID_FNAME);
243 SetDlgItemText(hwnd, CID_FNAME, szDesk);
244 SendDlgItemMessage(hwnd, CID_FNAME, EM_SETSEL, -1, -1);
245 SendDlgItemMessage(hwnd, CID_FNAME, EM_REPLACESEL, FALSE, (LPARAM)"\\");
246 SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwnd, IDOK));
247 if( szOld )
248 SetDlgItemText(hwnd, CID_FNAME, szOld);
249 else
250 SetDlgItemText(hwnd, CID_FNAME, "");
251 free(szOld);
252 GlobalFree(szDesk);
256 LRESULT CALLBACK WINAPI wpSubMain(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
258 /* if( gbDbg )
260 dbgWM(hwnd, msg, wp, lp);
262 POWSubClassData pow = (POWSubClassData)GetProp(hwnd, OW_PROP_NAME);
263 if( !pow )
264 return DefWindowProc(hwnd, msg, wp, lp);
266 static char buffer[MAX_PATH+1];
268 switch(msg)
270 case WM_INITDIALOG:
272 dbg("DLL: INITDIALOG");
273 LRESULT lRes = CallWindowProc(pow->wpOrig, hwnd, msg, wp, lp);
274 ShowWindow(hwnd, SW_HIDE);
275 return lRes;
277 break;
278 case WM_SHOWWINDOW:
279 if( wp && !pow->bSet )
281 pow->bSet = TRUE;
282 openWide(hwnd);
284 break;
285 /*case WM_SIZE:
287 LRESULT lRes = CallWindowProc(pow->wpOrig, hwnd, msg, wp, lp);
288 int w = LOWORD(lp);
289 int h = HIWORD(lp);
290 MoveWindow( GetDlgItem(hwnd, CID_OVERLAY), 0,0, w,h, FALSE);
291 return lRes;
293 break;*/
294 case WM_COMMAND:
295 switch (LOWORD(wp))
297 case OW_ABOUT_CMDID:
298 MessageBox(hwnd, "OpenWide is written by Luke Hudson. (c)2005", "About OpenWide", MB_OK);
299 return 0;
300 case OW_TBUTTON_CMDID:
301 case OW_SHOWDESK_CMDID:
302 showDesktop(hwnd);
303 break;
304 case OW_EXPLORE_CMDID:
306 char *szParm = "/select,";
307 wsprintf(buffer, szParm);
308 int len = strlen(szParm);
309 LPARAM lpBuf = (LPARAM)buffer + (LPARAM)len;
310 dbg("CDM_GET..PATH, cbSize=%d, buffer = %p", MAX_PATH-len, lpBuf);
311 len = SendMessage(hwnd, CDM_GETFOLDERPATH, MAX_PATH - len, lpBuf); //(LPARAM)(char *)((unsigned int)buffer + (unsigned int)len));
312 if (len)
314 dbg("Getfolderpath returned len %d, path: \"%s\"",len, buffer);
315 ShellExecute(hwnd, NULL, "explorer.exe", buffer, NULL, SW_SHOWNORMAL);
318 return 0;
320 case OW_ADDFAV_CMDID:
321 doAddFave(hwnd);
322 return 0;
323 default:
324 if (LOWORD(wp) >= OW_FAVOURITE_CMDID)
326 getFavourite(hwnd, (int)LOWORD(wp));
328 break;*/
330 break;
332 case WM_NOTIFY:
334 NMHDR *phdr = (NMHDR *)lp;
335 HWND hwTB = findChildWindow(hwnd, CID_TOOLBAR, TOOLBARCLASSNAME);
336 if (phdr->hwndFrom == hwTB)
338 // dbg("Got notify %d from toolbar", phdr->code);
339 if (phdr->code == TBN_DROPDOWN)
341 NMTOOLBAR *ptb = (NMTOOLBAR *)lp;
342 if (ptb->iItem == OW_TBUTTON_CMDID)
344 dropMenu(hwnd, hwTB, ptb->iItem);
345 return TBDDRET_DEFAULT;
350 break;
352 case WM_PARENTNOTIFY:
353 if( LOWORD(wp) == WM_CREATE)
355 static char buf[33];
356 GetClassName((HWND)lp, buf, 32);
358 if( strcmp(buf, "SHELLDLL_DefView") == 0 )
360 // dbg("Shell defview ctl created");
361 // subclass((HWND)lp, wpSubShellCtl, (LPARAM)hwnd);
362 HWND hwLV = GetDlgItem((HWND)lp, 1);
363 DragAcceptFiles(hwLV, TRUE);
364 if( hwLV )
366 if( GetWindowLong(hwLV, GWL_STYLE) & LVS_REPORT )
368 //dbg("hwLV is in report mode -- setting extended style");
369 ListView_SetExtendedListViewStyleEx(hwLV, OW_LISTVIEW_STYLE, OW_LISTVIEW_STYLE );
370 INPUT in[4] = {0};
371 in[0].type = INPUT_KEYBOARD;
372 in[0].ki.wVk = VK_CONTROL;
373 in[1].type = INPUT_KEYBOARD;
374 in[1].ki.wVk = VK_ADD;
375 in[2].type = INPUT_KEYBOARD;
376 in[2].ki.wVk = VK_CONTROL;
377 in[2].ki.dwFlags = KEYEVENTF_KEYUP;
378 in[3].type = INPUT_KEYBOARD;
379 in[3].ki.wVk = VK_ADD;
380 in[3].ki.dwFlags = KEYEVENTF_KEYUP;
381 HWND hwOld = SetFocus(hwLV);
382 SendInput(4, in, sizeof(INPUT));
383 SetFocus(hwOld);
386 SetTimer(hwnd, 251177, 1, NULL);
389 break;
390 /* case WM_TIMER:
391 if( wp == 251177 )
393 KillTimer(hwnd, 251177);
394 HWND hwDirCtl = GetDlgItem(hwnd, CID_DIRLISTPARENT);
395 if( getSharedData() )
397 if( gOwShared.iView == V_THUMBS || gOwShared.iView == V_TILES )
399 // dbg("posting cmd message to reset view?");
400 WORD vCmdID = viewToCmdID(gOwShared.iView);
401 PostMessage(hwDirCtl, WM_COMMAND, MAKEWPARAM(vCmdID, 0), 0);
405 break;
407 case WM_SYSCOMMAND:
409 int cmdId = wp & 0xFFF0;
410 if( cmdId == OW_ABOUT_CMDID )
412 MessageBox(hwnd, "OpenWide is written by Luke Hudson. (c)2005", "About OpenWide", MB_OK);
413 return 0;
415 else if( cmdId == OW_EXPLORE_CMDID )
417 char * szParm = "/select,";
418 wsprintf(buffer, szParm);
419 int len = strlen(szParm);
420 len = SendMessage(hwnd, CDM_GETFOLDERPATH, MAX_PATH-len, (LPARAM)(buffer+len));
421 if( len )
423 ShellExecute(hwnd, NULL, "explorer.exe", buffer, NULL, SW_SHOWNORMAL);
427 break;
428 /* case WM_NOTIFY:
430 NMHDR * phdr = (NMHDR *)lp;
431 HWND hwSV = GetDlgItem(hwnd, CID_DIRLISTPARENT);
432 hwSV = GetDlgItem(hwSV, CID_DIRLIST);
433 if( phdr->hwndFrom == hwSV )
435 dbg("Got notify %d from listview", phdr->code);
438 break;*/
439 /* case WM_NCPAINT:
441 HDC hdc = GetWindowDC(hwnd);
442 HBRUSH hbrOld;
443 HPEN hpOld;
444 hbrOld = SelectObject(hdc, GetStockObject(BLACK_BRUSH));
445 hpOld = SelectObject(hdc, GetStockObject(NULL_PEN));
446 RECT r;
447 GetWindowRect(hwnd, &r);
448 r.right-=r.left;
449 r.left -= r.left;
450 r.bottom-=r.top;
451 r.top -= r.top;
452 RoundRect(hdc, r.left, r.top, r.right, r.bottom, 16,16);
453 SelectObject(hdc, hbrOld);
454 SelectObject(hdc, hpOld);
455 ReleaseDC(hwnd, hdc);
457 break;*/
458 case WM_DROPFILES:
460 HANDLE hDrop = (HANDLE)wp;
461 int nFiles = DragQueryFile(hDrop, (UINT)-1, NULL, 0);
462 //dbg("%d files dropped on main window %p", nFiles, hwnd);
463 if( nFiles == 1 )
465 if( DragQueryFile(hDrop, 0, buffer, MAX_PATH) )
467 if( PathIsDirectory(buffer) )
469 SetDlgItemText(hwnd, CID_FNAME, buffer);
470 SendDlgItemMessage(hwnd, CID_FNAME, EM_SETSEL, -1, -1);
471 SendDlgItemMessage(hwnd, CID_FNAME, EM_REPLACESEL, FALSE, (LPARAM)"\\");
472 SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(IDOK, BN_CLICKED), (LPARAM)GetDlgItem(hwnd, IDOK));
473 SetDlgItemText(hwnd, CID_FNAME, "");
474 if( getSharedData() )
476 focusDlgItem(hwnd, gOwShared.iFocus);
482 return 0;
483 case WM_DESTROY:
485 //dbg("DLL: DESTROY");
486 if( openSharedMem() )
488 //dbg("DLL: Opened shared memory");
489 if( --gpSharedMem->refCount < 0 )
490 gpSharedMem->refCount = 0;
491 //dbg("DLL: dec'd refCount to %d, posting msg %x to app window %p", gpSharedMem->refCount, gpSharedMem->iCloseMsg, gpSharedMem->hwListener);
492 PostMessage( gpSharedMem->hwListener, gpSharedMem->iCloseMsg, 0,0);
493 closeSharedMem();
494 //dbg("DLL: Closed shared memory");
496 WNDPROC wpOrig = pow->wpOrig;
497 unsubclass(hwnd);
498 return CallWindowProc(wpOrig, hwnd, msg, wp, lp);
500 break;
502 return CallWindowProc(pow->wpOrig, hwnd, msg, wp, lp);
505 LRESULT CALLBACK WINAPI wpSubShellCtl(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp)
507 POWSubClassData pow = (POWSubClassData)GetProp(hwnd, OW_PROP_NAME);
508 if( !pow )
509 return DefWindowProc(hwnd, msg, wp, lp);
511 switch(msg)
513 case WM_DROPFILES:
515 HANDLE hDrop = (HANDLE)wp;
516 int nFiles = DragQueryFile(hDrop, (UINT)-1, NULL, 0);
517 ////dbg("%d files dropped, fwding mesg to %p", nFiles, pow->lpData);
518 return SendMessage((HWND)pow->lpData, msg, wp, lp);
520 break;
521 case WM_DESTROY:
523 WNDPROC wpOrig = pow->wpOrig;
524 unsubclass(hwnd);
525 //dbg("SHell view being destroyed");
526 return CallWindowProc(wpOrig, hwnd, msg, wp, lp);
528 break;
530 return CallWindowProc(pow->wpOrig, hwnd, msg, wp, lp);
533 static BOOL isExcluded(const char *szApp)
535 BOOL bEx = FALSE;
536 HKEY hk = regOpenKey(HKEY_CURRENT_USER, OW_REGKEY_EXCLUDES_NAME);
537 if( hk )
539 regGetDWORD(hk, szApp, &bEx);
540 regCloseKey(hk);
542 return bEx;
546 static void dbgCreateParams(LPVOID lpCreateParams)
548 UNALIGNED short * pcbData = (UNALIGNED short *)lpCreateParams;
549 if( pcbData )
551 short cbData = * pcbData;
552 UNALIGNED byte *pbData = (UNALIGNED byte *)pcbData;
553 pbData += sizeof(short);
554 dbg("**CreateParams:");
555 dbg(" %d bytes of data, starting at x%p", cbData, pbData);
556 if( pbData )
558 dbg(" First 8 bytes follow:");
559 int len = min( cbData, 8 );
560 char s[32] = {0};
561 int i;
562 for(i=0; i < len; i++)
564 s[i] = pbData[i];
566 s[i] = 0;
567 dbg(" \"%s\" (hex follows)", s);
568 char st[8];
569 s[0] = 0;
570 for(i=0; i < len; i++)
572 sprintf(st, "%02x ", pbData[i]);
573 strcat(s, st);
575 dbg(" %s", s);
578 else
579 dbg("CreateParams is NULL (%p)", pcbData);
582 static LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
585 if(nCode < 0)
587 if( ghMsgHook )
588 return CallNextHookEx(ghMsgHook, nCode, wParam, lParam);
591 switch(nCode)
593 case HCBT_CREATEWND:
595 static char buf[256];
596 HWND hwNew = (HWND)wParam;
597 CBT_CREATEWND * pcw = (CBT_CREATEWND *)lParam;
598 CREATESTRUCT * pcs = (CREATESTRUCT*) pcw->lpcs;
600 if( GetClassName(hwNew, buf, 255) && pcs->lpszName )
602 DWORD style = (DWORD)GetWindowLong(hwNew, GWL_STYLE);
603 DWORD exStyle = (DWORD)GetWindowLong(hwNew, GWL_EXSTYLE);
605 if( style == OW_MATCH_STYLE && exStyle == OW_MATCH_EXSTYLE
606 && strcmp(buf, "#32770") == 0
607 && strcmp(pcs->lpszName, "Open") == 0 )
609 BOOL bTakeOver = TRUE;
611 //// FIND name of Calling app ////
612 char *szApp = malloc( MAX_PATH+1 );
613 if( szApp && GetModuleFileName(NULL, szApp, MAX_PATH) )
615 if( isExcluded(szApp) )
616 bTakeOver = FALSE;
617 //dbg("DLL: Module: %s", szApp);
618 free(szApp);
621 ///dbg("DLL: Found O&S dlg %p, attempting access to shared mem", hwNew);
623 if( bTakeOver && openSharedMem() )
625 //dbgCreateParams(pcs->lpCreateParams);
626 //dbg("DLL: Opened shared memory");
627 if( gpSharedMem->bDisable )
628 bTakeOver = FALSE;
629 else
630 gpSharedMem->refCount++;
631 //dbg("DLL: Inc'd refCount to %d", gpSharedMem->refCount);
632 closeSharedMem();
633 //dbg("DLL: Closed shared memory");
635 if( bTakeOver )
637 pcs->style &= ~WS_VISIBLE;
638 ShowWindow(hwNew, SW_HIDE);
639 subclass(hwNew, wpSubMain, 0);
644 return 0;
646 // Call the next hook, if there is one
647 return CallNextHookEx(ghMsgHook, nCode, wParam, lParam);
650 int openSharedMem(void)
652 if( ghMap != NULL || gpSharedMem != NULL )
653 return 1;
655 if(!waitForMutex())
656 return 0;
658 ghMap = OpenFileMapping(FILE_MAP_WRITE, TRUE, OW_SHARED_FILE_MAPPING);
659 if( ghMap )
661 gpSharedMem = (POWSharedData)MapViewOfFile(ghMap, FILE_MAP_WRITE, 0,0, 0);
662 if( gpSharedMem )
664 CopyMemory(&gOwShared, gpSharedMem, sizeof(OWSharedData));
665 return 1;
667 else
668 closeSharedMem();
670 return 0;
673 void closeSharedMem(void)
675 if( gpSharedMem )
677 UnmapViewOfFile(gpSharedMem);
678 gpSharedMem = NULL;
680 if( ghMap )
682 CloseHandle(ghMap);
683 ghMap = NULL;
685 releaseMutex();
688 int getSharedData(void)
690 int rv = 0;
691 if( openSharedMem() )
693 rv = 1;
694 closeSharedMem();
696 return rv;
700 int DLLEXPORT setHook(void)
702 if(ghMsgHook != NULL)
704 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Already hooked");
705 return 1;
707 if(!getSharedData())
709 // SendMessage(hwLB, LB_ADDSTRING, 0, (LPARAM)"Failed to get shared data!!!");
710 // dbg("Hook failed to get shared mems");
711 return FALSE;
713 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Setting hook....");
714 ghMsgHook = SetWindowsHookEx(WH_CBT, CBTProc, ghInst, 0);
715 if(ghMsgHook != NULL)
717 //dbg("Hooked okay");
718 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Hooked ok!");
719 return 1;
721 //dbg("Hook failed");
722 //SendMessage(gOwShared.hwLog, LB_ADDSTRING, 0, (LPARAM)"Failed hook");
723 return 0;
727 int DLLEXPORT rmvHook(void)
729 if( !ghMsgHook )
730 return 1;
732 if( ghSysMsgHook )
734 UnhookWindowsHookEx(ghSysMsgHook);
735 ghSysMsgHook = NULL;
737 //dbg("DLL: Removing hook");
738 if( ghMsgHook )
740 UnhookWindowsHookEx(ghMsgHook);
741 ghMsgHook = NULL;
743 //dbg("DLL: removed hook okay");
744 return 1;
750 static LRESULT CALLBACK SysMsgProc(int nCode, WPARAM wParam, LPARAM lParam)
752 HWND hwnd;
754 if(nCode < 0)
755 return CallNextHookEx(ghMsgHook, nCode, wParam, lParam);
757 LPMSG pMsg = (MSG *)lParam;
758 if( pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST )
760 dbg("SysMsgProc: %d is code, pMsg: hwnd: %p, message: %d, wp: %x, lp: %x", nCode, pMsg->hwnd, pMsg->message, pMsg->wParam, pMsg->lParam);
762 if( GetAsyncKeyState(VK_SHIFT) & 0x8000 )
764 LRESULT lRet = CallNextHookEx(ghSysMsgHook, nCode, wParam, lParam);
765 UnhookWindowsHookEx(ghSysMsgHook);
766 ghSysMsgHook = NULL;
767 return lRet;
769 switch(pMsg->message)
771 case WM_MENUSELECT:
773 dbg("WM_MENUSELECT: %p %d", pMsg->hwnd, LOWORD(pMsg->wParam));
775 HMENU hm = (HMENU)pMsg->lParam;
776 if(hm)
778 static char buf[80];
779 MENUITEMINFO mii ={0};
780 int nItems = GetMenuItemCount(hm);
781 dbg(" %d items in menu", nItems);
782 for(int i=0; i < nItems; i++)
784 mii.cbSize = sizeof(mii);
785 mii.fMask = MIIM_FTYPE | MIIM_ID | MIIM_STRING;
786 mii.cch = 79;
787 mii.dwTypeData = (LPTSTR)buf;
788 GetMenuItemInfo(hm, i, TRUE, &mii);
789 dbg(" Item %d: %.8s, %d", i, buf, mii.wID);
793 UnhookWindowsHookEx(ghSysMsgHook);
794 ghSysMsgHook = NULL;
796 break;
797 default:
798 break;
800 // Call the next hook, if there is one
801 return CallNextHookEx(ghSysMsgHook, nCode, wParam, lParam);
805 BOOL DLLEXPORT WINAPI DLLPROC(HINSTANCE hDLLInst, DWORD fdwReason, LPVOID lpvReserved)
807 switch (fdwReason)
809 case DLL_PROCESS_ATTACH:
810 ghInst = hDLLInst;
811 break;
812 case DLL_PROCESS_DETACH:
813 ghInst = NULL;
814 break;
815 default:
816 break;
818 return TRUE;