summaryrefslogtreecommitdiffstats
path: root/mplayer_wine.spec.c
blob: 1974b3c6990f8db4d3baaca9ca386b7111815080 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
/* File generated automatically from mplayer_wine.spec; do not edit! */
/* This file can be copied, modified and distributed without restriction. */

extern char pe_header[];
asm(".section .text\n\t"
    ".align 4096\n"
    "pe_header:\t.fill 4096,1,0\n\t");
static const char dllname[] = "mplayer_wine";

extern int __wine_spec_exports[];

#define __stdcall __attribute__((__stdcall__))


static struct {
  struct {
    void        *OriginalFirstThunk;
    unsigned int TimeDateStamp;
    unsigned int ForwarderChain;
    const char  *Name;
    void        *FirstThunk;
  } imp[3];
  const char *data[8];
} imports = {
  {
    { 0, 0, 0, "kernel32.dll", &imports.data[0] },
    { 0, 0, 0, "ntdll.dll", &imports.data[5] },
    { 0, 0, 0, 0, 0 },
  },
  {
    /* kernel32.dll */
    "\0\0ExitProcess",
    "\0\0FreeLibrary",
    "\0\0GetProcAddress",
    "\0\0LoadLibraryA",
    0,
    /* ntdll.dll */
    "\0\0RtlRaiseException",
    "\0\0__wine_get_main_args",
    0,
  }
};

#ifndef __GNUC__
static void __asm__dummy_import(void) {
#endif

asm(".data\n\t.align 8\n"
    "\t.type ExitProcess,@function\n"
    "\t.globl ExitProcess\n"
    "ExitProcess:\n\tjmp *(imports+60)\n\tmovl %esi,%esi\n"
    "\t.type FreeLibrary,@function\n"
    "\t.globl FreeLibrary\n"
    "FreeLibrary:\n\tjmp *(imports+64)\n\tmovl %esi,%esi\n"
    "\t.type GetProcAddress,@function\n"
    "\t.globl GetProcAddress\n"
    "GetProcAddress:\n\tjmp *(imports+68)\n\tmovl %esi,%esi\n"
    "\t.type LoadLibraryA,@function\n"
    "\t.globl LoadLibraryA\n"
    "LoadLibraryA:\n\tjmp *(imports+72)\n\tmovl %esi,%esi\n"
    "\t.type RtlRaiseException,@function\n"
    "\t.globl RtlRaiseException\n"
    "RtlRaiseException:\n\tjmp *(imports+80)\n\tmovl %esi,%esi\n"
    "\t.type __wine_get_main_args,@function\n"
    "\t.globl __wine_get_main_args\n"
    "__wine_get_main_args:\n\tjmp *(imports+84)\n\tmovl %esi,%esi\n"
".previous");
#ifndef __GNUC__
}
#endif


int _ARGC;
char **_ARGV;
extern void __stdcall ExitProcess(int);
static void __wine_exe_main(void)
{
    extern int main( int argc, char *argv[] );
    extern int __wine_get_main_args( char ***argv );
    _ARGC = __wine_get_main_args( &_ARGV );
    ExitProcess( main( _ARGC, _ARGV ) );
}

static const struct image_nt_headers
{
  int Signature;
  struct file_header {
    short Machine;
    short NumberOfSections;
    int   TimeDateStamp;
    void *PointerToSymbolTable;
    int   NumberOfSymbols;
    short SizeOfOptionalHeader;
    short Characteristics;
  } FileHeader;
  struct opt_header {
    short Magic;
    char  MajorLinkerVersion, MinorLinkerVersion;
    int   SizeOfCode;
    int   SizeOfInitializedData;
    int   SizeOfUninitializedData;
    void *AddressOfEntryPoint;
    void *BaseOfCode;
    void *BaseOfData;
    void *ImageBase;
    int   SectionAlignment;
    int   FileAlignment;
    short MajorOperatingSystemVersion;
    short MinorOperatingSystemVersion;
    short MajorImageVersion;
    short MinorImageVersion;
    short MajorSubsystemVersion;
    short MinorSubsystemVersion;
    int   Win32VersionValue;
    int   SizeOfImage;
    int   SizeOfHeaders;
    int   CheckSum;
    short Subsystem;
    short DllCharacteristics;
    int   SizeOfStackReserve;
    int   SizeOfStackCommit;
    int   SizeOfHeapReserve;
    int   SizeOfHeapCommit;
    int   LoaderFlags;
    int   NumberOfRvaAndSizes;
    struct { const void *VirtualAddress; int Size; } DataDirectory[16];
  } OptionalHeader;
} nt_header = {
  0x4550,
  { 0x014c,
    0, 0, 0, 0,
    sizeof(nt_header.OptionalHeader),
    0x0000 },
  { 0x010b,
    0, 0,
    0, 0, 0,
    __wine_exe_main,
    0, 0,
    pe_header,
    4096,
    4096,
    1, 0,
    0, 0,
    4, 0,
    0,
    4096,
    4096,
    0,
    0x0003,
    0,
    0, 0,
    0, 0,
    0,
    16,
    {
      { 0, 0 },
      { &imports, sizeof(imports) },
      { 0, 0 },
    }
  }
};

#ifndef __GNUC__
static void __asm__dummy_dll_init(void) {
#endif /* defined(__GNUC__) */
asm("\t.section	.init ,\"ax\"\n"
    "\tcall __wine_spec_mplayer_wine_init\n"
    "\t.previous\n");
#ifndef __GNUC__
}
#endif /* defined(__GNUC__) */

void __wine_spec_mplayer_wine_init(void)
{
    extern void __wine_dll_register( const struct image_nt_headers *, const char * );
    extern void *__wine_dbg_register( char * const *, int );
    __wine_dll_register( &nt_header, "mplayer_wine.exe" );
}