mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
Compare commits
7 Commits
target_1_0_2
...
master
| Author | SHA1 | Date | |
|---|---|---|---|
| f920ff5644 | |||
| d6ad3343e8 | |||
| 7142a8ddb8 | |||
| cf09ed86a9 | |||
| 1509f7bd56 | |||
| c7c8830ce5 | |||
| c46f086b88 |
@@ -20,7 +20,7 @@ def dumped_apisetmap_base_and_version(request):
|
||||
ctypes_data = ctypes.c_buffer(data)
|
||||
yield ctypes.addressof(ctypes_data), version
|
||||
|
||||
KNOWN_APISETMAP_PREFIX = ["api-", "ext-", "MS-Win-"]
|
||||
KNOWN_APISETMAP_PREFIX = ["api-", "ext-", "MS-Win-", "SchemaExt-"]
|
||||
|
||||
def verify_apisetmap_parsing(apisetmap_base, version=None):
|
||||
if version is not None:
|
||||
|
||||
@@ -58,6 +58,11 @@ target = "APPP\x01\x02\x03\x04\x05\x06\x07\x08\x44PPP\x09\x0a\x0b\x0c\x0d\x0e\x0
|
||||
NDR_PACK_TEST_CASE = [
|
||||
# Simple case
|
||||
(ndr.make_structure([ndr.NdrLong, ndr.NdrLong]), (2, 2), b"\x02\x00\x00\x00\x02\x00\x00\x00"),
|
||||
# String case, test packing works + \x00 is added if not present in string
|
||||
(ndr.NdrCString, "Hello", b"\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00Hello\x00PP"),
|
||||
(ndr.NdrCString, "Hello\x00", b"\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00Hello\x00PP"),
|
||||
(ndr.NdrWString, "Hello", b"\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00H\x00e\x00l\x00l\x00o\x00\x00\x00"),
|
||||
(ndr.NdrWString, "Hello\x00", b"\x06\x00\x00\x00\x00\x00\x00\x00\x06\x00\x00\x00H\x00e\x00l\x00l\x00o\x00\x00\x00"),
|
||||
# Test GUID packing
|
||||
(ndr.NdrGuid, gdef.GUID.from_string("42424242-42424242-4242-4242-424242424242"), b"BBBBBBBBBBBBBBBB"),
|
||||
# Test CtxHandle packing
|
||||
|
||||
+8
-1
@@ -160,6 +160,9 @@ class NdrWString(object):
|
||||
return None
|
||||
if not data.endswith('\x00'):
|
||||
data += '\x00'
|
||||
# Technically windows NDR seems to accept any bitstream that ends with '\x00\x00' here
|
||||
# And not limited to valid utf-16
|
||||
# Exemple: b'\x41\x00\x00\xD8'
|
||||
data = data.encode("utf-16-le")
|
||||
l = (len(data) // 2)
|
||||
result = struct.pack("<3I", l, 0, l)
|
||||
@@ -179,7 +182,7 @@ class NdrWString(object):
|
||||
|
||||
@classmethod
|
||||
def get_alignment(self):
|
||||
# Not sur, but size is on 4 bytes so...
|
||||
# Not sure, but size is on 4 bytes so...
|
||||
return 4
|
||||
|
||||
class NdrCString(object):
|
||||
@@ -190,6 +193,10 @@ class NdrCString(object):
|
||||
return None
|
||||
if not data.endswith('\x00'):
|
||||
data += '\x00'
|
||||
# Windows NDR seems to accept any bitstream in a FC_C_CSTRING
|
||||
# I was able to send range(1, 256) + b"\x00"
|
||||
# For now play safe for user and only accept encoded with always keep the same number of bytes
|
||||
data = data.encode("ascii")
|
||||
l = len(data)
|
||||
result = struct.pack("<3I", l, 0, l)
|
||||
result += data
|
||||
|
||||
Reference in New Issue
Block a user