diff --git a/ctypes_generation/generate.py b/ctypes_generation/generate.py index b634451..388bd59 100644 --- a/ctypes_generation/generate.py +++ b/ctypes_generation/generate.py @@ -111,9 +111,15 @@ common_header = "#Generated file\n" defs_header = common_header + """ import sys +import platform if sys.version_info.major == 3: long = int +bits = platform.architecture()[0] +bitness = int(bits[:2]) + +NATIVE_WORD_MAX_VALUE = 0xffffffff if bitness == 32 else 0xffffffffffffffff + class Flag(long): def __new__(cls, name, value): return super(Flag, cls).__new__(cls, value) diff --git a/ctypes_generation/windef.txt b/ctypes_generation/windef.txt index 9562b28..e9b5633 100644 --- a/ctypes_generation/windef.txt +++ b/ctypes_generation/windef.txt @@ -1,3 +1,4 @@ +#define INVALID_HANDLE_VALUE ((-1) & NATIVE_WORD_MAX_VALUE) #define NULL 0 #define MAX_PATH 260 #define ANYSIZE_ARRAY 1 diff --git a/windows/generated_def/windef.py b/windows/generated_def/windef.py index 48e6cec..e06db5e 100644 --- a/windows/generated_def/windef.py +++ b/windows/generated_def/windef.py @@ -1,9 +1,15 @@ #Generated file import sys +import platform if sys.version_info.major == 3: long = int +bits = platform.architecture()[0] +bitness = int(bits[:2]) + +NATIVE_WORD_MAX_VALUE = 0xffffffff if bitness == 32 else 0xffffffffffffffff + class Flag(long): def __new__(cls, name, value): return super(Flag, cls).__new__(cls, value) @@ -16,6 +22,7 @@ class Flag(long): __str__ = __repr__ +INVALID_HANDLE_VALUE = Flag("INVALID_HANDLE_VALUE", ( ( -1 ) & NATIVE_WORD_MAX_VALUE )) NULL = Flag("NULL", 0) MAX_PATH = Flag("MAX_PATH", 260) ANYSIZE_ARRAY = Flag("ANYSIZE_ARRAY", 1) diff --git a/windows/test/mytest.py b/windows/test/mytest.py index a0a7755..59861d8 100644 --- a/windows/test/mytest.py +++ b/windows/test/mytest.py @@ -285,10 +285,15 @@ class WindowsTestCase(unittest.TestCase): cont = t.context self.assertEqual(cont.Rax, 0x4242424243434343) +class WindowsAPITestCase(unittest.TestCase): + def test_createfileA_fail(self): + with self.assertRaises(WindowsError) as ar: + windows.winproxy.CreateFileA("NONEXISTFILE.FILE") + if __name__ == '__main__': alltests = unittest.TestSuite() - alltests.addTest(unittest.makeSuite(WindowsTestCase)) + alltests.addTest(unittest.makeSuite(WindowsTestCase), unittest.makeSuite(WindowsAPITestCase)) alltests.debug() tester = unittest.TextTestRunner(verbosity=2) tester.run(alltests) diff --git a/windows/winproxy.py b/windows/winproxy.py index 738a44f..a1d1672 100644 --- a/windows/winproxy.py +++ b/windows/winproxy.py @@ -252,12 +252,19 @@ Wow64EnableWow64FsRedirection = OptionalExport(TransparentKernel32Proxy)("Wow64E Wow64GetThreadContext = OptionalExport(TransparentKernel32Proxy)("Wow64GetThreadContext") -@Kernel32Proxy("CreateFileA") +def CreateFile_error_check(func_name, result, func, args): + """raise Kernel32Error if result is NOT 0""" + if result == INVALID_HANDLE_VALUE: + raise Kernel32Error(func_name) + return args + + +@Kernel32Proxy("CreateFileA", error_check=CreateFile_error_check) def CreateFileA(lpFileName, dwDesiredAccess=GENERIC_READ, dwShareMode=0, lpSecurityAttributes=None, dwCreationDisposition=OPEN_EXISTING, dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL, hTemplateFile=None): return CreateFileA.ctypes_function(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile) -@Kernel32Proxy("CreateFileW") +@Kernel32Proxy("CreateFileW", error_check=CreateFile_error_check) def CreateFileW(lpFileName, dwDesiredAccess=GENERIC_READ, dwShareMode=0, lpSecurityAttributes=None, dwCreationDisposition=OPEN_EXISTING, dwFlagsAndAttributes=FILE_ATTRIBUTE_NORMAL, hTemplateFile=None): return CreateFileA.ctypes_function(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile)