blob: 9aebf1b4ff31336f2f08e9695ae4f9528f214c69 [file] [log] [blame]
José Fonseca7ad40262009-09-30 17:17:12 +01001##########################################################################
José Fonseca95442442008-07-08 10:32:53 +09002#
José Fonseca7ad40262009-09-30 17:17:12 +01003# Copyright 2008-2009 VMware, Inc.
4# All Rights Reserved.
José Fonseca95442442008-07-08 10:32:53 +09005#
José Fonseca7ad40262009-09-30 17:17:12 +01006# Permission is hereby granted, free of charge, to any person obtaining a copy
7# of this software and associated documentation files (the "Software"), to deal
8# in the Software without restriction, including without limitation the rights
9# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10# copies of the Software, and to permit persons to whom the Software is
11# furnished to do so, subject to the following conditions:
José Fonseca95442442008-07-08 10:32:53 +090012#
José Fonseca7ad40262009-09-30 17:17:12 +010013# The above copyright notice and this permission notice shall be included in
14# all copies or substantial portions of the Software.
José Fonseca95442442008-07-08 10:32:53 +090015#
José Fonseca7ad40262009-09-30 17:17:12 +010016# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22# THE SOFTWARE.
José Fonseca95442442008-07-08 10:32:53 +090023#
José Fonseca7ad40262009-09-30 17:17:12 +010024##########################################################################/
José Fonseca95442442008-07-08 10:32:53 +090025
José Fonsecad626cf42008-07-07 07:43:16 +090026"""windows.h"""
27
28from base import *
29
José Fonseca73f33cc2008-07-09 02:17:51 +090030SHORT = Intrinsic("SHORT", "%i")
31USHORT = Intrinsic("USHORT", "%u")
32INT = Intrinsic("INT", "%i")
José Fonsecad626cf42008-07-07 07:43:16 +090033UINT = Intrinsic("UINT", "%u")
34LONG = Intrinsic("LONG", "%li")
35ULONG = Intrinsic("ULONG", "%lu")
José Fonseca73f33cc2008-07-09 02:17:51 +090036FLOAT = Intrinsic("FLOAT", "%f")
37
38INT32 = Intrinsic("INT32", "%i")
39UINT32 = Intrinsic("UINT32", "%i")
José Fonsecad626cf42008-07-07 07:43:16 +090040
José Fonseca0dcc85c2008-07-08 07:34:54 +090041BYTE = Intrinsic("BYTE", "0x%02lx")
42WORD = Intrinsic("WORD", "0x%04lx")
43DWORD = Intrinsic("DWORD", "0x%08lx")
José Fonsecad626cf42008-07-07 07:43:16 +090044
45BOOL = Intrinsic("BOOL", "%i")
46
José Fonsecac569f872009-01-04 16:45:17 +000047LPLONG = Pointer(LONG)
48LPWORD = Pointer(WORD)
49LPDWORD = Pointer(DWORD)
50LPBOOL = Pointer(BOOL)
51LPSIZE = LPDWORD
52
53LPSTR = String
José Fonseca36e25aa2009-04-13 14:08:08 +010054LPCSTR = Const(String)
José Fonsecae54e4112009-06-25 13:56:18 +010055LPWSTR = WString
José Fonseca44eaac92009-06-30 19:48:50 +010056LPCWSTR = Const(WString)
José Fonsecac569f872009-01-04 16:45:17 +000057
José Fonseca4a9c40c2008-07-07 18:04:53 +090058LARGE_INTEGER = Intrinsic("LARGE_INTEGER", "0x%llx")
José Fonseca0b8fea12009-09-28 11:33:36 +010059SIZE_T = Alias("SIZE_T", SizeT)
José Fonsecad626cf42008-07-07 07:43:16 +090060
61HRESULT = Alias("HRESULT", Int)
62
63PVOID = Intrinsic("PVOID", "%p")
José Fonsecac569f872009-01-04 16:45:17 +000064LPVOID = PVOID
José Fonseca73f33cc2008-07-09 02:17:51 +090065HANDLE = Intrinsic("HANDLE", "%p")
José Fonsecad626cf42008-07-07 07:43:16 +090066HWND = Intrinsic("HWND", "%p")
José Fonseca73f33cc2008-07-09 02:17:51 +090067HDC = Intrinsic("HDC", "%p")
José Fonsecad626cf42008-07-07 07:43:16 +090068HMONITOR = Intrinsic("HMONITOR", "%p")
69
José Fonseca8a56d142008-07-09 12:18:08 +090070GUID = Struct("GUID", [
71 (DWORD, "Data1"),
72 (WORD, "Data2"),
73 (WORD, "Data3"),
74 (BYTE, "Data4[0]"),
75 (BYTE, "Data4[1]"),
76 (BYTE, "Data4[2]"),
77 (BYTE, "Data4[3]"),
78 (BYTE, "Data4[4]"),
79 (BYTE, "Data4[5]"),
80 (BYTE, "Data4[6]"),
81 (BYTE, "Data4[7]"),
82])
José Fonsecac569f872009-01-04 16:45:17 +000083LPGUID = Pointer(GUID)
José Fonseca8a56d142008-07-09 12:18:08 +090084
85#REFGUID = Alias("REFGUID", Pointer(GUID))
86REFGUID = Alias("REFGUID", GUID)
87
88IID = Alias("IID", GUID)
89#REFIID = Alias("REFIID", Pointer(IID))
90REFIID = Alias("REFIID", IID)
91
José Fonsecac569f872009-01-04 16:45:17 +000092CLSID = Alias("CLSID", GUID)
93#REFCLSID = Alias("REFCLSID", Pointer(CLSID))
94REFCLSID = Alias("REFCLSID", CLSID)
95
José Fonseca8a56d142008-07-09 12:18:08 +090096LUID = Struct("LUID", [
97 (DWORD, "LowPart"),
98 (LONG, "HighPart"),
99])
José Fonsecad626cf42008-07-07 07:43:16 +0900100
101POINT = Struct("POINT", (
102 (LONG, "x"),
103 (LONG, "y"),
104))
José Fonsecac569f872009-01-04 16:45:17 +0000105LPPOINT = Pointer(POINT)
José Fonsecad626cf42008-07-07 07:43:16 +0900106
107RECT = Struct("RECT", (
108 (LONG, "left"),
109 (LONG, "top"),
110 (LONG, "right"),
111 (LONG, "bottom"),
112))
José Fonsecac569f872009-01-04 16:45:17 +0000113LPRECT = Pointer(RECT)
José Fonsecad626cf42008-07-07 07:43:16 +0900114
115PALETTEENTRY = Struct("PALETTEENTRY", (
116 (BYTE, "peRed"),
117 (BYTE, "peGreen"),
118 (BYTE, "peBlue"),
119 (BYTE, "peFlags"),
120))
José Fonsecac569f872009-01-04 16:45:17 +0000121LPPALETTEENTRY = Pointer(PALETTEENTRY)
José Fonsecad626cf42008-07-07 07:43:16 +0900122
José Fonseca8a56d142008-07-09 12:18:08 +0900123
124RGNDATAHEADER = Struct("RGNDATAHEADER", [
125 (DWORD, "dwSize"),
126 (DWORD, "iType"),
127 (DWORD, "nCount"),
128 (DWORD, "nRgnSize"),
129 (RECT, "rcBound"),
130])
131
132RGNDATA = Struct("RGNDATA", [
133 (RGNDATAHEADER, "rdh"),
134 #(Char, "Buffer[1]"),
135])
José Fonsecac569f872009-01-04 16:45:17 +0000136LPRGNDATA = Pointer(RGNDATA)
José Fonsecad626cf42008-07-07 07:43:16 +0900137
José Fonseca0b8fea12009-09-28 11:33:36 +0100138HMODULE = Alias("HMODULE", LPVOID)
José Fonsecad626cf42008-07-07 07:43:16 +0900139
140IUnknown = Interface("IUnknown")
141
142IUnknown.methods = (
143 Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(Pointer(Void)), "ppvObj"))),
144 Method(ULONG, "AddRef", ()),
145 Method(ULONG, "Release", ()),
146)
147
148
José Fonseca3c2c9292009-05-04 12:16:30 +0100149class DllFunction(Function):
150
151 def get_true_pointer(self):
152 ptype = self.pointer_type()
153 pvalue = self.pointer_value()
154 print ' if(!g_hDll) {'
155 print ' g_hDll = LoadLibrary(g_szDll);'
156 print ' if(!g_hDll)'
157 self.fail_impl()
158 print ' }'
159 print ' if(!%s) {' % (pvalue,)
José Fonsecac77023d2009-05-04 12:53:50 +0100160 print ' %s = (%s)GetProcAddress(g_hDll, "%s");' % (pvalue, ptype, self.name)
José Fonseca3c2c9292009-05-04 12:16:30 +0100161 print ' if(!%s)' % (pvalue,)
162 self.fail_impl()
163 print ' }'
164
165
José Fonsecad626cf42008-07-07 07:43:16 +0900166class Dll:
167
168 def __init__(self, name):
169 self.name = name
170 self.functions = []
171 if self not in towrap:
172 towrap.append(self)
173
174 def wrap_name(self):
175 return "Wrap" + self.name
176
177 def wrap_pre_decl(self):
178 pass
179
180 def wrap_decl(self):
José Fonsecad626cf42008-07-07 07:43:16 +0900181 print 'static HINSTANCE g_hDll = NULL;'
José Fonsecad7605892008-07-07 13:09:31 +0900182 print 'static TCHAR g_szDll[MAX_PATH] = {0};'
José Fonsecad626cf42008-07-07 07:43:16 +0900183 print
184 print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
185 print
José Fonseca3c2c9292009-05-04 12:16:30 +0100186 for function in self.functions:
187 function.wrap_decl()
188 print
José Fonsecad626cf42008-07-07 07:43:16 +0900189
190 def wrap_impl(self):
191 print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
José Fonsecad626cf42008-07-07 07:43:16 +0900192 print r' switch(fdwReason) {'
193 print r' case DLL_PROCESS_ATTACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900194 print r' if(!GetSystemDirectory(g_szDll, MAX_PATH))'
José Fonsecad626cf42008-07-07 07:43:16 +0900195 print r' return FALSE;'
José Fonsecad7605892008-07-07 13:09:31 +0900196 print r' _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
José Fonsecadf824982009-04-13 13:49:51 +0100197 print r' Log::Open("%s");' % self.name
José Fonsecad626cf42008-07-07 07:43:16 +0900198 print r' case DLL_THREAD_ATTACH:'
199 print r' return TRUE;'
200 print r' case DLL_THREAD_DETACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900201 print r' return TRUE;'
202 print r' case DLL_PROCESS_DETACH:'
José Fonseca22aec832008-07-09 09:38:45 +0900203 print r' Log::Close();'
José Fonsecad7605892008-07-07 13:09:31 +0900204 print r' if(g_hDll) {'
205 print r' FreeLibrary(g_hDll);'
206 print r' g_hDll = NULL;'
207 print r' }'
José Fonsecad626cf42008-07-07 07:43:16 +0900208 print r' return TRUE;'
209 print r' }'
José Fonsecad7605892008-07-07 13:09:31 +0900210 print r' (void)hinstDLL;'
José Fonsecad626cf42008-07-07 07:43:16 +0900211 print r' (void)lpvReserved;'
212 print r' return TRUE;'
213 print r'}'
214 print
215 for function in self.functions:
José Fonseca3c2c9292009-05-04 12:16:30 +0100216 function.wrap_impl()
José Fonsecad626cf42008-07-07 07:43:16 +0900217 print
218