From 799bca8d3f8753f97ddd50e8b20aa7f35ac5d4be Mon Sep 17 00:00:00 2001 From: Clement Rouault Date: Thu, 20 Apr 2017 11:52:56 +0200 Subject: [PATCH] Fix BitsCopyCallback callback prototype + print error code on bits job error --- TODO | 2 +- windows/bits.py | 37 ++++++++++++++++++++++++++----------- 2 files changed, 27 insertions(+), 12 deletions(-) diff --git a/TODO b/TODO index 92f79b3..b2b5f9a 100644 --- a/TODO +++ b/TODO @@ -1,5 +1,6 @@ TODO: - Documentation + - thread.set_context in a sample - Better WMI interface - Bug in VARIANT_TYPE == BOOL (see Win32_OperatingSystem->Debug) @@ -24,7 +25,6 @@ TODO: - Clean pe_parse.py - - wintrust doc: add : https://blogs.msdn.microsoft.com/winsdk/2016/01/05/why-cryptcatadmincalchashfromfilehandle-fails-with-a-seemingly-unexpected-error-code/ diff --git a/windows/bits.py b/windows/bits.py index 3c00298..7f8ebb3 100644 --- a/windows/bits.py +++ b/windows/bits.py @@ -1,7 +1,10 @@ +import threading + import windows import windows.com -from windows.generated_def.interfaces import IBackgroundCopyManager, IEnumBackgroundCopyJobs, IBackgroundCopyJob, IBackgroundCopyCallback, COMImplementation, IUnknown -from windows.generated_def import DWORD, BG_JOB_TYPE_UPLOAD, BG_JOB_STATE_SUSPENDED +from windows.generated_def.interfaces import (IBackgroundCopyManager, IEnumBackgroundCopyJobs, IBackgroundCopyJob, + IBackgroundCopyCallback, COMImplementation, IUnknown, IBackgroundCopyError) +from windows.generated_def import DWORD, BG_JOB_TYPE_UPLOAD, BG_JOB_STATE_SUSPENDED, BG_ERROR_CONTEXT, HRESULT BackgroundCopyManager = windows.com.IID.from_string("4991d34b-80a1-4291-83b6-3328366b9097") BackgroundCopyManager1_5 = windows.com.IID.from_string("f087771f-d74f-4c1a-bb8a-e16aca9124ea") @@ -10,16 +13,10 @@ BackgroundCopyManager2_5 = windows.com.IID.from_string("03ca98d6-ff5d-49b8-abc6- BackgroundCopyManager3_0 = windows.com.IID.from_string("659cdea7-489e-11d9-a9cd-000d56965251") - - -import threading - - - class BitsCopyCallback(COMImplementation): IMPLEMENT = IBackgroundCopyCallback - def JobError(self, job, error): + def JobError(self, this, job, error): return True def JobTransferred(self, this, job): @@ -34,7 +31,16 @@ class BitsCopyCallbackSetEvent(BitsCopyCallback): super(BitsCopyCallbackSetEvent, self).__init__() self.event = event - def JobError(self, job, error): + # With the current generated_def.interface design, the current + # prototype is: + # ctypes.WINFUNCTYPE(HRESULT, PVOID, PVOID)(4, "JobError") + # How should I address that ? + def JobError(self, this, job, error): + job = BitsCopyJob(job) + error = BitsCopyError(error) + errcode, errctx = error.error + print("Copy failed with error code <{0:#x}> (ctx={1})".format(errcode, errctx)) + print("see ") self.event.set() return True @@ -89,4 +95,13 @@ class BitsCopyJob(IBackgroundCopyJob): def __repr__(self): - return '<{0} iid="{1}" at {2:#08x}>'.format(type(self).__name__, self.iid.to_string(), id(self)) \ No newline at end of file + return '<{0} iid="{1}" at {2:#08x}>'.format(type(self).__name__, self.iid.to_string(), id(self)) + + +class BitsCopyError(IBackgroundCopyError): + @property + def error(self): + err_ctx = BG_ERROR_CONTEXT() + err = HRESULT() + self.GetError(err_ctx, err) + return (err.value & 0xffffffff, err_ctx) \ No newline at end of file