Hex Artifact Content
Not logged in

Artifact 059fc11fc8a1312c717fe2cf8fb71bef31fb7155:


0000: 2f 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  /***************
0010: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0020: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0030: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0d 0a  **************..
0040: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0050: 31 30 0d 0a 0d 0a 42 65 6e 6a 61 6d 69 6e 20 54  10....Benjamin T
0060: 68 61 75 74 2e 20 41 6c 6c 20 72 69 67 68 74 73  haut. All rights
0070: 20 72 65 73 65 72 76 65 64 2e 0d 0a 0d 0a 52 65   reserved.....Re
0080: 64 69 73 74 72 69 62 75 74 69 6f 6e 20 61 6e 64  distribution and
0090: 20 75 73 65 20 69 6e 20 73 6f 75 72 63 65 20 61   use in source a
00a0: 6e 64 20 62 69 6e 61 72 79 20 66 6f 72 6d 73 2c  nd binary forms,
00b0: 20 77 69 74 68 20 6f 72 20 77 69 74 68 6f 75 74   with or without
00c0: 20 6d 6f 64 69 66 69 63 61 74 69 6f 6e 2c 20 61   modification, a
00d0: 72 65 20 70 65 72 6d 69 74 74 65 64 0d 0a 70 72  re permitted..pr
00e0: 6f 76 69 64 65 64 20 74 68 61 74 20 74 68 65 20  ovided that the 
00f0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6e 64 69 74  following condit
0100: 69 6f 6e 73 20 61 72 65 20 6d 65 74 3a 0d 0a 0d  ions are met:...
0110: 0a 20 20 31 2e 20 52 65 64 69 73 74 72 69 62 75  .  1. Redistribu
0120: 74 69 6f 6e 73 20 6f 66 20 73 6f 75 72 63 65 20  tions of source 
0130: 63 6f 64 65 20 6d 75 73 74 20 72 65 74 61 69 6e  code must retain
0140: 20 74 68 65 20 61 62 6f 76 65 20 63 6f 70 79 72   the above copyr
0150: 69 67 68 74 20 6e 6f 74 69 63 65 2c 20 74 68 69  ight notice, thi
0160: 73 20 6c 69 73 74 20 6f 66 20 63 6f 6e 64 69 74  s list of condit
0170: 69 6f 6e 73 0d 0a 20 20 20 20 20 61 6e 64 20 74  ions..     and t
0180: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73  he following dis
0190: 63 6c 61 69 6d 65 72 2e 0d 0a 0d 0a 20 20 32 2e  claimer.....  2.
01a0: 20 52 65 64 69 73 74 72 69 62 75 74 69 6f 6e 73   Redistributions
01b0: 20 69 6e 20 62 69 6e 61 72 79 20 66 6f 72 6d 20   in binary form 
01c0: 6d 75 73 74 20 72 65 70 72 6f 64 75 63 65 20 74  must reproduce t
01d0: 68 65 20 61 62 6f 76 65 20 63 6f 70 79 72 69 67  he above copyrig
01e0: 68 74 20 6e 6f 74 69 63 65 2c 20 74 68 69 73 20  ht notice, this 
01f0: 6c 69 73 74 20 6f 66 20 63 6f 6e 64 69 74 69 6f  list of conditio
0200: 6e 73 0d 0a 20 20 20 20 20 61 6e 64 20 74 68 65  ns..     and the
0210: 20 66 6f 6c 6c 6f 77 69 6e 67 20 64 69 73 63 6c   following discl
0220: 61 69 6d 65 72 20 69 6e 20 74 68 65 20 64 6f 63  aimer in the doc
0230: 75 6d 65 6e 74 61 74 69 6f 6e 20 61 6e 64 2f 6f  umentation and/o
0240: 72 20 6f 74 68 65 72 20 6d 61 74 65 72 69 61 6c  r other material
0250: 73 20 70 72 6f 76 69 64 65 64 20 77 69 74 68 20  s provided with 
0260: 74 68 65 20 64 69 73 74 72 69 62 75 74 69 6f 6e  the distribution
0270: 2e 0d 0a 0d 0a 54 48 49 53 20 53 4f 46 54 57 41  .....THIS SOFTWA
0280: 52 45 20 49 53 20 50 52 4f 56 49 44 45 44 20 42  RE IS PROVIDED B
0290: 59 20 42 45 4e 4a 41 4d 49 4e 20 54 48 41 55 54  Y BENJAMIN THAUT
02a0: 20 22 41 53 20 49 53 22 20 41 4e 44 20 41 4e 59   "AS IS" AND ANY
02b0: 20 45 58 50 52 45 53 53 20 4f 52 20 49 4d 50 4c   EXPRESS OR IMPL
02c0: 49 45 44 20 57 41 52 52 41 4e 54 49 45 53 2c 20  IED WARRANTIES, 
02d0: 49 4e 43 4c 55 44 49 4e 47 2c 0d 0a 42 55 54 20  INCLUDING,..BUT 
02e0: 4e 4f 54 20 4c 49 4d 49 54 45 44 20 54 4f 2c 20  NOT LIMITED TO, 
02f0: 54 48 45 20 49 4d 50 4c 49 45 44 20 57 41 52 52  THE IMPLIED WARR
0300: 41 4e 54 49 45 53 20 4f 46 20 4d 45 52 43 48 41  ANTIES OF MERCHA
0310: 4e 54 41 42 49 4c 49 54 59 20 41 4e 44 20 46 49  NTABILITY AND FI
0320: 54 4e 45 53 53 20 46 4f 52 20 41 20 50 41 52 54  TNESS FOR A PART
0330: 49 43 55 4c 41 52 20 50 55 52 50 4f 53 45 20 41  ICULAR PURPOSE A
0340: 52 45 20 44 49 53 43 4c 41 49 4d 45 44 2e 0d 0a  RE DISCLAIMED...
0350: 49 4e 20 4e 4f 20 45 56 45 4e 54 20 53 48 41 4c  IN NO EVENT SHAL
0360: 4c 20 54 48 45 20 52 45 47 45 4e 54 53 20 4f 52  L THE REGENTS OR
0370: 20 43 4f 4e 54 52 49 42 55 54 4f 52 53 20 42 45   CONTRIBUTORS BE
0380: 20 4c 49 41 42 4c 45 20 46 4f 52 20 41 4e 59 20   LIABLE FOR ANY 
0390: 44 49 52 45 43 54 2c 20 49 4e 44 49 52 45 43 54  DIRECT, INDIRECT
03a0: 2c 20 49 4e 43 49 44 45 4e 54 41 4c 2c 20 53 50  , INCIDENTAL, SP
03b0: 45 43 49 41 4c 2c 20 45 58 45 4d 50 4c 41 52 59  ECIAL, EXEMPLARY
03c0: 2c 0d 0a 4f 52 20 43 4f 4e 53 45 51 55 45 4e 54  ,..OR CONSEQUENT
03d0: 49 41 4c 20 44 41 4d 41 47 45 53 20 28 49 4e 43  IAL DAMAGES (INC
03e0: 4c 55 44 49 4e 47 2c 20 42 55 54 20 4e 4f 54 20  LUDING, BUT NOT 
03f0: 4c 49 4d 49 54 45 44 20 54 4f 2c 20 50 52 4f 43  LIMITED TO, PROC
0400: 55 52 45 4d 45 4e 54 20 4f 46 20 53 55 42 53 54  UREMENT OF SUBST
0410: 49 54 55 54 45 20 47 4f 4f 44 53 20 4f 52 20 53  ITUTE GOODS OR S
0420: 45 52 56 49 43 45 53 3b 20 4c 4f 53 53 20 4f 46  ERVICES; LOSS OF
0430: 20 55 53 45 2c 0d 0a 44 41 54 41 2c 20 4f 52 20   USE,..DATA, OR 
0440: 50 52 4f 46 49 54 53 3b 20 4f 52 20 42 55 53 49  PROFITS; OR BUSI
0450: 4e 45 53 53 20 49 4e 54 45 52 52 55 50 54 49 4f  NESS INTERRUPTIO
0460: 4e 29 20 48 4f 57 45 56 45 52 20 43 41 55 53 45  N) HOWEVER CAUSE
0470: 44 20 41 4e 44 20 4f 4e 20 41 4e 59 20 54 48 45  D AND ON ANY THE
0480: 4f 52 59 20 4f 46 20 4c 49 41 42 49 4c 49 54 59  ORY OF LIABILITY
0490: 2c 20 57 48 45 54 48 45 52 20 49 4e 20 43 4f 4e  , WHETHER IN CON
04a0: 54 52 41 43 54 2c 0d 0a 53 54 52 49 43 54 20 4c  TRACT,..STRICT L
04b0: 49 41 42 49 4c 49 54 59 2c 20 4f 52 20 54 4f 52  IABILITY, OR TOR
04c0: 54 20 28 49 4e 43 4c 55 44 49 4e 47 20 4e 45 47  T (INCLUDING NEG
04d0: 4c 49 47 45 4e 43 45 20 4f 52 20 4f 54 48 45 52  LIGENCE OR OTHER
04e0: 57 49 53 45 29 20 41 52 49 53 49 4e 47 20 49 4e  WISE) ARISING IN
04f0: 20 41 4e 59 20 57 41 59 20 4f 55 54 20 4f 46 20   ANY WAY OUT OF 
0500: 54 48 45 20 55 53 45 20 4f 46 20 54 48 49 53 20  THE USE OF THIS 
0510: 53 4f 46 54 57 41 52 45 2c 0d 0a 45 56 45 4e 20  SOFTWARE,..EVEN 
0520: 49 46 20 41 44 56 49 53 45 44 20 4f 46 20 54 48  IF ADVISED OF TH
0530: 45 20 50 4f 53 53 49 42 49 4c 49 54 59 20 4f 46  E POSSIBILITY OF
0540: 20 53 55 43 48 20 44 41 4d 41 47 45 2e 0d 0a 0d   SUCH DAMAGE....
0550: 0a 77 65 62 3a 20 68 74 74 70 3a 2f 2f 33 64 2e  .web: http://3d.
0560: 62 65 6e 6a 61 6d 69 6e 2d 74 68 61 75 74 2e 64  benjamin-thaut.d
0570: 65 0d 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  e..*************
0580: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0590: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05a0: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
05b0: 2f 0d 0a 6d 6f 64 75 6c 65 20 73 74 61 63 6b 74  /..module stackt
05c0: 72 61 63 65 3b 0d 0a 0d 0a 69 6d 70 6f 72 74 20  race;....import 
05d0: 73 74 64 2e 63 2e 77 69 6e 64 6f 77 73 2e 77 69  std.c.windows.wi
05e0: 6e 64 6f 77 73 3b 0d 0a 69 6d 70 6f 72 74 20 73  ndows;..import s
05f0: 74 64 2e 63 2e 73 74 72 69 6e 67 3b 0d 0a 69 6d  td.c.string;..im
0600: 70 6f 72 74 20 73 74 64 2e 73 74 72 69 6e 67 3b  port std.string;
0610: 0d 0a 69 6d 70 6f 72 74 20 64 62 67 68 65 6c 70  ..import dbghelp
0620: 3b 0d 0a 69 6d 70 6f 72 74 20 63 6f 72 65 2e 72  ;..import core.r
0630: 75 6e 74 69 6d 65 3b 0d 0a 69 6d 70 6f 72 74 20  untime;..import 
0640: 73 74 64 2e 73 74 64 69 6f 3b 0d 0a 69 6d 70 6f  std.stdio;..impo
0650: 72 74 20 73 74 64 2e 63 2e 73 74 64 6c 69 62 3b  rt std.c.stdlib;
0660: 0d 0a 69 6d 70 6f 72 74 20 73 74 64 2e 64 65 6d  ..import std.dem
0670: 61 6e 67 6c 65 3b 0d 0a 69 6d 70 6f 72 74 20 73  angle;..import s
0680: 74 64 2e 63 6f 6e 76 3b 0d 0a 0d 0a 65 78 74 65  td.conv;....exte
0690: 72 6e 28 57 69 6e 64 6f 77 73 29 7b 0d 0a 09 44  rn(Windows){...D
06a0: 57 4f 52 44 20 47 65 74 45 6e 76 69 72 6f 6e 6d  WORD GetEnvironm
06b0: 65 6e 74 56 61 72 69 61 62 6c 65 41 28 4c 50 43  entVariableA(LPC
06c0: 53 54 52 20 6c 70 4e 61 6d 65 2c 20 4c 50 53 54  STR lpName, LPST
06d0: 52 20 70 42 75 66 66 65 72 2c 20 44 57 4f 52 44  R pBuffer, DWORD
06e0: 20 6e 53 69 7a 65 29 3b 0d 0a 09 76 6f 69 64 20   nSize);...void 
06f0: 52 74 6c 43 61 70 74 75 72 65 43 6f 6e 74 65 78  RtlCaptureContex
0700: 74 28 43 4f 4e 54 45 58 54 2a 20 43 6f 6e 74 65  t(CONTEXT* Conte
0710: 78 74 52 65 63 6f 72 64 29 3b 0d 0a 09 74 79 70  xtRecord);...typ
0720: 65 64 65 66 20 4c 4f 4e 47 20 66 75 6e 63 74 69  edef LONG functi
0730: 6f 6e 28 76 6f 69 64 2a 29 20 55 6e 68 61 6e 64  on(void*) Unhand
0740: 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 46 69 6c  eledExceptionFil
0750: 74 65 72 46 75 6e 63 3b 0d 0a 09 76 6f 69 64 2a  terFunc;...void*
0760: 20 53 65 74 55 6e 68 61 6e 64 6c 65 64 45 78 63   SetUnhandledExc
0770: 65 70 74 69 6f 6e 46 69 6c 74 65 72 28 76 6f 69  eptionFilter(voi
0780: 64 2a 20 68 61 6e 64 6c 65 72 29 3b 0d 0a 7d 0d  d* handler);..}.
0790: 0a 0d 0a 63 6c 61 73 73 20 53 74 61 63 6b 54 72  ...class StackTr
07a0: 61 63 65 20 7b 0d 0a 70 72 69 76 61 74 65 3a 0d  ace {..private:.
07b0: 0a 09 65 6e 75 6d 20 3a 20 75 69 6e 74 20 7b 0d  ..enum : uint {.
07c0: 0a 09 09 4d 41 58 5f 4d 4f 44 55 4c 45 5f 4e 41  ...MAX_MODULE_NA
07d0: 4d 45 33 32 20 3d 20 32 35 35 2c 0d 0a 09 09 54  ME32 = 255,....T
07e0: 48 33 32 43 53 5f 53 4e 41 50 4d 4f 44 55 4c 45  H32CS_SNAPMODULE
07f0: 20 3d 20 30 78 30 30 30 30 30 30 30 38 2c 0d 0a   = 0x00000008,..
0800: 09 09 4d 41 58 5f 4e 41 4d 45 4c 45 4e 20 3d 20  ..MAX_NAMELEN = 
0810: 31 30 32 34 0d 0a 09 7d 3b 0d 0a 09 0d 0a 09 73  1024...};......s
0820: 74 72 75 63 74 20 4d 4f 44 55 4c 45 45 4e 54 52  truct MODULEENTR
0830: 59 33 32 20 7b 0d 0a 09 09 44 57 4f 52 44 20 64  Y32 {....DWORD d
0840: 77 53 69 7a 65 3b 0d 0a 09 09 44 57 4f 52 44 20  wSize;....DWORD 
0850: 74 68 33 32 4d 6f 64 75 6c 65 49 44 3b 0d 0a 09  th32ModuleID;...
0860: 09 44 57 4f 52 44 20 74 68 33 32 50 72 6f 63 65  .DWORD th32Proce
0870: 73 73 49 44 3b 0d 0a 09 09 44 57 4f 52 44 20 47  ssID;....DWORD G
0880: 6c 62 6c 63 6e 74 55 73 61 67 65 3b 0d 0a 09 09  lblcntUsage;....
0890: 44 57 4f 52 44 20 50 72 6f 63 63 6e 74 55 73 61  DWORD ProccntUsa
08a0: 67 65 3b 0d 0a 09 09 42 59 54 45 2a 20 6d 6f 64  ge;....BYTE* mod
08b0: 42 61 73 65 41 64 64 72 3b 0d 0a 09 09 44 57 4f  BaseAddr;....DWO
08c0: 52 44 20 6d 6f 64 42 61 73 65 53 69 7a 65 3b 0d  RD modBaseSize;.
08d0: 0a 09 09 48 4d 4f 44 55 4c 45 20 68 4d 6f 64 75  ...HMODULE hModu
08e0: 6c 65 3b 0d 0a 09 09 43 48 41 52 5b 4d 41 58 5f  le;....CHAR[MAX_
08f0: 4d 4f 44 55 4c 45 5f 4e 41 4d 45 33 32 20 2b 20  MODULE_NAME32 + 
0900: 31 5d 20 73 7a 4d 6f 64 75 6c 65 3b 0d 0a 09 09  1] szModule;....
0910: 43 48 41 52 5b 4d 41 58 5f 50 41 54 48 5d 20 73  CHAR[MAX_PATH] s
0920: 7a 45 78 65 50 61 74 68 3b 0d 0a 09 7d 3b 0d 0a  zExePath;...};..
0930: 09 0d 0a 09 73 74 72 69 6e 67 20 6d 5f 55 73 65  ....string m_Use
0940: 72 53 79 6d 50 61 74 68 3b 0d 0a 09 73 74 61 74  rSymPath;...stat
0950: 69 63 20 62 6f 6f 6c 20 69 73 49 6e 69 74 20 3d  ic bool isInit =
0960: 20 66 61 6c 73 65 3b 0d 0a 09 73 74 61 74 69 63   false;...static
0970: 20 62 6f 6f 6c 20 6d 6f 64 75 6c 65 73 4c 6f 61   bool modulesLoa
0980: 64 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a 09 0d  ded = false;....
0990: 0a 09 65 78 74 65 72 6e 28 53 79 73 74 65 6d 29  ..extern(System)
09a0: 7b 0d 0a 09 09 74 79 70 65 64 65 66 20 48 41 4e  {....typedef HAN
09b0: 44 4c 45 20 66 75 6e 63 74 69 6f 6e 28 44 57 4f  DLE function(DWO
09c0: 52 44 20 64 77 46 6c 61 67 73 2c 20 44 57 4f 52  RD dwFlags, DWOR
09d0: 44 20 74 68 33 32 50 72 6f 63 65 73 73 49 44 29  D th32ProcessID)
09e0: 20 43 72 65 61 74 65 54 6f 6f 6c 68 65 6c 70 33   CreateToolhelp3
09f0: 32 53 6e 61 70 73 68 6f 74 46 75 6e 63 3b 0d 0a  2SnapshotFunc;..
0a00: 09 09 74 79 70 65 64 65 66 20 42 4f 4f 4c 20 66  ..typedef BOOL f
0a10: 75 6e 63 74 69 6f 6e 28 48 41 4e 44 4c 45 20 68  unction(HANDLE h
0a20: 53 6e 61 70 73 68 6f 74 2c 20 4d 4f 44 55 4c 45  Snapshot, MODULE
0a30: 45 4e 54 52 59 33 32 20 2a 6c 70 6d 65 29 20 4d  ENTRY32 *lpme) M
0a40: 6f 64 75 6c 65 33 32 46 69 72 73 74 46 75 6e 63  odule32FirstFunc
0a50: 3b 0d 0a 09 09 74 79 70 65 64 65 66 20 42 4f 4f  ;....typedef BOO
0a60: 4c 20 66 75 6e 63 74 69 6f 6e 28 48 41 4e 44 4c  L function(HANDL
0a70: 45 20 68 53 6e 61 70 73 68 6f 74 2c 20 4d 4f 44  E hSnapshot, MOD
0a80: 55 4c 45 45 4e 54 52 59 33 32 20 2a 6c 70 6d 65  ULEENTRY32 *lpme
0a90: 29 20 4d 6f 64 75 6c 65 33 32 4e 65 78 74 46 75  ) Module32NextFu
0aa0: 6e 63 3b 0d 0a 09 7d 0d 0a 09 0d 0a 09 65 78 74  nc;...}......ext
0ab0: 65 72 6e 28 57 69 6e 64 6f 77 73 29 20 73 74 61  ern(Windows) sta
0ac0: 74 69 63 20 4c 4f 4e 47 20 55 6e 68 61 6e 64 65  tic LONG Unhande
0ad0: 6c 65 64 45 78 63 65 70 74 69 6f 6e 46 69 6c 74  ledExceptionFilt
0ae0: 65 72 48 61 6e 64 6c 65 72 28 76 6f 69 64 2a 20  erHandler(void* 
0af0: 69 6e 66 6f 29 7b 0d 0a 09 09 70 72 69 6e 74 53  info){....printS
0b00: 74 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a 09 09  tackTrace();....
0b10: 72 65 74 75 72 6e 20 30 3b 0d 0a 09 7d 0d 0a 09  return 0;...}...
0b20: 0d 0a 09 73 74 61 74 69 63 20 76 6f 69 64 20 70  ...static void p
0b30: 72 69 6e 74 53 74 61 63 6b 54 72 61 63 65 28 29  rintStackTrace()
0b40: 7b 0d 0a 09 09 61 75 74 6f 20 73 74 61 63 6b 20  {....auto stack 
0b50: 3d 20 54 72 61 63 65 48 61 6e 64 6c 65 72 28 6e  = TraceHandler(n
0b60: 75 6c 6c 29 3b 0d 0a 09 09 66 6f 72 65 61 63 68  ull);....foreach
0b70: 28 63 68 61 72 5b 5d 20 73 3b 73 74 61 63 6b 29  (char[] s;stack)
0b80: 7b 0d 0a 09 09 09 77 72 69 74 65 66 6c 6e 28 22  {.....writefln("
0b90: 25 73 22 2c 73 29 3b 0d 0a 09 09 7d 0d 0a 09 7d  %s",s);....}...}
0ba0: 0d 0a 09 0d 0a 09 62 6f 6f 6c 20 4c 6f 61 64 4d  ......bool LoadM
0bb0: 6f 64 75 6c 65 73 28 48 41 4e 44 4c 45 20 68 50  odules(HANDLE hP
0bc0: 72 6f 63 65 73 73 2c 20 44 57 4f 52 44 20 70 69  rocess, DWORD pi
0bd0: 64 29 7b 0d 0a 09 09 69 66 28 6d 6f 64 75 6c 65  d){....if(module
0be0: 73 4c 6f 61 64 65 64 29 0d 0a 09 09 09 72 65 74  sLoaded).....ret
0bf0: 75 72 6e 20 74 72 75 65 3b 0d 0a 09 09 0d 0a 09  urn true;.......
0c00: 09 43 72 65 61 74 65 54 6f 6f 6c 68 65 6c 70 33  .CreateToolhelp3
0c10: 32 53 6e 61 70 73 68 6f 74 46 75 6e 63 20 43 72  2SnapshotFunc Cr
0c20: 65 61 74 65 54 6f 6f 6c 68 65 6c 70 33 32 53 6e  eateToolhelp32Sn
0c30: 61 70 73 68 6f 74 20 3d 20 6e 75 6c 6c 3b 0d 0a  apshot = null;..
0c40: 09 09 4d 6f 64 75 6c 65 33 32 46 69 72 73 74 46  ..Module32FirstF
0c50: 75 6e 63 20 4d 6f 64 75 6c 65 33 32 46 69 72 73  unc Module32Firs
0c60: 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 09 09 4d 6f 64  t = null;....Mod
0c70: 75 6c 65 33 32 4e 65 78 74 46 75 6e 63 20 4d 6f  ule32NextFunc Mo
0c80: 64 75 6c 65 33 32 4e 65 78 74 20 3d 20 6e 75 6c  dule32Next = nul
0c90: 6c 3b 0d 0a 09 09 09 0d 0a 09 09 48 4d 4f 44 55  l;.........HMODU
0ca0: 4c 45 20 68 44 6c 6c 20 3d 20 6e 75 6c 6c 3b 0d  LE hDll = null;.
0cb0: 0a 09 09 0d 0a 09 09 73 74 72 69 6e 67 5b 5d 20  .......string[] 
0cc0: 73 65 61 72 63 68 44 6c 6c 73 20 3d 20 5b 20 22  searchDlls = [ "
0cd0: 6b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 2c 20 22  kernel32.dll", "
0ce0: 74 6c 68 65 6c 70 33 32 2e 64 6c 6c 22 20 5d 3b  tlhelp32.dll" ];
0cf0: 0d 0a 09 09 66 6f 72 65 61 63 68 28 64 6c 6c 3b  ....foreach(dll;
0d00: 73 65 61 72 63 68 44 6c 6c 73 29 7b 0d 0a 09 09  searchDlls){....
0d10: 09 68 44 6c 6c 20 3d 20 63 61 73 74 28 48 4d 4f  .hDll = cast(HMO
0d20: 44 55 4c 45 29 52 75 6e 74 69 6d 65 2e 6c 6f 61  DULE)Runtime.loa
0d30: 64 4c 69 62 72 61 72 79 28 64 6c 6c 29 3b 0d 0a  dLibrary(dll);..
0d40: 09 09 09 69 66 28 68 44 6c 6c 20 3d 3d 20 6e 75  ...if(hDll == nu
0d50: 6c 6c 29 0d 0a 09 09 09 09 62 72 65 61 6b 3b 0d  ll)......break;.
0d60: 0a 09 09 09 43 72 65 61 74 65 54 6f 6f 6c 68 65  ....CreateToolhe
0d70: 6c 70 33 32 53 6e 61 70 73 68 6f 74 20 3d 20 63  lp32Snapshot = c
0d80: 61 73 74 28 43 72 65 61 74 65 54 6f 6f 6c 68 65  ast(CreateToolhe
0d90: 6c 70 33 32 53 6e 61 70 73 68 6f 74 46 75 6e 63  lp32SnapshotFunc
0da0: 29 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73  ) GetProcAddress
0db0: 28 68 44 6c 6c 2c 22 43 72 65 61 74 65 54 6f 6f  (hDll,"CreateToo
0dc0: 6c 68 65 6c 70 33 32 53 6e 61 70 73 68 6f 74 22  lhelp32Snapshot"
0dd0: 29 3b 0d 0a 09 09 09 4d 6f 64 75 6c 65 33 32 46  );.....Module32F
0de0: 69 72 73 74 20 3d 20 63 61 73 74 28 4d 6f 64 75  irst = cast(Modu
0df0: 6c 65 33 32 46 69 72 73 74 46 75 6e 63 29 20 47  le32FirstFunc) G
0e00: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68 44  etProcAddress(hD
0e10: 6c 6c 2c 22 4d 6f 64 75 6c 65 33 32 46 69 72 73  ll,"Module32Firs
0e20: 74 22 29 3b 0d 0a 09 09 09 4d 6f 64 75 6c 65 33  t");.....Module3
0e30: 32 4e 65 78 74 20 3d 20 63 61 73 74 28 4d 6f 64  2Next = cast(Mod
0e40: 75 6c 65 33 32 4e 65 78 74 46 75 6e 63 29 20 47  ule32NextFunc) G
0e50: 65 74 50 72 6f 63 41 64 64 72 65 73 73 28 68 44  etProcAddress(hD
0e60: 6c 6c 2c 22 4d 6f 64 75 6c 65 33 32 4e 65 78 74  ll,"Module32Next
0e70: 22 29 3b 0d 0a 09 09 09 69 66 28 43 72 65 61 74  ");.....if(Creat
0e80: 65 54 6f 6f 6c 68 65 6c 70 33 32 53 6e 61 70 73  eToolhelp32Snaps
0e90: 68 6f 74 20 21 3d 20 6e 75 6c 6c 20 26 26 20 4d  hot != null && M
0ea0: 6f 64 75 6c 65 33 32 46 69 72 73 74 20 21 3d 20  odule32First != 
0eb0: 6e 75 6c 6c 20 26 26 20 4d 6f 64 75 6c 65 33 32  null && Module32
0ec0: 4e 65 78 74 20 21 3d 20 6e 75 6c 6c 29 0d 0a 09  Next != null)...
0ed0: 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 52 75  ...break;.....Ru
0ee0: 6e 74 69 6d 65 2e 75 6e 6c 6f 61 64 4c 69 62 72  ntime.unloadLibr
0ef0: 61 72 79 28 68 44 6c 6c 29 3b 0d 0a 09 09 09 68  ary(hDll);.....h
0f00: 44 6c 6c 20 3d 20 6e 75 6c 6c 3b 0d 0a 09 09 7d  Dll = null;....}
0f10: 0d 0a 09 09 0d 0a 09 09 69 66 28 68 44 6c 6c 20  ........if(hDll 
0f20: 3d 3d 20 6e 75 6c 6c 29 7b 0d 0a 09 09 09 72 65  == null){.....re
0f30: 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 09 7d  turn false;....}
0f40: 0d 0a 09 09 0d 0a 09 09 48 41 4e 44 4c 45 20 68  ........HANDLE h
0f50: 53 6e 61 70 20 3d 20 43 72 65 61 74 65 54 6f 6f  Snap = CreateToo
0f60: 6c 68 65 6c 70 33 32 53 6e 61 70 73 68 6f 74 28  lhelp32Snapshot(
0f70: 54 48 33 32 43 53 5f 53 4e 41 50 4d 4f 44 55 4c  TH32CS_SNAPMODUL
0f80: 45 2c 20 70 69 64 29 3b 0d 0a 09 09 69 66 28 68  E, pid);....if(h
0f90: 53 6e 61 70 20 3d 3d 20 63 61 73 74 28 48 41 4e  Snap == cast(HAN
0fa0: 44 4c 45 29 20 2d 31 29 0d 0a 09 09 09 72 65 74  DLE) -1).....ret
0fb0: 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 09 0d 0a  urn false;......
0fc0: 09 09 4d 4f 44 55 4c 45 45 4e 54 52 59 33 32 20  ..MODULEENTRY32 
0fd0: 4d 6f 64 75 6c 65 45 6e 74 72 79 3b 0d 0a 09 09  ModuleEntry;....
0fe0: 6d 65 6d 73 65 74 28 26 4d 6f 64 75 6c 65 45 6e  memset(&ModuleEn
0ff0: 74 72 79 2c 30 2c 4d 4f 44 55 4c 45 45 4e 54 52  try,0,MODULEENTR
1000: 59 33 32 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09 09  Y32.sizeof);....
1010: 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 64 77 53 69  ModuleEntry.dwSi
1020: 7a 65 20 3d 20 4d 4f 44 55 4c 45 45 4e 54 52 59  ze = MODULEENTRY
1030: 33 32 2e 73 69 7a 65 6f 66 3b 0d 0a 09 09 0d 0a  32.sizeof;......
1040: 09 09 62 6f 6f 6c 20 6d 6f 72 65 20 3d 20 63 61  ..bool more = ca
1050: 73 74 28 62 6f 6f 6c 29 4d 6f 64 75 6c 65 33 32  st(bool)Module32
1060: 46 69 72 73 74 28 68 53 6e 61 70 2c 26 4d 6f 64  First(hSnap,&Mod
1070: 75 6c 65 45 6e 74 72 79 29 3b 0d 0a 09 09 69 6e  uleEntry);....in
1080: 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a 09 09  t count = 0;....
1090: 77 68 69 6c 65 28 6d 6f 72 65 29 7b 0d 0a 09 09  while(more){....
10a0: 09 4c 6f 61 64 4d 6f 64 75 6c 65 28 68 50 72 6f  .LoadModule(hPro
10b0: 63 65 73 73 2c 20 4d 6f 64 75 6c 65 45 6e 74 72  cess, ModuleEntr
10c0: 79 2e 73 7a 45 78 65 50 61 74 68 2e 70 74 72 2c  y.szExePath.ptr,
10d0: 20 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 73 7a 4d   ModuleEntry.szM
10e0: 6f 64 75 6c 65 2e 70 74 72 2c 20 63 61 73 74 28  odule.ptr, cast(
10f0: 44 62 67 68 65 6c 70 2e 44 57 4f 52 44 36 34 29  Dbghelp.DWORD64)
1100: 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 6d 6f 64 42  ModuleEntry.modB
1110: 61 73 65 41 64 64 72 2c 20 4d 6f 64 75 6c 65 45  aseAddr, ModuleE
1120: 6e 74 72 79 2e 6d 6f 64 42 61 73 65 53 69 7a 65  ntry.modBaseSize
1130: 29 3b 0d 0a 09 09 09 63 6f 75 6e 74 2b 2b 3b 0d  );.....count++;.
1140: 0a 09 09 09 6d 6f 72 65 20 3d 20 63 61 73 74 28  ....more = cast(
1150: 62 6f 6f 6c 29 4d 6f 64 75 6c 65 33 32 4e 65 78  bool)Module32Nex
1160: 74 28 68 53 6e 61 70 2c 26 4d 6f 64 75 6c 65 45  t(hSnap,&ModuleE
1170: 6e 74 72 79 29 3b 0d 0a 09 09 7d 0d 0a 09 09 0d  ntry);....}.....
1180: 0a 09 09 43 6c 6f 73 65 48 61 6e 64 6c 65 28 68  ...CloseHandle(h
1190: 53 6e 61 70 29 3b 0d 0a 09 09 52 75 6e 74 69 6d  Snap);....Runtim
11a0: 65 2e 75 6e 6c 6f 61 64 4c 69 62 72 61 72 79 28  e.unloadLibrary(
11b0: 68 44 6c 6c 29 3b 0d 0a 09 09 0d 0a 09 09 69 66  hDll);........if
11c0: 28 63 6f 75 6e 74 20 3c 3d 20 30 29 0d 0a 09 09  (count <= 0)....
11d0: 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a  .return false;..
11e0: 09 09 0d 0a 09 09 6d 6f 64 75 6c 65 73 4c 6f 61  ......modulesLoa
11f0: 64 65 64 20 3d 20 74 72 75 65 3b 0d 0a 09 09 72  ded = true;....r
1200: 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 09 7d 0d  eturn true;...}.
1210: 0a 0d 0a 09 76 6f 69 64 20 4c 6f 61 64 4d 6f 64  ....void LoadMod
1220: 75 6c 65 28 48 41 4e 44 4c 45 20 68 50 72 6f 63  ule(HANDLE hProc
1230: 65 73 73 2c 20 4c 50 43 53 54 52 20 69 6d 67 2c  ess, LPCSTR img,
1240: 20 4c 50 43 53 54 52 20 6d 6f 64 2c 20 44 62 67   LPCSTR mod, Dbg
1250: 68 65 6c 70 2e 44 57 4f 52 44 36 34 20 62 61 73  help.DWORD64 bas
1260: 65 41 64 64 72 2c 20 44 57 4f 52 44 20 73 69 7a  eAddr, DWORD siz
1270: 65 29 7b 0d 0a 09 09 63 68 61 72 5b 5d 20 73 7a  e){....char[] sz
1280: 49 6d 67 20 3d 20 6e 65 77 20 63 68 61 72 5b 73  Img = new char[s
1290: 74 72 6c 65 6e 28 69 6d 67 29 5d 3b 0d 0a 09 09  trlen(img)];....
12a0: 63 68 61 72 5b 5d 20 73 7a 4d 6f 64 20 3d 20 6e  char[] szMod = n
12b0: 65 77 20 63 68 61 72 5b 73 74 72 6c 65 6e 28 6d  ew char[strlen(m
12c0: 6f 64 29 5d 3b 0d 0a 09 09 73 7a 49 6d 67 5b 30  od)];....szImg[0
12d0: 2e 2e 73 7a 49 6d 67 2e 6c 65 6e 67 74 68 5d 20  ..szImg.length] 
12e0: 3d 20 69 6d 67 5b 30 2e 2e 28 73 74 72 6c 65 6e  = img[0..(strlen
12f0: 28 69 6d 67 29 29 5d 3b 0d 0a 09 09 73 7a 4d 6f  (img))];....szMo
1300: 64 5b 30 2e 2e 73 7a 4d 6f 64 2e 6c 65 6e 67 74  d[0..szMod.lengt
1310: 68 5d 20 3d 20 6d 6f 64 5b 30 2e 2e 28 73 74 72  h] = mod[0..(str
1320: 6c 65 6e 28 6d 6f 64 29 29 5d 3b 0d 0a 09 09 0d  len(mod))];.....
1330: 0a 09 09 44 62 67 68 65 6c 70 2e 44 57 4f 52 44  ...Dbghelp.DWORD
1340: 36 34 20 6d 6f 64 75 6c 65 41 64 64 72 20 3d 20  64 moduleAddr = 
1350: 44 62 67 68 65 6c 70 2e 53 79 6d 4c 6f 61 64 4d  Dbghelp.SymLoadM
1360: 6f 64 75 6c 65 36 34 28 68 50 72 6f 63 65 73 73  odule64(hProcess
1370: 2c 48 41 4e 44 4c 45 2e 69 6e 69 74 2c 63 61 73  ,HANDLE.init,cas
1380: 74 28 44 62 67 68 65 6c 70 2e 50 43 53 54 52 29  t(Dbghelp.PCSTR)
1390: 74 6f 53 74 72 69 6e 67 7a 28 73 7a 49 6d 67 29  toStringz(szImg)
13a0: 2c 63 61 73 74 28 44 62 67 68 65 6c 70 2e 50 43  ,cast(Dbghelp.PC
13b0: 53 54 52 29 74 6f 53 74 72 69 6e 67 7a 28 73 7a  STR)toStringz(sz
13c0: 4d 6f 64 29 2c 62 61 73 65 41 64 64 72 2c 73 69  Mod),baseAddr,si
13d0: 7a 65 29 3b 0d 0a 09 09 69 66 28 6d 6f 64 75 6c  ze);....if(modul
13e0: 65 41 64 64 72 20 3d 3d 20 30 29 0d 0a 09 09 09  eAddr == 0).....
13f0: 72 65 74 75 72 6e 3b 0d 0a 09 09 0d 0a 09 09 44  return;........D
1400: 62 67 68 65 6c 70 2e 49 4d 41 47 45 48 4c 50 5f  bghelp.IMAGEHLP_
1410: 4d 4f 44 55 4c 45 36 34 20 4d 6f 64 75 6c 65 49  MODULE64 ModuleI
1420: 6e 66 6f 3b 0d 0a 09 09 6d 65 6d 73 65 74 28 26  nfo;....memset(&
1430: 4d 6f 64 75 6c 65 49 6e 66 6f 2c 30 2c 74 79 70  ModuleInfo,0,typ
1440: 65 6f 66 28 4d 6f 64 75 6c 65 49 6e 66 6f 29 2e  eof(ModuleInfo).
1450: 73 69 7a 65 6f 66 29 3b 0d 0a 09 09 4d 6f 64 75  sizeof);....Modu
1460: 6c 65 49 6e 66 6f 2e 53 69 7a 65 4f 66 53 74 72  leInfo.SizeOfStr
1470: 75 63 74 20 3d 20 74 79 70 65 6f 66 28 4d 6f 64  uct = typeof(Mod
1480: 75 6c 65 49 6e 66 6f 29 2e 73 69 7a 65 6f 66 3b  uleInfo).sizeof;
1490: 0d 0a 09 09 69 66 28 44 62 67 68 65 6c 70 2e 53  ....if(Dbghelp.S
14a0: 79 6d 47 65 74 4d 6f 64 75 6c 65 49 6e 66 6f 36  ymGetModuleInfo6
14b0: 34 28 68 50 72 6f 63 65 73 73 2c 6d 6f 64 75 6c  4(hProcess,modul
14c0: 65 41 64 64 72 2c 26 4d 6f 64 75 6c 65 49 6e 66  eAddr,&ModuleInf
14d0: 6f 29 20 3d 3d 20 54 52 55 45 29 7b 0d 0a 09 09  o) == TRUE){....
14e0: 09 69 66 28 4d 6f 64 75 6c 65 49 6e 66 6f 2e 53  .if(ModuleInfo.S
14f0: 79 6d 54 79 70 65 20 3d 3d 20 44 62 67 68 65 6c  ymType == Dbghel
1500: 70 2e 53 59 4d 5f 54 59 50 45 2e 53 79 6d 4e 6f  p.SYM_TYPE.SymNo
1510: 6e 65 29 7b 0d 0a 09 09 09 09 44 62 67 68 65 6c  ne){......Dbghel
1520: 70 2e 53 79 6d 55 6e 6c 6f 61 64 4d 6f 64 75 6c  p.SymUnloadModul
1530: 65 36 34 28 68 50 72 6f 63 65 73 73 2c 6d 6f 64  e64(hProcess,mod
1540: 75 6c 65 41 64 64 72 29 3b 0d 0a 09 09 09 09 6d  uleAddr);......m
1550: 6f 64 75 6c 65 41 64 64 72 20 3d 20 44 62 67 68  oduleAddr = Dbgh
1560: 65 6c 70 2e 53 79 6d 4c 6f 61 64 4d 6f 64 75 6c  elp.SymLoadModul
1570: 65 36 34 28 68 50 72 6f 63 65 73 73 2c 48 41 4e  e64(hProcess,HAN
1580: 44 4c 45 2e 69 6e 69 74 2c 63 61 73 74 28 44 62  DLE.init,cast(Db
1590: 67 68 65 6c 70 2e 50 43 53 54 52 29 74 6f 53 74  ghelp.PCSTR)toSt
15a0: 72 69 6e 67 7a 28 73 7a 49 6d 67 29 2c 6e 75 6c  ringz(szImg),nul
15b0: 6c 2c 63 61 73 74 28 44 62 67 68 65 6c 70 2e 44  l,cast(Dbghelp.D
15c0: 57 4f 52 44 36 34 29 30 2c 30 29 3b 0d 0a 09 09  WORD64)0,0);....
15d0: 09 09 69 66 28 6d 6f 64 75 6c 65 41 64 64 72 20  ..if(moduleAddr 
15e0: 3d 3d 20 30 29 0d 0a 09 09 09 09 09 72 65 74 75  == 0).......retu
15f0: 72 6e 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d 0d 0a  rn;.....}....}..
1600: 09 09 0d 0a 09 09 2f 2f 77 72 69 74 65 66 6c 6e  ......//writefln
1610: 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79 20 6c  ("Successfully l
1620: 6f 61 64 65 64 20 6d 6f 64 75 6c 65 20 25 73 22  oaded module %s"
1630: 2c 73 7a 49 6d 67 29 3b 0d 0a 09 7d 0d 0a 09 0d  ,szImg);...}....
1640: 0a 09 73 74 72 69 6e 67 20 47 65 6e 65 72 65 61  ..string Generea
1650: 74 65 53 65 61 72 63 68 50 61 74 68 28 29 7b 0d  teSearchPath(){.
1660: 0a 09 09 73 74 72 69 6e 67 20 70 61 74 68 3b 0d  ...string path;.
1670: 0a 09 09 69 66 28 6d 5f 55 73 65 72 53 79 6d 50  ...if(m_UserSymP
1680: 61 74 68 2e 6c 65 6e 67 74 68 29 7b 0d 0a 09 09  ath.length){....
1690: 09 70 61 74 68 20 3d 20 6d 5f 55 73 65 72 53 79  .path = m_UserSy
16a0: 6d 50 61 74 68 20 7e 20 22 3b 22 3b 0d 0a 09 09  mPath ~ ";";....
16b0: 7d 0d 0a 09 09 0d 0a 09 09 63 68 61 72 5b 31 30  }........char[10
16c0: 32 34 5d 20 74 65 6d 70 3b 0d 0a 09 09 69 66 28  24] temp;....if(
16d0: 47 65 74 43 75 72 72 65 6e 74 44 69 72 65 63 74  GetCurrentDirect
16e0: 6f 72 79 41 28 74 65 6d 70 2e 6c 65 6e 67 74 68  oryA(temp.length
16f0: 2c 74 65 6d 70 2e 70 74 72 29 20 3e 20 30 29 7b  ,temp.ptr) > 0){
1700: 0d 0a 09 09 09 74 65 6d 70 5b 74 65 6d 70 2e 6c  .....temp[temp.l
1710: 65 6e 67 74 68 2d 31 5d 20 3d 20 30 3b 0d 0a 09  ength-1] = 0;...
1720: 09 09 70 61 74 68 20 7e 3d 20 74 65 6d 70 20 7e  ..path ~= temp ~
1730: 20 22 3b 22 3b 0d 0a 09 09 7d 0d 0a 09 09 0d 0a   ";";....}......
1740: 09 09 69 66 28 47 65 74 4d 6f 64 75 6c 65 46 69  ..if(GetModuleFi
1750: 6c 65 4e 61 6d 65 41 28 6e 75 6c 6c 2c 74 65 6d  leNameA(null,tem
1760: 70 2e 70 74 72 2c 74 65 6d 70 2e 6c 65 6e 67 74  p.ptr,temp.lengt
1770: 68 29 20 3e 20 30 29 7b 0d 0a 09 09 09 74 65 6d  h) > 0){.....tem
1780: 70 5b 74 65 6d 70 2e 6c 65 6e 67 74 68 2d 31 5d  p[temp.length-1]
1790: 20 3d 20 30 3b 0d 0a 09 09 09 66 6f 72 65 61 63   = 0;.....foreac
17a0: 68 5f 72 65 76 65 72 73 65 28 72 65 66 20 63 68  h_reverse(ref ch
17b0: 61 72 20 65 3b 74 65 6d 70 29 7b 0d 0a 09 09 09  ar e;temp){.....
17c0: 09 69 66 28 65 20 3d 3d 20 27 5c 5c 27 20 7c 7c  .if(e == '\\' ||
17d0: 20 65 20 3d 3d 20 27 2f 27 20 7c 7c 20 65 20 3d   e == '/' || e =
17e0: 3d 20 27 3a 27 29 7b 0d 0a 09 09 09 09 09 65 20  = ':'){.......e 
17f0: 3d 20 30 3b 0d 0a 09 09 09 09 09 62 72 65 61 6b  = 0;.......break
1800: 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 7d 0d 0a  ;......}.....}..
1810: 09 09 09 69 66 28 73 74 72 6c 65 6e 28 74 65 6d  ...if(strlen(tem
1820: 70 2e 70 74 72 29 20 3e 20 30 29 7b 0d 0a 09 09  p.ptr) > 0){....
1830: 09 09 70 61 74 68 20 7e 3d 20 74 65 6d 70 20 7e  ..path ~= temp ~
1840: 20 22 3b 22 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d   ";";.....}....}
1850: 0d 0a 09 09 0d 0a 09 09 73 74 72 69 6e 67 5b 5d  ........string[]
1860: 20 73 79 73 74 65 6d 56 61 72 73 20 3d 20 5b 20   systemVars = [ 
1870: 22 5f 4e 54 5f 53 59 4d 42 4f 4c 5f 50 41 54 48  "_NT_SYMBOL_PATH
1880: 22 2c 20 22 5f 4e 54 5f 41 4c 54 45 52 4e 41 54  ", "_NT_ALTERNAT
1890: 45 5f 53 59 4d 42 4f 4c 5f 50 41 54 48 22 2c 20  E_SYMBOL_PATH", 
18a0: 22 53 59 53 54 45 4d 52 4f 4f 54 22 20 5d 3b 0d  "SYSTEMROOT" ];.
18b0: 0a 09 09 0d 0a 09 09 66 6f 72 65 61 63 68 28 65  .......foreach(e
18c0: 3b 73 79 73 74 65 6d 56 61 72 73 29 7b 0d 0a 09  ;systemVars){...
18d0: 09 09 69 66 28 47 65 74 45 6e 76 69 72 6f 6e 6d  ..if(GetEnvironm
18e0: 65 6e 74 56 61 72 69 61 62 6c 65 41 28 74 6f 53  entVariableA(toS
18f0: 74 72 69 6e 67 7a 28 65 29 2c 74 65 6d 70 2e 70  tringz(e),temp.p
1900: 74 72 2c 74 65 6d 70 2e 6c 65 6e 67 74 68 29 20  tr,temp.length) 
1910: 3e 20 30 29 7b 0d 0a 09 09 09 09 74 65 6d 70 5b  > 0){......temp[
1920: 74 65 6d 70 2e 6c 65 6e 67 74 68 2d 31 5d 20 3d  temp.length-1] =
1930: 20 30 3b 0d 0a 09 09 09 09 70 61 74 68 20 7e 3d   0;......path ~=
1940: 20 74 65 6d 70 20 7e 20 22 3b 22 3b 0d 0a 09 09   temp ~ ";";....
1950: 09 7d 0d 0a 09 09 7d 0d 0a 09 09 0d 0a 09 09 72  .}....}........r
1960: 65 74 75 72 6e 20 70 61 74 68 3b 0d 0a 09 7d 0d  eturn path;...}.
1970: 0a 09 0d 0a 09 73 74 61 74 69 63 20 63 6c 61 73  .....static clas
1980: 73 20 43 61 6c 6c 73 74 61 63 6b 20 3a 20 54 68  s Callstack : Th
1990: 72 6f 77 61 62 6c 65 2e 54 72 61 63 65 49 6e 66  rowable.TraceInf
19a0: 6f 20 7b 0d 0a 09 70 72 69 76 61 74 65 3a 0d 0a  o {...private:..
19b0: 09 09 73 74 72 69 6e 67 5b 5d 20 69 6e 66 6f 20  ..string[] info 
19c0: 3d 20 6e 75 6c 6c 3b 0d 0a 09 70 75 62 6c 69 63  = null;...public
19d0: 3a 09 09 0d 0a 09 09 69 6e 74 20 6f 70 41 70 70  :......int opApp
19e0: 6c 79 28 73 63 6f 70 65 20 69 6e 74 20 64 65 6c  ly(scope int del
19f0: 65 67 61 74 65 28 72 65 66 20 63 68 61 72 5b 5d  egate(ref char[]
1a00: 29 20 64 67 29 7b 0d 0a 09 09 09 69 6e 74 20 72  ) dg){.....int r
1a10: 65 73 75 6c 74 20 3d 20 30 3b 0d 0a 09 09 09 66  esult = 0;.....f
1a20: 6f 72 65 61 63 68 28 65 3b 69 6e 66 6f 29 7b 0d  oreach(e;info){.
1a30: 0a 09 09 09 09 63 68 61 72 5b 5d 20 74 65 6d 70  .....char[] temp
1a40: 20 3d 20 74 6f 21 28 63 68 61 72 5b 5d 29 28 65   = to!(char[])(e
1a50: 29 3b 0d 0a 09 09 09 09 72 65 73 75 6c 74 20 3d  );......result =
1a60: 20 64 67 28 74 65 6d 70 29 3b 0d 0a 09 09 09 09   dg(temp);......
1a70: 69 66 28 72 65 73 75 6c 74 29 0d 0a 09 09 09 09  if(result)......
1a80: 09 62 72 65 61 6b 3b 0d 0a 09 09 09 7d 0d 0a 09  .break;.....}...
1a90: 09 09 72 65 74 75 72 6e 20 72 65 73 75 6c 74 3b  ..return result;
1aa0: 0d 0a 09 09 7d 0d 0a 09 09 0d 0a 09 09 6f 76 65  ....}........ove
1ab0: 72 72 69 64 65 20 73 74 72 69 6e 67 20 74 6f 53  rride string toS
1ac0: 74 72 69 6e 67 28 29 7b 0d 0a 09 09 09 73 74 72  tring(){.....str
1ad0: 69 6e 67 20 72 65 73 75 6c 74 20 3d 20 22 22 3b  ing result = "";
1ae0: 0d 0a 09 09 09 66 6f 72 65 61 63 68 28 65 3b 69  .....foreach(e;i
1af0: 6e 66 6f 29 7b 0d 0a 09 09 09 09 72 65 73 75 6c  nfo){......resul
1b00: 74 20 7e 3d 20 65 20 7e 20 22 5c 6e 22 3b 0d 0a  t ~= e ~ "\n";..
1b10: 09 09 09 7d 0d 0a 09 09 09 72 65 74 75 72 6e 20  ...}.....return 
1b20: 72 65 73 75 6c 74 3b 0d 0a 09 09 7d 0d 0a 09 09  result;....}....
1b30: 0d 0a 09 09 76 6f 69 64 20 61 70 70 65 6e 64 28  ....void append(
1b40: 73 74 72 69 6e 67 20 73 74 72 29 7b 0d 0a 09 09  string str){....
1b50: 09 69 66 28 69 6e 66 6f 20 69 73 20 6e 75 6c 6c  .if(info is null
1b60: 29 7b 0d 0a 09 09 09 09 69 6e 66 6f 20 3d 20 6e  ){......info = n
1b70: 65 77 20 73 74 72 69 6e 67 5b 31 5d 3b 0d 0a 09  ew string[1];...
1b80: 09 09 09 69 6e 66 6f 5b 30 5d 20 3d 20 73 74 72  ...info[0] = str
1b90: 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 65 6c 73 65  ;.....}.....else
1ba0: 20 7b 0d 0a 09 09 09 09 69 6e 66 6f 2e 6c 65 6e   {......info.len
1bb0: 67 74 68 20 3d 20 69 6e 66 6f 2e 6c 65 6e 67 74  gth = info.lengt
1bc0: 68 20 2b 20 31 3b 0d 0a 09 09 09 09 69 6e 66 6f  h + 1;......info
1bd0: 5b 69 6e 66 6f 2e 6c 65 6e 67 74 68 2d 31 5d 20  [info.length-1] 
1be0: 3d 20 73 74 72 3b 0d 0a 09 09 09 7d 0d 0a 09 09  = str;.....}....
1bf0: 7d 0d 0a 09 7d 0d 0a 09 0d 0a 09 73 74 61 74 69  }...}......stati
1c00: 63 20 54 68 72 6f 77 61 62 6c 65 2e 54 72 61 63  c Throwable.Trac
1c10: 65 49 6e 66 6f 20 54 72 61 63 65 48 61 6e 64 6c  eInfo TraceHandl
1c20: 65 72 28 76 6f 69 64 2a 20 70 74 72 29 7b 0d 0a  er(void* ptr){..
1c30: 09 09 2f 2f 20 6d 6f 64 69 66 69 65 64 20 62 79  ..// modified by
1c40: 20 6b 2e 69 6e 61 62 61 20 74 6f 20 61 76 6f 69   k.inaba to avoi
1c50: 64 20 61 20 74 68 72 6f 77 20 69 6e 73 69 64 65  d a throw inside
1c60: 20 73 74 64 2e 64 65 6d 61 6e 67 6c 65 2e 64 65   std.demangle.de
1c70: 6d 61 6e 67 6c 65 0d 0a 09 09 2f 2f 20 6e 6f 74  mangle....// not
1c80: 20 71 75 69 74 65 20 74 68 72 65 61 64 20 73 61   quite thread sa
1c90: 66 65 0d 0a 09 09 52 75 6e 74 69 6d 65 2e 74 72  fe....Runtime.tr
1ca0: 61 63 65 48 61 6e 64 6c 65 72 28 26 63 6f 72 65  aceHandler(&core
1cb0: 2e 72 75 6e 74 69 6d 65 2e 64 65 66 61 75 6c 74  .runtime.default
1cc0: 54 72 61 63 65 48 61 6e 64 6c 65 72 29 3b 0d 0a  TraceHandler);..
1cd0: 09 09 73 63 6f 70 65 28 65 78 69 74 29 20 52 75  ..scope(exit) Ru
1ce0: 6e 74 69 6d 65 2e 74 72 61 63 65 48 61 6e 64 6c  ntime.traceHandl
1cf0: 65 72 28 26 54 72 61 63 65 48 61 6e 64 6c 65 72  er(&TraceHandler
1d00: 29 3b 0d 0a 09 20 20 0d 0a 09 09 53 74 61 63 6b  );...  ....Stack
1d10: 54 72 61 63 65 20 74 72 61 63 65 20 3d 20 6e 65  Trace trace = ne
1d20: 77 20 53 74 61 63 6b 54 72 61 63 65 28 29 3b 0d  w StackTrace();.
1d30: 0a 09 09 72 65 74 75 72 6e 20 74 72 61 63 65 2e  ...return trace.
1d40: 47 65 74 43 61 6c 6c 73 74 61 63 6b 28 29 3b 0d  GetCallstack();.
1d50: 0a 09 7d 0d 0a 09 0d 0a 70 75 62 6c 69 63 3a 0d  ..}.....public:.
1d60: 0a 09 73 74 61 74 69 63 20 74 68 69 73 28 29 7b  ..static this(){
1d70: 0d 0a 09 09 52 75 6e 74 69 6d 65 2e 74 72 61 63  ....Runtime.trac
1d80: 65 48 61 6e 64 6c 65 72 28 26 54 72 61 63 65 48  eHandler(&TraceH
1d90: 61 6e 64 6c 65 72 29 3b 0d 0a 09 09 53 65 74 55  andler);....SetU
1da0: 6e 68 61 6e 64 6c 65 64 45 78 63 65 70 74 69 6f  nhandledExceptio
1db0: 6e 46 69 6c 74 65 72 28 26 55 6e 68 61 6e 64 65  nFilter(&Unhande
1dc0: 6c 65 64 45 78 63 65 70 74 69 6f 6e 46 69 6c 74  ledExceptionFilt
1dd0: 65 72 48 61 6e 64 6c 65 72 29 3b 0d 0a 09 7d 0d  erHandler);...}.
1de0: 0a 09 0d 0a 09 74 68 69 73 28 29 7b 0d 0a 09 09  .....this(){....
1df0: 69 66 28 69 73 49 6e 69 74 29 0d 0a 09 09 09 72  if(isInit).....r
1e00: 65 74 75 72 6e 3b 0d 0a 09 09 48 41 4e 44 4c 45  eturn;....HANDLE
1e10: 20 68 50 72 6f 63 65 73 73 20 3d 20 47 65 74 43   hProcess = GetC
1e20: 75 72 72 65 6e 74 50 72 6f 63 65 73 73 28 29 3b  urrentProcess();
1e30: 0d 0a 09 09 44 57 4f 52 44 20 70 69 64 20 3d 20  ....DWORD pid = 
1e40: 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73  GetCurrentProces
1e50: 73 49 64 28 29 3b 0d 0a 09 09 0d 0a 09 09 44 62  sId();........Db
1e60: 67 68 65 6c 70 2e 49 6e 69 74 28 29 3b 0d 0a 09  ghelp.Init();...
1e70: 09 73 74 72 69 6e 67 20 73 79 6d 50 61 74 68 20  .string symPath 
1e80: 3d 20 47 65 6e 65 72 65 61 74 65 53 65 61 72 63  = GenereateSearc
1e90: 68 50 61 74 68 28 29 3b 0d 0a 09 09 69 66 28 44  hPath();....if(D
1ea0: 62 67 68 65 6c 70 2e 53 79 6d 49 6e 69 74 69 61  bghelp.SymInitia
1eb0: 6c 69 7a 65 28 68 50 72 6f 63 65 73 73 2c 63 61  lize(hProcess,ca
1ec0: 73 74 28 44 62 67 68 65 6c 70 2e 50 43 53 54 52  st(Dbghelp.PCSTR
1ed0: 29 74 6f 53 74 72 69 6e 67 7a 28 73 79 6d 50 61  )toStringz(symPa
1ee0: 74 68 29 2c 46 41 4c 53 45 29 20 21 3d 20 46 41  th),FALSE) != FA
1ef0: 4c 53 45 29 7b 0d 0a 09 09 09 69 73 49 6e 69 74  LSE){.....isInit
1f00: 20 3d 20 74 72 75 65 3b 0d 0a 09 09 09 0d 0a 09   = true;........
1f10: 09 09 44 57 4f 52 44 20 73 79 6d 4f 70 74 69 6f  ..DWORD symOptio
1f20: 6e 73 20 3d 20 44 62 67 68 65 6c 70 2e 53 79 6d  ns = Dbghelp.Sym
1f30: 47 65 74 4f 70 74 69 6f 6e 73 28 29 3b 0d 0a 09  GetOptions();...
1f40: 09 09 73 79 6d 4f 70 74 69 6f 6e 73 20 7c 3d 20  ..symOptions |= 
1f50: 44 62 67 68 65 6c 70 2e 53 59 4d 4f 50 54 5f 4c  Dbghelp.SYMOPT_L
1f60: 4f 41 44 5f 4c 49 4e 45 53 3b 0d 0a 09 09 09 73  OAD_LINES;.....s
1f70: 79 6d 4f 70 74 69 6f 6e 73 20 7c 3d 20 44 62 67  ymOptions |= Dbg
1f80: 68 65 6c 70 2e 53 59 4d 4f 50 54 5f 46 41 49 4c  help.SYMOPT_FAIL
1f90: 5f 43 52 49 54 49 43 41 4c 5f 45 52 52 4f 52 53  _CRITICAL_ERRORS
1fa0: 3b 0d 0a 09 09 09 73 79 6d 4f 70 74 69 6f 6e 73  ;.....symOptions
1fb0: 20 3d 20 44 62 67 68 65 6c 70 2e 53 79 6d 53 65   = Dbghelp.SymSe
1fc0: 74 4f 70 74 69 6f 6e 73 28 73 79 6d 4f 70 74 69  tOptions(symOpti
1fd0: 6f 6e 73 29 3b 0d 0a 09 09 09 0d 0a 09 09 09 4c  ons);..........L
1fe0: 6f 61 64 4d 6f 64 75 6c 65 73 28 68 50 72 6f 63  oadModules(hProc
1ff0: 65 73 73 2c 70 69 64 29 3b 0d 0a 09 09 7d 0d 0a  ess,pid);....}..
2000: 09 7d 0d 0a 09 0d 0a 09 54 68 72 6f 77 61 62 6c  .}......Throwabl
2010: 65 2e 54 72 61 63 65 49 6e 66 6f 20 47 65 74 43  e.TraceInfo GetC
2020: 61 6c 6c 73 74 61 63 6b 28 29 7b 0d 0a 09 09 69  allstack(){....i
2030: 66 28 21 69 73 49 6e 69 74 29 7b 0d 0a 09 09 09  f(!isInit){.....
2040: 77 72 69 74 65 66 6c 6e 28 22 49 73 20 6e 6f 74  writefln("Is not
2050: 20 69 6e 69 74 21 22 29 3b 0d 0a 09 09 09 72 65   init!");.....re
2060: 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 09 09 7d 0d  turn null;....}.
2070: 0a 09 09 0d 0a 09 09 48 41 4e 44 4c 45 20 68 54  .......HANDLE hT
2080: 68 72 65 61 64 20 3d 20 47 65 74 43 75 72 72 65  hread = GetCurre
2090: 6e 74 54 68 72 65 61 64 28 29 3b 0d 0a 09 09 48  ntThread();....H
20a0: 41 4e 44 4c 45 20 68 50 72 6f 63 65 73 73 20 3d  ANDLE hProcess =
20b0: 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65   GetCurrentProce
20c0: 73 73 28 29 3b 0d 0a 09 09 0d 0a 09 09 2f 2f 43  ss();........//C
20d0: 61 70 74 75 72 65 20 74 68 65 20 63 75 72 72 65  apture the curre
20e0: 6e 74 20 63 6f 6e 74 65 78 74 0d 0a 09 09 43 4f  nt context....CO
20f0: 4e 54 45 58 54 20 63 3b 0d 0a 09 09 6d 65 6d 73  NTEXT c;....mems
2100: 65 74 28 26 63 2c 20 30 2c 20 43 4f 4e 54 45 58  et(&c, 0, CONTEX
2110: 54 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09 09 63 2e  T.sizeof);....c.
2120: 43 6f 6e 74 65 78 74 46 6c 61 67 73 20 3d 20 43  ContextFlags = C
2130: 4f 4e 54 45 58 54 5f 46 55 4c 4c 3b 0d 0a 09 09  ONTEXT_FULL;....
2140: 52 74 6c 43 61 70 74 75 72 65 43 6f 6e 74 65 78  RtlCaptureContex
2150: 74 28 26 63 29 3b 0d 0a 09 09 0d 0a 09 09 44 62  t(&c);........Db
2160: 67 68 65 6c 70 2e 53 54 41 43 4b 46 52 41 4d 45  ghelp.STACKFRAME
2170: 36 34 20 73 74 61 63 6b 66 72 61 6d 65 3b 0d 0a  64 stackframe;..
2180: 09 09 6d 65 6d 73 65 74 28 26 73 74 61 63 6b 66  ..memset(&stackf
2190: 72 61 6d 65 2c 30 2c 74 79 70 65 6f 66 28 73 74  rame,0,typeof(st
21a0: 61 63 6b 66 72 61 6d 65 29 2e 73 69 7a 65 6f 66  ackframe).sizeof
21b0: 29 3b 0d 0a 09 09 44 57 4f 52 44 20 69 6d 61 67  );....DWORD imag
21c0: 65 54 79 70 65 3b 0d 0a 09 09 2f 2f 78 38 36 0d  eType;....//x86.
21d0: 0a 09 09 69 6d 61 67 65 54 79 70 65 20 3d 20 44  ...imageType = D
21e0: 62 67 68 65 6c 70 2e 49 4d 41 47 45 5f 46 49 4c  bghelp.IMAGE_FIL
21f0: 45 5f 4d 41 43 48 49 4e 45 5f 49 33 38 36 3b 0d  E_MACHINE_I386;.
2200: 0a 09 09 73 74 61 63 6b 66 72 61 6d 65 2e 41 64  ...stackframe.Ad
2210: 64 72 50 43 2e 4f 66 66 73 65 74 20 3d 20 63 61  drPC.Offset = ca
2220: 73 74 28 44 62 67 68 65 6c 70 2e 44 57 4f 52 44  st(Dbghelp.DWORD
2230: 36 34 29 63 2e 45 69 70 3b 0d 0a 09 09 73 74 61  64)c.Eip;....sta
2240: 63 6b 66 72 61 6d 65 2e 41 64 64 72 50 43 2e 4d  ckframe.AddrPC.M
2250: 6f 64 65 20 3d 20 44 62 67 68 65 6c 70 2e 41 44  ode = Dbghelp.AD
2260: 44 52 45 53 53 5f 4d 4f 44 45 2e 41 64 64 72 4d  DRESS_MODE.AddrM
2270: 6f 64 65 46 6c 61 74 3b 0d 0a 09 09 73 74 61 63  odeFlat;....stac
2280: 6b 66 72 61 6d 65 2e 41 64 64 72 46 72 61 6d 65  kframe.AddrFrame
2290: 2e 4f 66 66 73 65 74 20 3d 20 63 61 73 74 28 44  .Offset = cast(D
22a0: 62 67 68 65 6c 70 2e 44 57 4f 52 44 36 34 29 63  bghelp.DWORD64)c
22b0: 2e 45 62 70 3b 0d 0a 09 09 73 74 61 63 6b 66 72  .Ebp;....stackfr
22c0: 61 6d 65 2e 41 64 64 72 46 72 61 6d 65 2e 4d 6f  ame.AddrFrame.Mo
22d0: 64 65 20 3d 20 44 62 67 68 65 6c 70 2e 41 44 44  de = Dbghelp.ADD
22e0: 52 45 53 53 5f 4d 4f 44 45 2e 41 64 64 72 4d 6f  RESS_MODE.AddrMo
22f0: 64 65 46 6c 61 74 3b 0d 0a 09 09 73 74 61 63 6b  deFlat;....stack
2300: 66 72 61 6d 65 2e 41 64 64 72 53 74 61 63 6b 2e  frame.AddrStack.
2310: 4f 66 66 73 65 74 20 3d 20 63 61 73 74 28 44 62  Offset = cast(Db
2320: 67 68 65 6c 70 2e 44 57 4f 52 44 36 34 29 63 2e  ghelp.DWORD64)c.
2330: 45 73 70 3b 0d 0a 09 09 73 74 61 63 6b 66 72 61  Esp;....stackfra
2340: 6d 65 2e 41 64 64 72 53 74 61 63 6b 2e 4d 6f 64  me.AddrStack.Mod
2350: 65 20 3d 20 44 62 67 68 65 6c 70 2e 41 44 44 52  e = Dbghelp.ADDR
2360: 45 53 53 5f 4d 4f 44 45 2e 41 64 64 72 4d 6f 64  ESS_MODE.AddrMod
2370: 65 46 6c 61 74 3b 0d 0a 09 09 0d 0a 09 09 73 69  eFlat;........si
2380: 7a 65 5f 74 20 53 79 6d 62 6f 6c 53 69 7a 65 20  ze_t SymbolSize 
2390: 3d 20 44 62 67 68 65 6c 70 2e 49 4d 41 47 45 48  = Dbghelp.IMAGEH
23a0: 4c 50 5f 53 59 4d 42 4f 4c 36 34 2e 73 69 7a 65  LP_SYMBOL64.size
23b0: 6f 66 20 2b 20 4d 41 58 5f 4e 41 4d 45 4c 45 4e  of + MAX_NAMELEN
23c0: 3b 0d 0a 09 09 44 62 67 68 65 6c 70 2e 49 4d 41  ;....Dbghelp.IMA
23d0: 47 45 48 4c 50 5f 53 59 4d 42 4f 4c 36 34 20 2a  GEHLP_SYMBOL64 *
23e0: 53 79 6d 62 6f 6c 20 3d 20 63 61 73 74 28 44 62  Symbol = cast(Db
23f0: 67 68 65 6c 70 2e 49 4d 41 47 45 48 4c 50 5f 53  ghelp.IMAGEHLP_S
2400: 59 4d 42 4f 4c 36 34 2a 29 20 6d 61 6c 6c 6f 63  YMBOL64*) malloc
2410: 28 53 79 6d 62 6f 6c 53 69 7a 65 29 3b 0d 0a 09  (SymbolSize);...
2420: 09 6d 65 6d 73 65 74 28 53 79 6d 62 6f 6c 2c 30  .memset(Symbol,0
2430: 2c 53 79 6d 62 6f 6c 53 69 7a 65 29 3b 0d 0a 09  ,SymbolSize);...
2440: 09 53 79 6d 62 6f 6c 2e 53 69 7a 65 4f 66 53 74  .Symbol.SizeOfSt
2450: 72 75 63 74 20 3d 20 53 79 6d 62 6f 6c 53 69 7a  ruct = SymbolSiz
2460: 65 3b 0d 0a 09 09 53 79 6d 62 6f 6c 2e 4d 61 78  e;....Symbol.Max
2470: 4e 61 6d 65 4c 65 6e 67 74 68 20 3d 20 4d 41 58  NameLength = MAX
2480: 5f 4e 41 4d 45 4c 45 4e 3b 0d 0a 09 09 0d 0a 09  _NAMELEN;.......
2490: 09 44 62 67 68 65 6c 70 2e 49 4d 41 47 45 48 4c  .Dbghelp.IMAGEHL
24a0: 50 5f 4c 49 4e 45 36 34 20 4c 69 6e 65 3b 0d 0a  P_LINE64 Line;..
24b0: 09 09 6d 65 6d 73 65 74 28 26 4c 69 6e 65 2c 30  ..memset(&Line,0
24c0: 2c 74 79 70 65 6f 66 28 4c 69 6e 65 29 2e 73 69  ,typeof(Line).si
24d0: 7a 65 6f 66 29 3b 0d 0a 09 09 4c 69 6e 65 2e 53  zeof);....Line.S
24e0: 69 7a 65 4f 66 53 74 72 75 63 74 20 3d 20 74 79  izeOfStruct = ty
24f0: 70 65 6f 66 28 4c 69 6e 65 29 2e 73 69 7a 65 6f  peof(Line).sizeo
2500: 66 3b 0d 0a 09 09 0d 0a 09 09 44 62 67 68 65 6c  f;........Dbghel
2510: 70 2e 49 4d 41 47 45 48 4c 50 5f 4d 4f 44 55 4c  p.IMAGEHLP_MODUL
2520: 45 36 34 20 4d 6f 64 75 6c 65 3b 0d 0a 09 09 6d  E64 Module;....m
2530: 65 6d 73 65 74 28 26 4d 6f 64 75 6c 65 2c 30 2c  emset(&Module,0,
2540: 74 79 70 65 6f 66 28 4d 6f 64 75 6c 65 29 2e 73  typeof(Module).s
2550: 69 7a 65 6f 66 29 3b 0d 0a 09 09 4d 6f 64 75 6c  izeof);....Modul
2560: 65 2e 53 69 7a 65 4f 66 53 74 72 75 63 74 20 20  e.SizeOfStruct  
2570: 3d 20 74 79 70 65 6f 66 28 4d 6f 64 75 6c 65 29  = typeof(Module)
2580: 2e 73 69 7a 65 6f 66 3b 0d 0a 09 09 0d 0a 09 09  .sizeof;........
2590: 61 75 74 6f 20 73 74 61 63 6b 20 3d 20 6e 65 77  auto stack = new
25a0: 20 43 61 6c 6c 73 74 61 63 6b 28 29 3b 0d 0a 09   Callstack();...
25b0: 09 0d 0a 09 09 2f 2f 77 72 69 74 65 66 6c 6e 28  .....//writefln(
25c0: 22 43 61 6c 6c 73 74 61 63 6b 3a 22 29 3b 0d 0a  "Callstack:");..
25d0: 09 09 66 6f 72 28 69 6e 74 20 66 72 61 6d 65 4e  ..for(int frameN
25e0: 75 6d 3d 30 3b 3b 66 72 61 6d 65 4e 75 6d 2b 2b  um=0;;frameNum++
25f0: 29 7b 0d 0a 09 09 09 69 66 28 44 62 67 68 65 6c  ){.....if(Dbghel
2600: 70 2e 53 74 61 63 6b 57 61 6c 6b 36 34 28 69 6d  p.StackWalk64(im
2610: 61 67 65 54 79 70 65 2c 20 68 50 72 6f 63 65 73  ageType, hProces
2620: 73 2c 20 68 54 68 72 65 61 64 2c 20 0d 0a 09 09  s, hThread, ....
2630: 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2640: 20 20 20 20 20 26 73 74 61 63 6b 66 72 61 6d 65       &stackframe
2650: 2c 20 26 63 2c 20 0d 0a 09 09 09 20 20 20 20 20  , &c, .....     
2660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
2670: 75 6c 6c 2c 0d 0a 09 09 09 20 20 20 20 20 20 20  ull,.....       
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
2690: 74 28 44 62 67 68 65 6c 70 2e 46 75 6e 63 74 69  t(Dbghelp.Functi
26a0: 6f 6e 54 61 62 6c 65 41 63 63 65 73 73 50 72 6f  onTableAccessPro
26b0: 63 36 34 29 44 62 67 68 65 6c 70 2e 53 79 6d 46  c64)Dbghelp.SymF
26c0: 75 6e 63 74 69 6f 6e 54 61 62 6c 65 41 63 63 65  unctionTableAcce
26d0: 73 73 36 34 2c 0d 0a 09 09 09 20 20 20 20 20 20  ss64,.....      
26e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61                ca
26f0: 73 74 28 44 62 67 68 65 6c 70 2e 47 65 74 4d 6f  st(Dbghelp.GetMo
2700: 64 75 6c 65 42 61 73 65 50 72 6f 63 36 34 29 44  duleBaseProc64)D
2710: 62 67 68 65 6c 70 2e 53 79 6d 47 65 74 4d 6f 64  bghelp.SymGetMod
2720: 75 6c 65 42 61 73 65 36 34 2c 0d 0a 09 09 09 20  uleBase64,..... 
2730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2740: 20 20 20 6e 75 6c 6c 29 20 21 3d 20 54 52 55 45     null) != TRUE
2750: 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09 09 2f 2f   ).....{......//
2760: 77 72 69 74 65 66 6c 6e 28 22 45 6e 64 20 6f 66  writefln("End of
2770: 20 43 61 6c 6c 73 74 61 63 6b 22 29 3b 0d 0a 09   Callstack");...
2780: 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 7d 0d  ...break;.....}.
2790: 0a 09 09 09 0d 0a 09 09 09 69 66 28 73 74 61 63  .........if(stac
27a0: 6b 66 72 61 6d 65 2e 41 64 64 72 50 43 2e 4f 66  kframe.AddrPC.Of
27b0: 66 73 65 74 20 3d 3d 20 73 74 61 63 6b 66 72 61  fset == stackfra
27c0: 6d 65 2e 41 64 64 72 52 65 74 75 72 6e 2e 4f 66  me.AddrReturn.Of
27d0: 66 73 65 74 29 7b 0d 0a 09 09 09 09 2f 2f 77 72  fset){......//wr
27e0: 69 74 65 66 6c 6e 28 22 45 6e 64 6c 65 73 73 20  itefln("Endless 
27f0: 63 61 6c 6c 73 74 61 63 6b 22 29 3b 0d 0a 09 09  callstack");....
2800: 09 09 73 74 61 63 6b 2e 61 70 70 65 6e 64 28 22  ..stack.append("
2810: 45 6e 64 6c 65 73 73 20 63 61 6c 6c 73 74 61 63  Endless callstac
2820: 6b 22 29 3b 0d 0a 09 09 09 09 62 72 65 61 6b 3b  k");......break;
2830: 0d 0a 09 09 09 7d 0d 0a 09 09 09 0d 0a 09 09 09  .....}..........
2840: 69 66 28 73 74 61 63 6b 66 72 61 6d 65 2e 41 64  if(stackframe.Ad
2850: 64 72 50 43 2e 4f 66 66 73 65 74 20 21 3d 20 30  drPC.Offset != 0
2860: 29 7b 0d 0a 09 09 09 09 73 74 72 69 6e 67 20 6c  ){......string l
2870: 69 6e 65 53 74 72 20 3d 20 22 22 3b 0d 0a 09 09  ineStr = "";....
2880: 09 09 44 62 67 68 65 6c 70 2e 44 57 4f 52 44 36  ..Dbghelp.DWORD6
2890: 34 20 6f 66 66 73 65 74 46 72 6f 6d 53 79 6d 62  4 offsetFromSymb
28a0: 6f 6c 20 3d 20 63 61 73 74 28 44 62 67 68 65 6c  ol = cast(Dbghel
28b0: 70 2e 44 57 4f 52 44 36 34 29 30 3b 0d 0a 09 09  p.DWORD64)0;....
28c0: 09 09 69 66 28 20 44 62 67 68 65 6c 70 2e 53 79  ..if( Dbghelp.Sy
28d0: 6d 47 65 74 53 79 6d 46 72 6f 6d 41 64 64 72 36  mGetSymFromAddr6
28e0: 34 28 68 50 72 6f 63 65 73 73 2c 73 74 61 63 6b  4(hProcess,stack
28f0: 66 72 61 6d 65 2e 41 64 64 72 50 43 2e 4f 66 66  frame.AddrPC.Off
2900: 73 65 74 2c 26 6f 66 66 73 65 74 46 72 6f 6d 53  set,&offsetFromS
2910: 79 6d 62 6f 6c 2c 53 79 6d 62 6f 6c 29 20 3d 3d  ymbol,Symbol) ==
2920: 20 54 52 55 45 29 7b 0d 0a 09 09 09 09 09 63 68   TRUE){.......ch
2930: 61 72 5b 5d 20 73 79 6d 4e 61 6d 65 20 3d 20 6e  ar[] symName = n
2940: 65 77 20 63 68 61 72 5b 73 74 72 6c 65 6e 28 63  ew char[strlen(c
2950: 61 73 74 28 63 6f 6e 73 74 28 63 68 61 72 29 2a  ast(const(char)*
2960: 29 53 79 6d 62 6f 6c 2e 4e 61 6d 65 2e 70 74 72  )Symbol.Name.ptr
2970: 29 2b 31 5d 3b 0d 0a 09 09 09 09 09 6d 65 6d 63  )+1];.......memc
2980: 70 79 28 73 79 6d 4e 61 6d 65 2e 70 74 72 2c 53  py(symName.ptr,S
2990: 79 6d 62 6f 6c 2e 4e 61 6d 65 2e 70 74 72 2c 73  ymbol.Name.ptr,s
29a0: 79 6d 4e 61 6d 65 2e 6c 65 6e 67 74 68 29 3b 0d  ymName.length);.
29b0: 0a 09 09 09 09 09 73 74 72 69 6e 67 20 73 79 6d  ......string sym
29c0: 53 74 72 69 6e 67 20 3d 20 22 22 3b 0d 0a 09 09  String = "";....
29d0: 09 09 09 69 66 28 73 79 6d 4e 61 6d 65 5b 30 5d  ...if(symName[0]
29e0: 20 3d 3d 20 27 44 27 29 0d 0a 09 09 09 09 09 09   == 'D')........
29f0: 73 79 6d 53 74 72 69 6e 67 20 3d 20 22 5f 22 3b  symString = "_";
2a00: 0d 0a 09 09 09 09 09 73 79 6d 53 74 72 69 6e 67  .......symString
2a10: 20 7e 3d 20 73 79 6d 4e 61 6d 65 3b 0d 0a 09 09   ~= symName;....
2a20: 09 09 09 0d 0a 09 09 09 09 09 73 74 72 69 6e 67  ..........string
2a30: 20 64 65 6d 61 6e 67 65 6c 65 64 4e 61 6d 65 20   demangeledName 
2a40: 3d 20 64 65 6d 61 6e 67 6c 65 28 73 79 6d 53 74  = demangle(symSt
2a50: 72 69 6e 67 29 3b 0d 0a 09 09 09 09 09 6c 69 6e  ring);.......lin
2a60: 65 53 74 72 20 7e 3d 20 64 65 6d 61 6e 67 65 6c  eStr ~= demangel
2a70: 65 64 4e 61 6d 65 3b 0d 0a 0d 0a 09 09 09 09 09  edName;.........
2a80: 44 57 4f 52 44 20 7a 65 69 63 68 65 6e 20 3d 20  DWORD zeichen = 
2a90: 30 3b 0d 0a 09 09 09 09 09 69 66 28 44 62 67 68  0;.......if(Dbgh
2aa0: 65 6c 70 2e 53 79 6d 47 65 74 4c 69 6e 65 46 72  elp.SymGetLineFr
2ab0: 6f 6d 41 64 64 72 36 34 28 68 50 72 6f 63 65 73  omAddr64(hProces
2ac0: 73 2c 73 74 61 63 6b 66 72 61 6d 65 2e 41 64 64  s,stackframe.Add
2ad0: 72 50 43 2e 4f 66 66 73 65 74 2c 26 7a 65 69 63  rPC.Offset,&zeic
2ae0: 68 65 6e 2c 26 4c 69 6e 65 29 20 3d 3d 20 54 52  hen,&Line) == TR
2af0: 55 45 29 7b 0d 0a 09 09 09 09 09 09 63 68 61 72  UE){........char
2b00: 5b 5d 20 66 69 6c 65 4e 61 6d 65 20 3d 20 6e 65  [] fileName = ne
2b10: 77 20 63 68 61 72 5b 73 74 72 6c 65 6e 28 4c 69  w char[strlen(Li
2b20: 6e 65 2e 46 69 6c 65 4e 61 6d 65 29 5d 3b 0d 0a  ne.FileName)];..
2b30: 09 09 09 09 09 09 66 69 6c 65 4e 61 6d 65 5b 5d  ......fileName[]
2b40: 20 3d 20 4c 69 6e 65 2e 46 69 6c 65 4e 61 6d 65   = Line.FileName
2b50: 5b 30 2e 2e 66 69 6c 65 4e 61 6d 65 2e 6c 65 6e  [0..fileName.len
2b60: 67 74 68 5d 3b 0d 0a 09 09 09 09 09 09 6c 69 6e  gth];........lin
2b70: 65 53 74 72 20 3d 20 74 6f 21 73 74 72 69 6e 67  eStr = to!string
2b80: 28 66 69 6c 65 4e 61 6d 65 20 7e 20 22 3a 3a 22  (fileName ~ "::"
2b90: 20 7e 20 74 6f 21 73 74 72 69 6e 67 28 4c 69 6e   ~ to!string(Lin
2ba0: 65 2e 4c 69 6e 65 4e 75 6d 62 65 72 29 20 7e 20  e.LineNumber) ~ 
2bb0: 22 28 22 20 7e 20 74 6f 21 73 74 72 69 6e 67 28  "(" ~ to!string(
2bc0: 7a 65 69 63 68 65 6e 29 20 7e 20 22 29 20 22 20  zeichen) ~ ") " 
2bd0: 7e 20 6c 69 6e 65 53 74 72 29 3b 0d 0a 09 09 09  ~ lineStr);.....
2be0: 09 09 7d 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 09  ..}......}......
2bf0: 65 6c 73 65 20 7b 0d 0a 09 09 09 09 09 6c 69 6e  else {.......lin
2c00: 65 53 74 72 20 3d 20 74 6f 21 73 74 72 69 6e 67  eStr = to!string
2c10: 28 63 61 73 74 28 75 6c 6f 6e 67 29 73 74 61 63  (cast(ulong)stac
2c20: 6b 66 72 61 6d 65 2e 41 64 64 72 50 43 2e 4f 66  kframe.AddrPC.Of
2c30: 66 73 65 74 29 3b 0d 0a 09 09 09 09 7d 0d 0a 09  fset);......}...
2c40: 09 09 09 6c 69 6e 65 53 74 72 20 3d 20 74 6f 21  ...lineStr = to!
2c50: 73 74 72 69 6e 67 28 66 72 61 6d 65 4e 75 6d 2d  string(frameNum-
2c60: 32 29 20 7e 20 22 20 22 20 7e 20 6c 69 6e 65 53  2) ~ " " ~ lineS
2c70: 74 72 3b 0d 0a 09 09 09 09 69 66 28 66 72 61 6d  tr;......if(fram
2c80: 65 4e 75 6d 2d 32 20 3c 20 31 30 29 0d 0a 09 09  eNum-2 < 10)....
2c90: 09 09 09 6c 69 6e 65 53 74 72 20 3d 20 22 30 22  ...lineStr = "0"
2ca0: 20 7e 20 6c 69 6e 65 53 74 72 3b 0d 0a 09 09 09   ~ lineStr;.....
2cb0: 09 69 66 28 66 72 61 6d 65 4e 75 6d 20 3e 3d 20  .if(frameNum >= 
2cc0: 32 29 0d 0a 09 09 09 09 09 73 74 61 63 6b 2e 61  2).......stack.a
2cd0: 70 70 65 6e 64 28 6c 69 6e 65 53 74 72 29 3b 0d  ppend(lineStr);.
2ce0: 0a 09 09 09 7d 0d 0a 09 09 7d 0d 0a 09 09 0d 0a  ....}....}......
2cf0: 09 09 66 72 65 65 28 53 79 6d 62 6f 6c 29 3b 0d  ..free(Symbol);.
2d00: 0a 09 09 72 65 74 75 72 6e 20 73 74 61 63 6b 3b  ...return stack;
2d10: 0d 0a 09 7d 0d 0a 20 7d 3b 0d 0a 20              ...}.. };..