448
|
1 /*
|
|
2 * Copyright (c) 2000, Red Hat, Inc.
|
|
3 *
|
|
4 * This program is free software; you can redistribute it and/or modify
|
|
5 * it under the terms of the GNU General Public License as published by
|
|
6 * the Free Software Foundation; either version 2 of the License, or
|
|
7 * (at your option) any later version.
|
|
8 *
|
|
9 * A copy of the GNU General Public License can be found at
|
|
10 * http://www.gnu.org/
|
|
11 *
|
|
12 * Written by DJ Delorie <dj@cygnus.com>
|
|
13 *
|
|
14 */
|
|
15
|
|
16 #include "win32.h"
|
|
17
|
|
18 typedef struct {
|
|
19 char *name;
|
|
20 HINSTANCE handle;
|
|
21 } DllInfo;
|
|
22
|
|
23 #define DLL(n) static DllInfo n ## _info __asm__ (#n "_info") = { #n, 0}
|
|
24
|
|
25 #define Auto(dll, func, size) \
|
|
26 __asm__ ("\t.data"); \
|
|
27 __asm__ ("\t.global\t_" #func "@" #size); \
|
|
28 __asm__ ("_" #func "@" #size ":"); \
|
|
29 __asm__ ("\tcall\tautoload_common"); \
|
|
30 __asm__ ("\t.long\t" #dll "_info"); \
|
|
31 __asm__ ("\t.ascii\t\"" #func "\\0\"")
|
|
32
|
|
33 DLL (wininet);
|
|
34
|
|
35 Auto (wininet, InternetAttemptConnect, 4);
|
|
36 Auto (wininet, InternetCloseHandle, 4);
|
|
37 Auto (wininet, InternetGetLastResponseInfoA, 12);
|
|
38 Auto (wininet, InternetOpenA, 20);
|
|
39 Auto (wininet, InternetOpenUrlA, 24);
|
|
40 Auto (wininet, InternetReadFile, 16);
|
|
41 Auto (wininet, InternetSetOptionA, 16);
|
|
42 Auto (wininet, InternetQueryOptionA, 16);
|
|
43 Auto (wininet, HttpQueryInfoA, 20);
|
|
44 Auto (wininet, HttpSendRequestA, 20);
|
|
45
|
|
46 typedef struct {
|
|
47 DllInfo *dll;
|
|
48 char name[100];
|
|
49 } AutoEntry;
|
|
50
|
|
51 static void autoload_common () __asm__ ("autoload_common");
|
|
52
|
|
53 static void
|
|
54 autoload_common (int x)
|
|
55 {
|
|
56 int fp, rel;
|
|
57 unsigned char *proc;
|
|
58 HINSTANCE h;
|
|
59 AutoEntry *a;
|
|
60
|
|
61 a = *(AutoEntry **)(&x - 1);
|
|
62 if (a->dll->handle == 0)
|
|
63 {
|
|
64 h = LoadLibrary (a->dll->name);
|
|
65 a->dll->handle = h;
|
|
66 }
|
|
67 fp = (int) GetProcAddress (a->dll->handle, a->name);
|
|
68 proc = ((unsigned char *)a) - 5;
|
|
69 rel = fp - (int)(a); /* now it's a relative call */
|
|
70 *proc++ = 0xe9; /* jump near 32-bit relative */
|
|
71 *proc++ = rel;
|
|
72 *proc++ = rel>>8;
|
|
73 *proc++ = rel>>16;
|
|
74 *proc++ = rel>>24;
|
|
75
|
|
76 *(int *)(&x-1) = (int)proc-5;
|
|
77 }
|