VirtualBox

source: vbox/trunk/src/VBox/ValidationKit/testdriver/winbase.py@ 67954

Last change on this file since 67954 was 62484, checked in by vboxsync, 8 years ago

(C) 2016

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 8.9 KB
Line 
1# -*- coding: utf-8 -*-
2# $Id: winbase.py 62484 2016-07-22 18:35:33Z vboxsync $
3
4"""
5This module is here to externalize some Windows specifics that gives pychecker
6a hard time when running on non-Windows systems.
7"""
8
9__copyright__ = \
10"""
11Copyright (C) 2010-2016 Oracle Corporation
12
13This file is part of VirtualBox Open Source Edition (OSE), as
14available from http://www.virtualbox.org. This file is free software;
15you can redistribute it and/or modify it under the terms of the GNU
16General Public License (GPL) as published by the Free Software
17Foundation, in version 2 as it comes in the "COPYING" file of the
18VirtualBox OSE distribution. VirtualBox OSE is distributed in the
19hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
20
21The contents of this file may alternatively be used under the terms
22of the Common Development and Distribution License Version 1.0
23(CDDL) only, as it comes in the "COPYING.CDDL" file of the
24VirtualBox OSE distribution, in which case the provisions of the
25CDDL are applicable instead of those of the GPL.
26
27You may elect to license modified versions of this file under the
28terms and conditions of either the GPL or the CDDL or both.
29"""
30__version__ = "$Revision: 62484 $"
31
32
33# Standard Python imports.
34import os;
35import ctypes;
36
37# Windows specific imports.
38import win32api; # pylint: disable=import-error
39import win32con; # pylint: disable=import-error
40import win32console; # pylint: disable=import-error
41import win32event; # pylint: disable=import-error
42import win32process; # pylint: disable=import-error
43
44# Validation Kit imports.
45from testdriver import reporter;
46
47
48
49#
50# Windows specific implementation of base functions.
51#
52
53def processInterrupt(uPid):
54 """
55 The Windows version of base.processInterrupt
56
57 Note! This doesn't work terribly well with a lot of processes.
58 """
59 try:
60 # pylint: disable=no-member
61 win32console.GenerateConsoleCtrlEvent(win32con.CTRL_BREAK_EVENT, uPid);
62 #GenerateConsoleCtrlEvent = ctypes.windll.kernel32.GenerateConsoleCtrlEvent
63 #rc = GenerateConsoleCtrlEvent(1, uPid);
64 #reporter.log('GenerateConsoleCtrlEvent -> %s' % (rc,));
65 fRc = True;
66 except:
67 reporter.logXcpt('uPid=%s' % (uPid,));
68 fRc = False;
69 return fRc;
70
71def postThreadMesssageClose(uTid):
72 """ Posts a WM_CLOSE message to the specified thread."""
73 fRc = False;
74 try:
75 win32api.PostThreadMessage(uTid, win32con.WM_CLOSE, 0, 0); # pylint: disable=no-member
76 fRc = True;
77 except:
78 reporter.logXcpt('uTid=%s' % (uTid,));
79 return fRc;
80
81def postThreadMesssageQuit(uTid):
82 """ Posts a WM_QUIT message to the specified thread."""
83 fRc = False;
84 try:
85 win32api.PostThreadMessage(uTid, win32con.WM_QUIT, 0x40010004, 0); # DBG_TERMINATE_PROCESS # pylint: disable=no-member
86 fRc = True;
87 except:
88 reporter.logXcpt('uTid=%s' % (uTid,));
89 return fRc;
90
91def processTerminate(uPid):
92 """ The Windows version of base.processTerminate """
93 # pylint: disable=no-member
94 fRc = False;
95 try:
96 hProcess = win32api.OpenProcess(win32con.PROCESS_TERMINATE, False, uPid);
97 except:
98 reporter.logXcpt('uPid=%s' % (uPid,));
99 else:
100 try:
101 win32process.TerminateProcess(hProcess, 0x40010004); # DBG_TERMINATE_PROCESS
102 fRc = True;
103 except:
104 reporter.logXcpt('uPid=%s' % (uPid,));
105 win32api.CloseHandle(hProcess)
106 return fRc;
107
108def processKill(uPid):
109 """ The Windows version of base.processKill """
110 return processTerminate(uPid);
111
112def processExists(uPid):
113 """ The Windows version of base.processExists """
114 # pylint: disable=no-member
115 fRc = False;
116 try:
117 hProcess = win32api.OpenProcess(win32con.PROCESS_QUERY_INFORMATION, False, uPid);
118 except:
119 reporter.logXcpt('uPid=%s' % (uPid,));
120 else:
121 win32api.CloseHandle(hProcess)
122 fRc = True;
123 return fRc;
124
125def processCheckPidAndName(uPid, sName):
126 """ The Windows version of base.processCheckPidAndName """
127 fRc = processExists(uPid);
128 if fRc is True:
129 try:
130 from win32com.client import GetObject; # pylint: disable=F0401
131 oWmi = GetObject('winmgmts:');
132 aoProcesses = oWmi.InstancesOf('Win32_Process');
133 for oProcess in aoProcesses:
134 if long(oProcess.Properties_("ProcessId").Value) == uPid:
135 sCurName = oProcess.Properties_("Name").Value;
136 reporter.log2('uPid=%s sName=%s sCurName=%s' % (uPid, sName, sCurName));
137 sName = sName.lower();
138 sCurName = sCurName.lower();
139 if os.path.basename(sName) == sName:
140 sCurName = os.path.basename(sCurName);
141
142 if sCurName == sName \
143 or sCurName + '.exe' == sName \
144 or sCurName == sName + '.exe':
145 fRc = True;
146 break;
147 except:
148 reporter.logXcpt('uPid=%s sName=%s' % (uPid, sName));
149 return fRc;
150
151#
152# Some helper functions.
153#
154def processCreate(sName, asArgs):
155 """
156 Returns a (pid, handle, tid) tuple on success. (-1, None) on failure (logged).
157 """
158
159 # Construct a command line.
160 sCmdLine = '';
161 for sArg in asArgs:
162 if sCmdLine == '':
163 sCmdLine += '"';
164 else:
165 sCmdLine += ' "';
166 sCmdLine += sArg;
167 sCmdLine += '"';
168
169 # Try start the process.
170 # pylint: disable=no-member
171 dwCreationFlags = win32con.CREATE_NEW_PROCESS_GROUP;
172 oStartupInfo = win32process.STARTUPINFO();
173 try:
174 (hProcess, hThread, uPid, uTid) = win32process.CreateProcess(sName,
175 sCmdLine, # CommandLine
176 None, # ProcessAttributes
177 None, # ThreadAttibutes
178 1, # fInheritHandles
179 dwCreationFlags,
180 None, # Environment
181 None, # CurrentDirectory.
182 oStartupInfo);
183 except:
184 reporter.logXcpt('sName="%s" sCmdLine="%s"' % (sName, sCmdLine));
185 return (-1, None, -1);
186
187 # Dispense with the thread handle.
188 try:
189 win32api.CloseHandle(hThread);
190 except:
191 reporter.logXcpt();
192
193 # Try get full access to the process.
194 try:
195 hProcessFullAccess = win32api.DuplicateHandle(
196 win32api.GetCurrentProcess(),
197 hProcess,
198 win32api.GetCurrentProcess(),
199 win32con.PROCESS_TERMINATE
200 | win32con.PROCESS_QUERY_INFORMATION
201 | win32con.SYNCHRONIZE
202 | win32con.DELETE,
203 False,
204 0);
205 win32api.CloseHandle(hProcess);
206 hProcess = hProcessFullAccess;
207 except:
208 reporter.logXcpt();
209 reporter.log2('processCreate -> %#x, hProcess=%#x' % (uPid, hProcess,));
210 return (uPid, hProcess, uTid);
211
212def processPollByHandle(hProcess):
213 """
214 Polls the process handle to see if it has finished (True) or not (False).
215 """
216 try:
217 dwWait = win32event.WaitForSingleObject(hProcess, 0); # pylint: disable=no-member
218 except:
219 reporter.logXcpt('hProcess=%s %#x' % (hProcess, hProcess,));
220 return True;
221 return dwWait != win32con.WAIT_TIMEOUT; #0x102; #
222
223
224def processTerminateByHandle(hProcess):
225 """
226 Terminates the process.
227 """
228 try:
229 win32api.TerminateProcess(hProcess, 0x40010004); # DBG_TERMINATE_PROCESS # pylint: disable=no-member
230 except:
231 reporter.logXcpt('hProcess=%s %#x' % (hProcess, hProcess,));
232 return False;
233 return True;
234
235#
236# Misc
237#
238
239def logMemoryStats():
240 """
241 Logs windows memory stats.
242 """
243 class MemoryStatusEx(ctypes.Structure):
244 """ MEMORYSTATUSEX """
245 kaFields = [
246 ( 'dwLength', ctypes.c_ulong ),
247 ( 'dwMemoryLoad', ctypes.c_ulong ),
248 ( 'ullTotalPhys', ctypes.c_ulonglong ),
249 ( 'ullAvailPhys', ctypes.c_ulonglong ),
250 ( 'ullTotalPageFile', ctypes.c_ulonglong ),
251 ( 'ullAvailPageFile', ctypes.c_ulonglong ),
252 ( 'ullTotalVirtual', ctypes.c_ulonglong ),
253 ( 'ullAvailVirtual', ctypes.c_ulonglong ),
254 ( 'ullAvailExtendedVirtual', ctypes.c_ulonglong ),
255 ];
256 _fields_ = kaFields; # pylint: disable=invalid-name
257
258 def __init__(self):
259 super(MemoryStatusEx, self).__init__();
260 self.dwLength = ctypes.sizeof(self);
261
262 try:
263 oStats = MemoryStatusEx();
264 ctypes.windll.kernel32.GlobalMemoryStatusEx(ctypes.byref(oStats));
265 except:
266 reporter.logXcpt();
267 return False;
268
269 reporter.log('Memory statistics:');
270 for sField, _ in MemoryStatusEx.kaFields:
271 reporter.log(' %32s: %s' % (sField, getattr(oStats, sField)));
272 return True;
273
Note: See TracBrowser for help on using the repository browser.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette