Hex Artifact Content
Not logged in

Artifact e1d39624d6c4117471daa5ef493b515b9301e07f:


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 69 6d 70 6f 72 74  td.conv;..import
0690: 20 73 74 64 2e 70 61 74 68 3b 0d 0a 0d 0a 65 78   std.path;....ex
06a0: 74 65 72 6e 28 57 69 6e 64 6f 77 73 29 7b 0d 0a  tern(Windows){..
06b0: 09 44 57 4f 52 44 20 47 65 74 45 6e 76 69 72 6f  .DWORD GetEnviro
06c0: 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 41 28 4c  nmentVariableA(L
06d0: 50 43 53 54 52 20 6c 70 4e 61 6d 65 2c 20 4c 50  PCSTR lpName, LP
06e0: 53 54 52 20 70 42 75 66 66 65 72 2c 20 44 57 4f  STR pBuffer, DWO
06f0: 52 44 20 6e 53 69 7a 65 29 3b 0d 0a 09 76 6f 69  RD nSize);...voi
0700: 64 20 52 74 6c 43 61 70 74 75 72 65 43 6f 6e 74  d RtlCaptureCont
0710: 65 78 74 28 43 4f 4e 54 45 58 54 2a 20 43 6f 6e  ext(CONTEXT* Con
0720: 74 65 78 74 52 65 63 6f 72 64 29 3b 0d 0a 09 74  textRecord);...t
0730: 79 70 65 64 65 66 20 4c 4f 4e 47 20 66 75 6e 63  ypedef LONG func
0740: 74 69 6f 6e 28 76 6f 69 64 2a 29 20 55 6e 68 61  tion(void*) Unha
0750: 6e 64 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 46  ndeledExceptionF
0760: 69 6c 74 65 72 46 75 6e 63 3b 0d 0a 09 76 6f 69  ilterFunc;...voi
0770: 64 2a 20 53 65 74 55 6e 68 61 6e 64 6c 65 64 45  d* SetUnhandledE
0780: 78 63 65 70 74 69 6f 6e 46 69 6c 74 65 72 28 76  xceptionFilter(v
0790: 6f 69 64 2a 20 68 61 6e 64 6c 65 72 29 3b 0d 0a  oid* handler);..
07a0: 7d 0d 0a 0d 0a 63 6c 61 73 73 20 53 74 61 63 6b  }....class Stack
07b0: 54 72 61 63 65 20 7b 0d 0a 70 72 69 76 61 74 65  Trace {..private
07c0: 3a 0d 0a 09 65 6e 75 6d 20 3a 20 75 69 6e 74 20  :...enum : uint 
07d0: 7b 0d 0a 09 09 4d 41 58 5f 4d 4f 44 55 4c 45 5f  {....MAX_MODULE_
07e0: 4e 41 4d 45 33 32 20 3d 20 32 35 35 2c 0d 0a 09  NAME32 = 255,...
07f0: 09 54 48 33 32 43 53 5f 53 4e 41 50 4d 4f 44 55  .TH32CS_SNAPMODU
0800: 4c 45 20 3d 20 30 78 30 30 30 30 30 30 30 38 2c  LE = 0x00000008,
0810: 0d 0a 09 09 4d 41 58 5f 4e 41 4d 45 4c 45 4e 20  ....MAX_NAMELEN 
0820: 3d 20 31 30 32 34 0d 0a 09 7d 3b 0d 0a 09 0d 0a  = 1024...};.....
0830: 09 73 74 72 75 63 74 20 4d 4f 44 55 4c 45 45 4e  .struct MODULEEN
0840: 54 52 59 33 32 20 7b 0d 0a 09 09 44 57 4f 52 44  TRY32 {....DWORD
0850: 20 64 77 53 69 7a 65 3b 0d 0a 09 09 44 57 4f 52   dwSize;....DWOR
0860: 44 20 74 68 33 32 4d 6f 64 75 6c 65 49 44 3b 0d  D th32ModuleID;.
0870: 0a 09 09 44 57 4f 52 44 20 74 68 33 32 50 72 6f  ...DWORD th32Pro
0880: 63 65 73 73 49 44 3b 0d 0a 09 09 44 57 4f 52 44  cessID;....DWORD
0890: 20 47 6c 62 6c 63 6e 74 55 73 61 67 65 3b 0d 0a   GlblcntUsage;..
08a0: 09 09 44 57 4f 52 44 20 50 72 6f 63 63 6e 74 55  ..DWORD ProccntU
08b0: 73 61 67 65 3b 0d 0a 09 09 42 59 54 45 2a 20 6d  sage;....BYTE* m
08c0: 6f 64 42 61 73 65 41 64 64 72 3b 0d 0a 09 09 44  odBaseAddr;....D
08d0: 57 4f 52 44 20 6d 6f 64 42 61 73 65 53 69 7a 65  WORD modBaseSize
08e0: 3b 0d 0a 09 09 48 4d 4f 44 55 4c 45 20 68 4d 6f  ;....HMODULE hMo
08f0: 64 75 6c 65 3b 0d 0a 09 09 43 48 41 52 5b 4d 41  dule;....CHAR[MA
0900: 58 5f 4d 4f 44 55 4c 45 5f 4e 41 4d 45 33 32 20  X_MODULE_NAME32 
0910: 2b 20 31 5d 20 73 7a 4d 6f 64 75 6c 65 3b 0d 0a  + 1] szModule;..
0920: 09 09 43 48 41 52 5b 4d 41 58 5f 50 41 54 48 5d  ..CHAR[MAX_PATH]
0930: 20 73 7a 45 78 65 50 61 74 68 3b 0d 0a 09 7d 3b   szExePath;...};
0940: 0d 0a 09 0d 0a 09 73 74 72 69 6e 67 20 6d 5f 55  ......string m_U
0950: 73 65 72 53 79 6d 50 61 74 68 3b 0d 0a 09 73 74  serSymPath;...st
0960: 61 74 69 63 20 62 6f 6f 6c 20 69 73 49 6e 69 74  atic bool isInit
0970: 20 3d 20 66 61 6c 73 65 3b 0d 0a 09 73 74 61 74   = false;...stat
0980: 69 63 20 62 6f 6f 6c 20 6d 6f 64 75 6c 65 73 4c  ic bool modulesL
0990: 6f 61 64 65 64 20 3d 20 66 61 6c 73 65 3b 0d 0a  oaded = false;..
09a0: 09 0d 0a 09 65 78 74 65 72 6e 28 53 79 73 74 65  ....extern(Syste
09b0: 6d 29 7b 0d 0a 09 09 74 79 70 65 64 65 66 20 48  m){....typedef H
09c0: 41 4e 44 4c 45 20 66 75 6e 63 74 69 6f 6e 28 44  ANDLE function(D
09d0: 57 4f 52 44 20 64 77 46 6c 61 67 73 2c 20 44 57  WORD dwFlags, DW
09e0: 4f 52 44 20 74 68 33 32 50 72 6f 63 65 73 73 49  ORD th32ProcessI
09f0: 44 29 20 43 72 65 61 74 65 54 6f 6f 6c 68 65 6c  D) CreateToolhel
0a00: 70 33 32 53 6e 61 70 73 68 6f 74 46 75 6e 63 3b  p32SnapshotFunc;
0a10: 0d 0a 09 09 74 79 70 65 64 65 66 20 42 4f 4f 4c  ....typedef BOOL
0a20: 20 66 75 6e 63 74 69 6f 6e 28 48 41 4e 44 4c 45   function(HANDLE
0a30: 20 68 53 6e 61 70 73 68 6f 74 2c 20 4d 4f 44 55   hSnapshot, MODU
0a40: 4c 45 45 4e 54 52 59 33 32 20 2a 6c 70 6d 65 29  LEENTRY32 *lpme)
0a50: 20 4d 6f 64 75 6c 65 33 32 46 69 72 73 74 46 75   Module32FirstFu
0a60: 6e 63 3b 0d 0a 09 09 74 79 70 65 64 65 66 20 42  nc;....typedef B
0a70: 4f 4f 4c 20 66 75 6e 63 74 69 6f 6e 28 48 41 4e  OOL function(HAN
0a80: 44 4c 45 20 68 53 6e 61 70 73 68 6f 74 2c 20 4d  DLE hSnapshot, M
0a90: 4f 44 55 4c 45 45 4e 54 52 59 33 32 20 2a 6c 70  ODULEENTRY32 *lp
0aa0: 6d 65 29 20 4d 6f 64 75 6c 65 33 32 4e 65 78 74  me) Module32Next
0ab0: 46 75 6e 63 3b 0d 0a 09 7d 0d 0a 09 0d 0a 09 65  Func;...}......e
0ac0: 78 74 65 72 6e 28 57 69 6e 64 6f 77 73 29 20 73  xtern(Windows) s
0ad0: 74 61 74 69 63 20 4c 4f 4e 47 20 55 6e 68 61 6e  tatic LONG Unhan
0ae0: 64 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 46 69  deledExceptionFi
0af0: 6c 74 65 72 48 61 6e 64 6c 65 72 28 76 6f 69 64  lterHandler(void
0b00: 2a 20 69 6e 66 6f 29 7b 0d 0a 09 09 70 72 69 6e  * info){....prin
0b10: 74 53 74 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a  tStackTrace();..
0b20: 09 09 72 65 74 75 72 6e 20 30 3b 0d 0a 09 7d 0d  ..return 0;...}.
0b30: 0a 09 0d 0a 09 73 74 61 74 69 63 20 76 6f 69 64  .....static void
0b40: 20 70 72 69 6e 74 53 74 61 63 6b 54 72 61 63 65   printStackTrace
0b50: 28 29 7b 0d 0a 09 09 61 75 74 6f 20 73 74 61 63  (){....auto stac
0b60: 6b 20 3d 20 54 72 61 63 65 48 61 6e 64 6c 65 72  k = TraceHandler
0b70: 28 6e 75 6c 6c 29 3b 0d 0a 09 09 66 6f 72 65 61  (null);....forea
0b80: 63 68 28 63 68 61 72 5b 5d 20 73 3b 73 74 61 63  ch(char[] s;stac
0b90: 6b 29 7b 0d 0a 09 09 09 77 72 69 74 65 66 6c 6e  k){.....writefln
0ba0: 28 22 25 73 22 2c 73 29 3b 0d 0a 09 09 7d 0d 0a  ("%s",s);....}..
0bb0: 09 7d 0d 0a 09 0d 0a 09 62 6f 6f 6c 20 4c 6f 61  .}......bool Loa
0bc0: 64 4d 6f 64 75 6c 65 73 28 48 41 4e 44 4c 45 20  dModules(HANDLE 
0bd0: 68 50 72 6f 63 65 73 73 2c 20 44 57 4f 52 44 20  hProcess, DWORD 
0be0: 70 69 64 29 7b 0d 0a 09 09 69 66 28 6d 6f 64 75  pid){....if(modu
0bf0: 6c 65 73 4c 6f 61 64 65 64 29 0d 0a 09 09 09 72  lesLoaded).....r
0c00: 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 09 09 0d  eturn true;.....
0c10: 0a 09 09 43 72 65 61 74 65 54 6f 6f 6c 68 65 6c  ...CreateToolhel
0c20: 70 33 32 53 6e 61 70 73 68 6f 74 46 75 6e 63 20  p32SnapshotFunc 
0c30: 43 72 65 61 74 65 54 6f 6f 6c 68 65 6c 70 33 32  CreateToolhelp32
0c40: 53 6e 61 70 73 68 6f 74 20 3d 20 6e 75 6c 6c 3b  Snapshot = null;
0c50: 0d 0a 09 09 4d 6f 64 75 6c 65 33 32 46 69 72 73  ....Module32Firs
0c60: 74 46 75 6e 63 20 4d 6f 64 75 6c 65 33 32 46 69  tFunc Module32Fi
0c70: 72 73 74 20 3d 20 6e 75 6c 6c 3b 0d 0a 09 09 4d  rst = null;....M
0c80: 6f 64 75 6c 65 33 32 4e 65 78 74 46 75 6e 63 20  odule32NextFunc 
0c90: 4d 6f 64 75 6c 65 33 32 4e 65 78 74 20 3d 20 6e  Module32Next = n
0ca0: 75 6c 6c 3b 0d 0a 09 09 09 0d 0a 09 09 48 4d 4f  ull;.........HMO
0cb0: 44 55 4c 45 20 68 44 6c 6c 20 3d 20 6e 75 6c 6c  DULE hDll = null
0cc0: 3b 0d 0a 09 09 0d 0a 09 09 73 74 72 69 6e 67 5b  ;........string[
0cd0: 5d 20 73 65 61 72 63 68 44 6c 6c 73 20 3d 20 5b  ] searchDlls = [
0ce0: 20 22 6b 65 72 6e 65 6c 33 32 2e 64 6c 6c 22 2c   "kernel32.dll",
0cf0: 20 22 74 6c 68 65 6c 70 33 32 2e 64 6c 6c 22 20   "tlhelp32.dll" 
0d00: 5d 3b 0d 0a 09 09 66 6f 72 65 61 63 68 28 64 6c  ];....foreach(dl
0d10: 6c 3b 73 65 61 72 63 68 44 6c 6c 73 29 7b 0d 0a  l;searchDlls){..
0d20: 09 09 09 68 44 6c 6c 20 3d 20 63 61 73 74 28 48  ...hDll = cast(H
0d30: 4d 4f 44 55 4c 45 29 52 75 6e 74 69 6d 65 2e 6c  MODULE)Runtime.l
0d40: 6f 61 64 4c 69 62 72 61 72 79 28 64 6c 6c 29 3b  oadLibrary(dll);
0d50: 0d 0a 09 09 09 69 66 28 68 44 6c 6c 20 3d 3d 20  .....if(hDll == 
0d60: 6e 75 6c 6c 29 0d 0a 09 09 09 09 62 72 65 61 6b  null)......break
0d70: 3b 0d 0a 09 09 09 43 72 65 61 74 65 54 6f 6f 6c  ;.....CreateTool
0d80: 68 65 6c 70 33 32 53 6e 61 70 73 68 6f 74 20 3d  help32Snapshot =
0d90: 20 63 61 73 74 28 43 72 65 61 74 65 54 6f 6f 6c   cast(CreateTool
0da0: 68 65 6c 70 33 32 53 6e 61 70 73 68 6f 74 46 75  help32SnapshotFu
0db0: 6e 63 29 20 47 65 74 50 72 6f 63 41 64 64 72 65  nc) GetProcAddre
0dc0: 73 73 28 68 44 6c 6c 2c 22 43 72 65 61 74 65 54  ss(hDll,"CreateT
0dd0: 6f 6f 6c 68 65 6c 70 33 32 53 6e 61 70 73 68 6f  oolhelp32Snapsho
0de0: 74 22 29 3b 0d 0a 09 09 09 4d 6f 64 75 6c 65 33  t");.....Module3
0df0: 32 46 69 72 73 74 20 3d 20 63 61 73 74 28 4d 6f  2First = cast(Mo
0e00: 64 75 6c 65 33 32 46 69 72 73 74 46 75 6e 63 29  dule32FirstFunc)
0e10: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
0e20: 68 44 6c 6c 2c 22 4d 6f 64 75 6c 65 33 32 46 69  hDll,"Module32Fi
0e30: 72 73 74 22 29 3b 0d 0a 09 09 09 4d 6f 64 75 6c  rst");.....Modul
0e40: 65 33 32 4e 65 78 74 20 3d 20 63 61 73 74 28 4d  e32Next = cast(M
0e50: 6f 64 75 6c 65 33 32 4e 65 78 74 46 75 6e 63 29  odule32NextFunc)
0e60: 20 47 65 74 50 72 6f 63 41 64 64 72 65 73 73 28   GetProcAddress(
0e70: 68 44 6c 6c 2c 22 4d 6f 64 75 6c 65 33 32 4e 65  hDll,"Module32Ne
0e80: 78 74 22 29 3b 0d 0a 09 09 09 69 66 28 43 72 65  xt");.....if(Cre
0e90: 61 74 65 54 6f 6f 6c 68 65 6c 70 33 32 53 6e 61  ateToolhelp32Sna
0ea0: 70 73 68 6f 74 20 21 3d 20 6e 75 6c 6c 20 26 26  pshot != null &&
0eb0: 20 4d 6f 64 75 6c 65 33 32 46 69 72 73 74 20 21   Module32First !
0ec0: 3d 20 6e 75 6c 6c 20 26 26 20 4d 6f 64 75 6c 65  = null && Module
0ed0: 33 32 4e 65 78 74 20 21 3d 20 6e 75 6c 6c 29 0d  32Next != null).
0ee0: 0a 09 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09  .....break;.....
0ef0: 52 75 6e 74 69 6d 65 2e 75 6e 6c 6f 61 64 4c 69  Runtime.unloadLi
0f00: 62 72 61 72 79 28 68 44 6c 6c 29 3b 0d 0a 09 09  brary(hDll);....
0f10: 09 68 44 6c 6c 20 3d 20 6e 75 6c 6c 3b 0d 0a 09  .hDll = null;...
0f20: 09 7d 0d 0a 09 09 0d 0a 09 09 69 66 28 68 44 6c  .}........if(hDl
0f30: 6c 20 3d 3d 20 6e 75 6c 6c 29 7b 0d 0a 09 09 09  l == null){.....
0f40: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09  return false;...
0f50: 09 7d 0d 0a 09 09 0d 0a 09 09 48 41 4e 44 4c 45  .}........HANDLE
0f60: 20 68 53 6e 61 70 20 3d 20 43 72 65 61 74 65 54   hSnap = CreateT
0f70: 6f 6f 6c 68 65 6c 70 33 32 53 6e 61 70 73 68 6f  oolhelp32Snapsho
0f80: 74 28 54 48 33 32 43 53 5f 53 4e 41 50 4d 4f 44  t(TH32CS_SNAPMOD
0f90: 55 4c 45 2c 20 70 69 64 29 3b 0d 0a 09 09 69 66  ULE, pid);....if
0fa0: 28 68 53 6e 61 70 20 3d 3d 20 63 61 73 74 28 48  (hSnap == cast(H
0fb0: 41 4e 44 4c 45 29 20 2d 31 29 0d 0a 09 09 09 72  ANDLE) -1).....r
0fc0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0d 0a 09 09  eturn false;....
0fd0: 0d 0a 09 09 4d 4f 44 55 4c 45 45 4e 54 52 59 33  ....MODULEENTRY3
0fe0: 32 20 4d 6f 64 75 6c 65 45 6e 74 72 79 3b 0d 0a  2 ModuleEntry;..
0ff0: 09 09 6d 65 6d 73 65 74 28 26 4d 6f 64 75 6c 65  ..memset(&Module
1000: 45 6e 74 72 79 2c 30 2c 4d 4f 44 55 4c 45 45 4e  Entry,0,MODULEEN
1010: 54 52 59 33 32 2e 73 69 7a 65 6f 66 29 3b 0d 0a  TRY32.sizeof);..
1020: 09 09 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 64 77  ..ModuleEntry.dw
1030: 53 69 7a 65 20 3d 20 4d 4f 44 55 4c 45 45 4e 54  Size = MODULEENT
1040: 52 59 33 32 2e 73 69 7a 65 6f 66 3b 0d 0a 09 09  RY32.sizeof;....
1050: 0d 0a 09 09 62 6f 6f 6c 20 6d 6f 72 65 20 3d 20  ....bool more = 
1060: 63 61 73 74 28 62 6f 6f 6c 29 4d 6f 64 75 6c 65  cast(bool)Module
1070: 33 32 46 69 72 73 74 28 68 53 6e 61 70 2c 26 4d  32First(hSnap,&M
1080: 6f 64 75 6c 65 45 6e 74 72 79 29 3b 0d 0a 09 09  oduleEntry);....
1090: 69 6e 74 20 63 6f 75 6e 74 20 3d 20 30 3b 0d 0a  int count = 0;..
10a0: 09 09 77 68 69 6c 65 28 6d 6f 72 65 29 7b 0d 0a  ..while(more){..
10b0: 09 09 09 4c 6f 61 64 4d 6f 64 75 6c 65 28 68 50  ...LoadModule(hP
10c0: 72 6f 63 65 73 73 2c 20 4d 6f 64 75 6c 65 45 6e  rocess, ModuleEn
10d0: 74 72 79 2e 73 7a 45 78 65 50 61 74 68 2e 70 74  try.szExePath.pt
10e0: 72 2c 20 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 73  r, ModuleEntry.s
10f0: 7a 4d 6f 64 75 6c 65 2e 70 74 72 2c 20 63 61 73  zModule.ptr, cas
1100: 74 28 44 62 67 68 65 6c 70 2e 44 57 4f 52 44 36  t(Dbghelp.DWORD6
1110: 34 29 4d 6f 64 75 6c 65 45 6e 74 72 79 2e 6d 6f  4)ModuleEntry.mo
1120: 64 42 61 73 65 41 64 64 72 2c 20 4d 6f 64 75 6c  dBaseAddr, Modul
1130: 65 45 6e 74 72 79 2e 6d 6f 64 42 61 73 65 53 69  eEntry.modBaseSi
1140: 7a 65 29 3b 0d 0a 09 09 09 63 6f 75 6e 74 2b 2b  ze);.....count++
1150: 3b 0d 0a 09 09 09 6d 6f 72 65 20 3d 20 63 61 73  ;.....more = cas
1160: 74 28 62 6f 6f 6c 29 4d 6f 64 75 6c 65 33 32 4e  t(bool)Module32N
1170: 65 78 74 28 68 53 6e 61 70 2c 26 4d 6f 64 75 6c  ext(hSnap,&Modul
1180: 65 45 6e 74 72 79 29 3b 0d 0a 09 09 7d 0d 0a 09  eEntry);....}...
1190: 09 0d 0a 09 09 43 6c 6f 73 65 48 61 6e 64 6c 65  .....CloseHandle
11a0: 28 68 53 6e 61 70 29 3b 0d 0a 09 09 52 75 6e 74  (hSnap);....Runt
11b0: 69 6d 65 2e 75 6e 6c 6f 61 64 4c 69 62 72 61 72  ime.unloadLibrar
11c0: 79 28 68 44 6c 6c 29 3b 0d 0a 09 09 0d 0a 09 09  y(hDll);........
11d0: 69 66 28 63 6f 75 6e 74 20 3c 3d 20 30 29 0d 0a  if(count <= 0)..
11e0: 09 09 09 72 65 74 75 72 6e 20 66 61 6c 73 65 3b  ...return false;
11f0: 0d 0a 09 09 0d 0a 09 09 6d 6f 64 75 6c 65 73 4c  ........modulesL
1200: 6f 61 64 65 64 20 3d 20 74 72 75 65 3b 0d 0a 09  oaded = true;...
1210: 09 72 65 74 75 72 6e 20 74 72 75 65 3b 0d 0a 09  .return true;...
1220: 7d 0d 0a 0d 0a 09 76 6f 69 64 20 4c 6f 61 64 4d  }.....void LoadM
1230: 6f 64 75 6c 65 28 48 41 4e 44 4c 45 20 68 50 72  odule(HANDLE hPr
1240: 6f 63 65 73 73 2c 20 4c 50 43 53 54 52 20 69 6d  ocess, LPCSTR im
1250: 67 2c 20 4c 50 43 53 54 52 20 6d 6f 64 2c 20 44  g, LPCSTR mod, D
1260: 62 67 68 65 6c 70 2e 44 57 4f 52 44 36 34 20 62  bghelp.DWORD64 b
1270: 61 73 65 41 64 64 72 2c 20 44 57 4f 52 44 20 73  aseAddr, DWORD s
1280: 69 7a 65 29 7b 0d 0a 09 09 63 68 61 72 5b 5d 20  ize){....char[] 
1290: 73 7a 49 6d 67 20 3d 20 6e 65 77 20 63 68 61 72  szImg = new char
12a0: 5b 73 74 72 6c 65 6e 28 69 6d 67 29 5d 3b 0d 0a  [strlen(img)];..
12b0: 09 09 63 68 61 72 5b 5d 20 73 7a 4d 6f 64 20 3d  ..char[] szMod =
12c0: 20 6e 65 77 20 63 68 61 72 5b 73 74 72 6c 65 6e   new char[strlen
12d0: 28 6d 6f 64 29 5d 3b 0d 0a 09 09 73 7a 49 6d 67  (mod)];....szImg
12e0: 5b 30 2e 2e 73 7a 49 6d 67 2e 6c 65 6e 67 74 68  [0..szImg.length
12f0: 5d 20 3d 20 69 6d 67 5b 30 2e 2e 28 73 74 72 6c  ] = img[0..(strl
1300: 65 6e 28 69 6d 67 29 29 5d 3b 0d 0a 09 09 73 7a  en(img))];....sz
1310: 4d 6f 64 5b 30 2e 2e 73 7a 4d 6f 64 2e 6c 65 6e  Mod[0..szMod.len
1320: 67 74 68 5d 20 3d 20 6d 6f 64 5b 30 2e 2e 28 73  gth] = mod[0..(s
1330: 74 72 6c 65 6e 28 6d 6f 64 29 29 5d 3b 0d 0a 09  trlen(mod))];...
1340: 09 0d 0a 09 09 44 62 67 68 65 6c 70 2e 44 57 4f  .....Dbghelp.DWO
1350: 52 44 36 34 20 6d 6f 64 75 6c 65 41 64 64 72 20  RD64 moduleAddr 
1360: 3d 20 44 62 67 68 65 6c 70 2e 53 79 6d 4c 6f 61  = Dbghelp.SymLoa
1370: 64 4d 6f 64 75 6c 65 36 34 28 68 50 72 6f 63 65  dModule64(hProce
1380: 73 73 2c 48 41 4e 44 4c 45 2e 69 6e 69 74 2c 63  ss,HANDLE.init,c
1390: 61 73 74 28 44 62 67 68 65 6c 70 2e 50 43 53 54  ast(Dbghelp.PCST
13a0: 52 29 74 6f 53 74 72 69 6e 67 7a 28 73 7a 49 6d  R)toStringz(szIm
13b0: 67 29 2c 63 61 73 74 28 44 62 67 68 65 6c 70 2e  g),cast(Dbghelp.
13c0: 50 43 53 54 52 29 74 6f 53 74 72 69 6e 67 7a 28  PCSTR)toStringz(
13d0: 73 7a 4d 6f 64 29 2c 62 61 73 65 41 64 64 72 2c  szMod),baseAddr,
13e0: 73 69 7a 65 29 3b 0d 0a 09 09 69 66 28 6d 6f 64  size);....if(mod
13f0: 75 6c 65 41 64 64 72 20 3d 3d 20 30 29 0d 0a 09  uleAddr == 0)...
1400: 09 09 72 65 74 75 72 6e 3b 0d 0a 09 09 0d 0a 09  ..return;.......
1410: 09 44 62 67 68 65 6c 70 2e 49 4d 41 47 45 48 4c  .Dbghelp.IMAGEHL
1420: 50 5f 4d 4f 44 55 4c 45 36 34 20 4d 6f 64 75 6c  P_MODULE64 Modul
1430: 65 49 6e 66 6f 3b 0d 0a 09 09 6d 65 6d 73 65 74  eInfo;....memset
1440: 28 26 4d 6f 64 75 6c 65 49 6e 66 6f 2c 30 2c 74  (&ModuleInfo,0,t
1450: 79 70 65 6f 66 28 4d 6f 64 75 6c 65 49 6e 66 6f  ypeof(ModuleInfo
1460: 29 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09 09 4d 6f  ).sizeof);....Mo
1470: 64 75 6c 65 49 6e 66 6f 2e 53 69 7a 65 4f 66 53  duleInfo.SizeOfS
1480: 74 72 75 63 74 20 3d 20 74 79 70 65 6f 66 28 4d  truct = typeof(M
1490: 6f 64 75 6c 65 49 6e 66 6f 29 2e 73 69 7a 65 6f  oduleInfo).sizeo
14a0: 66 3b 0d 0a 09 09 69 66 28 44 62 67 68 65 6c 70  f;....if(Dbghelp
14b0: 2e 53 79 6d 47 65 74 4d 6f 64 75 6c 65 49 6e 66  .SymGetModuleInf
14c0: 6f 36 34 28 68 50 72 6f 63 65 73 73 2c 6d 6f 64  o64(hProcess,mod
14d0: 75 6c 65 41 64 64 72 2c 26 4d 6f 64 75 6c 65 49  uleAddr,&ModuleI
14e0: 6e 66 6f 29 20 3d 3d 20 54 52 55 45 29 7b 0d 0a  nfo) == TRUE){..
14f0: 09 09 09 69 66 28 4d 6f 64 75 6c 65 49 6e 66 6f  ...if(ModuleInfo
1500: 2e 53 79 6d 54 79 70 65 20 3d 3d 20 44 62 67 68  .SymType == Dbgh
1510: 65 6c 70 2e 53 59 4d 5f 54 59 50 45 2e 53 79 6d  elp.SYM_TYPE.Sym
1520: 4e 6f 6e 65 29 7b 0d 0a 09 09 09 09 44 62 67 68  None){......Dbgh
1530: 65 6c 70 2e 53 79 6d 55 6e 6c 6f 61 64 4d 6f 64  elp.SymUnloadMod
1540: 75 6c 65 36 34 28 68 50 72 6f 63 65 73 73 2c 6d  ule64(hProcess,m
1550: 6f 64 75 6c 65 41 64 64 72 29 3b 0d 0a 09 09 09  oduleAddr);.....
1560: 09 6d 6f 64 75 6c 65 41 64 64 72 20 3d 20 44 62  .moduleAddr = Db
1570: 67 68 65 6c 70 2e 53 79 6d 4c 6f 61 64 4d 6f 64  ghelp.SymLoadMod
1580: 75 6c 65 36 34 28 68 50 72 6f 63 65 73 73 2c 48  ule64(hProcess,H
1590: 41 4e 44 4c 45 2e 69 6e 69 74 2c 63 61 73 74 28  ANDLE.init,cast(
15a0: 44 62 67 68 65 6c 70 2e 50 43 53 54 52 29 74 6f  Dbghelp.PCSTR)to
15b0: 53 74 72 69 6e 67 7a 28 73 7a 49 6d 67 29 2c 6e  Stringz(szImg),n
15c0: 75 6c 6c 2c 63 61 73 74 28 44 62 67 68 65 6c 70  ull,cast(Dbghelp
15d0: 2e 44 57 4f 52 44 36 34 29 30 2c 30 29 3b 0d 0a  .DWORD64)0,0);..
15e0: 09 09 09 09 69 66 28 6d 6f 64 75 6c 65 41 64 64  ....if(moduleAdd
15f0: 72 20 3d 3d 20 30 29 0d 0a 09 09 09 09 09 72 65  r == 0).......re
1600: 74 75 72 6e 3b 0d 0a 09 09 09 7d 0d 0a 09 09 7d  turn;.....}....}
1610: 0d 0a 09 09 0d 0a 09 09 2f 2f 77 72 69 74 65 66  ........//writef
1620: 6c 6e 28 22 53 75 63 63 65 73 73 66 75 6c 6c 79  ln("Successfully
1630: 20 6c 6f 61 64 65 64 20 6d 6f 64 75 6c 65 20 25   loaded module %
1640: 73 22 2c 73 7a 49 6d 67 29 3b 0d 0a 09 7d 0d 0a  s",szImg);...}..
1650: 09 0d 0a 09 73 74 72 69 6e 67 20 47 65 6e 65 72  ....string Gener
1660: 65 61 74 65 53 65 61 72 63 68 50 61 74 68 28 29  eateSearchPath()
1670: 7b 0d 0a 09 09 73 74 72 69 6e 67 20 70 61 74 68  {....string path
1680: 3b 0d 0a 09 09 69 66 28 6d 5f 55 73 65 72 53 79  ;....if(m_UserSy
1690: 6d 50 61 74 68 2e 6c 65 6e 67 74 68 29 7b 0d 0a  mPath.length){..
16a0: 09 09 09 70 61 74 68 20 3d 20 6d 5f 55 73 65 72  ...path = m_User
16b0: 53 79 6d 50 61 74 68 20 7e 20 22 3b 22 3b 0d 0a  SymPath ~ ";";..
16c0: 09 09 7d 0d 0a 09 09 0d 0a 09 09 63 68 61 72 5b  ..}........char[
16d0: 31 30 32 34 5d 20 74 65 6d 70 3b 0d 0a 09 09 69  1024] temp;....i
16e0: 66 28 47 65 74 43 75 72 72 65 6e 74 44 69 72 65  f(GetCurrentDire
16f0: 63 74 6f 72 79 41 28 74 65 6d 70 2e 6c 65 6e 67  ctoryA(temp.leng
1700: 74 68 2c 74 65 6d 70 2e 70 74 72 29 20 3e 20 30  th,temp.ptr) > 0
1710: 29 7b 0d 0a 09 09 09 74 65 6d 70 5b 74 65 6d 70  ){.....temp[temp
1720: 2e 6c 65 6e 67 74 68 2d 31 5d 20 3d 20 30 3b 0d  .length-1] = 0;.
1730: 0a 09 09 09 70 61 74 68 20 7e 3d 20 74 65 6d 70  ....path ~= temp
1740: 20 7e 20 22 3b 22 3b 0d 0a 09 09 7d 0d 0a 09 09   ~ ";";....}....
1750: 0d 0a 09 09 69 66 28 47 65 74 4d 6f 64 75 6c 65  ....if(GetModule
1760: 46 69 6c 65 4e 61 6d 65 41 28 6e 75 6c 6c 2c 74  FileNameA(null,t
1770: 65 6d 70 2e 70 74 72 2c 74 65 6d 70 2e 6c 65 6e  emp.ptr,temp.len
1780: 67 74 68 29 20 3e 20 30 29 7b 0d 0a 09 09 09 74  gth) > 0){.....t
1790: 65 6d 70 5b 74 65 6d 70 2e 6c 65 6e 67 74 68 2d  emp[temp.length-
17a0: 31 5d 20 3d 20 30 3b 0d 0a 09 09 09 66 6f 72 65  1] = 0;.....fore
17b0: 61 63 68 5f 72 65 76 65 72 73 65 28 72 65 66 20  ach_reverse(ref 
17c0: 63 68 61 72 20 65 3b 74 65 6d 70 29 7b 0d 0a 09  char e;temp){...
17d0: 09 09 09 69 66 28 65 20 3d 3d 20 27 5c 5c 27 20  ...if(e == '\\' 
17e0: 7c 7c 20 65 20 3d 3d 20 27 2f 27 20 7c 7c 20 65  || e == '/' || e
17f0: 20 3d 3d 20 27 3a 27 29 7b 0d 0a 09 09 09 09 09   == ':'){.......
1800: 65 20 3d 20 30 3b 0d 0a 09 09 09 09 09 62 72 65  e = 0;.......bre
1810: 61 6b 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 7d  ak;......}.....}
1820: 0d 0a 09 09 09 69 66 28 73 74 72 6c 65 6e 28 74  .....if(strlen(t
1830: 65 6d 70 2e 70 74 72 29 20 3e 20 30 29 7b 0d 0a  emp.ptr) > 0){..
1840: 09 09 09 09 70 61 74 68 20 7e 3d 20 74 65 6d 70  ....path ~= temp
1850: 20 7e 20 22 3b 22 3b 0d 0a 09 09 09 7d 0d 0a 09   ~ ";";.....}...
1860: 09 7d 0d 0a 09 09 0d 0a 09 09 73 74 72 69 6e 67  .}........string
1870: 5b 5d 20 73 79 73 74 65 6d 56 61 72 73 20 3d 20  [] systemVars = 
1880: 5b 20 22 5f 4e 54 5f 53 59 4d 42 4f 4c 5f 50 41  [ "_NT_SYMBOL_PA
1890: 54 48 22 2c 20 22 5f 4e 54 5f 41 4c 54 45 52 4e  TH", "_NT_ALTERN
18a0: 41 54 45 5f 53 59 4d 42 4f 4c 5f 50 41 54 48 22  ATE_SYMBOL_PATH"
18b0: 2c 20 22 53 59 53 54 45 4d 52 4f 4f 54 22 20 5d  , "SYSTEMROOT" ]
18c0: 3b 0d 0a 09 09 0d 0a 09 09 66 6f 72 65 61 63 68  ;........foreach
18d0: 28 65 3b 73 79 73 74 65 6d 56 61 72 73 29 7b 0d  (e;systemVars){.
18e0: 0a 09 09 09 69 66 28 47 65 74 45 6e 76 69 72 6f  ....if(GetEnviro
18f0: 6e 6d 65 6e 74 56 61 72 69 61 62 6c 65 41 28 74  nmentVariableA(t
1900: 6f 53 74 72 69 6e 67 7a 28 65 29 2c 74 65 6d 70  oStringz(e),temp
1910: 2e 70 74 72 2c 74 65 6d 70 2e 6c 65 6e 67 74 68  .ptr,temp.length
1920: 29 20 3e 20 30 29 7b 0d 0a 09 09 09 09 74 65 6d  ) > 0){......tem
1930: 70 5b 74 65 6d 70 2e 6c 65 6e 67 74 68 2d 31 5d  p[temp.length-1]
1940: 20 3d 20 30 3b 0d 0a 09 09 09 09 70 61 74 68 20   = 0;......path 
1950: 7e 3d 20 74 65 6d 70 20 7e 20 22 3b 22 3b 0d 0a  ~= temp ~ ";";..
1960: 09 09 09 7d 0d 0a 09 09 7d 0d 0a 09 09 0d 0a 09  ...}....}.......
1970: 09 72 65 74 75 72 6e 20 70 61 74 68 3b 0d 0a 09  .return path;...
1980: 7d 0d 0a 09 0d 0a 09 73 74 61 74 69 63 20 63 6c  }......static cl
1990: 61 73 73 20 43 61 6c 6c 73 74 61 63 6b 20 3a 20  ass Callstack : 
19a0: 54 68 72 6f 77 61 62 6c 65 2e 54 72 61 63 65 49  Throwable.TraceI
19b0: 6e 66 6f 20 7b 0d 0a 09 70 72 69 76 61 74 65 3a  nfo {...private:
19c0: 0d 0a 09 09 73 74 72 69 6e 67 5b 5d 20 69 6e 66  ....string[] inf
19d0: 6f 20 3d 20 6e 75 6c 6c 3b 0d 0a 09 70 75 62 6c  o = null;...publ
19e0: 69 63 3a 09 09 0d 0a 09 09 69 6e 74 20 6f 70 41  ic:......int opA
19f0: 70 70 6c 79 28 73 63 6f 70 65 20 69 6e 74 20 64  pply(scope int d
1a00: 65 6c 65 67 61 74 65 28 72 65 66 20 63 68 61 72  elegate(ref char
1a10: 5b 5d 29 20 64 67 29 7b 0d 0a 09 09 09 69 6e 74  []) dg){.....int
1a20: 20 72 65 73 75 6c 74 20 3d 20 30 3b 0d 0a 09 09   result = 0;....
1a30: 09 66 6f 72 65 61 63 68 28 65 3b 69 6e 66 6f 29  .foreach(e;info)
1a40: 7b 0d 0a 09 09 09 09 63 68 61 72 5b 5d 20 74 65  {......char[] te
1a50: 6d 70 20 3d 20 74 6f 21 28 63 68 61 72 5b 5d 29  mp = to!(char[])
1a60: 28 65 29 3b 0d 0a 09 09 09 09 72 65 73 75 6c 74  (e);......result
1a70: 20 3d 20 64 67 28 74 65 6d 70 29 3b 0d 0a 09 09   = dg(temp);....
1a80: 09 09 69 66 28 72 65 73 75 6c 74 29 0d 0a 09 09  ..if(result)....
1a90: 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09 09 7d 0d  ...break;.....}.
1aa0: 0a 09 09 09 72 65 74 75 72 6e 20 72 65 73 75 6c  ....return resul
1ab0: 74 3b 0d 0a 09 09 7d 0d 0a 09 09 0d 0a 09 09 6f  t;....}........o
1ac0: 76 65 72 72 69 64 65 20 73 74 72 69 6e 67 20 74  verride string t
1ad0: 6f 53 74 72 69 6e 67 28 29 7b 0d 0a 09 09 09 73  oString(){.....s
1ae0: 74 72 69 6e 67 20 72 65 73 75 6c 74 20 3d 20 22  tring result = "
1af0: 22 3b 0d 0a 09 09 09 66 6f 72 65 61 63 68 28 65  ";.....foreach(e
1b00: 3b 69 6e 66 6f 29 7b 0d 0a 09 09 09 09 72 65 73  ;info){......res
1b10: 75 6c 74 20 7e 3d 20 65 20 7e 20 22 5c 6e 22 3b  ult ~= e ~ "\n";
1b20: 0d 0a 09 09 09 7d 0d 0a 09 09 09 72 65 74 75 72  .....}.....retur
1b30: 6e 20 72 65 73 75 6c 74 3b 0d 0a 09 09 7d 0d 0a  n result;....}..
1b40: 09 09 0d 0a 09 09 76 6f 69 64 20 61 70 70 65 6e  ......void appen
1b50: 64 28 73 74 72 69 6e 67 20 73 74 72 29 7b 0d 0a  d(string str){..
1b60: 09 09 09 69 66 28 69 6e 66 6f 20 69 73 20 6e 75  ...if(info is nu
1b70: 6c 6c 29 7b 0d 0a 09 09 09 09 69 6e 66 6f 20 3d  ll){......info =
1b80: 20 6e 65 77 20 73 74 72 69 6e 67 5b 31 5d 3b 0d   new string[1];.
1b90: 0a 09 09 09 09 69 6e 66 6f 5b 30 5d 20 3d 20 73  .....info[0] = s
1ba0: 74 72 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 65 6c  tr;.....}.....el
1bb0: 73 65 20 7b 0d 0a 09 09 09 09 69 6e 66 6f 2e 6c  se {......info.l
1bc0: 65 6e 67 74 68 20 3d 20 69 6e 66 6f 2e 6c 65 6e  ength = info.len
1bd0: 67 74 68 20 2b 20 31 3b 0d 0a 09 09 09 09 69 6e  gth + 1;......in
1be0: 66 6f 5b 69 6e 66 6f 2e 6c 65 6e 67 74 68 2d 31  fo[info.length-1
1bf0: 5d 20 3d 20 73 74 72 3b 0d 0a 09 09 09 7d 0d 0a  ] = str;.....}..
1c00: 09 09 7d 0d 0a 09 7d 0d 0a 09 0d 0a 09 73 74 61  ..}...}......sta
1c10: 74 69 63 20 54 68 72 6f 77 61 62 6c 65 2e 54 72  tic Throwable.Tr
1c20: 61 63 65 49 6e 66 6f 20 54 72 61 63 65 48 61 6e  aceInfo TraceHan
1c30: 64 6c 65 72 28 76 6f 69 64 2a 20 70 74 72 29 7b  dler(void* ptr){
1c40: 0d 0a 09 09 2f 2f 20 6d 6f 64 69 66 69 65 64 20  ....// modified 
1c50: 62 79 20 6b 2e 69 6e 61 62 61 20 74 6f 20 61 76  by k.inaba to av
1c60: 6f 69 64 20 61 20 74 68 72 6f 77 20 69 6e 73 69  oid a throw insi
1c70: 64 65 20 73 74 64 2e 64 65 6d 61 6e 67 6c 65 2e  de std.demangle.
1c80: 64 65 6d 61 6e 67 6c 65 0d 0a 09 09 2f 2f 20 6e  demangle....// n
1c90: 6f 74 20 71 75 69 74 65 20 74 68 72 65 61 64 20  ot quite thread 
1ca0: 73 61 66 65 0d 0a 09 09 52 75 6e 74 69 6d 65 2e  safe....Runtime.
1cb0: 74 72 61 63 65 48 61 6e 64 6c 65 72 28 26 63 6f  traceHandler(&co
1cc0: 72 65 2e 72 75 6e 74 69 6d 65 2e 64 65 66 61 75  re.runtime.defau
1cd0: 6c 74 54 72 61 63 65 48 61 6e 64 6c 65 72 29 3b  ltTraceHandler);
1ce0: 0d 0a 09 09 73 63 6f 70 65 28 65 78 69 74 29 20  ....scope(exit) 
1cf0: 52 75 6e 74 69 6d 65 2e 74 72 61 63 65 48 61 6e  Runtime.traceHan
1d00: 64 6c 65 72 28 26 54 72 61 63 65 48 61 6e 64 6c  dler(&TraceHandl
1d10: 65 72 29 3b 0d 0a 0d 0a 09 09 53 74 61 63 6b 54  er);......StackT
1d20: 72 61 63 65 20 74 72 61 63 65 20 3d 20 6e 65 77  race trace = new
1d30: 20 53 74 61 63 6b 54 72 61 63 65 28 29 3b 0d 0a   StackTrace();..
1d40: 09 09 72 65 74 75 72 6e 20 74 72 61 63 65 2e 47  ..return trace.G
1d50: 65 74 43 61 6c 6c 73 74 61 63 6b 28 29 3b 0d 0a  etCallstack();..
1d60: 09 7d 0d 0a 09 0d 0a 70 75 62 6c 69 63 3a 0d 0a  .}.....public:..
1d70: 09 73 74 61 74 69 63 20 74 68 69 73 28 29 7b 0d  .static this(){.
1d80: 0a 2f 2f 09 09 52 75 6e 74 69 6d 65 2e 74 72 61  .//..Runtime.tra
1d90: 63 65 48 61 6e 64 6c 65 72 28 26 54 72 61 63 65  ceHandler(&Trace
1da0: 48 61 6e 64 6c 65 72 29 3b 0d 0a 2f 2f 09 09 53  Handler);..//..S
1db0: 65 74 55 6e 68 61 6e 64 6c 65 64 45 78 63 65 70  etUnhandledExcep
1dc0: 74 69 6f 6e 46 69 6c 74 65 72 28 26 55 6e 68 61  tionFilter(&Unha
1dd0: 6e 64 65 6c 65 64 45 78 63 65 70 74 69 6f 6e 46  ndeledExceptionF
1de0: 69 6c 74 65 72 48 61 6e 64 6c 65 72 29 3b 0d 0a  ilterHandler);..
1df0: 09 7d 0d 0a 09 0d 0a 09 74 68 69 73 28 29 7b 0d  .}......this(){.
1e00: 0a 09 09 69 66 28 69 73 49 6e 69 74 29 0d 0a 09  ...if(isInit)...
1e10: 09 09 72 65 74 75 72 6e 3b 0d 0a 09 09 48 41 4e  ..return;....HAN
1e20: 44 4c 45 20 68 50 72 6f 63 65 73 73 20 3d 20 47  DLE hProcess = G
1e30: 65 74 43 75 72 72 65 6e 74 50 72 6f 63 65 73 73  etCurrentProcess
1e40: 28 29 3b 0d 0a 09 09 44 57 4f 52 44 20 70 69 64  ();....DWORD pid
1e50: 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72 6f   = GetCurrentPro
1e60: 63 65 73 73 49 64 28 29 3b 0d 0a 09 09 0d 0a 09  cessId();.......
1e70: 09 44 62 67 68 65 6c 70 2e 49 6e 69 74 28 29 3b  .Dbghelp.Init();
1e80: 0d 0a 09 09 73 74 72 69 6e 67 20 73 79 6d 50 61  ....string symPa
1e90: 74 68 20 3d 20 47 65 6e 65 72 65 61 74 65 53 65  th = GenereateSe
1ea0: 61 72 63 68 50 61 74 68 28 29 3b 0d 0a 09 09 69  archPath();....i
1eb0: 66 28 44 62 67 68 65 6c 70 2e 53 79 6d 49 6e 69  f(Dbghelp.SymIni
1ec0: 74 69 61 6c 69 7a 65 28 68 50 72 6f 63 65 73 73  tialize(hProcess
1ed0: 2c 63 61 73 74 28 44 62 67 68 65 6c 70 2e 50 43  ,cast(Dbghelp.PC
1ee0: 53 54 52 29 74 6f 53 74 72 69 6e 67 7a 28 73 79  STR)toStringz(sy
1ef0: 6d 50 61 74 68 29 2c 46 41 4c 53 45 29 20 21 3d  mPath),FALSE) !=
1f00: 20 46 41 4c 53 45 29 7b 0d 0a 09 09 09 69 73 49   FALSE){.....isI
1f10: 6e 69 74 20 3d 20 74 72 75 65 3b 0d 0a 09 09 09  nit = true;.....
1f20: 0d 0a 09 09 09 44 57 4f 52 44 20 73 79 6d 4f 70  .....DWORD symOp
1f30: 74 69 6f 6e 73 20 3d 20 44 62 67 68 65 6c 70 2e  tions = Dbghelp.
1f40: 53 79 6d 47 65 74 4f 70 74 69 6f 6e 73 28 29 3b  SymGetOptions();
1f50: 0d 0a 09 09 09 73 79 6d 4f 70 74 69 6f 6e 73 20  .....symOptions 
1f60: 7c 3d 20 44 62 67 68 65 6c 70 2e 53 59 4d 4f 50  |= Dbghelp.SYMOP
1f70: 54 5f 4c 4f 41 44 5f 4c 49 4e 45 53 3b 0d 0a 09  T_LOAD_LINES;...
1f80: 09 09 73 79 6d 4f 70 74 69 6f 6e 73 20 7c 3d 20  ..symOptions |= 
1f90: 44 62 67 68 65 6c 70 2e 53 59 4d 4f 50 54 5f 46  Dbghelp.SYMOPT_F
1fa0: 41 49 4c 5f 43 52 49 54 49 43 41 4c 5f 45 52 52  AIL_CRITICAL_ERR
1fb0: 4f 52 53 3b 0d 0a 09 09 09 73 79 6d 4f 70 74 69  ORS;.....symOpti
1fc0: 6f 6e 73 20 3d 20 44 62 67 68 65 6c 70 2e 53 79  ons = Dbghelp.Sy
1fd0: 6d 53 65 74 4f 70 74 69 6f 6e 73 28 73 79 6d 4f  mSetOptions(symO
1fe0: 70 74 69 6f 6e 73 29 3b 0d 0a 09 09 09 0d 0a 09  ptions);........
1ff0: 09 09 4c 6f 61 64 4d 6f 64 75 6c 65 73 28 68 50  ..LoadModules(hP
2000: 72 6f 63 65 73 73 2c 70 69 64 29 3b 0d 0a 09 09  rocess,pid);....
2010: 7d 0d 0a 09 7d 0d 0a 09 0d 0a 09 54 68 72 6f 77  }...}......Throw
2020: 61 62 6c 65 2e 54 72 61 63 65 49 6e 66 6f 20 47  able.TraceInfo G
2030: 65 74 43 61 6c 6c 73 74 61 63 6b 28 29 7b 0d 0a  etCallstack(){..
2040: 09 09 69 66 28 21 69 73 49 6e 69 74 29 7b 0d 0a  ..if(!isInit){..
2050: 09 09 09 77 72 69 74 65 66 6c 6e 28 22 49 73 20  ...writefln("Is 
2060: 6e 6f 74 20 69 6e 69 74 21 22 29 3b 0d 0a 09 09  not init!");....
2070: 09 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 0d 0a 09  .return null;...
2080: 09 7d 0d 0a 09 09 0d 0a 09 09 48 41 4e 44 4c 45  .}........HANDLE
2090: 20 68 54 68 72 65 61 64 20 3d 20 47 65 74 43 75   hThread = GetCu
20a0: 72 72 65 6e 74 54 68 72 65 61 64 28 29 3b 0d 0a  rrentThread();..
20b0: 09 09 48 41 4e 44 4c 45 20 68 50 72 6f 63 65 73  ..HANDLE hProces
20c0: 73 20 3d 20 47 65 74 43 75 72 72 65 6e 74 50 72  s = GetCurrentPr
20d0: 6f 63 65 73 73 28 29 3b 0d 0a 09 09 0d 0a 09 09  ocess();........
20e0: 2f 2f 43 61 70 74 75 72 65 20 74 68 65 20 63 75  //Capture the cu
20f0: 72 72 65 6e 74 20 63 6f 6e 74 65 78 74 0d 0a 09  rrent context...
2100: 09 43 4f 4e 54 45 58 54 20 63 3b 0d 0a 09 09 6d  .CONTEXT c;....m
2110: 65 6d 73 65 74 28 26 63 2c 20 30 2c 20 43 4f 4e  emset(&c, 0, CON
2120: 54 45 58 54 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09  TEXT.sizeof);...
2130: 09 63 2e 43 6f 6e 74 65 78 74 46 6c 61 67 73 20  .c.ContextFlags 
2140: 3d 20 43 4f 4e 54 45 58 54 5f 46 55 4c 4c 3b 0d  = CONTEXT_FULL;.
2150: 0a 09 09 52 74 6c 43 61 70 74 75 72 65 43 6f 6e  ...RtlCaptureCon
2160: 74 65 78 74 28 26 63 29 3b 0d 0a 09 09 0d 0a 09  text(&c);.......
2170: 09 44 62 67 68 65 6c 70 2e 53 54 41 43 4b 46 52  .Dbghelp.STACKFR
2180: 41 4d 45 36 34 20 73 74 61 63 6b 66 72 61 6d 65  AME64 stackframe
2190: 3b 0d 0a 09 09 6d 65 6d 73 65 74 28 26 73 74 61  ;....memset(&sta
21a0: 63 6b 66 72 61 6d 65 2c 30 2c 74 79 70 65 6f 66  ckframe,0,typeof
21b0: 28 73 74 61 63 6b 66 72 61 6d 65 29 2e 73 69 7a  (stackframe).siz
21c0: 65 6f 66 29 3b 0d 0a 09 09 44 57 4f 52 44 20 69  eof);....DWORD i
21d0: 6d 61 67 65 54 79 70 65 3b 0d 0a 09 09 2f 2f 78  mageType;....//x
21e0: 38 36 0d 0a 09 09 69 6d 61 67 65 54 79 70 65 20  86....imageType 
21f0: 3d 20 44 62 67 68 65 6c 70 2e 49 4d 41 47 45 5f  = Dbghelp.IMAGE_
2200: 46 49 4c 45 5f 4d 41 43 48 49 4e 45 5f 49 33 38  FILE_MACHINE_I38
2210: 36 3b 0d 0a 09 09 73 74 61 63 6b 66 72 61 6d 65  6;....stackframe
2220: 2e 41 64 64 72 50 43 2e 4f 66 66 73 65 74 20 3d  .AddrPC.Offset =
2230: 20 63 61 73 74 28 44 62 67 68 65 6c 70 2e 44 57   cast(Dbghelp.DW
2240: 4f 52 44 36 34 29 63 2e 45 69 70 3b 0d 0a 09 09  ORD64)c.Eip;....
2250: 73 74 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 50  stackframe.AddrP
2260: 43 2e 4d 6f 64 65 20 3d 20 44 62 67 68 65 6c 70  C.Mode = Dbghelp
2270: 2e 41 44 44 52 45 53 53 5f 4d 4f 44 45 2e 41 64  .ADDRESS_MODE.Ad
2280: 64 72 4d 6f 64 65 46 6c 61 74 3b 0d 0a 09 09 73  drModeFlat;....s
2290: 74 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 46 72  tackframe.AddrFr
22a0: 61 6d 65 2e 4f 66 66 73 65 74 20 3d 20 63 61 73  ame.Offset = cas
22b0: 74 28 44 62 67 68 65 6c 70 2e 44 57 4f 52 44 36  t(Dbghelp.DWORD6
22c0: 34 29 63 2e 45 62 70 3b 0d 0a 09 09 73 74 61 63  4)c.Ebp;....stac
22d0: 6b 66 72 61 6d 65 2e 41 64 64 72 46 72 61 6d 65  kframe.AddrFrame
22e0: 2e 4d 6f 64 65 20 3d 20 44 62 67 68 65 6c 70 2e  .Mode = Dbghelp.
22f0: 41 44 44 52 45 53 53 5f 4d 4f 44 45 2e 41 64 64  ADDRESS_MODE.Add
2300: 72 4d 6f 64 65 46 6c 61 74 3b 0d 0a 09 09 73 74  rModeFlat;....st
2310: 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 53 74 61  ackframe.AddrSta
2320: 63 6b 2e 4f 66 66 73 65 74 20 3d 20 63 61 73 74  ck.Offset = cast
2330: 28 44 62 67 68 65 6c 70 2e 44 57 4f 52 44 36 34  (Dbghelp.DWORD64
2340: 29 63 2e 45 73 70 3b 0d 0a 09 09 73 74 61 63 6b  )c.Esp;....stack
2350: 66 72 61 6d 65 2e 41 64 64 72 53 74 61 63 6b 2e  frame.AddrStack.
2360: 4d 6f 64 65 20 3d 20 44 62 67 68 65 6c 70 2e 41  Mode = Dbghelp.A
2370: 44 44 52 45 53 53 5f 4d 4f 44 45 2e 41 64 64 72  DDRESS_MODE.Addr
2380: 4d 6f 64 65 46 6c 61 74 3b 0d 0a 09 09 0d 0a 09  ModeFlat;.......
2390: 09 73 69 7a 65 5f 74 20 53 79 6d 62 6f 6c 53 69  .size_t SymbolSi
23a0: 7a 65 20 3d 20 44 62 67 68 65 6c 70 2e 49 4d 41  ze = Dbghelp.IMA
23b0: 47 45 48 4c 50 5f 53 59 4d 42 4f 4c 36 34 2e 73  GEHLP_SYMBOL64.s
23c0: 69 7a 65 6f 66 20 2b 20 4d 41 58 5f 4e 41 4d 45  izeof + MAX_NAME
23d0: 4c 45 4e 3b 0d 0a 09 09 44 62 67 68 65 6c 70 2e  LEN;....Dbghelp.
23e0: 49 4d 41 47 45 48 4c 50 5f 53 59 4d 42 4f 4c 36  IMAGEHLP_SYMBOL6
23f0: 34 20 2a 53 79 6d 62 6f 6c 20 3d 20 63 61 73 74  4 *Symbol = cast
2400: 28 44 62 67 68 65 6c 70 2e 49 4d 41 47 45 48 4c  (Dbghelp.IMAGEHL
2410: 50 5f 53 59 4d 42 4f 4c 36 34 2a 29 20 6d 61 6c  P_SYMBOL64*) mal
2420: 6c 6f 63 28 53 79 6d 62 6f 6c 53 69 7a 65 29 3b  loc(SymbolSize);
2430: 0d 0a 09 09 6d 65 6d 73 65 74 28 53 79 6d 62 6f  ....memset(Symbo
2440: 6c 2c 30 2c 53 79 6d 62 6f 6c 53 69 7a 65 29 3b  l,0,SymbolSize);
2450: 0d 0a 09 09 53 79 6d 62 6f 6c 2e 53 69 7a 65 4f  ....Symbol.SizeO
2460: 66 53 74 72 75 63 74 20 3d 20 53 79 6d 62 6f 6c  fStruct = Symbol
2470: 53 69 7a 65 3b 0d 0a 09 09 53 79 6d 62 6f 6c 2e  Size;....Symbol.
2480: 4d 61 78 4e 61 6d 65 4c 65 6e 67 74 68 20 3d 20  MaxNameLength = 
2490: 4d 41 58 5f 4e 41 4d 45 4c 45 4e 3b 0d 0a 09 09  MAX_NAMELEN;....
24a0: 0d 0a 09 09 44 62 67 68 65 6c 70 2e 49 4d 41 47  ....Dbghelp.IMAG
24b0: 45 48 4c 50 5f 4c 49 4e 45 36 34 20 4c 69 6e 65  EHLP_LINE64 Line
24c0: 3b 0d 0a 09 09 6d 65 6d 73 65 74 28 26 4c 69 6e  ;....memset(&Lin
24d0: 65 2c 30 2c 74 79 70 65 6f 66 28 4c 69 6e 65 29  e,0,typeof(Line)
24e0: 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09 09 4c 69 6e  .sizeof);....Lin
24f0: 65 2e 53 69 7a 65 4f 66 53 74 72 75 63 74 20 3d  e.SizeOfStruct =
2500: 20 74 79 70 65 6f 66 28 4c 69 6e 65 29 2e 73 69   typeof(Line).si
2510: 7a 65 6f 66 3b 0d 0a 09 09 0d 0a 09 09 44 62 67  zeof;........Dbg
2520: 68 65 6c 70 2e 49 4d 41 47 45 48 4c 50 5f 4d 4f  help.IMAGEHLP_MO
2530: 44 55 4c 45 36 34 20 4d 6f 64 75 6c 65 3b 0d 0a  DULE64 Module;..
2540: 09 09 6d 65 6d 73 65 74 28 26 4d 6f 64 75 6c 65  ..memset(&Module
2550: 2c 30 2c 74 79 70 65 6f 66 28 4d 6f 64 75 6c 65  ,0,typeof(Module
2560: 29 2e 73 69 7a 65 6f 66 29 3b 0d 0a 09 09 4d 6f  ).sizeof);....Mo
2570: 64 75 6c 65 2e 53 69 7a 65 4f 66 53 74 72 75 63  dule.SizeOfStruc
2580: 74 20 20 3d 20 74 79 70 65 6f 66 28 4d 6f 64 75  t  = typeof(Modu
2590: 6c 65 29 2e 73 69 7a 65 6f 66 3b 0d 0a 09 09 0d  le).sizeof;.....
25a0: 0a 09 09 61 75 74 6f 20 73 74 61 63 6b 20 3d 20  ...auto stack = 
25b0: 6e 65 77 20 43 61 6c 6c 73 74 61 63 6b 28 29 3b  new Callstack();
25c0: 0d 0a 09 09 0d 0a 09 09 2f 2f 77 72 69 74 65 66  ........//writef
25d0: 6c 6e 28 22 43 61 6c 6c 73 74 61 63 6b 3a 22 29  ln("Callstack:")
25e0: 3b 0d 0a 09 09 66 6f 72 28 69 6e 74 20 66 72 61  ;....for(int fra
25f0: 6d 65 4e 75 6d 3d 30 3b 3b 66 72 61 6d 65 4e 75  meNum=0;;frameNu
2600: 6d 2b 2b 29 7b 0d 0a 09 09 09 69 66 28 44 62 67  m++){.....if(Dbg
2610: 68 65 6c 70 2e 53 74 61 63 6b 57 61 6c 6b 36 34  help.StackWalk64
2620: 28 69 6d 61 67 65 54 79 70 65 2c 20 68 50 72 6f  (imageType, hPro
2630: 63 65 73 73 2c 20 68 54 68 72 65 61 64 2c 20 0d  cess, hThread, .
2640: 0a 09 09 09 20 20 20 20 20 20 20 20 20 20 20 20  ....            
2650: 20 20 20 20 20 20 20 20 26 73 74 61 63 6b 66 72          &stackfr
2660: 61 6d 65 2c 20 26 63 2c 20 0d 0a 09 09 09 20 20  ame, &c, .....  
2670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2680: 20 20 6e 75 6c 6c 2c 0d 0a 09 09 09 20 20 20 20    null,.....    
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26a0: 63 61 73 74 28 44 62 67 68 65 6c 70 2e 46 75 6e  cast(Dbghelp.Fun
26b0: 63 74 69 6f 6e 54 61 62 6c 65 41 63 63 65 73 73  ctionTableAccess
26c0: 50 72 6f 63 36 34 29 44 62 67 68 65 6c 70 2e 53  Proc64)Dbghelp.S
26d0: 79 6d 46 75 6e 63 74 69 6f 6e 54 61 62 6c 65 41  ymFunctionTableA
26e0: 63 63 65 73 73 36 34 2c 0d 0a 09 09 09 20 20 20  ccess64,.....   
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2700: 20 63 61 73 74 28 44 62 67 68 65 6c 70 2e 47 65   cast(Dbghelp.Ge
2710: 74 4d 6f 64 75 6c 65 42 61 73 65 50 72 6f 63 36  tModuleBaseProc6
2720: 34 29 44 62 67 68 65 6c 70 2e 53 79 6d 47 65 74  4)Dbghelp.SymGet
2730: 4d 6f 64 75 6c 65 42 61 73 65 36 34 2c 0d 0a 09  ModuleBase64,...
2740: 09 09 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
2750: 20 20 20 20 20 20 6e 75 6c 6c 29 20 21 3d 20 54        null) != T
2760: 52 55 45 20 29 0d 0a 09 09 09 7b 0d 0a 09 09 09  RUE ).....{.....
2770: 09 2f 2f 77 72 69 74 65 66 6c 6e 28 22 45 6e 64  .//writefln("End
2780: 20 6f 66 20 43 61 6c 6c 73 74 61 63 6b 22 29 3b   of Callstack");
2790: 0d 0a 09 09 09 09 62 72 65 61 6b 3b 0d 0a 09 09  ......break;....
27a0: 09 7d 0d 0a 09 09 09 0d 0a 09 09 09 69 66 28 73  .}..........if(s
27b0: 74 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 50 43  tackframe.AddrPC
27c0: 2e 4f 66 66 73 65 74 20 3d 3d 20 73 74 61 63 6b  .Offset == stack
27d0: 66 72 61 6d 65 2e 41 64 64 72 52 65 74 75 72 6e  frame.AddrReturn
27e0: 2e 4f 66 66 73 65 74 29 7b 0d 0a 09 09 09 09 2f  .Offset){....../
27f0: 2f 77 72 69 74 65 66 6c 6e 28 22 45 6e 64 6c 65  /writefln("Endle
2800: 73 73 20 63 61 6c 6c 73 74 61 63 6b 22 29 3b 0d  ss callstack");.
2810: 0a 09 09 09 09 73 74 61 63 6b 2e 61 70 70 65 6e  .....stack.appen
2820: 64 28 22 45 6e 64 6c 65 73 73 20 63 61 6c 6c 73  d("Endless calls
2830: 74 61 63 6b 22 29 3b 0d 0a 09 09 09 09 62 72 65  tack");......bre
2840: 61 6b 3b 0d 0a 09 09 09 7d 0d 0a 09 09 09 0d 0a  ak;.....}.......
2850: 09 09 09 69 66 28 73 74 61 63 6b 66 72 61 6d 65  ...if(stackframe
2860: 2e 41 64 64 72 50 43 2e 4f 66 66 73 65 74 20 21  .AddrPC.Offset !
2870: 3d 20 30 29 7b 0d 0a 09 09 09 09 73 74 72 69 6e  = 0){......strin
2880: 67 20 6c 69 6e 65 53 74 72 20 3d 20 22 22 3b 0d  g lineStr = "";.
2890: 0a 09 09 09 09 44 62 67 68 65 6c 70 2e 44 57 4f  .....Dbghelp.DWO
28a0: 52 44 36 34 20 6f 66 66 73 65 74 46 72 6f 6d 53  RD64 offsetFromS
28b0: 79 6d 62 6f 6c 20 3d 20 63 61 73 74 28 44 62 67  ymbol = cast(Dbg
28c0: 68 65 6c 70 2e 44 57 4f 52 44 36 34 29 30 3b 0d  help.DWORD64)0;.
28d0: 0a 09 09 09 09 69 66 28 20 44 62 67 68 65 6c 70  .....if( Dbghelp
28e0: 2e 53 79 6d 47 65 74 53 79 6d 46 72 6f 6d 41 64  .SymGetSymFromAd
28f0: 64 72 36 34 28 68 50 72 6f 63 65 73 73 2c 73 74  dr64(hProcess,st
2900: 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 50 43 2e  ackframe.AddrPC.
2910: 4f 66 66 73 65 74 2c 26 6f 66 66 73 65 74 46 72  Offset,&offsetFr
2920: 6f 6d 53 79 6d 62 6f 6c 2c 53 79 6d 62 6f 6c 29  omSymbol,Symbol)
2930: 20 3d 3d 20 54 52 55 45 29 7b 0d 0a 09 09 09 09   == TRUE){......
2940: 09 63 68 61 72 5b 5d 20 73 79 6d 4e 61 6d 65 20  .char[] symName 
2950: 3d 20 6e 65 77 20 63 68 61 72 5b 73 74 72 6c 65  = new char[strle
2960: 6e 28 63 61 73 74 28 63 6f 6e 73 74 28 63 68 61  n(cast(const(cha
2970: 72 29 2a 29 53 79 6d 62 6f 6c 2e 4e 61 6d 65 2e  r)*)Symbol.Name.
2980: 70 74 72 29 5d 3b 0d 0a 09 09 09 09 09 6d 65 6d  ptr)];.......mem
2990: 63 70 79 28 73 79 6d 4e 61 6d 65 2e 70 74 72 2c  cpy(symName.ptr,
29a0: 53 79 6d 62 6f 6c 2e 4e 61 6d 65 2e 70 74 72 2c  Symbol.Name.ptr,
29b0: 73 79 6d 4e 61 6d 65 2e 6c 65 6e 67 74 68 29 3b  symName.length);
29c0: 0d 0a 09 09 09 09 09 73 74 72 69 6e 67 20 73 79  .......string sy
29d0: 6d 53 74 72 69 6e 67 20 3d 20 22 22 3b 0d 0a 09  mString = "";...
29e0: 09 09 09 09 69 66 28 73 79 6d 4e 61 6d 65 5b 30  ....if(symName[0
29f0: 5d 20 3d 3d 20 27 44 27 29 0d 0a 09 09 09 09 09  ] == 'D').......
2a00: 09 73 79 6d 53 74 72 69 6e 67 20 3d 20 22 5f 22  .symString = "_"
2a10: 3b 0d 0a 09 09 09 09 09 73 79 6d 53 74 72 69 6e  ;.......symStrin
2a20: 67 20 7e 3d 20 73 79 6d 4e 61 6d 65 3b 0d 0a 0d  g ~= symName;...
2a30: 0a 09 09 09 09 09 73 74 72 69 6e 67 20 64 65 6d  ......string dem
2a40: 61 6e 67 6c 65 64 4e 61 6d 65 20 3d 20 64 65 6d  angledName = dem
2a50: 61 6e 67 6c 65 28 73 79 6d 53 74 72 69 6e 67 29  angle(symString)
2a60: 3b 0d 0a 09 09 09 09 09 62 6f 6f 6c 20 69 73 4f  ;.......bool isO
2a70: 4b 20 3d 20 74 72 75 65 3b 0d 0a 09 09 09 09 09  K = true;.......
2a80: 66 6f 72 28 69 6e 74 20 69 3d 30 3b 20 69 3c 64  for(int i=0; i<d
2a90: 65 6d 61 6e 67 6c 65 64 4e 61 6d 65 2e 6c 65 6e  emangledName.len
2aa0: 67 74 68 3b 20 2b 2b 69 29 0d 0a 09 09 09 09 09  gth; ++i).......
2ab0: 09 69 66 28 20 64 65 6d 61 6e 67 6c 65 64 4e 61  .if( demangledNa
2ac0: 6d 65 5b 69 5d 20 3e 3d 20 30 78 38 30 20 29 0d  me[i] >= 0x80 ).
2ad0: 0a 09 09 09 09 09 09 09 69 73 4f 4b 20 3d 20 66  ........isOK = f
2ae0: 61 6c 73 65 3b 0d 0a 09 09 09 09 09 69 66 28 69  alse;.......if(i
2af0: 73 4f 4b 29 0d 0a 09 09 09 09 09 09 6c 69 6e 65  sOK)........line
2b00: 53 74 72 20 7e 3d 20 64 65 6d 61 6e 67 6c 65 64  Str ~= demangled
2b10: 4e 61 6d 65 3b 0d 0a 0d 0a 09 09 09 09 09 44 57  Name;.........DW
2b20: 4f 52 44 20 7a 65 69 63 68 65 6e 20 3d 20 30 3b  ORD zeichen = 0;
2b30: 0d 0a 09 09 09 09 09 69 66 28 44 62 67 68 65 6c  .......if(Dbghel
2b40: 70 2e 53 79 6d 47 65 74 4c 69 6e 65 46 72 6f 6d  p.SymGetLineFrom
2b50: 41 64 64 72 36 34 28 68 50 72 6f 63 65 73 73 2c  Addr64(hProcess,
2b60: 73 74 61 63 6b 66 72 61 6d 65 2e 41 64 64 72 50  stackframe.AddrP
2b70: 43 2e 4f 66 66 73 65 74 2c 26 7a 65 69 63 68 65  C.Offset,&zeiche
2b80: 6e 2c 26 4c 69 6e 65 29 20 3d 3d 20 54 52 55 45  n,&Line) == TRUE
2b90: 29 7b 0d 0a 09 09 09 09 09 09 63 68 61 72 5b 5d  ){........char[]
2ba0: 20 66 69 6c 65 4e 61 6d 65 20 3d 20 6e 65 77 20   fileName = new 
2bb0: 63 68 61 72 5b 73 74 72 6c 65 6e 28 4c 69 6e 65  char[strlen(Line
2bc0: 2e 46 69 6c 65 4e 61 6d 65 29 5d 3b 0d 0a 09 09  .FileName)];....
2bd0: 09 09 09 09 66 69 6c 65 4e 61 6d 65 20 3d 20 73  ....fileName = s
2be0: 74 64 2e 70 61 74 68 2e 62 61 73 65 6e 61 6d 65  td.path.basename
2bf0: 28 20 4c 69 6e 65 2e 46 69 6c 65 4e 61 6d 65 5b  ( Line.FileName[
2c00: 30 2e 2e 66 69 6c 65 4e 61 6d 65 2e 6c 65 6e 67  0..fileName.leng
2c10: 74 68 5d 20 29 3b 0d 0a 09 09 09 09 09 09 6c 69  th] );........li
2c20: 6e 65 53 74 72 20 3d 20 74 65 78 74 28 66 69 6c  neStr = text(fil
2c30: 65 4e 61 6d 65 20 7e 20 22 3a 3a 22 20 7e 20 74  eName ~ "::" ~ t
2c40: 65 78 74 28 4c 69 6e 65 2e 4c 69 6e 65 4e 75 6d  ext(Line.LineNum
2c50: 62 65 72 29 20 7e 20 22 28 22 20 7e 20 74 65 78  ber) ~ "(" ~ tex
2c60: 74 28 7a 65 69 63 68 65 6e 29 20 7e 20 22 29 20  t(zeichen) ~ ") 
2c70: 22 20 7e 20 6c 69 6e 65 53 74 72 29 3b 0d 0a 09  " ~ lineStr);...
2c80: 09 09 09 09 7d 0d 0a 09 09 09 09 7d 0d 0a 09 09  ....}......}....
2c90: 09 09 65 6c 73 65 20 7b 0d 0a 09 09 09 09 09 6c  ..else {.......l
2ca0: 69 6e 65 53 74 72 20 3d 20 74 65 78 74 28 63 61  ineStr = text(ca
2cb0: 73 74 28 75 6c 6f 6e 67 29 73 74 61 63 6b 66 72  st(ulong)stackfr
2cc0: 61 6d 65 2e 41 64 64 72 50 43 2e 4f 66 66 73 65  ame.AddrPC.Offse
2cd0: 74 29 3b 0d 0a 09 09 09 09 7d 0d 0a 09 09 09 09  t);......}......
2ce0: 6c 69 6e 65 53 74 72 20 3d 20 74 65 78 74 28 66  lineStr = text(f
2cf0: 72 61 6d 65 4e 75 6d 2d 32 29 20 7e 20 22 20 22  rameNum-2) ~ " "
2d00: 20 7e 20 6c 69 6e 65 53 74 72 3b 0d 0a 09 09 09   ~ lineStr;.....
2d10: 09 69 66 28 66 72 61 6d 65 4e 75 6d 2d 32 20 3c  .if(frameNum-2 <
2d20: 20 31 30 29 0d 0a 09 09 09 09 09 6c 69 6e 65 53   10).......lineS
2d30: 74 72 20 3d 20 22 30 22 20 7e 20 6c 69 6e 65 53  tr = "0" ~ lineS
2d40: 74 72 3b 0d 0a 09 09 09 09 69 66 28 66 72 61 6d  tr;......if(fram
2d50: 65 4e 75 6d 20 3e 3d 20 32 29 0d 0a 09 09 09 09  eNum >= 2)......
2d60: 09 73 74 61 63 6b 2e 61 70 70 65 6e 64 28 6c 69  .stack.append(li
2d70: 6e 65 53 74 72 29 3b 0d 0a 09 09 09 7d 0d 0a 09  neStr);.....}...
2d80: 09 7d 0d 0a 09 09 0d 0a 09 09 66 72 65 65 28 53  .}........free(S
2d90: 79 6d 62 6f 6c 29 3b 0d 0a 09 09 72 65 74 75 72  ymbol);....retur
2da0: 6e 20 73 74 61 63 6b 3b 0d 0a 09 7d 0d 0a 20 7d  n stack;...}.. }
2db0: 3b 0d 0a 20                                      ;..