mirror of
https://github.com/hakril/PythonForWindows
synced 2026-06-08 14:31:45 +00:00
105 lines
2.8 KiB
Python
105 lines
2.8 KiB
Python
import sys
|
|
import pytest
|
|
import os.path
|
|
|
|
import windows.rpc as rpc
|
|
from windows.rpc import ndr
|
|
import windows.generated_def as gdef
|
|
|
|
from .pfwtest import *
|
|
|
|
|
|
|
|
UAC_UIID = "201ef99a-7fa0-444c-9399-19ba84f12a1a"
|
|
|
|
|
|
|
|
def test_rpc_epmapper():
|
|
endpoints = windows.rpc.find_alpc_endpoints(UAC_UIID)
|
|
assert endpoints
|
|
endpoint = endpoints[0]
|
|
assert endpoint.protseq == "ncalrpc"
|
|
assert endpoint.endpoint
|
|
assert endpoint.object.Uuid.to_string().lower() == UAC_UIID
|
|
|
|
|
|
# NDR Descriptions
|
|
class NDRPoint(ndr.NdrStructure):
|
|
MEMBERS = [ndr.NdrLong, ndr.NdrLong]
|
|
|
|
class NdrUACStartupInfo(ndr.NdrStructure):
|
|
MEMBERS = [ndr.NdrUniquePTR(ndr.NdrWString),
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
NDRPoint]
|
|
|
|
class UACParameters(ndr.NdrParameters):
|
|
MEMBERS = [ndr.NdrUniquePTR(ndr.NdrWString),
|
|
ndr.NdrUniquePTR(ndr.NdrWString),
|
|
ndr.NdrLong,
|
|
ndr.NdrLong,
|
|
ndr.NdrWString,
|
|
ndr.NdrWString,
|
|
NdrUACStartupInfo,
|
|
ndr.NdrLong,
|
|
ndr.NdrLong]
|
|
|
|
class NdrProcessInformation(ndr.NdrParameters):
|
|
MEMBERS = [ndr.NdrLong] * 4
|
|
|
|
|
|
def test_rpc_uac_call():
|
|
client = windows.rpc.find_alpc_endpoint_and_connect(UAC_UIID)
|
|
iid = client.bind(UAC_UIID)
|
|
|
|
python_path = sys.executable
|
|
python_name = os.path.basename(python_path)
|
|
|
|
# Marshalling parameters.
|
|
parameters = UACParameters.pack([
|
|
python_path + "\x00", # Application Path
|
|
python_path + "\x00", # Commandline
|
|
0, # UAC-Request Flag
|
|
gdef.CREATE_UNICODE_ENVIRONMENT, # dwCreationFlags
|
|
"\x00", # StartDirectory
|
|
"WinSta0\\Default\x00", # Station
|
|
# Startup Info
|
|
(None, # Title
|
|
0, # dwX
|
|
0, # dwY
|
|
0, # dwXSize
|
|
0, # dwYSize
|
|
0, # dwXCountChars
|
|
0, # dwYCountChars
|
|
0, # dwFillAttribute
|
|
0, # dwFlags
|
|
5, # wShowWindow
|
|
# Point structure: Use MonitorFromPoint to setup StartupInfo.hStdOutput
|
|
(0, 0)),
|
|
0, # Window-Handle to know if UAC can steal focus
|
|
0xffffffff]) # UAC Timeout
|
|
|
|
|
|
result = client.call(iid, 0, parameters)
|
|
stream = ndr.NdrStream(result)
|
|
|
|
ph, th, pid, tid = NdrProcessInformation.unpack(stream)
|
|
return_value = ndr.NdrLong.unpack(stream)
|
|
assert ph
|
|
assert pid
|
|
assert th
|
|
assert tid
|
|
windows.winproxy.CloseHandle(th) # NoLeak
|
|
proc = windows.WinProcess(handle=ph)
|
|
assert proc.name == python_name
|
|
assert proc.pid == pid
|
|
proc.exit(0)
|
|
|