e718313e814ffee8c33a11080d9a0455c5dae166
10 #define debug(x) (printf x)
15 int agent_exists(void) {
17 hwnd
= FindWindow("Pageant", "Pageant");
24 void agent_query(void *in
, int inlen
, void **out
, int *outlen
) {
26 #define MAILSLOTNAME "\\\\.\\mailslot\\pageant_listener"
27 SECURITY_ATTRIBUTES sa
;
28 HANDLE my_mailslot
, agent_mailslot
;
31 DWORD msglen
, byteswritten
, bytesread
, inid
;
36 agent_mailslot
= CreateFile(MAILSLOTNAME
, GENERIC_WRITE
,
37 FILE_SHARE_READ
, (LPSECURITY_ATTRIBUTES
)NULL
,
38 OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
,
40 debug(("opened %s: %p\n", MAILSLOTNAME
, agent_mailslot
));
41 if (agent_mailslot
== INVALID_HANDLE_VALUE
)
44 inid
= GetCurrentThreadId();
47 sa
.nLength
= sizeof(sa
);
48 sa
.lpSecurityDescriptor
= NULL
;
49 sa
.bInheritHandle
= TRUE
;
52 sprintf(name
, "\\\\.\\mailslot\\pclient_request_%08x", ++inid
);
54 * Five-minute timeout.
56 my_mailslot
= CreateMailslot(name
, 0, 0, &sa
);
57 debug(("mailslot %s: %p\n", name
, my_mailslot
));
58 } while (my_mailslot
== INVALID_HANDLE_VALUE
);
61 msglen
= strlen(name
) + 1 + inlen
;
64 CloseHandle(my_mailslot
);
65 CloseHandle(agent_mailslot
);
70 memcpy(p
+strlen(p
)+1, in
, inlen
);
73 if (WriteFile(agent_mailslot
, p
, msglen
, &byteswritten
, NULL
) == 0) {
76 CloseHandle(my_mailslot
);
77 CloseHandle(agent_mailslot
);
82 CloseHandle(agent_mailslot
);
84 WaitForSingleObject(my_mailslot
, 3000000);
86 if (!GetMailslotInfo(my_mailslot
, NULL
, &msglen
, NULL
, NULL
)) {
87 CloseHandle(my_mailslot
);
90 if (msglen
== MAILSLOT_NO_MESSAGE
) {
91 debug(("no message\n"));
92 CloseHandle(my_mailslot
);
95 debug(("msglen=%d\n", msglen
));
98 CloseHandle(my_mailslot
);
101 if (ReadFile(my_mailslot
, p
, msglen
, &bytesread
, NULL
) == 0 &&
102 bytesread
== msglen
) {
106 CloseHandle(my_mailslot
);
118 hwnd
= FindWindow("Pageant", "Pageant");
119 debug(("hwnd is %p\n", hwnd
));
122 cds
.dwData
= 0; /* FIXME */
125 id
= SendMessage(hwnd
, WM_COPYDATA
, (WPARAM
)NULL
, (LPARAM
)&cds
);
126 debug(("return is %d\n", id
));
128 sprintf(mapname
, "PageantReply%08x", id
);
129 filemap
= OpenFileMapping(FILE_MAP_READ
, FALSE
, mapname
);
130 debug(("name is `%s', filemap is %p\n", mapname
, filemap
));
131 debug(("error is %d\n", GetLastError()));
132 if (filemap
!= NULL
&& filemap
!= INVALID_HANDLE_VALUE
) {
133 p
= MapViewOfFile(filemap
, FILE_MAP_READ
, 0, 0, 0);
134 debug(("p is %p\n", p
));
137 debug(("len is %d\n", retlen
));
138 ret
= malloc(retlen
);
140 memcpy(ret
, ((int *)p
) + 1, retlen
);
146 CloseHandle(filemap
);
148 /* FIXME: tell agent to close its handle too */
159 agent_query("\0\0\0\1\1", 5, &msg
, &len
);
161 for (i
= 0; i
< len
; i
++)
162 debug((" %02x", ((unsigned char *)msg
)[i
]));