blob: eec3fde014470244d7f44d2aedca964c3d6ad7df [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é Fonsecaf20c1262010-11-25 11:39:57 +000026"""Win32 API type description."""
José Fonsecad626cf42008-07-07 07:43:16 +090027
28from base import *
29
José Fonseca51c1ef82010-11-15 16:09:14 +000030SHORT = Alias("SHORT", Short)
31USHORT = Alias("USHORT", UShort)
32INT = Alias("INT", Int)
33UINT = Alias("UINT", UInt)
34LONG = Alias("LONG", Long)
35ULONG = Alias("ULONG", ULong)
36LONGLONG = Alias("LONGLONG", LongLong)
37FLOAT = Alias("FLOAT", Float)
José Fonseca73f33cc2008-07-09 02:17:51 +090038
José Fonseca51c1ef82010-11-15 16:09:14 +000039INT32 = Literal("INT32", "UInt")
40UINT32 = Literal("UINT32", "UInt")
José Fonsecad626cf42008-07-07 07:43:16 +090041
José Fonseca51c1ef82010-11-15 16:09:14 +000042BYTE = Literal("BYTE", "UInt", base=16)
43WORD = Literal("WORD", "UInt", base=16)
44DWORD = Literal("DWORD", "UInt", base=16)
José Fonsecad626cf42008-07-07 07:43:16 +090045
José Fonseca51c1ef82010-11-15 16:09:14 +000046BOOL = Alias("BOOL", Bool)
José Fonsecad626cf42008-07-07 07:43:16 +090047
José Fonsecac569f872009-01-04 16:45:17 +000048LPLONG = Pointer(LONG)
49LPWORD = Pointer(WORD)
50LPDWORD = Pointer(DWORD)
51LPBOOL = Pointer(BOOL)
52LPSIZE = LPDWORD
53
José Fonseca5f81c3a2010-11-24 08:42:22 +000054LPSTR = CString
55LPCSTR = Const(CString)
José Fonsecae54e4112009-06-25 13:56:18 +010056LPWSTR = WString
José Fonseca44eaac92009-06-30 19:48:50 +010057LPCWSTR = Const(WString)
José Fonsecac569f872009-01-04 16:45:17 +000058
José Fonseca51c1ef82010-11-15 16:09:14 +000059LARGE_INTEGER = Struct("LARGE_INTEGER", [
60 (LONGLONG, 'QuadPart'),
61])
62
José Fonseca0b8fea12009-09-28 11:33:36 +010063SIZE_T = Alias("SIZE_T", SizeT)
José Fonsecad626cf42008-07-07 07:43:16 +090064
65HRESULT = Alias("HRESULT", Int)
66
José Fonsecae02bb2a2010-11-24 16:19:16 +000067VOID = Void
José Fonsecaf6592d72010-11-21 12:44:41 +000068PVOID = Opaque("PVOID")
José Fonsecac569f872009-01-04 16:45:17 +000069LPVOID = PVOID
José Fonsecaf6592d72010-11-21 12:44:41 +000070HANDLE = Opaque("HANDLE")
71HWND = Opaque("HWND")
72HDC = Opaque("HDC")
73HMONITOR = Opaque("HMONITOR")
José Fonsecad626cf42008-07-07 07:43:16 +090074
José Fonseca8a56d142008-07-09 12:18:08 +090075GUID = Struct("GUID", [
76 (DWORD, "Data1"),
77 (WORD, "Data2"),
78 (WORD, "Data3"),
79 (BYTE, "Data4[0]"),
80 (BYTE, "Data4[1]"),
81 (BYTE, "Data4[2]"),
82 (BYTE, "Data4[3]"),
83 (BYTE, "Data4[4]"),
84 (BYTE, "Data4[5]"),
85 (BYTE, "Data4[6]"),
86 (BYTE, "Data4[7]"),
87])
José Fonsecac569f872009-01-04 16:45:17 +000088LPGUID = Pointer(GUID)
José Fonseca8a56d142008-07-09 12:18:08 +090089
90#REFGUID = Alias("REFGUID", Pointer(GUID))
91REFGUID = Alias("REFGUID", GUID)
92
93IID = Alias("IID", GUID)
94#REFIID = Alias("REFIID", Pointer(IID))
95REFIID = Alias("REFIID", IID)
96
José Fonsecac569f872009-01-04 16:45:17 +000097CLSID = Alias("CLSID", GUID)
98#REFCLSID = Alias("REFCLSID", Pointer(CLSID))
99REFCLSID = Alias("REFCLSID", CLSID)
100
José Fonseca8a56d142008-07-09 12:18:08 +0900101LUID = Struct("LUID", [
102 (DWORD, "LowPart"),
103 (LONG, "HighPart"),
104])
José Fonsecad626cf42008-07-07 07:43:16 +0900105
106POINT = Struct("POINT", (
107 (LONG, "x"),
108 (LONG, "y"),
109))
José Fonsecac569f872009-01-04 16:45:17 +0000110LPPOINT = Pointer(POINT)
José Fonsecad626cf42008-07-07 07:43:16 +0900111
112RECT = Struct("RECT", (
113 (LONG, "left"),
114 (LONG, "top"),
115 (LONG, "right"),
116 (LONG, "bottom"),
117))
José Fonsecac569f872009-01-04 16:45:17 +0000118LPRECT = Pointer(RECT)
José Fonsecad626cf42008-07-07 07:43:16 +0900119
120PALETTEENTRY = Struct("PALETTEENTRY", (
121 (BYTE, "peRed"),
122 (BYTE, "peGreen"),
123 (BYTE, "peBlue"),
124 (BYTE, "peFlags"),
125))
José Fonsecac569f872009-01-04 16:45:17 +0000126LPPALETTEENTRY = Pointer(PALETTEENTRY)
José Fonsecad626cf42008-07-07 07:43:16 +0900127
José Fonseca8a56d142008-07-09 12:18:08 +0900128
129RGNDATAHEADER = Struct("RGNDATAHEADER", [
130 (DWORD, "dwSize"),
131 (DWORD, "iType"),
132 (DWORD, "nCount"),
133 (DWORD, "nRgnSize"),
134 (RECT, "rcBound"),
135])
136
137RGNDATA = Struct("RGNDATA", [
138 (RGNDATAHEADER, "rdh"),
139 #(Char, "Buffer[1]"),
140])
José Fonsecac569f872009-01-04 16:45:17 +0000141LPRGNDATA = Pointer(RGNDATA)
José Fonsecad626cf42008-07-07 07:43:16 +0900142
José Fonseca31524192010-11-22 21:05:26 +0000143HMODULE = Opaque("HMODULE")
José Fonsecad626cf42008-07-07 07:43:16 +0900144
145IUnknown = Interface("IUnknown")
146
147IUnknown.methods = (
José Fonseca31524192010-11-22 21:05:26 +0000148 Method(HRESULT, "QueryInterface", ((REFIID, "riid"), (Pointer(OpaquePointer(Void)), "ppvObj"))),
José Fonsecad626cf42008-07-07 07:43:16 +0900149 Method(ULONG, "AddRef", ()),
150 Method(ULONG, "Release", ()),
151)
152
153
José Fonseca3c2c9292009-05-04 12:16:30 +0100154class DllFunction(Function):
155
156 def get_true_pointer(self):
157 ptype = self.pointer_type()
158 pvalue = self.pointer_value()
159 print ' if(!g_hDll) {'
160 print ' g_hDll = LoadLibrary(g_szDll);'
161 print ' if(!g_hDll)'
162 self.fail_impl()
163 print ' }'
164 print ' if(!%s) {' % (pvalue,)
José Fonsecac77023d2009-05-04 12:53:50 +0100165 print ' %s = (%s)GetProcAddress(g_hDll, "%s");' % (pvalue, ptype, self.name)
José Fonseca3c2c9292009-05-04 12:16:30 +0100166 print ' if(!%s)' % (pvalue,)
167 self.fail_impl()
168 print ' }'
169
170
José Fonsecad626cf42008-07-07 07:43:16 +0900171class Dll:
172
173 def __init__(self, name):
174 self.name = name
175 self.functions = []
176 if self not in towrap:
177 towrap.append(self)
178
179 def wrap_name(self):
180 return "Wrap" + self.name
181
182 def wrap_pre_decl(self):
183 pass
184
185 def wrap_decl(self):
José Fonsecad626cf42008-07-07 07:43:16 +0900186 print 'static HINSTANCE g_hDll = NULL;'
José Fonsecad7605892008-07-07 13:09:31 +0900187 print 'static TCHAR g_szDll[MAX_PATH] = {0};'
José Fonsecad626cf42008-07-07 07:43:16 +0900188 print
189 print 'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved);'
190 print
José Fonseca3c2c9292009-05-04 12:16:30 +0100191 for function in self.functions:
192 function.wrap_decl()
193 print
José Fonsecad626cf42008-07-07 07:43:16 +0900194
195 def wrap_impl(self):
196 print r'BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {'
José Fonsecad626cf42008-07-07 07:43:16 +0900197 print r' switch(fdwReason) {'
198 print r' case DLL_PROCESS_ATTACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900199 print r' if(!GetSystemDirectory(g_szDll, MAX_PATH))'
José Fonsecad626cf42008-07-07 07:43:16 +0900200 print r' return FALSE;'
José Fonsecad7605892008-07-07 13:09:31 +0900201 print r' _tcscat(g_szDll, TEXT("\\%s.dll"));' % self.name
José Fonsecadf824982009-04-13 13:49:51 +0100202 print r' Log::Open("%s");' % self.name
José Fonsecad626cf42008-07-07 07:43:16 +0900203 print r' case DLL_THREAD_ATTACH:'
204 print r' return TRUE;'
205 print r' case DLL_THREAD_DETACH:'
José Fonsecad7605892008-07-07 13:09:31 +0900206 print r' return TRUE;'
207 print r' case DLL_PROCESS_DETACH:'
José Fonseca22aec832008-07-09 09:38:45 +0900208 print r' Log::Close();'
José Fonsecad7605892008-07-07 13:09:31 +0900209 print r' if(g_hDll) {'
210 print r' FreeLibrary(g_hDll);'
211 print r' g_hDll = NULL;'
212 print r' }'
José Fonsecad626cf42008-07-07 07:43:16 +0900213 print r' return TRUE;'
214 print r' }'
José Fonsecad7605892008-07-07 13:09:31 +0900215 print r' (void)hinstDLL;'
José Fonsecad626cf42008-07-07 07:43:16 +0900216 print r' (void)lpvReserved;'
217 print r' return TRUE;'
218 print r'}'
219 print
220 for function in self.functions:
José Fonseca3c2c9292009-05-04 12:16:30 +0100221 function.wrap_impl()
José Fonsecad626cf42008-07-07 07:43:16 +0900222 print
223