123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- # A demo of the Windows CE Remote API
- #
- # This connects to a CE device, and interacts with it.
-
- import getopt
- import os
- import sys
-
- import win32api
- import win32con
- import win32event
- import wincerapi
-
-
- def DumpPythonRegistry():
- try:
- h = wincerapi.CeRegOpenKeyEx(
- win32con.HKEY_LOCAL_MACHINE,
- "Software\\Python\\PythonCore\\%s\\PythonPath" % sys.winver,
- )
- except win32api.error:
- print("The remote device does not appear to have Python installed")
- return 0
- path, typ = wincerapi.CeRegQueryValueEx(h, None)
- print("The remote PythonPath is '%s'" % (str(path),))
- h.Close()
- return 1
-
-
- def DumpRegistry(root, level=0):
- # A recursive dump of the remote registry to test most functions.
- h = wincerapi.CeRegOpenKeyEx(win32con.HKEY_LOCAL_MACHINE, None)
- level_prefix = " " * level
- index = 0
- # Enumerate values.
- while 1:
- try:
- name, data, typ = wincerapi.CeRegEnumValue(root, index)
- except win32api.error:
- break
- print("%s%s=%s" % (level_prefix, name, repr(str(data))))
- index = index + 1
- # Now enumerate all keys.
- index = 0
- while 1:
- try:
- name, klass = wincerapi.CeRegEnumKeyEx(root, index)
- except win32api.error:
- break
- print("%s%s\\" % (level_prefix, name))
- subkey = wincerapi.CeRegOpenKeyEx(root, name)
- DumpRegistry(subkey, level + 1)
- index = index + 1
-
-
- def DemoCopyFile():
- # Create a file on the device, and write a string.
- cefile = wincerapi.CeCreateFile(
- "TestPython", win32con.GENERIC_WRITE, 0, None, win32con.OPEN_ALWAYS, 0, None
- )
- wincerapi.CeWriteFile(cefile, "Hello from Python")
- cefile.Close()
- # reopen the file and check the data.
- cefile = wincerapi.CeCreateFile(
- "TestPython", win32con.GENERIC_READ, 0, None, win32con.OPEN_EXISTING, 0, None
- )
- if wincerapi.CeReadFile(cefile, 100) != "Hello from Python":
- print("Couldnt read the data from the device!")
- cefile.Close()
- # Delete the test file
- wincerapi.CeDeleteFile("TestPython")
- print("Created, wrote to, read from and deleted a test file!")
-
-
- def DemoCreateProcess():
- try:
- hp, ht, pid, tid = wincerapi.CeCreateProcess(
- "Windows\\Python.exe", "", None, None, 0, 0, None, "", None
- )
-
- # Not necessary, except to see if handle closing raises an exception
- # (if auto-closed, the error is suppressed)
- hp.Close()
- ht.Close()
- print("Python is running on the remote device!")
- except win32api.error as xxx_todo_changeme1:
- (hr, fn, msg) = xxx_todo_changeme1.args
- print("Couldnt execute remote process -", msg)
-
-
- def DumpRemoteMachineStatus():
- (
- ACLineStatus,
- BatteryFlag,
- BatteryLifePercent,
- BatteryLifeTime,
- BatteryFullLifeTime,
- BackupBatteryFlag,
- BackupBatteryLifePercent,
- BackupBatteryLifeTime,
- BackupBatteryLifeTime,
- ) = wincerapi.CeGetSystemPowerStatusEx()
- if ACLineStatus:
- power = "AC"
- else:
- power = "battery"
- if BatteryLifePercent == 255:
- batPerc = "unknown"
- else:
- batPerc = BatteryLifePercent
- print(
- "The batteries are at %s%%, and is currently being powered by %s"
- % (batPerc, power)
- )
-
- (
- memLoad,
- totalPhys,
- availPhys,
- totalPage,
- availPage,
- totalVirt,
- availVirt,
- ) = wincerapi.CeGlobalMemoryStatus()
-
- print("The memory is %d%% utilized." % (memLoad))
- print("%-20s%-10s%-10s" % ("", "Total", "Avail"))
- print("%-20s%-10s%-10s" % ("Physical Memory", totalPhys, availPhys))
- print("%-20s%-10s%-10s" % ("Virtual Memory", totalVirt, availVirt))
- print("%-20s%-10s%-10s" % ("Paging file", totalPage, availPage))
-
- storeSize, freeSize = wincerapi.CeGetStoreInformation()
- print("%-20s%-10s%-10s" % ("File store", storeSize, freeSize))
-
- print("The CE temp path is", wincerapi.CeGetTempPath())
- print("The system info for the device is", wincerapi.CeGetSystemInfo())
-
-
- def DumpRemoteFolders():
- # Dump all special folders possible.
- for name, val in list(wincerapi.__dict__.items()):
- if name[:6] == "CSIDL_":
- try:
- loc = str(wincerapi.CeGetSpecialFolderPath(val))
- print("Folder %s is at %s" % (name, loc))
- except win32api.error as details:
- pass
-
- # Get the shortcut targets for the "Start Menu"
- print("Dumping start menu shortcuts...")
- try:
- startMenu = str(wincerapi.CeGetSpecialFolderPath(wincerapi.CSIDL_STARTMENU))
- except win32api.error as details:
- print("This device has no start menu!", details)
- startMenu = None
-
- if startMenu:
- for fileAttr in wincerapi.CeFindFiles(os.path.join(startMenu, "*")):
- fileName = fileAttr[8]
- fullPath = os.path.join(startMenu, str(fileName))
- try:
- resolved = wincerapi.CeSHGetShortcutTarget(fullPath)
- except win32api.error as xxx_todo_changeme:
- (rc, fn, msg) = xxx_todo_changeme.args
- resolved = "#Error - %s" % msg
- print("%s->%s" % (fileName, resolved))
-
- # print "The start menu is at",
- # print wincerapi.CeSHGetShortcutTarget("\\Windows\\Start Menu\\Shortcut to Python.exe.lnk")
-
-
- def usage():
- print("Options:")
- print("-a - Execute all demos")
- print("-p - Execute Python process on remote device")
- print("-r - Dump the remote registry")
- print("-f - Dump all remote special folder locations")
- print("-s - Dont dump machine status")
- print("-y - Perform asynch init of CE connection")
-
-
- def main():
- async_init = bStartPython = bDumpRegistry = bDumpFolders = 0
- bDumpStatus = 1
- try:
- opts, args = getopt.getopt(sys.argv[1:], "apr")
- except getopt.error as why:
- print("Invalid usage:", why)
- usage()
- return
-
- for o, v in opts:
- if o == "-a":
- bStartPython = bDumpRegistry = bDumpStatus = bDumpFolders = asynch_init = 1
- if o == "-p":
- bStartPython = 1
- if o == "-r":
- bDumpRegistry = 1
- if o == "-s":
- bDumpStatus = 0
- if o == "-f":
- bDumpFolders = 1
- if o == "-y":
- print("Doing asynch init of CE connection")
- async_init = 1
-
- if async_init:
- event, rc = wincerapi.CeRapiInitEx()
- while 1:
- rc = win32event.WaitForSingleObject(event, 500)
- if rc == win32event.WAIT_OBJECT_0:
- # We connected.
- break
- else:
- print(
- "Waiting for Initialize to complete (picture a Cancel button here :)"
- )
- else:
- wincerapi.CeRapiInit()
- print("Connected to remote CE device.")
- try:
- verinfo = wincerapi.CeGetVersionEx()
- print(
- "The device is running windows CE version %d.%d - %s"
- % (verinfo[0], verinfo[1], verinfo[4])
- )
-
- if bDumpStatus:
- print("Dumping remote machine status")
- DumpRemoteMachineStatus()
-
- if bDumpRegistry:
- print("Dumping remote registry...")
- DumpRegistry(win32con.HKEY_LOCAL_MACHINE)
-
- if bDumpFolders:
- print("Dumping remote folder information")
- DumpRemoteFolders()
-
- DemoCopyFile()
- if bStartPython:
- print("Starting remote Python process")
- if DumpPythonRegistry():
- DemoCreateProcess()
- else:
- print("Not trying to start Python, as it's not installed")
-
- finally:
- wincerapi.CeRapiUninit()
- print("Disconnected")
-
-
- if __name__ == "__main__":
- main()
|