]> asedeno.scripts.mit.edu Git - PuTTY.git/blob - pageantc.c
7764b6bf2b4f8d270dd38870df03aa7a8f9d387a
[PuTTY.git] / pageantc.c
1 /*
2  * Pageant client code.
3  */
4
5 #include <windows.h>
6 #include <stdio.h>
7 #include <stdlib.h>
8
9 #include "puttymem.h"
10
11 #define AGENT_COPYDATA_ID 0x804e50ba   /* random goop */
12 #define AGENT_MAX_MSGLEN  8192
13
14 #ifdef TESTMODE
15 #define debug(x) (printf x)
16 #else
17 #define debug(x)
18 #endif
19
20 #define GET_32BIT(cp) \
21     (((unsigned long)(unsigned char)(cp)[0] << 24) | \
22     ((unsigned long)(unsigned char)(cp)[1] << 16) | \
23     ((unsigned long)(unsigned char)(cp)[2] << 8) | \
24     ((unsigned long)(unsigned char)(cp)[3]))
25
26 int agent_exists(void) {
27     HWND hwnd;
28     hwnd = FindWindow("Pageant", "Pageant");
29     if (!hwnd)
30         return FALSE;
31     else
32         return TRUE;
33 }
34
35 void agent_query(void *in, int inlen, void **out, int *outlen) {
36     HWND hwnd;
37     char mapname[64];
38     HANDLE filemap;
39     unsigned char *p, *ret;
40     int id, retlen;
41     COPYDATASTRUCT cds;
42
43     *out = NULL;
44     *outlen = 0;
45
46     hwnd = FindWindow("Pageant", "Pageant");
47     debug(("hwnd is %p\n", hwnd));
48     if (!hwnd)
49         return;
50     sprintf(mapname, "PageantRequest%08x", GetCurrentThreadId());
51     filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
52                                 0, AGENT_MAX_MSGLEN, mapname);
53     if (!filemap)
54         return;
55     p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);
56     memcpy(p, in, inlen);
57     cds.dwData = AGENT_COPYDATA_ID;
58     cds.cbData = 1+strlen(mapname);
59     cds.lpData = mapname;
60     id = SendMessage(hwnd, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
61     debug(("return is %d\n", id));
62     if (id > 0) {
63         retlen = 4 + GET_32BIT(p);
64         debug(("len is %d\n", retlen));
65         ret = smalloc(retlen);
66         if (ret) {
67             memcpy(ret, p, retlen);
68             *out = ret;
69             *outlen = retlen;
70         }
71     }
72     UnmapViewOfFile(p);
73     CloseHandle(filemap);
74 }
75
76 #ifdef TESTMODE
77
78 int main(void) {
79     void *msg;
80     int len;
81     int i;
82
83     agent_query("\0\0\0\1\1", 5, &msg, &len);
84     debug(("%d:", len));
85     for (i = 0; i < len; i++)
86         debug((" %02x", ((unsigned char *)msg)[i]));
87     debug(("\n"));
88     return 0;
89 }
90
91 #endif