UNPKG

2.1 kBtext/x-cView Raw
1#include <windows.h>
2#include <stdio.h>
3#include <fcntl.h>
4
5#define AGENT_COPYDATA_ID 0x804e50ba
6#define AGENT_MAX_MSGLEN 8192
7
8#define GET_32BIT_MSB_FIRST(cp) \
9 (((unsigned long)(unsigned char)(cp)[0] << 24) | \
10 ((unsigned long)(unsigned char)(cp)[1] << 16) | \
11 ((unsigned long)(unsigned char)(cp)[2] << 8) | \
12 ((unsigned long)(unsigned char)(cp)[3]))
13
14#define GET_32BIT(cp) GET_32BIT_MSB_FIRST(cp)
15
16#define RET_ERR_BADARGS 10
17#define RET_ERR_UNAVAILABLE 11
18#define RET_ERR_NOMAP 12
19#define RET_ERR_BINSTDIN 13
20#define RET_ERR_BINSTDOUT 14
21#define RET_ERR_BADLEN 15
22
23#define RET_NORESPONSE 1
24#define RET_RESPONSE 0
25
26int main (int argc, const char* argv[]) {
27 HWND hwnd;
28 char *mapname;
29 HANDLE filemap;
30 unsigned char *p, *ret;
31 int id, retlen, inlen, n, rmode, r = RET_NORESPONSE;
32 COPYDATASTRUCT cds;
33 void *in;
34
35 if (argc < 2)
36 return RET_ERR_BADARGS;
37
38 hwnd = FindWindow("Pageant", "Pageant");
39 if (!hwnd)
40 return RET_ERR_UNAVAILABLE;
41
42 rmode = _setmode(_fileno(stdin), _O_BINARY);
43 if (rmode == -1)
44 return RET_ERR_BINSTDIN;
45
46 rmode = _setmode(_fileno(stdout), _O_BINARY);
47 if (rmode == -1)
48 return RET_ERR_BINSTDOUT;
49
50 inlen = atoi(argv[1]);
51 in = malloc(inlen);
52 n = fread(in, 1, inlen, stdin);
53 if (n != inlen) {
54 free(in);
55 return RET_ERR_BADLEN;
56 }
57
58 mapname = malloc(32);
59 n = sprintf(mapname, "PageantRequest%08x", (unsigned)GetCurrentThreadId());
60
61 filemap = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE,
62 0, AGENT_MAX_MSGLEN, mapname);
63 if (filemap == NULL || filemap == INVALID_HANDLE_VALUE) {
64 free(in);
65 free(mapname);
66 return RET_ERR_NOMAP;
67 }
68
69 p = MapViewOfFile(filemap, FILE_MAP_WRITE, 0, 0, 0);
70 memcpy(p, in, inlen);
71 cds.dwData = AGENT_COPYDATA_ID;
72 cds.cbData = 1 + n;
73 cds.lpData = mapname;
74
75 id = SendMessage(hwnd, WM_COPYDATA, (WPARAM) NULL, (LPARAM) &cds);
76 if (id > 0) {
77 r = RET_RESPONSE;
78 retlen = 4 + GET_32BIT(p);
79 fwrite(p, 1, retlen, stdout);
80 }
81
82 free(in);
83 free(mapname);
84 UnmapViewOfFile(p);
85 CloseHandle(filemap);
86
87 return r;
88}