Add transaction + window APIs to winproxy + get_mapped_filename raise on non-standard error (like aborted transaction)

This commit is contained in:
hakril
2018-01-26 11:05:53 +01:00
parent 4251b18041
commit f682fbd8c1
3 changed files with 74 additions and 1 deletions
+2
View File
@@ -571,6 +571,8 @@ class Process(AutoHandle):
try:
size = winproxy.GetMappedFileNameA(self.handle, addr, buffer, buffer_size)
except winproxy.Kernel32Error as e:
if e.winerror != gdef.ERROR_UNEXP_NET_ERR:
raise # Raise if error type is not expected: detect mapped aborted transaction
return None
return buffer[:size]
+1 -1
View File
@@ -93,7 +93,7 @@ class WmiRequester(object):
result = enumerator.Next(timeout, 1, ctypes.byref(processor), ctypes.byref(count))
except WindowsError as e:
if (e.winerror & 0xffffffff) == WBEM_E_INVALID_CLASS:
raise WindowsError(e.winerror, 'WBEM_E_INVALID_CLASS <Invalid WMI class "{0}">'.format(query))
raise WindowsError(e.winerror, 'WBEM_E_INVALID_CLASS <Invalid WMI class>')
if (e.winerror & 0xffffffff) in WBEMSTATUS.values:
raise WindowsError(e.winerror, WBEMSTATUS(e.winerror & 0xffffffff).value)
raise
+71
View File
@@ -114,6 +114,11 @@ def error_ntstatus(func_name, result, func, args):
raise NtStatusException(result & 0xffffffff)
return args
def valid_handle_check(func_name, result, func, args):
if result == INVALID_HANDLE_VALUE:
raise Kernel32Error(func_name)
return args
class ExportNotFound(RuntimeError):
def __init__(self, func_name, api_name):
@@ -226,6 +231,10 @@ class Shell32Proxy(ApiProxy):
APIDLL = "shell32"
default_error_check = staticmethod(zero_is_fail_error_check)
class Ktmw32Proxy(ApiProxy):
APIDLL = "Ktmw32"
default_error_check = staticmethod(zero_is_fail_error_check)
#class OptionalExport(object):
# """used 'around' a Proxy decorator
# Should be used for export that are not available everywhere (ntdll internals | 32/64 bits stuff)
@@ -627,6 +636,7 @@ def QueryWorkingSetExWrapper(hProcess, pv, cb):
QueryWorkingSetEx = Kernel32Proxy("QueryWorkingSetEx")(QueryWorkingSetExWrapper)
if not is_implemented(GetMappedFileNameA):
GetMappedFileNameW = PsapiProxy("GetMappedFileNameW")(GetMappedFileNameWWrapper)
GetMappedFileNameA = PsapiProxy("GetMappedFileNameA")(GetMappedFileNameAWrapper)
@@ -1556,11 +1566,16 @@ def CryptUIDlgViewContext(dwContextType, pvContext, hwnd, pwszTitle, dwFlags, pv
# ## User32 stuff ## #
EnumWindows = TransparentUser32Proxy('EnumWindows')
EnumChildWindows = TransparentUser32Proxy('EnumChildWindows')
GetParent = TransparentUser32Proxy('GetParent')
GetClassInfoExA = TransparentUser32Proxy('GetClassInfoExA')
GetClassInfoExW = TransparentUser32Proxy('GetClassInfoExW')
GetWindowTextA = TransparentUser32Proxy('GetWindowTextA', no_error_check)
GetWindowTextW = TransparentUser32Proxy('GetWindowTextW', no_error_check)
GetWindowModuleFileNameA = TransparentUser32Proxy('GetWindowModuleFileNameA', no_error_check)
GetWindowModuleFileNameW = TransparentUser32Proxy('GetWindowModuleFileNameW', no_error_check)
GetSystemMetrics = TransparentUser32Proxy('GetSystemMetrics', no_error_check)
GetWindowThreadProcessId = TransparentUser32Proxy('GetWindowThreadProcessId')
@User32Proxy("GetCursorPos")
def GetCursorPos(lpPoint):
@@ -1583,6 +1598,30 @@ def MessageBoxA(hWnd=0, lpText=NeededParameter, lpCaption=None, uType=0):
def MessageBoxW(hWnd=0, lpText=NeededParameter, lpCaption=None, uType=0):
return MessageBoxW.ctypes_function(hWnd, lpText, lpCaption, uType)
@User32Proxy("RealGetWindowClassA")
def RealGetWindowClassA(hwnd, pszType, cchType=None):
if cchType is None:
cchType = len(pszType)
return RealGetWindowClassA.ctypes_function(hwnd, pszType, cchType)
@User32Proxy("RealGetWindowClassW")
def RealGetWindowClassW(hwnd, pszType, cchType=None):
if cchType is None:
cchType = len(pszType)
return RealGetWindowClassW.ctypes_function(hwnd, pszType, cchType)
@User32Proxy("GetClassNameA")
def GetClassNameA (hwnd, pszType, cchType=None):
if cchType is None:
cchType = len(pszType)
return GetClassNameA .ctypes_function(hwnd, pszType, cchType)
@User32Proxy("GetClassNameW")
def GetClassNameW (hwnd, pszType, cchType=None):
if cchType is None:
cchType = len(pszType)
return GetClassNameW .ctypes_function(hwnd, pszType, cchType)
# ## Version stuff ## #
@VersionProxy("GetFileVersionInfoA")
@@ -1648,3 +1687,35 @@ def ShellExecuteA(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd
@Shell32Proxy('ShellExecuteW')
def ShellExecuteW(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd):
return ShellExecuteW.ctypes_function(hwnd, lpOperation, lpFile, lpParameters, lpDirectory, nShowCmd)
# Transactions #
@Kernel32Proxy("CreateFileTransactedA", error_check=valid_handle_check)
def CreateFileTransactedA(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, pExtendedParameter):
return CreateFileTransactedA.ctypes_function(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, pExtendedParameter)
@Kernel32Proxy("CreateFileTransactedW", error_check=valid_handle_check)
def CreateFileTransactedW(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, pExtendedParameter):
return CreateFileTransactedW.ctypes_function(lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes, dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile, hTransaction, pusMiniVersion, pExtendedParameter)
@Ktmw32Proxy("CommitTransaction")
def CommitTransaction(TransactionHandle):
return CommitTransaction.ctypes_function(TransactionHandle)
@Ktmw32Proxy("CreateTransaction")
def CreateTransaction(lpTransactionAttributes, UOW, CreateOptions, IsolationLevel, IsolationFlags, Timeout, Description):
return CreateTransaction.ctypes_function(lpTransactionAttributes, UOW, CreateOptions, IsolationLevel, IsolationFlags, Timeout, Description)
@Ktmw32Proxy("RollbackTransaction")
def RollbackTransaction(TransactionHandle):
return RollbackTransaction.ctypes_function(TransactionHandle)
@Ktmw32Proxy("OpenTransaction")
def OpenTransaction(dwDesiredAccess, TransactionId):
return OpenTransaction.ctypes_function(dwDesiredAccess, TransactionId)