Skip to content

Commit 3151155

Browse files
committed
Added a fonction to translate comdate format to datetime + fix DisableWow64FsRedirection for 32b system
1 parent 38aef8e commit 3151155

1 file changed

Lines changed: 17 additions & 2 deletions

File tree

windows/utils/winutils.py

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,11 @@ def check_debug():
213213

214214
UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0)
215215
WINDOWS_EPOCH = datetime.datetime(1601, 1, 1, 0, 0)
216+
# https://docs.microsoft.com/en-us/cpp/atl-mfc-shared/date-type?view=vs-2019
217+
# Why keep it simple and have only one epoch ? :D
218+
# I don't want to name this "DATE_EPOCH" as everything is a DATE
219+
# So let's go with COMDATE as this structure seems very related to COM/AUTOMATION
220+
COMDATE_EPOCH = datetime.datetime(1899, 12, 30, 0, 0)
216221

217222
WIN_TO_UNIX_EPOCH_SECOND = int((UNIX_EPOCH - WINDOWS_EPOCH).total_seconds())
218223
WIN_TICK_PER_SECOND_INT = 10**7
@@ -252,6 +257,16 @@ def filetime_from_datetime(dtime):
252257
"""Return the FILETIME value from a :class:`datetime.datetime` in a python :class:`int`"""
253258
return int((dtime - WINDOWS_EPOCH).total_seconds()) * WIN_TICK_PER_SECOND_INT
254259

260+
def datetime_from_comdate(comtime):
261+
# Hour values are expressed as the absolute value of the fractional part of the number.
262+
if comtime < 0:
263+
# The date timeline becomes discontinuous for date values less than 0 (before 30 December 1899). This is because the whole-number portion of the date value is treated as signed, while the fractional part is treated as unsigned.
264+
# other words, the whole-number part of the date value may be positive or negative, while the fractional part of the date value is always added to the overall logical date.
265+
# WTF :D
266+
dec, nb = math.modf(comtime)
267+
final_delta = nb + abs(dec)
268+
return COMDATE_EPOCH + datetime.timedelta(final_delta)
269+
return COMDATE_EPOCH + datetime.timedelta(comtime)
255270

256271
class FixedInteractiveConsole(code.InteractiveConsole):
257272
def raw_input(self, prompt=">>>"):
@@ -573,14 +588,14 @@ def pop_calc_64():
573588
return windows.utils.create_process(r"C:\Windows\system32\calc.exe", True)
574589
"""
575590
def __enter__(self):
576-
if windows.current_process.bitness == 64:
591+
if windows.current_process.bitness == 64 or windows.system.bitness == 32:
577592
return self
578593
self.OldValue = PVOID()
579594
winproxy.Wow64DisableWow64FsRedirection(ctypes.byref(self.OldValue))
580595
return self
581596

582597
def __exit__(self, exc_type, exc_value, traceback):
583-
if windows.current_process.bitness == 64:
598+
if windows.current_process.bitness == 64 or windows.system.bitness == 32:
584599
return False
585600
winproxy.Wow64RevertWow64FsRedirection(self.OldValue)
586601
return False

0 commit comments

Comments
 (0)