ReactOS 0.4.17-dev-1321-g5c122a9
ddeserver.c
Go to the documentation of this file.
1/*
2 * DDEML library
3 *
4 * Copyright 1997 Alexandre Julliard
5 * Copyright 1997 Len White
6 * Copyright 1999 Keith Matthews
7 * Copyright 2000 Corel
8 * Copyright 2001 Eric Pouech
9 * Copyright 2003, 2004, 2005 Dmitry Timoshkov
10 *
11 * This library is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU Lesser General Public
13 * License as published by the Free Software Foundation; either
14 * version 2.1 of the License, or (at your option) any later version.
15 *
16 * This library is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
19 * Lesser General Public License for more details.
20 *
21 * You should have received a copy of the GNU Lesser General Public
22 * License along with this library; if not, write to the Free Software
23 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
24 */
25
26#include <user32.h>
27
29
30#ifdef __REACTOS__
31static const WCHAR szServerNameClass[] = L"DDEMLMom";
32const char WDML_szServerConvClassA[] = "DDEMLAnsiServer";
33const WCHAR WDML_szServerConvClassW[] = L"DDEMLUnicodeServer";
34#else
35const char WDML_szServerConvClassA[] = "WineDdeServerConvA";
36const WCHAR WDML_szServerConvClassW[] = L"WineDdeServerConvW";
37#endif
38
41
42/******************************************************************************
43 * DdePostAdvise [USER32.@] Send transaction to DDE callback function.
44 *
45 * PARAMS
46 * idInst [I] Instance identifier
47 * hszTopic [I] Handle to topic name string
48 * hszItem [I] Handle to item name string
49 *
50 * RETURNS
51 * Success: TRUE
52 * Failure: FALSE
53 */
54BOOL WINAPI DdePostAdvise(DWORD idInst, HSZ hszTopic, HSZ hszItem)
55{
57 WDML_LINK* pLink;
58 HDDEDATA hDdeData;
59 HGLOBAL hItemData;
60 WDML_CONV* pConv;
61 ATOM atom;
62 UINT count;
63
64 TRACE("(%ld,%p,%p)\n", idInst, hszTopic, hszItem);
65
67
68 if (pInstance == NULL)
69 return FALSE;
70
71 atom = WDML_MakeAtomFromHsz(hszItem);
72 if (!atom) return FALSE;
73
74 /* first compute the number of links which will trigger a message */
75 count = 0;
76 for (pLink = pInstance->links[WDML_SERVER_SIDE]; pLink != NULL; pLink = pLink->next)
77 {
78 if (DdeCmpStringHandles(hszItem, pLink->hszItem) == 0)
79 {
80 count++;
81 }
82 }
83 if (count >= CADV_LATEACK)
84 {
85 FIXME("too high value for count\n");
86 count &= 0xFFFF;
87 }
88
89 for (pLink = pInstance->links[WDML_SERVER_SIDE]; pLink != NULL; pLink = pLink->next)
90 {
91 if (DdeCmpStringHandles(hszItem, pLink->hszItem) == 0)
92 {
93 hDdeData = WDML_InvokeCallback(pInstance, XTYP_ADVREQ, pLink->uFmt, pLink->hConv,
94 hszTopic, hszItem, 0, --count, 0);
95
96 if (hDdeData == CBR_BLOCK)
97 {
98 /* MS doc is not consistent here */
99 FIXME("CBR_BLOCK returned for ADVREQ\n");
100 continue;
101 }
102 if (hDdeData)
103 {
104 if (pLink->transactionType & XTYPF_NODATA)
105 {
106 TRACE("no data\n");
107 hItemData = 0;
108 }
109 else
110 {
111 TRACE("with data\n");
112
113 hItemData = WDML_DataHandle2Global(hDdeData, FALSE, FALSE, FALSE, FALSE);
114 }
115
116 pConv = WDML_GetConv(pLink->hConv, TRUE);
117
118 if (pConv == NULL)
119 {
120 if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData);
121 goto theError;
122 }
123
125 PackDDElParam(WM_DDE_DATA, (UINT_PTR)hItemData, atom)))
126 {
127 ERR("post message failed\n");
128 pConv->wStatus &= ~ST_CONNECTED;
129 pConv->instance->lastError = DMLERR_POSTMSG_FAILED;
130 if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData);
131 GlobalFree(hItemData);
132 goto theError;
133 }
134 if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData);
135 }
136 }
137 }
138 return TRUE;
139
140 theError:
141 GlobalDeleteAtom(atom);
142 return FALSE;
143}
144
145
146/******************************************************************************
147 * DdeNameService [USER32.@] {Un}registers service name of DDE server
148 *
149 * PARAMS
150 * idInst [I] Instance identifier
151 * hsz1 [I] Handle to service name string
152 * hsz2 [I] Reserved
153 * afCmd [I] Service name flags
154 *
155 * RETURNS
156 * Success: Non-zero
157 * Failure: 0
158 */
159HDDEDATA WINAPI DdeNameService(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT afCmd)
160{
161 WDML_SERVER* pServer;
163 HWND hwndServer;
164 WNDCLASSEXW wndclass;
165
166 TRACE("(%ld,%p,%p,%x)\n", idInst, hsz1, hsz2, afCmd);
167
168 /* First check instance
169 */
170 pInstance = WDML_GetInstance(idInst);
171 if (pInstance == NULL)
172 {
173 TRACE("Instance not found as initialised\n");
174 /* Nothing has been initialised - exit now ! can return TRUE since effect is the same */
175 return NULL;
176 }
177
178 if (hsz2 != 0L)
179 {
180 /* Illegal, reserved parameter
181 */
183 WARN("Reserved parameter no-zero !!\n");
184 return NULL;
185 }
186 if (hsz1 == 0 && !(afCmd & DNS_UNREGISTER))
187 {
188 /* don't know if we should check this but it makes sense
189 * why supply REGISTER or filter flags if de-registering all
190 */
191 TRACE("General unregister unexpected flags\n");
193 return NULL;
194 }
195
196 switch (afCmd & (DNS_REGISTER | DNS_UNREGISTER))
197 {
198 case DNS_REGISTER:
199 pServer = WDML_FindServer(pInstance, hsz1, 0);
200 if (pServer)
201 {
202 ERR("Trying to register already registered service!\n");
203 pInstance->lastError = DMLERR_DLL_USAGE;
204 return NULL;
205 }
206
207 TRACE("Adding service name\n");
208
209 WDML_IncHSZ(pInstance, hsz1);
210
211 pServer = WDML_AddServer(pInstance, hsz1, 0);
212
214 pServer->atomService, pServer->atomServiceSpec);
215
216 wndclass.cbSize = sizeof(wndclass);
217 wndclass.style = 0;
219 wndclass.cbClsExtra = 0;
220 wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR);
221 wndclass.hInstance = 0;
222 wndclass.hIcon = 0;
223 wndclass.hCursor = 0;
224 wndclass.hbrBackground = 0;
225 wndclass.lpszMenuName = NULL;
226#ifdef __REACTOS__
227 wndclass.lpszClassName = szServerNameClass;
228#else
229 wndclass.lpszClassName = L"WineDdeServerName";
230#endif
231 wndclass.hIconSm = 0;
232
233 RegisterClassExW(&wndclass);
234
235#ifdef __REACTOS__
236 hwndServer = CreateWindowW(szServerNameClass, NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0);
237#else
238 hwndServer = CreateWindowW(L"WineDdeServerName", NULL, WS_POPUP, 0, 0, 0, 0, 0, 0, 0, 0);
239#endif
241 SetWindowLongPtrW(hwndServer, GWL_WDML_SERVER, (ULONG_PTR)pServer);
242 TRACE("Created nameServer=%p for instance=%08lx\n", hwndServer, idInst);
243
244 pServer->hwndServer = hwndServer;
245 break;
246
247 case DNS_UNREGISTER:
248 if (hsz1 == 0L)
249 {
250 /* General unregister situation
251 * terminate all server side pending conversations
252 */
253 while (pInstance->servers)
254 WDML_RemoveServer(pInstance, pInstance->servers->hszService, 0);
255 pInstance->servers = NULL;
256 TRACE("General de-register - finished\n");
257 }
258 else
259 {
261 }
262 break;
263 }
264
265 if (afCmd & (DNS_FILTERON | DNS_FILTEROFF))
266 {
267 /* Set filter flags on to hold notifications of connection
268 */
269 pServer = WDML_FindServer(pInstance, hsz1, 0);
270 if (!pServer)
271 {
272 /* trying to filter where no service names !!
273 */
274 pInstance->lastError = DMLERR_DLL_USAGE;
275 return NULL;
276 }
277 else
278 {
279 pServer->filterOn = (afCmd & DNS_FILTERON) != 0;
280 }
281 }
282 return (HDDEDATA)TRUE;
283}
284
285/******************************************************************
286 * WDML_CreateServerConv
287 *
288 *
289 */
291 HWND hwndServerName, HSZ hszApp, HSZ hszTopic)
292{
293 HWND hwndServerConv;
294 WDML_CONV* pConv;
295
296 if (pInstance->unicode)
297 {
298 WNDCLASSEXW wndclass;
299
300 wndclass.cbSize = sizeof(wndclass);
301 wndclass.style = 0;
303 wndclass.cbClsExtra = 0;
304 wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR);
305 wndclass.hInstance = 0;
306 wndclass.hIcon = 0;
307 wndclass.hCursor = 0;
308 wndclass.hbrBackground = 0;
309 wndclass.lpszMenuName = NULL;
311 wndclass.hIconSm = 0;
312
313 RegisterClassExW(&wndclass);
314
315 hwndServerConv = CreateWindowW(WDML_szServerConvClassW, 0,
316 WS_CHILD, 0, 0, 0, 0,
317 hwndServerName, 0, 0, 0);
318 }
319 else
320 {
321 WNDCLASSEXA wndclass;
322
323 wndclass.cbSize = sizeof(wndclass);
324 wndclass.style = 0;
326 wndclass.cbClsExtra = 0;
327 wndclass.cbWndExtra = 2 * sizeof(ULONG_PTR);
328 wndclass.hInstance = 0;
329 wndclass.hIcon = 0;
330 wndclass.hCursor = 0;
331 wndclass.hbrBackground = 0;
332 wndclass.lpszMenuName = NULL;
334 wndclass.hIconSm = 0;
335
336 RegisterClassExA(&wndclass);
337
338 hwndServerConv = CreateWindowA(WDML_szServerConvClassA, 0,
339 WS_CHILD, 0, 0, 0, 0,
340 hwndServerName, 0, 0, 0);
341 }
342
343 TRACE("Created convServer=%p (nameServer=%p) for instance=%08lx unicode=%d\n",
344 hwndServerConv, hwndServerName, pInstance->instanceID, pInstance->unicode);
345
347 hwndClient, hwndServerConv);
348 if (pConv)
349 {
351 SetWindowLongPtrW(hwndServerConv, GWL_WDML_CONVERSATION, (ULONG_PTR)pConv);
352
353 /* this should be the only place using SendMessage for WM_DDE_ACK */
354 /* note: sent messages shall not use packing */
355 SendMessageW(hwndClient, WM_DDE_ACK, (WPARAM)hwndServerConv,
357 /* we assume we're connected since we've sent an answer...
358 * I'm not sure what we can do... it doesn't look like the return value
359 * of SendMessage is used... sigh...
360 */
361 pConv->wStatus |= ST_CONNECTED;
362 }
363 else
364 {
365 NtUserDestroyWindow(hwndServerConv);
366 }
367 return pConv;
368}
369
370/******************************************************************
371 * WDML_ServerNameProc
372 *
373 *
374 */
376{
377 HWND hwndClient;
378 HSZ hszApp, hszTop;
379 HDDEDATA hDdeData;
381 UINT_PTR uiLo, uiHi;
382
383 switch (iMsg)
384 {
385 case WM_DDE_INITIATE:
386
387 /* wParam -- sending window handle
388 LOWORD(lParam) -- application atom
389 HIWORD(lParam) -- topic atom */
390
391 TRACE("WM_DDE_INITIATE message received!\n");
392 hwndClient = (HWND)wParam;
393
395 if (!pInstance) return 0;
396 TRACE("idInst=%ld, threadID=0x%lx\n", pInstance->instanceID, GetCurrentThreadId());
397
398 /* don't free DDEParams, since this is a broadcast */
399 UnpackDDElParam(WM_DDE_INITIATE, lParam, &uiLo, &uiHi);
400
401 hszApp = WDML_MakeHszFromAtom(pInstance, uiLo);
402 hszTop = WDML_MakeHszFromAtom(pInstance, uiHi);
403
404 if (!(pInstance->CBFflags & CBF_FAIL_CONNECTIONS))
405 {
406 BOOL self = FALSE;
408 CONVCONTEXT* pcc = NULL;
409 WDML_CONV* pConv;
410 char buf[256];
411
412 if (GetWindowThreadProcessId(hwndClient, NULL) == GetWindowThreadProcessId(hwndServer, NULL) &&
413 WDML_GetInstanceFromWnd(hwndClient) == WDML_GetInstanceFromWnd(hwndServer))
414 {
415 self = TRUE;
416 }
417 /* FIXME: so far, we don't grab distant convcontext, so only check if remote is
418 * handled under DDEML, and if so build a default context
419 */
420 if ((GetClassNameA(hwndClient, buf, sizeof(buf)) &&
422 (GetClassNameW(hwndClient, (LPWSTR)buf, sizeof(buf)/sizeof(WCHAR)) &&
424 {
425 pcc = &cc;
426 memset(pcc, 0, sizeof(*pcc));
427 pcc->cb = sizeof(*pcc);
428 pcc->iCodePage = IsWindowUnicode(hwndClient) ? CP_WINUNICODE : CP_WINANSI;
429 }
430 if ((pInstance->CBFflags & CBF_FAIL_SELFCONNECTIONS) && self)
431 {
432 TRACE("Don't do self connection as requested\n");
433 }
434 else if (hszApp && hszTop)
435 {
437
438 /* check filters for name service */
439 if (!pServer->filterOn || DdeCmpStringHandles(pServer->hszService, hszApp) == 0)
440 {
441 /* pass on to the callback */
443 0, 0, hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
444 if ((ULONG_PTR)hDdeData)
445 {
446 pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer,
447 hszApp, hszTop);
448 if (pConv)
449 {
450 if (pcc) pConv->wStatus |= ST_ISLOCAL;
452 hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
453 }
454 }
455 }
456 }
457 else if (pInstance->servers)
458 {
459 /* pass on to the callback */
461 0, 0, hszTop, hszApp, 0, (ULONG_PTR)pcc, self);
462
463 if (hDdeData == CBR_BLOCK)
464 {
465 /* MS doc is not consistent here */
466 FIXME("CBR_BLOCK returned for WILDCONNECT\n");
467 }
468 else if ((ULONG_PTR)hDdeData != 0)
469 {
470 HSZPAIR* hszp;
471
472 hszp = (HSZPAIR*)DdeAccessData(hDdeData, NULL);
473 if (hszp)
474 {
475 int i;
476 for (i = 0; hszp[i].hszSvc && hszp[i].hszTopic; i++)
477 {
478 pConv = WDML_CreateServerConv(pInstance, hwndClient, hwndServer,
479 hszp[i].hszSvc, hszp[i].hszTopic);
480 if (pConv)
481 {
482 if (pcc) pConv->wStatus |= ST_ISLOCAL;
484 hszp[i].hszTopic, hszp[i].hszSvc, 0, (ULONG_PTR)pcc, self);
485 }
486 }
487 DdeUnaccessData(hDdeData);
488 }
489 if (!WDML_IsAppOwned(hDdeData)) DdeFreeDataHandle(hDdeData);
490 }
491 }
492 }
493
494 return 0;
495
496 case WM_DDE_REQUEST:
497 FIXME("WM_DDE_REQUEST message received!\n");
498 return 0;
499 case WM_DDE_ADVISE:
500 FIXME("WM_DDE_ADVISE message received!\n");
501 return 0;
502 case WM_DDE_UNADVISE:
503 FIXME("WM_DDE_UNADVISE message received!\n");
504 return 0;
505 case WM_DDE_EXECUTE:
506 FIXME("WM_DDE_EXECUTE message received!\n");
507 return 0;
508 case WM_DDE_POKE:
509 FIXME("WM_DDE_POKE message received!\n");
510 return 0;
511 case WM_DDE_TERMINATE:
512 FIXME("WM_DDE_TERMINATE message received!\n");
513 return 0;
514 default:
515 break;
516 }
517
518 return DefWindowProcW(hwndServer, iMsg, wParam, lParam);
519}
520
521/******************************************************************
522 * WDML_ServerQueueRequest
523 *
524 *
525 */
527{
528 UINT_PTR uiLo, uiHi;
529 WDML_XACT* pXAct;
530
531 UnpackDDElParam(WM_DDE_REQUEST, lParam, &uiLo, &uiHi);
532
534 uiLo, WDML_MakeHszFromAtom(pConv->instance, uiHi));
535 if (pXAct) pXAct->atom = uiHi;
536 return pXAct;
537}
538
539/******************************************************************
540 * WDML_ServerHandleRequest
541 *
542 *
543 */
545{
546 HDDEDATA hDdeData = 0;
547 BOOL fAck = TRUE;
548
549 if (!(pConv->instance->CBFflags & CBF_FAIL_REQUESTS))
550 {
551
552 hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_REQUEST, pXAct->wFmt, (HCONV)pConv,
553 pConv->hszTopic, pXAct->hszItem, 0, 0, 0);
554 }
555
556 switch ((ULONG_PTR)hDdeData)
557 {
558 case 0:
559 TRACE("No data returned from the Callback\n");
560 fAck = FALSE;
561 break;
562
563 case (ULONG_PTR)CBR_BLOCK:
564 return WDML_QS_BLOCK;
565
566 default:
567 {
568 HGLOBAL hMem = WDML_DataHandle2Global(hDdeData, TRUE, FALSE, FALSE, FALSE);
571 (UINT_PTR)hMem, (UINT_PTR)pXAct->atom)))
572 {
573 pConv->instance->lastError = DMLERR_POSTMSG_FAILED;
574 DdeFreeDataHandle(hDdeData);
575 GlobalFree(hMem);
576 fAck = FALSE;
577 }
578 }
579 break;
580 }
581
582 WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, fAck, pXAct->atom, pXAct->lParam, WM_DDE_REQUEST);
583
584 WDML_DecHSZ(pConv->instance, pXAct->hszItem);
585
586 return WDML_QS_HANDLED;
587}
588
589/******************************************************************
590 * WDML_ServerQueueAdvise
591 *
592 *
593 */
595{
596 UINT_PTR uiLo, uiHi;
597 WDML_XACT* pXAct;
598
599 /* XTYP_ADVSTART transaction:
600 establish link and save link info to InstanceInfoTable */
601
602 if (!UnpackDDElParam(WM_DDE_ADVISE, lParam, &uiLo, &uiHi))
603 return NULL;
604
606 0, WDML_MakeHszFromAtom(pConv->instance, uiHi));
607 if (pXAct)
608 {
609 pXAct->hMem = (HGLOBAL)uiLo;
610 pXAct->atom = uiHi;
611 }
612 return pXAct;
613}
614
615/******************************************************************
616 * WDML_ServerHandleAdvise
617 *
618 *
619 */
621{
622 UINT uType;
623 WDML_LINK* pLink;
624 DDEADVISE* pDdeAdvise;
625 HDDEDATA hDdeData = 0;
626 BOOL fAck = TRUE;
627
628 pDdeAdvise = GlobalLock(pXAct->hMem);
629 uType = XTYP_ADVSTART |
630 (pDdeAdvise->fDeferUpd ? XTYPF_NODATA : 0) |
631 (pDdeAdvise->fAckReq ? XTYPF_ACKREQ : 0);
632
633 if (!(pConv->instance->CBFflags & CBF_FAIL_ADVISES))
634 {
635 hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_ADVSTART, pDdeAdvise->cfFormat,
636 (HCONV)pConv, pConv->hszTopic, pXAct->hszItem, 0, 0, 0);
637 }
638
639 switch ((ULONG_PTR)hDdeData)
640 {
641 case 0:
642 TRACE("No data returned from the Callback\n");
643 fAck = FALSE;
644 break;
645
646 case (ULONG_PTR)CBR_BLOCK:
647 return WDML_QS_BLOCK;
648
649 default:
650 /* billx: first to see if the link is already created. */
651 pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
652 pXAct->hszItem, TRUE, pDdeAdvise->cfFormat);
653
654 if (pLink != NULL)
655 {
656 /* we found a link, and only need to modify it in case it changes */
657 pLink->transactionType = uType;
658 }
659 else
660 {
661 TRACE("Adding Link with hConv %p\n", pConv);
662 WDML_AddLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
663 uType, pXAct->hszItem, pDdeAdvise->cfFormat);
664 }
665 break;
666 }
667
668 GlobalUnlock(pXAct->hMem);
669 if (fAck)
670 {
671 GlobalFree(pXAct->hMem);
672 }
673 pXAct->hMem = 0;
674
675 WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, fAck, pXAct->atom, pXAct->lParam, WM_DDE_ADVISE);
676
677 WDML_DecHSZ(pConv->instance, pXAct->hszItem);
678
679 return WDML_QS_HANDLED;
680}
681
682/******************************************************************
683 * WDML_ServerQueueUnadvise
684 *
685 *
686 */
688{
689 UINT_PTR uiLo, uiHi;
690 WDML_XACT* pXAct;
691
692 UnpackDDElParam(WM_DDE_UNADVISE, lParam, &uiLo, &uiHi);
693
695 uiLo, WDML_MakeHszFromAtom(pConv->instance, uiHi));
696 if (pXAct) pXAct->atom = uiHi;
697 return pXAct;
698}
699
700/******************************************************************
701 * WDML_ServerHandleUnadvise
702 *
703 *
704 */
706{
707 WDML_LINK* pLink;
708
709 if (pXAct->hszItem == NULL || pXAct->wFmt == 0)
710 {
711 ERR("Unsupported yet options (null item or clipboard format)\n");
712 return WDML_QS_ERROR;
713 }
714
715 pLink = WDML_FindLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
716 pXAct->hszItem, TRUE, pXAct->wFmt);
717 if (pLink == NULL)
718 {
719 ERR("Couldn't find link for %p, dropping request\n", pXAct->hszItem);
721 return WDML_QS_ERROR;
722 }
723
724 if (!(pConv->instance->CBFflags & CBF_FAIL_ADVISES))
725 {
726 WDML_InvokeCallback(pConv->instance, XTYP_ADVSTOP, pXAct->wFmt, (HCONV)pConv,
727 pConv->hszTopic, pXAct->hszItem, 0, 0, 0);
728 }
729
730 WDML_RemoveLink(pConv->instance, (HCONV)pConv, WDML_SERVER_SIDE,
731 pXAct->hszItem, pXAct->wFmt);
732
733 /* send back ack */
734 WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, FALSE, TRUE, pXAct->atom,
735 pXAct->lParam, WM_DDE_UNADVISE);
736
737 WDML_DecHSZ(pConv->instance, pXAct->hszItem);
738
739 return WDML_QS_HANDLED;
740}
741
742/******************************************************************
743 * WDML_QueueExecute
744 *
745 *
746 */
748{
749 WDML_XACT* pXAct;
750
751 pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_EXECUTE, 0, 0);
752 if (pXAct)
753 {
754 pXAct->hMem = (HGLOBAL)lParam;
755 }
756 return pXAct;
757}
758
760{
761 DWORD i;
762
763 if (size % sizeof(WCHAR)) return FALSE;
764 for (i = 0; i < size / sizeof(WCHAR); i++) if (data[i] > 255) return FALSE;
765 return TRUE;
766}
767
768/* convert data to Unicode, unless it looks like it's already Unicode */
769static HDDEDATA map_A_to_W( DWORD instance, void *ptr, DWORD size )
770{
771 HDDEDATA ret;
772 DWORD len;
773 const char *end;
774
775 if (!data_looks_unicode( ptr, size ))
776 {
777 if ((end = memchr( ptr, 0, size ))) size = end + 1 - (const char *)ptr;
779 ret = DdeCreateDataHandle( instance, NULL, len * sizeof(WCHAR), 0, 0, CF_TEXT, 0);
781 }
782 else ret = DdeCreateDataHandle( instance, ptr, size, 0, 0, CF_TEXT, 0 );
783
784 return ret;
785}
786
787/* convert data to ANSI, unless it looks like it's not in Unicode format */
788static HDDEDATA map_W_to_A( DWORD instance, void *ptr, DWORD size )
789{
790 HDDEDATA ret;
791 DWORD len;
792 const WCHAR *end;
793
795 {
796 size /= sizeof(WCHAR);
797 if ((end = wmemchr( ptr, 0, size ))) size = end + 1 - (const WCHAR *)ptr;
801 }
802 else ret = DdeCreateDataHandle( instance, ptr, size, 0, 0, CF_TEXT, 0 );
803
804 return ret;
805}
806
807 /******************************************************************
808 * WDML_ServerHandleExecute
809 *
810 *
811 */
813{
814 HDDEDATA hDdeData = DDE_FNOTPROCESSED;
815 BOOL fAck = FALSE, fBusy = FALSE;
816
817 if (!(pConv->instance->CBFflags & CBF_FAIL_EXECUTES))
818 {
819 LPVOID ptr = GlobalLock(pXAct->hMem);
820 DWORD size = GlobalSize(pXAct->hMem);
821
822 if (ptr)
823 {
824 if (pConv->instance->unicode) /* Unicode server, try to map A->W */
825 hDdeData = map_A_to_W( pConv->instance->instanceID, ptr, size );
826 else if (!IsWindowUnicode( pConv->hwndClient )) /* ANSI server and client, try to map W->A */
827 hDdeData = map_W_to_A( pConv->instance->instanceID, ptr, size );
828 else
829 hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, ptr, size, 0, 0, CF_TEXT, 0);
830 GlobalUnlock(pXAct->hMem);
831 }
832 hDdeData = WDML_InvokeCallback(pConv->instance, XTYP_EXECUTE, 0, (HCONV)pConv,
833 pConv->hszTopic, 0, hDdeData, 0L, 0L);
834 }
835
836 switch ((ULONG_PTR)hDdeData)
837 {
838 case (ULONG_PTR)CBR_BLOCK:
839 return WDML_QS_BLOCK;
840
841 case DDE_FACK:
842 fAck = TRUE;
843 break;
844 case DDE_FBUSY:
845 fBusy = TRUE;
846 break;
847 default:
848 FIXME("Unsupported returned value %p\n", hDdeData);
849 /* fall through */
851 break;
852 }
853 WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, fBusy, fAck, (UINT_PTR)pXAct->hMem, 0, 0);
854
855 return WDML_QS_HANDLED;
856}
857
858/******************************************************************
859 * WDML_ServerQueuePoke
860 *
861 *
862 */
864{
865 UINT_PTR uiLo, uiHi;
866 WDML_XACT* pXAct;
867
868 UnpackDDElParam(WM_DDE_POKE, lParam, &uiLo, &uiHi);
869
871 0, WDML_MakeHszFromAtom(pConv->instance, uiHi));
872 if (pXAct)
873 {
874 pXAct->atom = uiHi;
875 pXAct->hMem = (HGLOBAL)uiLo;
876 }
877 return pXAct;
878}
879
880/******************************************************************
881 * WDML_ServerHandlePoke
882 *
883 *
884 */
886{
887 DDEPOKE* pDdePoke;
888 HDDEDATA hDdeData;
889 BOOL fBusy = FALSE, fAck = FALSE;
890
891 pDdePoke = GlobalLock(pXAct->hMem);
892 if (!pDdePoke)
893 {
894 return WDML_QS_ERROR;
895 }
896
897 if (!(pConv->instance->CBFflags & CBF_FAIL_POKES))
898 {
899 hDdeData = DdeCreateDataHandle(pConv->instance->instanceID, pDdePoke->Value,
901 0, 0, pDdePoke->cfFormat, 0);
902 if (hDdeData)
903 {
904 HDDEDATA hDdeDataOut;
905
906 hDdeDataOut = WDML_InvokeCallback(pConv->instance, XTYP_POKE, pDdePoke->cfFormat,
907 (HCONV)pConv, pConv->hszTopic, pXAct->hszItem,
908 hDdeData, 0, 0);
909 switch ((ULONG_PTR)hDdeDataOut)
910 {
911 case DDE_FACK:
912 fAck = TRUE;
913 break;
914 case DDE_FBUSY:
915 fBusy = TRUE;
916 break;
917 default:
918 FIXME("Unsupported returned value %p\n", hDdeDataOut);
919 /* fal through */
921 break;
922 }
923 DdeFreeDataHandle(hDdeData);
924 }
925 }
926 GlobalUnlock(pXAct->hMem);
927
928 if (!fAck)
929 {
930 GlobalFree(pXAct->hMem);
931 }
932 WDML_PostAck(pConv, WDML_SERVER_SIDE, 0, fBusy, fAck, pXAct->atom, pXAct->lParam, WM_DDE_POKE);
933
934 WDML_DecHSZ(pConv->instance, pXAct->hszItem);
935
936 return WDML_QS_HANDLED;
937}
938
939/******************************************************************
940 * WDML_ServerQueueTerminate
941 *
942 *
943 */
945{
946 WDML_XACT* pXAct;
947
948 pXAct = WDML_AllocTransaction(pConv->instance, WM_DDE_TERMINATE, 0, 0);
949 return pXAct;
950}
951
952/******************************************************************
953 * WDML_ServerHandleTerminate
954 *
955 *
956 */
958{
959 /* billx: two things to remove: the conv, and associated links.
960 * Respond with another WM_DDE_TERMINATE iMsg.
961 */
962 if (!(pConv->instance->CBFflags & CBF_SKIP_DISCONNECTS))
963 {
964 WDML_InvokeCallback(pConv->instance, XTYP_DISCONNECT, 0, (HCONV)pConv, 0, 0,
965 0, 0, (pConv->wStatus & ST_ISSELF) ? 1 : 0);
966 }
969
970 return WDML_QS_HANDLED;
971}
972
973/******************************************************************
974 * WDML_ServerHandle
975 *
976 *
977 */
979{
981
982 switch (pXAct->ddeMsg)
983 {
984 case WM_DDE_INITIATE:
985 FIXME("WM_DDE_INITIATE shouldn't be there!\n");
986 break;
987 case WM_DDE_REQUEST:
988 qs = WDML_ServerHandleRequest(pConv, pXAct);
989 break;
990
991 case WM_DDE_ADVISE:
992 qs = WDML_ServerHandleAdvise(pConv, pXAct);
993 break;
994
995 case WM_DDE_UNADVISE:
996 qs = WDML_ServerHandleUnadvise(pConv, pXAct);
997 break;
998
999 case WM_DDE_EXECUTE:
1000 qs = WDML_ServerHandleExecute(pConv, pXAct);
1001 break;
1002
1003 case WM_DDE_POKE:
1004 qs = WDML_ServerHandlePoke(pConv, pXAct);
1005 break;
1006
1007 case WM_DDE_TERMINATE:
1008 qs = WDML_ServerHandleTerminate(pConv, pXAct);
1009 break;
1010
1011 case WM_DDE_ACK:
1012 WARN("Shouldn't receive a ACK message (never requests them). Ignoring it\n");
1013 break;
1014
1015 default:
1016 FIXME("Unsupported message %d\n", pXAct->ddeMsg);
1017 }
1018 return qs;
1019}
1020
1021/******************************************************************
1022 * WDML_ServerConvProc
1023 *
1024 *
1025 */
1027{
1029 WDML_CONV* pConv;
1030 WDML_XACT* pXAct = NULL;
1031
1032 TRACE("%p %04x %08Ix %08Ix\n", hwndServer, iMsg, wParam, lParam);
1033
1034 if (iMsg == WM_DESTROY)
1035 {
1036 pConv = WDML_GetConvFromWnd(hwndServer);
1037 if (pConv && !(pConv->wStatus & ST_TERMINATED))
1038 {
1040 }
1041 }
1042 if (iMsg < WM_DDE_FIRST || iMsg > WM_DDE_LAST)
1043 {
1044 return IsWindowUnicode(hwndServer) ? DefWindowProcW(hwndServer, iMsg, wParam, lParam) :
1045 DefWindowProcA(hwndServer, iMsg, wParam, lParam);
1046 }
1047
1048 pInstance = WDML_GetInstanceFromWnd(hwndServer);
1049 pConv = WDML_GetConvFromWnd(hwndServer);
1050
1051 if (!pConv)
1052 {
1053 ERR("Got a message (%x) on a not known conversation, dropping request\n", iMsg);
1054 return 0;
1055 }
1056 if (pConv->hwndClient != WIN_GetFullHandle( (HWND)wParam ) || pConv->hwndServer != hwndServer)
1057 {
1058 ERR("mismatch between C/S windows and conversation\n");
1059 return 0;
1060 }
1061 if (pConv->instance != pInstance || pConv->instance == NULL)
1062 {
1063 ERR("mismatch in instances\n");
1064 return 0;
1065 }
1066
1067 switch (iMsg)
1068 {
1069 case WM_DDE_INITIATE:
1070 FIXME("WM_DDE_INITIATE message received!\n");
1071 break;
1072
1073 case WM_DDE_REQUEST:
1074 pXAct = WDML_ServerQueueRequest(pConv, lParam);
1075 break;
1076
1077 case WM_DDE_ADVISE:
1078 pXAct = WDML_ServerQueueAdvise(pConv, lParam);
1079 break;
1080
1081 case WM_DDE_UNADVISE:
1082 pXAct = WDML_ServerQueueUnadvise(pConv, lParam);
1083 break;
1084
1085 case WM_DDE_EXECUTE:
1086 pXAct = WDML_ServerQueueExecute(pConv, lParam);
1087 break;
1088
1089 case WM_DDE_POKE:
1090 pXAct = WDML_ServerQueuePoke(pConv, lParam);
1091 break;
1092
1093 case WM_DDE_TERMINATE:
1094 pXAct = WDML_ServerQueueTerminate(pConv, lParam);
1095 break;
1096
1097 case WM_DDE_ACK:
1098 WARN("Shouldn't receive a ACK message (never requests them). Ignoring it\n");
1099 break;
1100
1101 default:
1102 FIXME("Unsupported message %x\n", iMsg);
1103 break;
1104 }
1105
1106 if (pXAct)
1107 {
1108 pXAct->lParam = lParam;
1109
1110 if ((pConv->wStatus & ST_BLOCKED) || WDML_ServerHandle(pConv, pXAct) == WDML_QS_BLOCK)
1111 {
1112 TRACE("Transactions are blocked, add to the queue and exit\n");
1113 WDML_QueueTransaction(pConv, pXAct);
1114 }
1115 else
1116 {
1118 }
1119 }
1120 else
1121 pConv->instance->lastError = DMLERR_MEMORY_ERROR;
1122
1123 return 0;
1124}
#define WINE_DEFAULT_DEBUG_CHANNEL(t)
Definition: precomp.h:23
#define CF_TEXT
Definition: constants.h:396
#define FIXME(fmt,...)
Definition: precomp.h:53
#define WARN(fmt,...)
Definition: precomp.h:61
#define ERR(fmt,...)
Definition: precomp.h:57
WPARAM wParam
Definition: combotst.c:138
LPARAM lParam
Definition: combotst.c:139
#define WM_DDE_REQUEST
Definition: dde.h:43
LPARAM WINAPI ReuseDDElParam(LPARAM, UINT, UINT, UINT_PTR, UINT_PTR)
Definition: ddemisc.c:175
BOOL WINAPI UnpackDDElParam(UINT, LPARAM, PUINT_PTR, PUINT_PTR)
Definition: ddemisc.c:109
#define WM_DDE_DATA
Definition: dde.h:42
#define WM_DDE_POKE
Definition: dde.h:44
#define WM_DDE_LAST
Definition: dde.h:46
#define WM_DDE_ADVISE
Definition: dde.h:39
BOOL WINAPI FreeDDElParam(UINT, LPARAM)
Definition: ddemisc.c:151
#define WM_DDE_ACK
Definition: dde.h:41
#define WM_DDE_EXECUTE
Definition: dde.h:45
#define WM_DDE_INITIATE
Definition: dde.h:37
LPARAM WINAPI PackDDElParam(UINT, UINT_PTR, UINT_PTR)
Definition: ddemisc.c:67
#define WM_DDE_UNADVISE
Definition: dde.h:40
#define WM_DDE_TERMINATE
Definition: dde.h:38
void WDML_QueueTransaction(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddemisc.c:1941
WDML_INSTANCE * WDML_GetInstanceFromWnd(HWND hWnd)
Definition: ddemisc.c:1265
BOOL WDML_IsAppOwned(HDDEDATA hDdeData)
Definition: ddemisc.c:1482
const WCHAR WDML_szEventClass[]
Definition: ddemisc.c:41
#define GWL_WDML_CONVERSATION
Definition: dde_private.h:263
#define GWL_WDML_SERVER
Definition: dde_private.h:264
WDML_CONV * WDML_AddConv(WDML_INSTANCE *pInstance, WDML_SIDE side, HSZ hszService, HSZ hszTopic, HWND hwndClient, HWND hwndServer)
Definition: ddemisc.c:2016
HGLOBAL WDML_DataHandle2Global(HDDEDATA hDdeData, BOOL fResponse, BOOL fRelease, BOOL fDeferUpd, BOOL dAckReq)
Definition: ddemisc.c:1568
const WCHAR WDML_szClientConvClassW[]
Definition: ddeclient.c:36
WDML_CONV * WDML_GetConv(HCONV hConv, BOOL checkConnected)
Definition: ddemisc.c:2239
BOOL WDML_PostAck(WDML_CONV *pConv, WDML_SIDE side, WORD appRetCode, BOOL fBusy, BOOL fAck, UINT_PTR pmt, LPARAM lParam, UINT oldMsg)
Definition: ddemisc.c:2284
HSZ WDML_MakeHszFromAtom(const WDML_INSTANCE *pInstance, ATOM atom)
Definition: ddemisc.c:346
void WDML_FreeTransaction(WDML_INSTANCE *pInstance, WDML_XACT *pXAct, BOOL doFreePmt)
Definition: ddemisc.c:1975
BOOL WDML_IncHSZ(WDML_INSTANCE *pInstance, HSZ hsz)
Definition: ddemisc.c:366
void WDML_RemoveLink(WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, HSZ hszItem, UINT wFmt)
Definition: ddemisc.c:1788
WDML_SERVER * WDML_AddServer(WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
Definition: ddemisc.c:1643
BOOL WDML_DecHSZ(WDML_INSTANCE *pInstance, HSZ hsz)
Definition: ddemisc.c:384
void WDML_RemoveConv(WDML_CONV *pConv, WDML_SIDE side)
Definition: ddemisc.c:2078
HDDEDATA WDML_InvokeCallback(WDML_INSTANCE *pInst, UINT uType, UINT uFmt, HCONV hConv, HSZ hsz1, HSZ hsz2, HDDEDATA hdata, ULONG_PTR dwData1, ULONG_PTR dwData2)
Definition: ddemisc.c:1210
WDML_XACT * WDML_AllocTransaction(WDML_INSTANCE *pInstance, UINT ddeMsg, UINT wFmt, HSZ hszItem)
Definition: ddemisc.c:1908
void WDML_RemoveServer(WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
Definition: ddemisc.c:1678
ATOM WDML_MakeAtomFromHsz(HSZ hsz)
Definition: ddemisc.c:329
#define WM_WDML_REGISTER
Definition: dde_private.h:251
const char WDML_szClientConvClassA[]
Definition: ddeclient.c:35
WDML_LINK * WDML_FindLink(WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, HSZ hszItem, BOOL use_fmt, UINT uFmt)
Definition: ddemisc.c:1876
@ WDML_SERVER_SIDE
Definition: dde_private.h:184
WDML_INSTANCE * WDML_GetInstance(DWORD InstId)
Definition: ddemisc.c:1234
WDML_QUEUE_STATE
Definition: dde_private.h:187
@ WDML_QS_BLOCK
Definition: dde_private.h:188
@ WDML_QS_HANDLED
Definition: dde_private.h:188
@ WDML_QS_ERROR
Definition: dde_private.h:188
WDML_SERVER * WDML_FindServer(WDML_INSTANCE *pInstance, HSZ hszService, HSZ hszTopic)
Definition: ddemisc.c:1737
WDML_CONV * WDML_GetConvFromWnd(HWND hWnd)
Definition: ddemisc.c:2274
void WDML_AddLink(WDML_INSTANCE *pInstance, HCONV hConv, WDML_SIDE side, UINT wType, HSZ hszItem, UINT wFmt)
Definition: ddemisc.c:1763
void WDML_BroadcastDDEWindows(LPCWSTR clsName, UINT uMsg, WPARAM wParam, LPARAM lParam)
Definition: ddemisc.c:2511
#define GWL_WDML_INSTANCE
Definition: dde_private.h:262
#define XTYP_ADVREQ
Definition: ddeml.h:182
#define XTYPF_NODATA
Definition: ddeml.h:171
#define DNS_FILTEROFF
Definition: ddeml.h:155
#define ST_CONNECTED
Definition: ddeml.h:80
#define CBF_FAIL_REQUESTS
Definition: ddeml.h:108
#define CBF_FAIL_POKES
Definition: ddeml.h:107
#define DNS_UNREGISTER
Definition: ddeml.h:153
#define CBF_FAIL_EXECUTES
Definition: ddeml.h:106
HDDEDATA WINAPI DdeCreateDataHandle(DWORD, LPBYTE, DWORD, DWORD, HSZ, UINT, UINT)
Definition: ddemisc.c:1279
INT WINAPI DdeCmpStringHandles(HSZ, HSZ)
Definition: ddemisc.c:689
#define CBF_SKIP_DISCONNECTS
Definition: ddeml.h:114
#define DNS_REGISTER
Definition: ddeml.h:152
#define DMLERR_POSTMSG_FAILED
Definition: ddeml.h:258
#define CBR_BLOCK
Definition: ddeml.h:117
#define XTYP_CONNECT
Definition: ddeml.h:186
#define XTYP_ADVSTART
Definition: ddeml.h:183
#define DDE_FACK
Definition: ddeml.h:216
#define XTYP_REQUEST
Definition: ddeml.h:191
#define XTYP_ADVSTOP
Definition: ddeml.h:184
#define DMLERR_MEMORY_ERROR
Definition: ddeml.h:254
#define XTYP_CONNECT_CONFIRM
Definition: ddeml.h:187
#define ST_ISLOCAL
Definition: ddeml.h:82
#define CADV_LATEACK
Definition: ddeml.h:202
#define DDE_FNOTPROCESSED
Definition: ddeml.h:223
#define XTYP_DISCONNECT
Definition: ddeml.h:192
#define XTYP_POKE
Definition: ddeml.h:189
#define CBF_FAIL_SELFCONNECTIONS
Definition: ddeml.h:103
#define ST_ISSELF
Definition: ddeml.h:88
#define CBF_FAIL_CONNECTIONS
Definition: ddeml.h:104
#define ST_BLOCKED
Definition: ddeml.h:83
#define CP_WINANSI
Definition: ddeml.h:32
#define ST_TERMINATED
Definition: ddeml.h:85
#define XTYP_EXECUTE
Definition: ddeml.h:185
#define CP_WINUNICODE
Definition: ddeml.h:33
#define XTYPF_ACKREQ
Definition: ddeml.h:172
BOOL WINAPI DdeUnaccessData(HDDEDATA)
Definition: ddemisc.c:1452
#define XTYP_WILDCONNECT
Definition: ddeml.h:194
LPBYTE WINAPI DdeAccessData(HDDEDATA, LPDWORD)
Definition: ddemisc.c:1427
#define DMLERR_DLL_USAGE
Definition: ddeml.h:250
#define CBF_FAIL_ADVISES
Definition: ddeml.h:105
BOOL WINAPI DdeFreeDataHandle(HDDEDATA)
Definition: ddemisc.c:1466
#define DNS_FILTERON
Definition: ddeml.h:154
#define DMLERR_INVALIDPARAMETER
Definition: ddeml.h:252
#define DDE_FBUSY
Definition: ddeml.h:217
static BOOL data_looks_unicode(const WCHAR *data, DWORD size)
Definition: ddeserver.c:759
WDML_QUEUE_STATE WDML_ServerHandle(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:978
static HDDEDATA map_W_to_A(DWORD instance, void *ptr, DWORD size)
Definition: ddeserver.c:788
static WDML_QUEUE_STATE WDML_ServerHandlePoke(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:885
static WDML_CONV * WDML_CreateServerConv(WDML_INSTANCE *pInstance, HWND hwndClient, HWND hwndServerName, HSZ hszApp, HSZ hszTopic)
Definition: ddeserver.c:290
static LRESULT CALLBACK WDML_ServerConvProc(HWND, UINT, WPARAM, LPARAM)
Definition: ddeserver.c:1026
static WDML_QUEUE_STATE WDML_ServerHandleUnadvise(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:705
static WDML_XACT * WDML_ServerQueueAdvise(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:594
HDDEDATA WINAPI DdeNameService(DWORD idInst, HSZ hsz1, HSZ hsz2, UINT afCmd)
Definition: ddeserver.c:159
static WDML_XACT * WDML_ServerQueueTerminate(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:944
static WDML_QUEUE_STATE WDML_ServerHandleRequest(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:544
BOOL WINAPI DdePostAdvise(DWORD idInst, HSZ hszTopic, HSZ hszItem)
Definition: ddeserver.c:54
static WDML_XACT * WDML_ServerQueuePoke(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:863
static WDML_QUEUE_STATE WDML_ServerHandleExecute(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:812
static LRESULT CALLBACK WDML_ServerNameProc(HWND, UINT, WPARAM, LPARAM)
Definition: ddeserver.c:375
const char WDML_szServerConvClassA[]
Definition: ddeserver.c:35
static WDML_XACT * WDML_ServerQueueUnadvise(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:687
static HDDEDATA map_A_to_W(DWORD instance, void *ptr, DWORD size)
Definition: ddeserver.c:769
static WDML_QUEUE_STATE WDML_ServerHandleTerminate(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:957
static WDML_XACT * WDML_ServerQueueRequest(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:526
static WDML_XACT * WDML_ServerQueueExecute(WDML_CONV *pConv, LPARAM lParam)
Definition: ddeserver.c:747
static WDML_QUEUE_STATE WDML_ServerHandleAdvise(WDML_CONV *pConv, WDML_XACT *pXAct)
Definition: ddeserver.c:620
const WCHAR WDML_szServerConvClassW[]
Definition: ddeserver.c:36
WORD ATOM
Definition: dimm.idl:113
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
#define FALSE
Definition: types.h:117
static HINSTANCE instance
Definition: main.c:35
#define CP_ACP
Definition: compat.h:109
HANDLE HWND
Definition: compat.h:19
#define CALLBACK
Definition: compat.h:35
#define WideCharToMultiByte
Definition: compat.h:111
#define MultiByteToWideChar
Definition: compat.h:110
ATOM WINAPI GlobalDeleteAtom(ATOM nAtom)
Definition: atom.c:444
int WINAPI lstrcmpiW(LPCWSTR str1, LPCWSTR str2)
Definition: locale.c:4171
int WINAPI lstrcmpiA(LPCSTR str1, LPCSTR str2)
Definition: locale.c:4133
static wchar_t * wmemchr(const wchar_t *s, wchar_t c, size_t n)
Definition: wchar.h:48
return ret
Definition: mutex.c:147
#define L(x)
Definition: resources.c:13
#define ULONG_PTR
Definition: config.h:101
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
FxWmiInstanceExternal * pInstance
Definition: fxwmiapi.cpp:117
GLuint GLuint GLsizei count
Definition: gl.h:1545
GLuint GLuint end
Definition: gl.h:1545
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * data
Definition: gl.h:1950
GLsizeiptr size
Definition: glext.h:5919
GLenum GLuint GLenum GLsizei const GLchar * buf
Definition: glext.h:7751
GLenum GLsizei len
Definition: glext.h:6722
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
Definition: glfuncs.h:248
unsigned int UINT
Definition: sysinfo.c:13
HGLOBAL NTAPI GlobalFree(HGLOBAL hMem)
Definition: heapmem.c:611
BOOL NTAPI GlobalUnlock(HGLOBAL hMem)
Definition: heapmem.c:1190
SIZE_T NTAPI GlobalSize(HGLOBAL hMem)
Definition: heapmem.c:1090
BOOLEAN NTAPI NtUserDestroyWindow(HWND Wnd)
Definition: window.c:3041
static ERESOURCE GlobalLock
Definition: sys_arch.c:8
uint32_t cc
Definition: isohybrid.c:75
LONG_PTR LPARAM
Definition: minwindef.h:175
LONG_PTR LRESULT
Definition: minwindef.h:176
UINT_PTR WPARAM
Definition: minwindef.h:174
#define memchr(s, c, n)
Definition: mkisofs.h:875
static PVOID ptr
Definition: dispmode.c:27
unsigned __int3264 UINT_PTR
Definition: mstsclib_h.h:274
#define HGLOBAL
Definition: ole.h:15
#define WS_CHILD
Definition: pedump.c:617
short WCHAR
Definition: pedump.c:58
#define WS_POPUP
Definition: pedump.c:616
#define GetWindowLongPtrW
Definition: winuser.h:4983
#define MAKELPARAM(l, h)
Definition: winuser.h:4116
LRESULT WINAPI DefWindowProcW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
LRESULT WINAPI DefWindowProcA(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
BOOL WINAPI PostMessageW(_In_opt_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define CreateWindowA(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4469
int WINAPI GetClassNameA(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPSTR lpClassName, _In_ int nMaxCount)
BOOL WINAPI IsWindowUnicode(_In_ HWND)
ATOM WINAPI RegisterClassExA(_In_ CONST WNDCLASSEXA *)
ATOM WINAPI RegisterClassExW(_In_ CONST WNDCLASSEXW *)
#define CreateWindowW(a, b, c, d, e, f, g, h, i, j, k)
Definition: winuser.h:4470
int WINAPI GetClassNameW(_In_ HWND hWnd, _Out_writes_to_(nMaxCount, return) LPWSTR lpClassName, _In_ int nMaxCount)
#define WM_DESTROY
Definition: winuser.h:1637
#define SetWindowLongPtrW
Definition: winuser.h:5512
LRESULT WINAPI SendMessageW(_In_ HWND, _In_ UINT, _In_ WPARAM, _In_ LPARAM)
#define memset(x, y, z)
Definition: compat.h:39
static HSZ hszTopic
Definition: shlexec.c:148
#define TRACE(s)
Definition: solgame.cpp:4
Definition: dde.h:65
short cfFormat
Definition: dde.h:67
unsigned short fAckReq
Definition: dde.h:66
unsigned short fDeferUpd
Definition: dde.h:66
Definition: dde.h:72
short cfFormat
Definition: dde.h:74
BYTE Value[1]
Definition: dde.h:75
int cbClsExtra
Definition: winuser.h:3312
HINSTANCE hInstance
Definition: winuser.h:3314
HCURSOR hCursor
Definition: winuser.h:3316
LPCSTR lpszMenuName
Definition: winuser.h:3318
HICON hIconSm
Definition: winuser.h:3320
UINT style
Definition: winuser.h:3310
int cbWndExtra
Definition: winuser.h:3313
UINT cbSize
Definition: winuser.h:3309
WNDPROC lpfnWndProc
Definition: winuser.h:3311
LPCSTR lpszClassName
Definition: winuser.h:3319
HICON hIcon
Definition: winuser.h:3315
HBRUSH hbrBackground
Definition: winuser.h:3317
LPCWSTR lpszClassName
Definition: winuser.h:3334
LPCWSTR lpszMenuName
Definition: winuser.h:3333
HBRUSH hbrBackground
Definition: winuser.h:3332
WNDPROC lpfnWndProc
Definition: winuser.h:3326
UINT cbSize
Definition: winuser.h:3324
int cbWndExtra
Definition: winuser.h:3328
HCURSOR hCursor
Definition: winuser.h:3331
HICON hIconSm
Definition: winuser.h:3335
HINSTANCE hInstance
Definition: winuser.h:3329
UINT style
Definition: winuser.h:3325
int cbClsExtra
Definition: winuser.h:3327
HICON hIcon
Definition: winuser.h:3330
INT iCodePage
Definition: ddeml.h:310
HSZ hszSvc
Definition: ddeml.h:301
HSZ hszTopic
Definition: ddeml.h:302
struct tagWDML_INSTANCE * instance
Definition: dde_private.h:130
ATOM atomServiceSpec
Definition: dde_private.h:107
LPARAM lParam
Definition: dde_private.h:124
HGLOBAL hMem
Definition: dde_private.h:123
#define FIELD_OFFSET(t, f)
Definition: typedefs.h:255
uint16_t * LPWSTR
Definition: typedefs.h:56
uint32_t ULONG_PTR
Definition: typedefs.h:65
#define WIN_GetFullHandle(h)
Definition: user_x.h:108
_Must_inspect_result_ _In_ WDFKEY _In_ PCUNICODE_STRING _Out_opt_ PUSHORT _Inout_opt_ PUNICODE_STRING Value
Definition: wdfregistry.h:413
DWORD WINAPI GetCurrentThreadId(void)
Definition: thread.c:462
DWORD WINAPI GetWindowThreadProcessId(HWND hWnd, PDWORD lpdwProcessId)
#define WINAPI
Definition: msvc.h:6