21 if (s_hwndServer &&
IsWindow(s_hwndServer))
26 if (hwndShell ==
NULL)
28 TRACE(
"GetShellWindow() returned NULL\n");
36 ERR(
"Unable to get server window\n");
41 s_hwndServer = hwndServer;
71 public CWindowImpl<CChangeNotifyBroker, CWindow, CWorkerTraits>
110 ERR(
"hLock is NULL\n");
115 TRACE(
"broker notifying: %p, 0x%x, %p, 0x%lx\n",
133 ERR(
"Out of memory\n");
138 if (hwndBroker ==
NULL)
140 ERR(
"hwndBroker == NULL\n");
157 DWORD cbPidl1 = 0, cbPidl2 = 0, ibOffset1 = 0, ibOffset2 = 0;
170 DWORD cbSize = ibOffset2 + cbPidl2;
174 ERR(
"Out of memory\n");
182 ERR(
"SHLockSharedEx failed\n");
214 ERR(
"pTicket is invalid\n");
221 if (pHandbag ==
NULL)
223 ERR(
"Out of memory\n");
251 DWORD cbSize = ibPidl + cbPidl;
255 if (hRegEntry ==
NULL)
257 ERR(
"Out of memory\n");
261 if (pRegEntry ==
NULL)
263 ERR(
"SHLockSharedEx failed\n");
270 pRegEntry->
cbSize = cbSize;
271 pRegEntry->
nRegID = nRegID;
273 pRegEntry->
uMsg = wMsg;
281 pRegEntry->
ibPidl = ibPidl;
299 if (hwndServer ==
NULL)
311 TRACE(
"hTicket: %p, 0x%lx\n", hTicket,
pid);
365 apidls[0] = apidls[1] =
NULL;
403 TRACE(
"(%p,0x%08x,0x%08x,0x%08x,%d,%p)\n",
404 hwnd, fSources, wEventMask, uMsg, cItems, lpItems);
407 if (wEventMask == 0 || cItems <= 0 || cItems > 0x7FFF || lpItems ==
NULL ||
415 if (hwndServer ==
NULL)
435 for (iItem = 0; iItem < cItems; ++iItem)
439 lpItems[iItem].fRecursive, lpItems[iItem].pidl,
440 dwOwnerPID, hwndBroker);
443 TRACE(
"CN_REGISTER: hwnd:%p, hRegEntry:%p, pid:0x%lx\n",
444 hwndServer, hRegEntry, dwOwnerPID);
453 nRegID = pRegEntry->
nRegID;
463 ERR(
"Delivery failed\n");
481 lpItems[iItem].fRecursive, apidlAlias[0],
482 dwOwnerPID, hwndBroker);
485 TRACE(
"CN_REGISTER: hwnd:%p, hRegEntry:%p, pid:0x%lx\n",
486 hwndServer, hRegEntry, dwOwnerPID);
501 lpItems[iItem].fRecursive, apidlAlias[1],
502 dwOwnerPID, hwndBroker);
505 TRACE(
"CN_REGISTER: hwnd:%p, hRegEntry:%p, pid:0x%lx\n",
506 hwndServer, hRegEntry, dwOwnerPID);
529 TRACE(
"(0x%08x)\n", hNotify);
533 if (hwndServer ==
NULL)
539 ERR(
"CN_UNREGISTER failed\n");
551 FIXME(
"(0x%08x, 0x%08x, 0x%08x, 0x%08x)\n",
552 unknown1, unknown2, unknown3, unknown4);
560 return "SHCNE_ALLEVENTS";
561 #define DUMPEV(x) ,( event & SHCNE_##x )? #x " " : "" 595 FIXME(
"SHChangeRegistrationReceive() stub\n");
632 TRACE(
"(0x%08x,0x%08x,%p,%p)\n", wEventId,
uFlags, dwItem1, dwItem2);
671 FIXME(
"SHChangeNotify with (uFlags & SHCNF_PRINTER)\n");
709 TRACE(
"%p %08x %p %p\n", hTicket, dwOwnerPID, lppidls, lpwEventId);
715 ERR(
"pHandbag is invalid\n");
721 *lppidls = pHandbag->
pidls;
735 TRACE(
"%p\n", hLock);
741 ERR(
"pHandbag is invalid\n");
757 FIXME(
"(0x%08x):semi stub.\n", hNotify);
771 FIXME(
"SHChangeNotifySuspendResume() stub\n");
static HWND GetNotificationServer(BOOL bCreate)
static HWND CreateNotificationBroker(HWND hwnd, UINT wMsg)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
HWND WINAPI GetShellWindow(VOID)
PVOID WINAPI SHLockSharedEx(HANDLE hData, DWORD dwProcessId, BOOL bWriteAccess)
void WINAPI ILFree(LPITEMIDLIST pidl)
static ALIAS_PIDL AliasPIDLs[]
EXTERN_C DWORD WINAPI NTSHChangeNotifyDeregister(ULONG hNotify)
EXTERN_C void FreeChangeNotifications(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
CRITICAL_SECTION SHELL32_ChangenotifyCS
BOOL WINAPI IsWindow(_In_opt_ HWND)
EXTERN_C void InitChangeNotifications(void)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
#define CSIDL_COMMON_DESKTOPDIRECTORY
#define WM_DESKTOP_GET_CNOTIFY_SERVER
GLuint GLuint GLsizei count
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
DWORD WINAPI GetTickCount(VOID)
void OnFinalMessage(HWND)
#define SHCNRF_RecursiveInterrupt
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
EXTERN_C BOOL WINAPI SHChangeNotifySuspendResume(BOOL bSuspend, LPITEMIDLIST pidl, BOOL bRecursive, DWORD dwReserved)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
BOOL WINAPI DestroyWindow(_In_ HWND)
const char * wine_dbg_sprintf(const char *format,...)
BOOL SubclassWindow(HWND hWnd)
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
EXTERN_C ULONG WINAPI NTSHChangeNotifyRegister(HWND hwnd, INT fSources, LONG fEvents, UINT msg, INT count, SHChangeNotifyEntry *idlist)
static LPCSTR DumpEvent(LONG event)
#define SHCNRF_InterruptLevel
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
EXTERN_C BOOL WINAPI SHChangeNotifyUpdateEntryList(DWORD unknown1, DWORD unknown2, DWORD unknown3, DWORD unknown4)
#define CN_UNREGISTER_PROCESS
static void CreateNotificationParamAndSend(LONG wEventId, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
LRESULT OnBrokerNotification(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
CChangeNotifyBroker(HWND hwndClient, UINT uMsg)
HANDLE WINAPI SHAllocShared(LPCVOID lpvData, DWORD dwSize, DWORD dwProcId)
LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
#define WM_BROKER_NOTIFICATION
BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId)
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
EXTERN_C BOOL WINAPI SHChangeRegistrationReceive(LPVOID lpUnknown1, DWORD dwUnknown2)
struct HANDBAG * LPHANDBAG
EXTERN_C VOID WINAPI SHChangeNotifyTransmit(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
#define memcpy(s1, s2, n)
#define CN_DELIVER_NOTIFICATION
EXTERN_C VOID WINAPI SHChangeNotifyReceive(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
static VOID DoInitAliasPIDLs(void)
#define SHCNRF_NewDelivery
_In_ int _In_ BOOL bCreate
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
HLOCAL NTAPI LocalFree(HLOCAL hMem)
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
static LPHANDBAG DoGetHandbagFromTicket(HANDLE hTicket, DWORD dwOwnerPID)
struct DELITICKET * LPDELITICKET
#define BEGIN_MSG_MAP(theClass)
static HANDLE CreateRegistrationParam(ULONG nRegID, HWND hwnd, UINT wMsg, INT fSources, LONG fEvents, LONG fRecursive, LPCITEMIDLIST pidl, DWORD dwOwnerPID, HWND hwndBroker)
#define MESSAGE_HANDLER(msg, func)
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
BOOL BrokerNotification(HANDLE hTicket, DWORD dwOwnerPID)
BOOL WINAPI SHUnlockShared(LPVOID lpView)
HLOCAL NTAPI LocalAlloc(UINT uFlags, SIZE_T dwBytes)
#define CSIDL_DESKTOPDIRECTORY
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
WINE_DEFAULT_DEBUG_CHANNEL(shcn)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
EXTERN_C VOID WINAPI SHChangeNotifyReceiveEx(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
HWND SHCreateDefaultWorkerWindow(VOID)
struct REGENTRY * LPREGENTRY
#define DWORD_ALIGNMENT(offset)
static BOOL DoGetAliasPIDLs(LPITEMIDLIST apidls[2], PCIDLIST_ABSOLUTE pidl)
#define SHCNF_FLUSHNOWAIT
DWORD WINAPI GetCurrentProcessId(VOID)
static HANDLE CreateNotificationParam(LONG wEventId, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwOwnerPID, DWORD dwTick)
#define SHCNE_ASSOCCHANGED