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)
421 fSources &= ~SHCNRF_RecursiveInterrupt;
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");
struct DELITICKET * LPDELITICKET
#define CN_DELIVER_NOTIFICATION
#define CN_UNREGISTER_PROCESS
struct REGENTRY * LPREGENTRY
#define DWORD_ALIGNMENT(offset)
struct HANDBAG * LPHANDBAG
#define WM_DESKTOP_GET_CNOTIFY_SERVER
#define WM_BROKER_NOTIFICATION
HWND SHCreateDefaultWorkerWindow(VOID)
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
EXTERN_C ULONG WINAPI NTSHChangeNotifyRegister(HWND hwnd, INT fSources, LONG fEvents, UINT msg, INT count, SHChangeNotifyEntry *idlist)
EXTERN_C VOID WINAPI SHChangeNotifyTransmit(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
static HWND CreateNotificationBroker(HWND hwnd, UINT wMsg)
EXTERN_C HANDLE WINAPI SHChangeNotification_Lock(HANDLE hTicket, DWORD dwOwnerPID, LPITEMIDLIST **lppidls, LPLONG lpwEventId)
static VOID DoInitAliasPIDLs(void)
EXTERN_C ULONG WINAPI SHChangeNotifyRegister(HWND hwnd, INT fSources, LONG wEventMask, UINT uMsg, INT cItems, SHChangeNotifyEntry *lpItems)
EXTERN_C void InitChangeNotifications(void)
EXTERN_C BOOL WINAPI SHChangeRegistrationReceive(LPVOID lpUnknown1, DWORD dwUnknown2)
static void CreateNotificationParamAndSend(LONG wEventId, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
static LPHANDBAG DoGetHandbagFromTicket(HANDLE hTicket, DWORD dwOwnerPID)
static ALIAS_PIDL AliasPIDLs[]
static HWND GetNotificationServer(BOOL bCreate)
static BOOL DoGetAliasPIDLs(LPITEMIDLIST apidls[2], PCIDLIST_ABSOLUTE pidl)
EXTERN_C DWORD WINAPI NTSHChangeNotifyDeregister(ULONG hNotify)
EXTERN_C void WINAPI SHChangeNotify(LONG wEventId, UINT uFlags, LPCVOID dwItem1, LPCVOID dwItem2)
static HANDLE CreateNotificationParam(LONG wEventId, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwOwnerPID, DWORD dwTick)
EXTERN_C VOID WINAPI SHChangeNotifyReceive(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
EXTERN_C VOID WINAPI SHChangeNotifyReceiveEx(LONG lEvent, UINT uFlags, LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2, DWORD dwTick)
static LPCSTR DumpEvent(LONG event)
EXTERN_C BOOL WINAPI SHChangeNotification_Unlock(HANDLE hLock)
EXTERN_C BOOL WINAPI SHChangeNotifySuspendResume(BOOL bSuspend, LPITEMIDLIST pidl, BOOL bRecursive, DWORD dwReserved)
EXTERN_C BOOL WINAPI SHChangeNotifyUpdateEntryList(DWORD unknown1, DWORD unknown2, DWORD unknown3, DWORD unknown4)
CRITICAL_SECTION SHELL32_ChangenotifyCS
EXTERN_C void FreeChangeNotifications(void)
EXTERN_C BOOL WINAPI SHChangeNotifyDeregister(ULONG hNotify)
static HANDLE CreateRegistrationParam(ULONG nRegID, HWND hwnd, UINT wMsg, INT fSources, LONG fEvents, LONG fRecursive, LPCITEMIDLIST pidl, DWORD dwOwnerPID, HWND hwndBroker)
BOOL SubclassWindow(HWND hWnd)
void OnFinalMessage(HWND)
CChangeNotifyBroker(HWND hwndClient, UINT uMsg)
LRESULT OnBrokerNotification(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled)
BOOL BrokerNotification(HANDLE hTicket, DWORD dwOwnerPID)
const char * wine_dbg_sprintf(const char *format,...)
DWORD WINAPI GetTickCount(VOID)
HRESULT WINAPI SHGetSpecialFolderLocation(HWND hwndOwner, INT nFolder, LPITEMIDLIST *ppidl)
HANDLE WINAPI SHAllocShared(LPCVOID lpvData, DWORD dwSize, DWORD dwProcId)
BOOL WINAPI SHFreeShared(HANDLE hShared, DWORD dwProcId)
BOOL WINAPI SHUnlockShared(LPVOID lpView)
DWORD WINAPI SHAnsiToUnicode(LPCSTR lpSrcStr, LPWSTR lpDstStr, int iLen)
GLuint GLuint GLsizei count
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 LocalAlloc(UINT uFlags, SIZE_T dwBytes)
HLOCAL NTAPI LocalFree(HLOCAL hMem)
#define MESSAGE_HANDLER(msg, func)
#define BEGIN_MSG_MAP(theClass)
#define DECLARE_WND_CLASS_EX(WndClassName, style, bkgnd)
#define memcpy(s1, s2, n)
_In_ HANDLE _In_ DWORD _In_ DWORD _Inout_opt_ LPOVERLAPPED _In_opt_ LPTRANSMIT_FILE_BUFFERS _In_ DWORD dwReserved
LPITEMIDLIST WINAPI ILClone(LPCITEMIDLIST pidl)
void WINAPI ILFree(LPITEMIDLIST pidl)
BOOL WINAPI SHGetPathFromIDListW(LPCITEMIDLIST pidl, LPWSTR pszPath)
LPITEMIDLIST WINAPI SHSimpleIDListFromPathW(LPCWSTR lpszPath)
LPITEMIDLIST WINAPI ILCreateFromPathW(LPCWSTR path)
BOOL WINAPI ILIsEqual(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2)
#define CSIDL_COMMON_DESKTOPDIRECTORY
_In_ int _In_ BOOL bCreate
#define CSIDL_DESKTOPDIRECTORY
#define SHCNRF_RecursiveInterrupt
#define SHCNRF_NewDelivery
#define SHCNE_ASSOCCHANGED
#define SHCNRF_InterruptLevel
#define SHCNF_FLUSHNOWAIT
PVOID WINAPI SHLockSharedEx(HANDLE hData, DWORD dwProcessId, BOOL bWriteAccess)
ITEMIDLIST UNALIGNED * LPITEMIDLIST
const ITEMIDLIST UNALIGNED * LPCITEMIDLIST
VOID WINAPI InitializeCriticalSection(OUT LPCRITICAL_SECTION lpCriticalSection)
HWND WINAPI GetShellWindow(VOID)
void WINAPI LeaveCriticalSection(LPCRITICAL_SECTION)
DWORD WINAPI GetCurrentProcessId(void)
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
void WINAPI EnterCriticalSection(LPCRITICAL_SECTION)
void WINAPI DeleteCriticalSection(PCRITICAL_SECTION)
_In_ ULONG_PTR _In_ ULONG _Out_ ULONG_PTR * pid
BOOL WINAPI IsWindow(_In_opt_ HWND)
BOOL WINAPI SendNotifyMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI DestroyWindow(_In_ HWND)
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)