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 }