diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index d99b6c52..8fdba415 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -6,6 +6,8 @@ on: pull_request: branches: [master] +permissions: read-all + jobs: lint: runs-on: ubuntu-latest diff --git a/speakeasy/config.py b/speakeasy/config.py index b02ba363..5dc38a99 100644 --- a/speakeasy/config.py +++ b/speakeasy/config.py @@ -232,6 +232,12 @@ {"name": "wkscli", "base_addr": "0x5fc00000", "path": "C:\\Windows\\system32\\wkscli.dll"}, {"name": "iphlpapi", "base_addr": "0x5fd00000", "path": "C:\\Windows\\system32\\iphlpapi.dll"}, {"name": "sfc_os", "base_addr": "0x5fe00000", "path": "C:\\Windows\\system32\\sfc_os.dll"}, + {"name": "winmm", "base_addr": "0x5ff00000", "path": "C:\\Windows\\system32\\winmm.dll"}, + { + "name": "bcryptprimitives", + "base_addr": "0x60000000", + "path": "C:\\Windows\\system32\\bcryptprimitives.dll", + }, ], }, } diff --git a/speakeasy/version.py b/speakeasy/version.py index 4b3c3ea5..9b8d3ee1 100644 --- a/speakeasy/version.py +++ b/speakeasy/version.py @@ -1 +1 @@ -__version__ = "2.0.0a1" +__version__ = "2.0.0b1" diff --git a/speakeasy/windows/objman.py b/speakeasy/windows/objman.py index 5274e798..87566e3a 100644 --- a/speakeasy/windows/objman.py +++ b/speakeasy/windows/objman.py @@ -552,6 +552,8 @@ def get_std_handle(self, dev): STD_OUTPUT_HANDLE = 0xFFFFFFF5 STD_ERROR_HANDLE = 0xFFFFFFF4 + dev = dev & 0xFFFFFFFF + for k, v in ( (STD_INPUT_HANDLE, self.stdin), (STD_OUTPUT_HANDLE, self.stdout), diff --git a/speakeasy/windows/winemu.py b/speakeasy/windows/winemu.py index ea8f1145..47787a7f 100644 --- a/speakeasy/windows/winemu.py +++ b/speakeasy/windows/winemu.py @@ -496,6 +496,36 @@ def setup_user_shared_data(self): # This is a read-only address for KUSER_SHARED_DATA, # and this is the same address for 32-bit and 64-bit. self.mem_map(self.page_size, base=0x7FFE0000, tag="emu.struct.KUSER_SHARED_DATA") + self._populate_user_shared_data(0x7FFE0000) + + def _populate_user_shared_data(self, base): + import struct + import time + + now_100ns = int(time.time() * 10_000_000) + 116444736000000000 + tick_ms = int(time.monotonic() * 1000) & 0xFFFFFFFF + + data = bytearray(0x400) + + # InterruptTime (offset 0x008): KSYSTEM_TIME {LowPart, High1Time, High2Time} + interrupt_100ns = int(time.monotonic() * 10_000_000) + struct.pack_into( + "> 32, interrupt_100ns >> 32 + ) + # SystemTime (offset 0x014): KSYSTEM_TIME + struct.pack_into("> 32, now_100ns >> 32) + # NtMajorVersion (offset 0x260) + struct.pack_into("