PoshCode Archive  Hex Artifact Content

Artifact 0c560243c93ea6d21b4d47ca04cb428e78e091134440a0eed408db4a71d86697:

  • File Suspend-Process.ps1 — part of check-in [c2360ee6f8] at 2018-06-10 13:18:26 on branch trunk — A couple of functions to suspend and resume applications (like what you do with Resource Monitor). (user: Joel Bennett size: 5063)

0000: 23 20 65 6e 63 6f 64 69 6e 67 3a 20 61 73 63 69  # encoding: asci
0010: 69 0d 0a 23 20 61 70 69 3a 20 70 6f 77 65 72 73  i..# api: powers
0020: 68 65 6c 6c 0d 0a 23 20 74 69 74 6c 65 3a 20 53  hell..# title: S
0030: 75 73 70 65 6e 64 2d 50 72 6f 63 65 73 73 0d 0a  uspend-Process..
0040: 23 20 64 65 73 63 72 69 70 74 69 6f 6e 3a 20 41  # description: A
0050: 20 63 6f 75 70 6c 65 20 6f 66 20 66 75 6e 63 74   couple of funct
0060: 69 6f 6e 73 20 74 6f 20 73 75 73 70 65 6e 64 20  ions to suspend 
0070: 61 6e 64 20 72 65 73 75 6d 65 20 61 70 70 6c 69  and resume appli
0080: 63 61 74 69 6f 6e 73 20 28 6c 69 6b 65 20 77 68  cations (like wh
0090: 61 74 20 79 6f 75 20 64 6f 20 77 69 74 68 20 52  at you do with R
00a0: 65 73 6f 75 72 63 65 20 4d 6f 6e 69 74 6f 72 29  esource Monitor)
00b0: 2e 0d 0a 23 20 76 65 72 73 69 6f 6e 3a 20 30 2e  ...# version: 0.
00c0: 31 0d 0a 23 20 74 79 70 65 3a 20 66 75 6e 63 74  1..# type: funct
00d0: 69 6f 6e 0d 0a 23 20 61 75 74 68 6f 72 3a 20 4a  ion..# author: J
00e0: 6f 65 6c 20 42 65 6e 6e 65 74 74 0d 0a 23 20 6c  oel Bennett..# l
00f0: 69 63 65 6e 73 65 3a 20 43 43 30 0d 0a 23 20 66  icense: CC0..# f
0100: 75 6e 63 74 69 6f 6e 3a 20 53 75 73 70 65 6e 64  unction: Suspend
0110: 2d 50 72 6f 63 65 73 73 0d 0a 23 20 78 2d 70 6f  -Process..# x-po
0120: 73 68 63 6f 64 65 2d 69 64 3a 20 32 39 39 35 0d  shcode-id: 2995.
0130: 0a 23 20 78 2d 61 72 63 68 69 76 65 64 3a 20 32  .# x-archived: 2
0140: 30 31 37 2d 30 32 2d 32 36 54 31 32 3a 34 38 3a  017-02-26T12:48:
0150: 33 33 0d 0a 23 20 78 2d 70 75 62 6c 69 73 68 65  33..# x-publishe
0160: 64 3a 20 32 30 31 32 2d 31 30 2d 30 39 54 31 31  d: 2012-10-09T11
0170: 3a 33 37 3a 30 30 0d 0a 23 0d 0a 23 20 47 65 74  :37:00..#..# Get
0180: 2d 50 72 6f 63 65 73 73 20 6e 6f 74 65 70 61 64  -Process notepad
0190: 20 7c 20 53 75 73 70 65 6e 64 2d 50 72 6f 63 65   | Suspend-Proce
01a0: 73 73 0d 0a 23 20 47 65 74 2d 50 72 6f 63 65 73  ss..# Get-Proces
01b0: 73 20 6e 6f 74 65 70 61 64 20 7c 20 52 65 73 75  s notepad | Resu
01c0: 6d 65 2d 50 72 6f 63 65 73 73 0d 0a 23 20 68 33  me-Process..# h3
01d0: 2e 20 49 20 63 61 6e e2 80 99 74 20 65 6d 70 68  . I can...t emph
01e0: 61 73 69 7a 65 20 65 6e 6f 75 67 68 20 74 68 61  asize enough tha
01f0: 74 20 74 68 69 73 20 69 73 20 61 20 64 61 6e 67  t this is a dang
0200: 65 72 6f 75 73 20 74 6f 6f 6c 2e 20 0d 0a 23 20  erous tool. ..# 
0210: 55 73 69 6e 67 20 53 75 73 70 65 6e 64 2d 50 72  Using Suspend-Pr
0220: 6f 63 65 73 73 20 69 6e 20 70 61 72 74 69 63 75  ocess in particu
0230: 6c 61 72 20 6d 61 79 20 63 72 61 73 68 20 61 70  lar may crash ap
0240: 70 6c 69 63 61 74 69 6f 6e 73 2c 20 77 6f 72 6b  plications, work
0250: 20 77 6f 6e 64 65 72 66 75 6c 6c 79 2c 20 63 61   wonderfully, ca
0260: 75 73 65 20 62 6c 75 65 73 63 72 65 65 6e 73 2c  use bluescreens,
0270: 20 63 6f 72 72 75 70 74 20 6d 65 6d 6f 72 79 2c   corrupt memory,
0280: 20 6f 72 20 73 74 61 72 74 20 61 20 74 68 65 72   or start a ther
0290: 6d 6f 6e 75 63 6c 65 61 72 20 77 61 72 2e 20 50  monuclear war. P
02a0: 6c 65 61 73 65 20 75 73 65 20 72 65 73 70 6f 6e  lease use respon
02b0: 73 69 62 6c 79 2e 0d 0a 23 0d 0a 41 64 64 2d 54  sibly...#..Add-T
02c0: 79 70 65 20 2d 4e 61 6d 65 20 54 68 72 65 61 64  ype -Name Thread
02d0: 65 72 20 2d 4e 61 6d 65 73 70 61 63 65 20 22 22  er -Namespace ""
02e0: 20 2d 4d 65 6d 62 65 72 20 40 22 0d 0a 20 20 20   -Member @"..   
02f0: 5b 46 6c 61 67 73 5d 0d 0a 20 20 20 70 75 62 6c  [Flags]..   publ
0300: 69 63 20 65 6e 75 6d 20 54 68 72 65 61 64 41 63  ic enum ThreadAc
0310: 63 65 73 73 20 3a 20 69 6e 74 0d 0a 20 20 20 7b  cess : int..   {
0320: 0d 0a 20 20 20 20 20 20 54 65 72 6d 69 6e 61 74  ..      Terminat
0330: 65 20 3d 20 28 30 78 30 30 30 31 29 2c 0d 0a 20  e = (0x0001),.. 
0340: 20 20 20 20 20 53 75 73 70 65 6e 64 52 65 73 75       SuspendResu
0350: 6d 65 20 3d 20 28 30 78 30 30 30 32 29 2c 0d 0a  me = (0x0002),..
0360: 20 20 20 20 20 20 47 65 74 43 6f 6e 74 65 78 74        GetContext
0370: 20 3d 20 28 30 78 30 30 30 38 29 2c 0d 0a 20 20   = (0x0008),..  
0380: 20 20 20 20 53 65 74 43 6f 6e 74 65 78 74 20 3d      SetContext =
0390: 20 28 30 78 30 30 31 30 29 2c 0d 0a 20 20 20 20   (0x0010),..    
03a0: 20 20 53 65 74 49 6e 66 6f 72 6d 61 74 69 6f 6e    SetInformation
03b0: 20 3d 20 28 30 78 30 30 32 30 29 2c 0d 0a 20 20   = (0x0020),..  
03c0: 20 20 20 20 47 65 74 49 6e 66 6f 72 6d 61 74 69      GetInformati
03d0: 6f 6e 20 3d 20 28 30 78 30 30 34 30 29 2c 0d 0a  on = (0x0040),..
03e0: 20 20 20 20 20 20 53 65 74 54 68 72 65 61 64 54        SetThreadT
03f0: 6f 6b 65 6e 20 3d 20 28 30 78 30 30 38 30 29 2c  oken = (0x0080),
0400: 0d 0a 20 20 20 20 20 20 49 6d 70 65 72 73 6f 6e  ..      Imperson
0410: 61 74 65 20 3d 20 28 30 78 30 31 30 30 29 2c 0d  ate = (0x0100),.
0420: 0a 20 20 20 20 20 20 44 69 72 65 63 74 49 6d 70  .      DirectImp
0430: 65 72 73 6f 6e 61 74 69 6f 6e 20 3d 20 28 30 78  ersonation = (0x
0440: 30 32 30 30 29 0d 0a 20 20 20 7d 0d 0a 20 20 20  0200)..   }..   
0450: 5b 46 6c 61 67 73 5d 0d 0a 20 20 20 70 75 62 6c  [Flags]..   publ
0460: 69 63 20 65 6e 75 6d 20 50 72 6f 63 65 73 73 41  ic enum ProcessA
0470: 63 63 65 73 73 20 3a 20 75 69 6e 74 0d 0a 20 20  ccess : uint..  
0480: 20 7b 0d 0a 20 20 20 20 20 20 54 65 72 6d 69 6e   {..      Termin
0490: 61 74 65 20 3d 20 30 78 30 30 30 30 30 30 30 31  ate = 0x00000001
04a0: 2c 0d 0a 20 20 20 20 20 20 43 72 65 61 74 65 54  ,..      CreateT
04b0: 68 72 65 61 64 20 3d 20 30 78 30 30 30 30 30 30  hread = 0x000000
04c0: 30 32 2c 0d 0a 20 20 20 20 20 20 56 4d 4f 70 65  02,..      VMOpe
04d0: 72 61 74 69 6f 6e 20 3d 20 30 78 30 30 30 30 30  ration = 0x00000
04e0: 30 30 38 2c 0d 0a 20 20 20 20 20 20 56 4d 52 65  008,..      VMRe
04f0: 61 64 20 3d 20 30 78 30 30 30 30 30 30 31 30 2c  ad = 0x00000010,
0500: 0d 0a 20 20 20 20 20 20 56 4d 57 72 69 74 65 20  ..      VMWrite 
0510: 3d 20 30 78 30 30 30 30 30 30 32 30 2c 0d 0a 20  = 0x00000020,.. 
0520: 20 20 20 20 20 44 75 70 48 61 6e 64 6c 65 20 3d       DupHandle =
0530: 20 30 78 30 30 30 30 30 30 34 30 2c 0d 0a 20 20   0x00000040,..  
0540: 20 20 20 20 53 65 74 49 6e 66 6f 72 6d 61 74 69      SetInformati
0550: 6f 6e 20 3d 20 30 78 30 30 30 30 30 32 30 30 2c  on = 0x00000200,
0560: 0d 0a 20 20 20 20 20 20 51 75 65 72 79 49 6e 66  ..      QueryInf
0570: 6f 72 6d 61 74 69 6f 6e 20 3d 20 30 78 30 30 30  ormation = 0x000
0580: 30 30 34 30 30 2c 0d 0a 20 20 20 20 20 20 53 75  00400,..      Su
0590: 73 70 65 6e 64 52 65 73 75 6d 65 20 3d 20 30 78  spendResume = 0x
05a0: 30 30 30 30 30 38 30 30 2c 0d 0a 20 20 20 20 20  00000800,..     
05b0: 20 53 79 6e 63 68 72 6f 6e 69 7a 65 20 3d 20 30   Synchronize = 0
05c0: 78 30 30 31 30 30 30 30 30 2c 0d 0a 20 20 20 20  x00100000,..    
05d0: 20 20 41 6c 6c 20 3d 20 30 78 30 30 31 46 30 46    All = 0x001F0F
05e0: 46 46 0d 0a 20 20 20 7d 0d 0a 0d 0a 20 20 20 5b  FF..   }....   [
05f0: 44 6c 6c 49 6d 70 6f 72 74 28 22 6e 74 64 6c 6c  DllImport("ntdll
0600: 2e 64 6c 6c 22 2c 20 45 6e 74 72 79 50 6f 69 6e  .dll", EntryPoin
0610: 74 20 3d 20 22 4e 74 53 75 73 70 65 6e 64 50 72  t = "NtSuspendPr
0620: 6f 63 65 73 73 22 2c 20 53 65 74 4c 61 73 74 45  ocess", SetLastE
0630: 72 72 6f 72 20 3d 20 74 72 75 65 29 5d 0d 0a 20  rror = true)].. 
0640: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
0650: 65 78 74 65 72 6e 20 75 69 6e 74 20 53 75 73 70  extern uint Susp
0660: 65 6e 64 50 72 6f 63 65 73 73 28 49 6e 74 50 74  endProcess(IntPt
0670: 72 20 70 72 6f 63 65 73 73 48 61 6e 64 6c 65 29  r processHandle)
0680: 3b 0d 0a 20 20 20 0d 0a 20 20 20 5b 44 6c 6c 49  ;..   ..   [DllI
0690: 6d 70 6f 72 74 28 22 6e 74 64 6c 6c 2e 64 6c 6c  mport("ntdll.dll
06a0: 22 2c 20 45 6e 74 72 79 50 6f 69 6e 74 20 3d 20  ", EntryPoint = 
06b0: 22 4e 74 52 65 73 75 6d 65 50 72 6f 63 65 73 73  "NtResumeProcess
06c0: 22 2c 20 53 65 74 4c 61 73 74 45 72 72 6f 72 20  ", SetLastError 
06d0: 3d 20 74 72 75 65 29 5d 0d 0a 20 20 20 70 75 62  = true)]..   pub
06e0: 6c 69 63 20 73 74 61 74 69 63 20 65 78 74 65 72  lic static exter
06f0: 6e 20 75 69 6e 74 20 52 65 73 75 6d 65 50 72 6f  n uint ResumePro
0700: 63 65 73 73 28 49 6e 74 50 74 72 20 70 72 6f 63  cess(IntPtr proc
0710: 65 73 73 48 61 6e 64 6c 65 29 3b 0d 0a 20 20 20  essHandle);..   
0720: 0d 0a 20 20 20 5b 44 6c 6c 49 6d 70 6f 72 74 28  ..   [DllImport(
0730: 22 6b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 29 5d  "kernel32.dll")]
0740: 0d 0a 20 20 20 70 75 62 6c 69 63 20 73 74 61 74  ..   public stat
0750: 69 63 20 65 78 74 65 72 6e 20 49 6e 74 50 74 72  ic extern IntPtr
0760: 20 4f 70 65 6e 50 72 6f 63 65 73 73 28 50 72 6f   OpenProcess(Pro
0770: 63 65 73 73 41 63 63 65 73 73 20 64 77 44 65 73  cessAccess dwDes
0780: 69 72 65 64 41 63 63 65 73 73 2c 20 62 6f 6f 6c  iredAccess, bool
0790: 20 62 49 6e 68 65 72 69 74 48 61 6e 64 6c 65 2c   bInheritHandle,
07a0: 20 75 69 6e 74 20 64 77 50 72 6f 63 65 73 73 49   uint dwProcessI
07b0: 64 29 3b 0d 0a 0d 0a 20 20 20 5b 44 6c 6c 49 6d  d);....   [DllIm
07c0: 70 6f 72 74 28 22 6b 65 72 6e 65 6c 33 32 2e 64  port("kernel32.d
07d0: 6c 6c 22 29 5d 0d 0a 20 20 20 70 75 62 6c 69 63  ll")]..   public
07e0: 20 73 74 61 74 69 63 20 65 78 74 65 72 6e 20 49   static extern I
07f0: 6e 74 50 74 72 20 4f 70 65 6e 54 68 72 65 61 64  ntPtr OpenThread
0800: 28 54 68 72 65 61 64 41 63 63 65 73 73 20 64 77  (ThreadAccess dw
0810: 44 65 73 69 72 65 64 41 63 63 65 73 73 2c 20 62  DesiredAccess, b
0820: 6f 6f 6c 20 62 49 6e 68 65 72 69 74 48 61 6e 64  ool bInheritHand
0830: 6c 65 2c 20 75 69 6e 74 20 64 77 54 68 72 65 61  le, uint dwThrea
0840: 64 49 64 29 3b 0d 0a 20 20 20 0d 0a 20 20 20 5b  dId);..   ..   [
0850: 44 6c 6c 49 6d 70 6f 72 74 28 22 6b 65 72 6e 65  DllImport("kerne
0860: 6c 33 32 2e 64 6c 6c 22 2c 20 53 65 74 4c 61 73  l32.dll", SetLas
0870: 74 45 72 72 6f 72 3d 74 72 75 65 29 5d 0d 0a 20  tError=true)].. 
0880: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
0890: 65 78 74 65 72 6e 20 62 6f 6f 6c 20 43 6c 6f 73  extern bool Clos
08a0: 65 48 61 6e 64 6c 65 28 49 6e 74 50 74 72 20 68  eHandle(IntPtr h
08b0: 4f 62 6a 65 63 74 29 3b 0d 0a 0d 0a 20 20 20 5b  Object);....   [
08c0: 44 6c 6c 49 6d 70 6f 72 74 28 22 6b 65 72 6e 65  DllImport("kerne
08d0: 6c 33 32 2e 64 6c 6c 22 29 5d 0d 0a 20 20 20 70  l32.dll")]..   p
08e0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 65 78 74  ublic static ext
08f0: 65 72 6e 20 75 69 6e 74 20 53 75 73 70 65 6e 64  ern uint Suspend
0900: 54 68 72 65 61 64 28 49 6e 74 50 74 72 20 68 54  Thread(IntPtr hT
0910: 68 72 65 61 64 29 3b 0d 0a 0d 0a 20 20 20 5b 44  hread);....   [D
0920: 6c 6c 49 6d 70 6f 72 74 28 22 6b 65 72 6e 65 6c  llImport("kernel
0930: 33 32 2e 64 6c 6c 22 29 5d 0d 0a 20 20 20 70 75  32.dll")]..   pu
0940: 62 6c 69 63 20 73 74 61 74 69 63 20 65 78 74 65  blic static exte
0950: 72 6e 20 69 6e 74 20 52 65 73 75 6d 65 54 68 72  rn int ResumeThr
0960: 65 61 64 28 49 6e 74 50 74 72 20 68 54 68 72 65  ead(IntPtr hThre
0970: 61 64 29 3b 0d 0a 22 40 0d 0a 0d 0a 0d 0a 0d 0a  ad);.."@........
0980: 66 75 6e 63 74 69 6f 6e 20 53 75 73 70 65 6e 64  function Suspend
0990: 2d 50 72 6f 63 65 73 73 20 7b 0d 0a 70 61 72 61  -Process {..para
09a0: 6d 28 0d 0a 5b 50 61 72 61 6d 65 74 65 72 28 56  m(..[Parameter(V
09b0: 61 6c 75 65 46 72 6f 6d 50 69 70 65 6c 69 6e 65  alueFromPipeline
09c0: 3d 24 74 72 75 65 2c 4d 61 6e 64 61 74 6f 72 79  =$true,Mandatory
09d0: 3d 24 74 72 75 65 29 5d 0d 0a 5b 53 79 73 74 65  =$true)]..[Syste
09e0: 6d 2e 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72  m.Diagnostics.Pr
09f0: 6f 63 65 73 73 5d 0d 0a 24 50 72 6f 63 65 73 73  ocess]..$Process
0a00: 0d 0a 29 0d 0a 70 72 6f 63 65 73 73 20 7b 0d 0a  ..)..process {..
0a10: 20 20 20 0d 0a 20 20 20 69 66 28 28 24 70 50 72     ..   if(($pPr
0a20: 6f 63 20 3d 20 5b 54 68 72 65 61 64 65 72 5d 3a  oc = [Threader]:
0a30: 3a 4f 70 65 6e 50 72 6f 63 65 73 73 28 22 53 75  :OpenProcess("Su
0a40: 73 70 65 6e 64 52 65 73 75 6d 65 22 2c 20 24 66  spendResume", $f
0a50: 61 6c 73 65 2c 20 24 50 72 6f 63 65 73 73 2e 49  alse, $Process.I
0a60: 64 29 29 20 2d 6e 65 20 5b 49 6e 74 50 74 72 5d  d)) -ne [IntPtr]
0a70: 3a 3a 5a 65 72 6f 29 20 7b 0d 0a 20 20 20 20 20  ::Zero) {..     
0a80: 20 57 72 69 74 65 2d 56 65 72 62 6f 73 65 20 22   Write-Verbose "
0a90: 53 75 73 70 65 6e 64 69 6e 67 20 50 72 6f 63 65  Suspending Proce
0aa0: 73 73 3a 20 24 70 50 72 6f 63 22 0d 0a 20 20 20  ss: $pProc"..   
0ab0: 20 20 20 24 72 65 73 75 6c 74 20 3d 20 5b 54 68     $result = [Th
0ac0: 72 65 61 64 65 72 5d 3a 3a 53 75 73 70 65 6e 64  reader]::Suspend
0ad0: 50 72 6f 63 65 73 73 28 24 70 50 72 6f 63 29 0d  Process($pProc).
0ae0: 0a 20 20 20 20 20 20 69 66 28 24 72 65 73 75 6c  .      if($resul
0af0: 74 20 2d 6e 65 20 30 29 20 7b 0d 0a 20 20 20 20  t -ne 0) {..    
0b00: 20 20 20 20 20 57 72 69 74 65 2d 45 72 72 6f 72       Write-Error
0b10: 20 22 46 61 69 6c 65 64 20 74 6f 20 53 75 73 70   "Failed to Susp
0b20: 65 6e 64 3a 20 24 72 65 73 75 6c 74 22 0d 0a 20  end: $result".. 
0b30: 20 20 20 20 20 20 20 20 23 23 20 54 4f 44 4f 3a          ## TODO:
0b40: 20 47 65 74 4c 61 73 74 45 72 72 6f 72 28 29 0d   GetLastError().
0b50: 0a 20 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20  .      }..      
0b60: 5b 54 68 72 65 61 64 65 72 5d 3a 3a 43 6c 6f 73  [Threader]::Clos
0b70: 65 48 61 6e 64 6c 65 28 24 70 50 72 6f 63 29 0d  eHandle($pProc).
0b80: 0a 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20  .   } else {..  
0b90: 20 20 20 20 57 72 69 74 65 2d 45 72 72 6f 72 20      Write-Error 
0ba0: 22 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20  "Unable to open 
0bb0: 50 72 6f 63 65 73 73 20 24 28 24 50 72 6f 63 65  Process $($Proce
0bc0: 73 73 2e 49 64 29 2c 20 61 72 65 20 79 6f 75 20  ss.Id), are you 
0bd0: 72 75 6e 6e 69 6e 67 20 65 6c 65 76 61 74 65 64  running elevated
0be0: 3f 22 0d 0a 20 20 20 20 20 20 23 23 20 54 4f 44  ?"..      ## TOD
0bf0: 4f 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 79  O: Check if they
0c00: 27 72 65 20 65 6c 65 76 61 74 65 64 20 61 6e 64  're elevated and
0c10: 20 6f 74 68 65 72 77 69 73 65 20 47 65 74 4c 61   otherwise GetLa
0c20: 73 74 45 72 72 6f 72 28 29 0d 0a 20 20 20 7d 0d  stError()..   }.
0c30: 0a 7d 0d 0a 7d 0d 0a 66 75 6e 63 74 69 6f 6e 20  .}..}..function 
0c40: 52 65 73 75 6d 65 2d 50 72 6f 63 65 73 73 20 7b  Resume-Process {
0c50: 0d 0a 70 61 72 61 6d 28 0d 0a 5b 50 61 72 61 6d  ..param(..[Param
0c60: 65 74 65 72 28 56 61 6c 75 65 46 72 6f 6d 50 69  eter(ValueFromPi
0c70: 70 65 6c 69 6e 65 3d 24 74 72 75 65 2c 4d 61 6e  peline=$true,Man
0c80: 64 61 74 6f 72 79 3d 24 74 72 75 65 29 5d 0d 0a  datory=$true)]..
0c90: 5b 53 79 73 74 65 6d 2e 44 69 61 67 6e 6f 73 74  [System.Diagnost
0ca0: 69 63 73 2e 50 72 6f 63 65 73 73 5d 0d 0a 24 50  ics.Process]..$P
0cb0: 72 6f 63 65 73 73 0d 0a 29 0d 0a 70 72 6f 63 65  rocess..)..proce
0cc0: 73 73 20 7b 0d 0a 20 20 20 69 66 28 28 24 70 50  ss {..   if(($pP
0cd0: 72 6f 63 20 3d 20 5b 54 68 72 65 61 64 65 72 5d  roc = [Threader]
0ce0: 3a 3a 4f 70 65 6e 50 72 6f 63 65 73 73 28 22 53  ::OpenProcess("S
0cf0: 75 73 70 65 6e 64 52 65 73 75 6d 65 22 2c 20 24  uspendResume", $
0d00: 66 61 6c 73 65 2c 20 24 50 72 6f 63 65 73 73 2e  false, $Process.
0d10: 49 64 29 29 20 2d 6e 65 20 5b 49 6e 74 50 74 72  Id)) -ne [IntPtr
0d20: 5d 3a 3a 5a 65 72 6f 29 20 7b 0d 0a 20 20 20 20  ]::Zero) {..    
0d30: 20 20 57 72 69 74 65 2d 56 65 72 62 6f 73 65 20    Write-Verbose 
0d40: 22 52 65 73 75 6d 69 6e 67 20 50 72 6f 63 65 73  "Resuming Proces
0d50: 73 3a 20 24 70 50 72 6f 63 22 0d 0a 20 20 20 20  s: $pProc"..    
0d60: 20 20 24 72 65 73 75 6c 74 20 3d 20 5b 54 68 72    $result = [Thr
0d70: 65 61 64 65 72 5d 3a 3a 52 65 73 75 6d 65 50 72  eader]::ResumePr
0d80: 6f 63 65 73 73 28 24 70 50 72 6f 63 29 0d 0a 20  ocess($pProc).. 
0d90: 20 20 20 20 20 69 66 28 24 72 65 73 75 6c 74 20       if($result 
0da0: 2d 6e 65 20 30 29 20 7b 0d 0a 20 20 20 20 20 20  -ne 0) {..      
0db0: 20 20 20 57 72 69 74 65 2d 45 72 72 6f 72 20 22     Write-Error "
0dc0: 46 61 69 6c 65 64 20 74 6f 20 53 75 73 70 65 6e  Failed to Suspen
0dd0: 64 3a 20 24 72 65 73 75 6c 74 22 0d 0a 20 20 20  d: $result"..   
0de0: 20 20 20 20 20 20 23 23 20 54 4f 44 4f 3a 20 47        ## TODO: G
0df0: 65 74 4c 61 73 74 45 72 72 6f 72 28 29 0d 0a 20  etLastError().. 
0e00: 20 20 20 20 20 7d 0d 0a 20 20 20 20 20 20 5b 54       }..      [T
0e10: 68 72 65 61 64 65 72 5d 3a 3a 43 6c 6f 73 65 48  hreader]::CloseH
0e20: 61 6e 64 6c 65 28 24 70 50 72 6f 63 29 0d 0a 20  andle($pProc).. 
0e30: 20 20 7d 20 65 6c 73 65 20 7b 0d 0a 20 20 20 20    } else {..    
0e40: 20 20 57 72 69 74 65 2d 45 72 72 6f 72 20 22 55    Write-Error "U
0e50: 6e 61 62 6c 65 20 74 6f 20 6f 70 65 6e 20 50 72  nable to open Pr
0e60: 6f 63 65 73 73 20 24 28 24 50 72 6f 63 65 73 73  ocess $($Process
0e70: 2e 49 64 29 2c 20 61 72 65 20 79 6f 75 20 72 75  .Id), are you ru
0e80: 6e 6e 69 6e 67 20 65 6c 65 76 61 74 65 64 3f 22  nning elevated?"
0e90: 0d 0a 20 20 20 20 20 20 23 23 20 54 4f 44 4f 3a  ..      ## TODO:
0ea0: 20 43 68 65 63 6b 20 69 66 20 74 68 65 79 27 72   Check if they'r
0eb0: 65 20 65 6c 65 76 61 74 65 64 20 61 6e 64 20 6f  e elevated and o
0ec0: 74 68 65 72 77 69 73 65 20 47 65 74 4c 61 73 74  therwise GetLast
0ed0: 45 72 72 6f 72 28 29 0d 0a 20 20 20 7d 0d 0a 7d  Error()..   }..}
0ee0: 0d 0a 7d 0d 0a 0d 0a 0d 0a 66 75 6e 63 74 69 6f  ..}......functio
0ef0: 6e 20 53 75 73 70 65 6e 64 2d 54 68 72 65 61 64  n Suspend-Thread
0f00: 20 7b 0d 0a 70 61 72 61 6d 28 0d 0a 5b 50 61 72   {..param(..[Par
0f10: 61 6d 65 74 65 72 28 56 61 6c 75 65 46 72 6f 6d  ameter(ValueFrom
0f20: 50 69 70 65 6c 69 6e 65 3d 24 74 72 75 65 2c 56  Pipeline=$true,V
0f30: 61 6c 75 65 46 72 6f 6d 50 69 70 65 6c 69 6e 65  alueFromPipeline
0f40: 42 79 50 72 6f 70 65 72 74 79 4e 61 6d 65 3d 24  ByPropertyName=$
0f50: 74 72 75 65 2c 4d 61 6e 64 61 74 6f 72 79 3d 24  true,Mandatory=$
0f60: 74 72 75 65 29 5d 0d 0a 5b 53 79 73 74 65 6d 2e  true)]..[System.
0f70: 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63  Diagnostics.Proc
0f80: 65 73 73 54 68 72 65 61 64 5b 5d 5d 0d 0a 5b 41  essThread[]]..[A
0f90: 6c 69 61 73 28 22 54 68 72 65 61 64 73 22 29 5d  lias("Threads")]
0fa0: 0d 0a 24 54 68 72 65 61 64 0d 0a 29 0d 0a 70 72  ..$Thread..)..pr
0fb0: 6f 63 65 73 73 20 7b 0d 0a 20 20 20 69 66 28 28  ocess {..   if((
0fc0: 24 70 54 68 72 65 61 64 20 3d 20 5b 54 68 72 65  $pThread = [Thre
0fd0: 61 64 65 72 5d 3a 3a 4f 70 65 6e 54 68 72 65 61  ader]::OpenThrea
0fe0: 64 28 22 53 75 73 70 65 6e 64 52 65 73 75 6d 65  d("SuspendResume
0ff0: 22 2c 20 24 66 61 6c 73 65 2c 20 24 54 68 72 65  ", $false, $Thre
1000: 61 64 2e 49 64 29 29 20 2d 6e 65 20 5b 49 6e 74  ad.Id)) -ne [Int
1010: 50 74 72 5d 3a 3a 5a 65 72 6f 29 20 7b 0d 0a 20  Ptr]::Zero) {.. 
1020: 20 20 20 20 20 57 72 69 74 65 2d 56 65 72 62 6f       Write-Verbo
1030: 73 65 20 22 53 75 73 70 65 6e 64 69 6e 67 20 54  se "Suspending T
1040: 68 72 65 61 64 3a 20 24 70 54 68 72 65 61 64 22  hread: $pThread"
1050: 0d 0a 20 20 20 20 20 20 5b 54 68 72 65 61 64 65  ..      [Threade
1060: 72 5d 3a 3a 53 75 73 70 65 6e 64 54 68 72 65 61  r]::SuspendThrea
1070: 64 28 24 70 54 68 72 65 61 64 29 0d 0a 20 20 20  d($pThread)..   
1080: 20 20 20 5b 54 68 72 65 61 64 65 72 5d 3a 3a 43     [Threader]::C
1090: 6c 6f 73 65 48 61 6e 64 6c 65 28 24 70 54 68 72  loseHandle($pThr
10a0: 65 61 64 29 0d 0a 20 20 20 7d 20 65 6c 73 65 20  ead)..   } else 
10b0: 7b 0d 0a 20 20 20 20 20 20 57 72 69 74 65 2d 45  {..      Write-E
10c0: 72 72 6f 72 20 22 55 6e 61 62 6c 65 20 74 6f 20  rror "Unable to 
10d0: 6f 70 65 6e 20 54 68 72 65 61 64 20 24 28 24 54  open Thread $($T
10e0: 68 72 65 61 64 2e 49 64 29 2c 20 61 72 65 20 79  hread.Id), are y
10f0: 6f 75 20 72 75 6e 6e 69 6e 67 20 65 6c 65 76 61  ou running eleva
1100: 74 65 64 3f 22 0d 0a 20 20 20 20 20 20 23 23 20  ted?"..      ## 
1110: 54 4f 44 4f 3a 20 43 68 65 63 6b 20 69 66 20 74  TODO: Check if t
1120: 68 65 79 27 72 65 20 65 6c 65 76 61 74 65 64 20  hey're elevated 
1130: 61 6e 64 20 6f 74 68 65 72 77 69 73 65 20 47 65  and otherwise Ge
1140: 74 4c 61 73 74 45 72 72 6f 72 28 29 0d 0a 20 20  tLastError()..  
1150: 20 7d 0d 0a 7d 0d 0a 7d 0d 0a 66 75 6e 63 74 69   }..}..}..functi
1160: 6f 6e 20 52 65 73 75 6d 65 2d 54 68 72 65 61 64  on Resume-Thread
1170: 20 7b 0d 0a 70 61 72 61 6d 28 0d 0a 5b 50 61 72   {..param(..[Par
1180: 61 6d 65 74 65 72 28 56 61 6c 75 65 46 72 6f 6d  ameter(ValueFrom
1190: 50 69 70 65 6c 69 6e 65 3d 24 74 72 75 65 2c 56  Pipeline=$true,V
11a0: 61 6c 75 65 46 72 6f 6d 50 69 70 65 6c 69 6e 65  alueFromPipeline
11b0: 42 79 50 72 6f 70 65 72 74 79 4e 61 6d 65 3d 24  ByPropertyName=$
11c0: 74 72 75 65 2c 4d 61 6e 64 61 74 6f 72 79 3d 24  true,Mandatory=$
11d0: 74 72 75 65 29 5d 0d 0a 5b 53 79 73 74 65 6d 2e  true)]..[System.
11e0: 44 69 61 67 6e 6f 73 74 69 63 73 2e 50 72 6f 63  Diagnostics.Proc
11f0: 65 73 73 54 68 72 65 61 64 5b 5d 5d 0d 0a 5b 41  essThread[]]..[A
1200: 6c 69 61 73 28 22 54 68 72 65 61 64 73 22 29 5d  lias("Threads")]
1210: 0d 0a 24 54 68 72 65 61 64 0d 0a 29 0d 0a 70 72  ..$Thread..)..pr
1220: 6f 63 65 73 73 20 7b 0d 0a 20 20 20 69 66 28 28  ocess {..   if((
1230: 24 70 54 68 72 65 61 64 20 3d 20 5b 54 68 72 65  $pThread = [Thre
1240: 61 64 65 72 5d 3a 3a 4f 70 65 6e 54 68 72 65 61  ader]::OpenThrea
1250: 64 28 22 53 75 73 70 65 6e 64 52 65 73 75 6d 65  d("SuspendResume
1260: 22 2c 20 24 66 61 6c 73 65 2c 20 24 54 68 72 65  ", $false, $Thre
1270: 61 64 2e 49 64 29 29 20 2d 6e 65 20 5b 49 6e 74  ad.Id)) -ne [Int
1280: 50 74 72 5d 3a 3a 5a 65 72 6f 29 20 7b 0d 0a 20  Ptr]::Zero) {.. 
1290: 20 20 20 20 20 57 72 69 74 65 2d 56 65 72 62 6f       Write-Verbo
12a0: 73 65 20 22 52 65 73 75 6d 69 6e 67 20 54 68 72  se "Resuming Thr
12b0: 65 61 64 3a 20 24 70 54 68 72 65 61 64 22 0d 0a  ead: $pThread"..
12c0: 20 20 20 20 20 20 5b 54 68 72 65 61 64 65 72 5d        [Threader]
12d0: 3a 3a 52 65 73 75 6d 65 54 68 72 65 61 64 28 24  ::ResumeThread($
12e0: 70 54 68 72 65 61 64 29 0d 0a 20 20 20 20 20 20  pThread)..      
12f0: 5b 54 68 72 65 61 64 65 72 5d 3a 3a 43 6c 6f 73  [Threader]::Clos
1300: 65 48 61 6e 64 6c 65 28 24 70 54 68 72 65 61 64  eHandle($pThread
1310: 29 0d 0a 20 20 20 7d 20 65 6c 73 65 20 7b 0d 0a  )..   } else {..
1320: 20 20 20 20 20 20 57 72 69 74 65 2d 45 72 72 6f        Write-Erro
1330: 72 20 22 55 6e 61 62 6c 65 20 74 6f 20 6f 70 65  r "Unable to ope
1340: 6e 20 54 68 72 65 61 64 20 24 28 24 54 68 72 65  n Thread $($Thre
1350: 61 64 2e 49 64 29 2c 20 61 72 65 20 79 6f 75 20  ad.Id), are you 
1360: 72 75 6e 6e 69 6e 67 20 65 6c 65 76 61 74 65 64  running elevated
1370: 3f 22 0d 0a 20 20 20 20 20 20 23 23 20 54 4f 44  ?"..      ## TOD
1380: 4f 3a 20 43 68 65 63 6b 20 69 66 20 74 68 65 79  O: Check if they
1390: 27 72 65 20 65 6c 65 76 61 74 65 64 20 61 6e 64  're elevated and
13a0: 20 6f 74 68 65 72 77 69 73 65 20 47 65 74 4c 61   otherwise GetLa
13b0: 73 74 45 72 72 6f 72 28 29 0d 0a 20 20 20 7d 0d  stError()..   }.
13c0: 0a 7d 0d 0a 7d 0d 0a                             .}..}..