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