From d67123a0adca745338ff05c378a064fd4c9c847a Mon Sep 17 00:00:00 2001 From: ChengChengCC Date: Thu, 3 Mar 2016 00:41:09 +0800 Subject: [PATCH] inline hook shadow SSDT --- InlineHook_ShadowSSDT/ReadMe.md | 2 + InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.c | 1363 +++++++++++++++++ InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.h | 66 + .../ring0/InlineHookSSSDT.sln | 16 + .../ring0/InlineHookSSSDT.suo | Bin 0 -> 11264 bytes .../ring0/InlineHookSSSDT.vcxproj | 62 + .../ring0/InlineHookSSSDT.vcxproj.user | 3 + InlineHook_ShadowSSDT/ring0/clean.bat | 28 + InlineHook_ShadowSSDT/ring0/ddkbuild.cmd | 1122 ++++++++++++++ InlineHook_ShadowSSDT/ring0/makefile | 6 + InlineHook_ShadowSSDT/ring0/mybuild.bat | 3 + InlineHook_ShadowSSDT/ring0/readme.txt | 157 ++ InlineHook_ShadowSSDT/ring0/sources | 9 + ...7\224\250\347\250\213\345\272\217.opensdf" | Bin 0 -> 28 bytes ...4\347\224\250\347\250\213\345\272\217.sln" | 26 + ...4\347\224\250\347\250\213\345\272\217.suo" | Bin 0 -> 11776 bytes ...4\347\224\250\347\250\213\345\272\217.aps" | Bin 0 -> 106036 bytes ...4\347\224\250\347\250\213\345\272\217.cpp" | 94 ++ ...224\347\224\250\347\250\213\345\272\217.h" | 32 + ...24\347\224\250\347\250\213\345\272\217.rc" | Bin 0 -> 10370 bytes ...7\224\250\347\250\213\345\272\217.vcxproj" | 208 +++ ...0\347\250\213\345\272\217.vcxproj.filters" | 59 + ...\250\347\250\213\345\272\217.vcxproj.user" | 3 + ...47\224\250\347\250\213\345\272\217Dlg.cpp" | 296 ++++ ...\347\224\250\347\250\213\345\272\217Dlg.h" | 69 + .../ReadMe.txt" | 77 + .../res/InlineHookSSSDT.rc2" | Bin 0 -> 686 bytes ...4\347\224\250\347\250\213\345\272\217.ico" | Bin 0 -> 67777 bytes .../resource.h" | Bin 0 -> 1568 bytes .../stdafx.cpp" | 8 + .../stdafx.h" | 58 + .../targetver.h" | 8 + 32 files changed, 3775 insertions(+) create mode 100644 InlineHook_ShadowSSDT/ReadMe.md create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.c create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.h create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.sln create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.suo create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj create mode 100644 InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj.user create mode 100644 InlineHook_ShadowSSDT/ring0/clean.bat create mode 100644 InlineHook_ShadowSSDT/ring0/ddkbuild.cmd create mode 100644 InlineHook_ShadowSSDT/ring0/makefile create mode 100644 InlineHook_ShadowSSDT/ring0/mybuild.bat create mode 100644 InlineHook_ShadowSSDT/ring0/readme.txt create mode 100644 InlineHook_ShadowSSDT/ring0/sources create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.opensdf" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.sln" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.suo" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.aps" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.cpp" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.h" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.rc" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.filters" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.user" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.cpp" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.h" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/ReadMe.txt" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/res/InlineHookSSSDT.rc2" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/res/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.ico" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/resource.h" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.cpp" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.h" create mode 100644 "InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/targetver.h" diff --git a/InlineHook_ShadowSSDT/ReadMe.md b/InlineHook_ShadowSSDT/ReadMe.md new file mode 100644 index 0000000..3779858 --- /dev/null +++ b/InlineHook_ShadowSSDT/ReadMe.md @@ -0,0 +1,2 @@ +##ShadowSSDT inline hook +因为ShadowSSDT需要GUI进程,带一个应用层MFC程序。 \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.c b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.c new file mode 100644 index 0000000..b3f2206 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.c @@ -0,0 +1,1363 @@ + + +#ifndef CXX_INLINEHOOKSSSDT_H +# include "InlineHookSSSDT.h" +#endif +KIRQL Irql; +ULONG_PTR SSSDTDescriptor = 0; + + +ULONG IndexOfNtUserPostMessageWin7 = 15; +ULONG IndexOfNtUserPostMessageWinXP = 475; +ULONG IndexOfNtUserQueryWindowWin7 = 16; +ULONG IndexOfNtUserQueryWindowWinXP = 483; + + +ULONG CurrentProcessID = 0; + + +pfnNtUserQueryWindow CurrentNtUserQueryWindowAddress = NULL; +pfnNtUserPostMessage CurrentNtUserPostMessageAddress = NULL; + + +PVOID OrigianlFunctionCode = NULL; + +typedef int (*LDE_DISASM64)(void *Base, int Temp); +LDE_DISASM64 LDEx64 = NULL; + + +//获得PatchSize的ShellCode +unsigned char szShellCode64[12800] = +{ + 0x55, 0x48, 0x83, 0xEC, 0x2B, 0x48, 0x89, 0xE5, 0x51, 0x52, 0x56, 0xE8, 0x00, 0x21, 0x00, 0x00, + 0xEF, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA5, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xBF, 0x2A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x98, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x58, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x86, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD8, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x97, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x77, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x18, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x08, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x16, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA8, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA0, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB5, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x85, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x3D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x35, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x25, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x1D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x15, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0D, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5E, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAE, 0x1F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF1, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x45, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4F, 0x1E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC5, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x85, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x75, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x65, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x55, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x06, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFE, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2E, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDA, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x9D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x50, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF2, 0x24, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB5, 0x25, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x11, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8A, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x26, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3A, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8B, 0x27, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xED, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDD, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xCD, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEE, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB8, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAD, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE7, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, 0x23, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFB, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x40, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x30, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x28, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x20, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x91, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAB, 0x1D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD8, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xD0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC8, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDC, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x38, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x28, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x80, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x78, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x70, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x60, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x58, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB9, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAB, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x7D, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x01, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x1C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x48, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2E, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x10, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x16, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBE, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB6, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF8, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xF0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3E, 0x15, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x17, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB0, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFE, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x66, 0x1B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x38, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x6F, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xC0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA8, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xA0, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x98, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x90, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xE7, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x67, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDB, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x57, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x47, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x37, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x27, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAF, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA7, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9F, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x97, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8B, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6B, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0F, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFF, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBB, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x13, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x73, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x43, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x33, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x23, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x13, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x12, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x11, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0D, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x05, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFD, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC3, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB3, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAB, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA3, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9B, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x77, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6B, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5B, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFB, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFB, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x0A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0B, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFB, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF3, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x09, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x65, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x55, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x45, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x35, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x15, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xED, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAD, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA5, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x95, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x85, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x7D, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x75, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xAC, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xA4, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x9C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x94, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x8D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xAF, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xB3, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x74, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x6C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x64, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x54, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x4D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x44, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x3C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x34, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x2C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x1C, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x0D, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xFC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xF4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xEC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xD4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xCC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xC4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xBC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xB4, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x5E, 0x51, 0x8F, 0x45, 0x23, 0x89, 0x55, 0x1E, 0xC6, 0x45, 0x22, 0x00, 0xC7, 0x45, 0x02, 0x20, + 0x00, 0x00, 0x00, 0xC7, 0x45, 0x06, 0x20, 0x00, 0x00, 0x00, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x07, + 0xC7, 0x45, 0x06, 0x40, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, 0x08, 0x48, + 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0x5E, 0x5A, 0x59, 0x48, 0x83, 0xF8, 0xFF, 0x74, + 0x07, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x29, 0xC8, 0x48, 0x83, 0xC4, 0x2B, 0x5D, 0xC3, 0xC7, 0x45, + 0x1A, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x25, 0xC7, 0x00, + 0x00, 0x00, 0xB9, 0x40, 0x00, 0x00, 0x00, 0x48, 0x31, 0xD2, 0xF7, 0xF1, 0x89, 0x45, 0x0A, 0x83, + 0xF8, 0x01, 0x75, 0x04, 0x83, 0x45, 0x1A, 0x01, 0x83, 0xF8, 0x02, 0x75, 0x04, 0x83, 0x45, 0x1A, + 0x04, 0x89, 0x55, 0x0E, 0xC1, 0xE0, 0x06, 0x48, 0x01, 0xF0, 0x48, 0x05, 0x00, 0x20, 0x00, 0x00, + 0x48, 0x8D, 0x04, 0xD0, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, + 0x40, 0x01, 0x83, 0xE0, 0x38, 0xC1, 0xE8, 0x03, 0x89, 0x45, 0x16, 0xC3, 0xC3, 0x83, 0x7D, 0x06, + 0x20, 0x7C, 0x23, 0x83, 0x45, 0x1A, 0x01, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x02, 0x83, + 0xE0, 0x07, 0x89, 0x45, 0x12, 0x83, 0x7D, 0x12, 0x05, 0x75, 0x0A, 0x83, 0x7D, 0x0A, 0x00, 0x75, + 0x04, 0x83, 0x45, 0x1A, 0x04, 0xC3, 0xC3, 0x83, 0x7D, 0x06, 0x20, 0x7C, 0x05, 0x83, 0x45, 0x1A, + 0x04, 0xC3, 0xC3, 0x83, 0x7D, 0x06, 0x10, 0x75, 0x05, 0x83, 0x45, 0x1A, 0x02, 0xC3, 0xC3, 0xE8, + 0x5A, 0xFF, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, + 0x48, 0xFF, 0x45, 0x23, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x83, 0x7D, 0x02, 0x10, 0x75, + 0x06, 0xE8, 0xD9, 0xFF, 0xFF, 0xFF, 0xC3, 0xE8, 0x51, 0x02, 0x00, 0x00, 0xC3, 0x83, 0x7D, 0x1E, + 0x40, 0x75, 0x06, 0xE8, 0x45, 0x02, 0x00, 0x00, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xC3, 0x83, 0x7D, + 0x02, 0x20, 0x7C, 0x06, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, + 0x83, 0x7D, 0x02, 0x40, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x09, 0xC3, 0x83, 0x7D, 0x02, 0x20, + 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0xE8, 0x8C, + 0xFF, 0xFF, 0xFF, 0x48, 0xFF, 0x45, 0x23, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x24, 0xC7, 0x45, + 0x02, 0x40, 0x00, 0x00, 0x00, 0x48, 0xFF, 0x45, 0x23, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, + 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC7, 0x45, 0x02, 0x20, 0x00, 0x00, + 0x00, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x25, 0x48, 0xFF, 0x45, + 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, 0x22, 0x0F, 0x75, 0x06, 0xE8, 0xBE, 0x01, 0x00, 0x00, 0xC3, + 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, + 0xD0, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x01, 0xC3, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, + 0x22, 0x0F, 0x75, 0x06, 0xE8, 0x94, 0x01, 0x00, 0x00, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, + 0xB6, 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC3, 0x83, 0x7D, 0x02, 0x20, + 0x7C, 0x0B, 0xE8, 0xF8, 0xFE, 0xFF, 0xFF, 0x48, 0x83, 0x45, 0x23, 0x04, 0xC3, 0xE8, 0xED, 0xFE, + 0xFF, 0xFF, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x06, 0xE8, 0x5A, + 0x01, 0x00, 0x00, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x04, 0xC3, + 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x06, 0xE8, 0x3C, 0x01, 0x00, + 0x00, 0xC3, 0xE8, 0xB8, 0xFE, 0xFF, 0xFF, 0xC3, 0xE8, 0x11, 0xFE, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, + 0x03, 0x75, 0x06, 0xE8, 0xA7, 0xFE, 0xFF, 0xFF, 0xC3, 0xE8, 0x1F, 0x01, 0x00, 0x00, 0xC3, 0x48, + 0x83, 0x45, 0x23, 0x03, 0xC3, 0x83, 0x7D, 0x06, 0x40, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x09, + 0xC3, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x83, 0x7D, 0x06, 0x10, 0x75, 0x06, 0x48, 0x83, 0x45, + 0x23, 0x03, 0xC3, 0x83, 0x7D, 0x06, 0x20, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x48, + 0x83, 0x45, 0x23, 0x09, 0xC3, 0x80, 0x7D, 0x00, 0x01, 0x75, 0x06, 0xE8, 0x5F, 0xFE, 0xFF, 0xFF, + 0xC3, 0xE8, 0xD7, 0x00, 0x00, 0x00, 0xC3, 0x80, 0x7D, 0x00, 0x01, 0x75, 0x06, 0xE8, 0x4D, 0xFE, + 0xFF, 0xFF, 0xC3, 0x80, 0x7D, 0x01, 0x01, 0x75, 0x06, 0xE8, 0x41, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, + 0x7D, 0x02, 0x10, 0x75, 0x06, 0xE8, 0x35, 0xFE, 0xFF, 0xFF, 0xC3, 0xE8, 0xAD, 0x00, 0x00, 0x00, + 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x06, 0xE8, 0xA1, 0x00, 0x00, 0x00, 0xC3, 0x83, 0x7D, 0x02, + 0x20, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x07, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0xC3, + 0x83, 0x7D, 0x02, 0x10, 0x74, 0x11, 0xE8, 0x63, 0xFD, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, + 0x23, 0x48, 0x83, 0x45, 0x23, 0x06, 0xC3, 0xE8, 0x52, 0xFD, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, + 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x04, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x06, 0xE8, 0x5A, + 0x00, 0x00, 0x00, 0xC3, 0x83, 0x7D, 0x02, 0x20, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x07, 0xC3, + 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0xE8, 0x6F, 0xFD, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, + 0x06, 0xE8, 0xB9, 0xFD, 0xFF, 0xFF, 0xC3, 0xE8, 0x31, 0x00, 0x00, 0x00, 0xC3, 0x83, 0x7D, 0x1E, + 0x40, 0x75, 0x06, 0x48, 0x83, 0x45, 0x23, 0x05, 0xC3, 0x83, 0x7D, 0x02, 0x20, 0x75, 0x06, 0x48, + 0x83, 0x45, 0x23, 0x05, 0xC3, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0x80, 0x7D, 0x00, 0x01, 0x75, + 0x06, 0xE8, 0x89, 0xFD, 0xFF, 0xFF, 0xC3, 0xE8, 0x01, 0x00, 0x00, 0x00, 0xC3, 0x48, 0xB8, 0xFF, + 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x06, 0xE8, 0xEA, + 0xFF, 0xFF, 0xFF, 0xC3, 0xE8, 0x66, 0xFD, 0xFF, 0xFF, 0x48, 0x83, 0x45, 0x23, 0x01, 0xC3, 0x83, + 0x7D, 0x02, 0x20, 0x7C, 0x0B, 0xE8, 0x55, 0xFD, 0xFF, 0xFF, 0x48, 0x83, 0x45, 0x23, 0x04, 0xC3, + 0xE8, 0x4A, 0xFD, 0xFF, 0xFF, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0x9E, 0xFC, 0xFF, 0xFF, + 0xE8, 0xE5, 0xFC, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x0C, 0x8B, 0x45, 0x1A, 0x01, 0x45, + 0x23, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x06, 0xE8, 0x9B, 0xFF, + 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x83, + 0x7D, 0x02, 0x20, 0x7C, 0x34, 0xE8, 0x64, 0xFC, 0xFF, 0xFF, 0xE8, 0xAB, 0xFC, 0xFF, 0xFF, 0x83, + 0x7D, 0x16, 0x00, 0x75, 0x0C, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x06, + 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x06, 0xE8, 0x61, 0xFF, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, + 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0x30, 0xFC, 0xFF, 0xFF, 0xE8, 0x77, + 0xFC, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x0C, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, + 0x83, 0x45, 0x23, 0x04, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x06, 0xE8, 0x2D, 0xFF, 0xFF, 0xFF, + 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0xFC, 0xFB, + 0xFF, 0xFF, 0xE8, 0x43, 0xFC, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x01, 0x7E, 0x06, 0xE8, 0x0B, 0xFF, + 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, + 0x26, 0xFC, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x06, 0x7E, 0x06, 0xE8, 0xEE, 0xFE, 0xFF, 0xFF, 0xC3, + 0xE8, 0xC9, 0xFB, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, + 0xC3, 0xE8, 0xB8, 0xFB, 0xFF, 0xFF, 0xE8, 0xFF, 0xFB, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x05, 0x7E, + 0x06, 0xE8, 0xC7, 0xFE, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, + 0x23, 0x02, 0xC3, 0xE8, 0x96, 0xFB, 0xFF, 0xFF, 0xE8, 0xDD, 0xFB, 0xFF, 0xFF, 0x83, 0x7D, 0x16, + 0x00, 0x75, 0x1A, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x85, 0xAC, 0x00, 0x00, 0x00, 0x83, 0x7D, 0x0E, + 0x04, 0x0F, 0x8E, 0xA2, 0x00, 0x00, 0x00, 0xE8, 0x91, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, + 0x01, 0x75, 0x1A, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x85, 0x8C, 0x00, 0x00, 0x00, 0x83, 0x7D, 0x0E, + 0x01, 0x0F, 0x8E, 0x82, 0x00, 0x00, 0x00, 0xE8, 0x71, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, + 0x02, 0x75, 0x10, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x85, 0x6C, 0x00, 0x00, 0x00, 0xE8, 0x5B, 0xFE, + 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x0C, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x5A, 0xE8, + 0x49, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x0C, 0x83, 0x7D, 0x0A, 0x03, 0x75, + 0x48, 0xE8, 0x37, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x05, 0x75, 0x06, 0xE8, 0x2B, 0xFE, + 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x06, 0x75, 0x0C, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x2A, 0xE8, + 0x19, 0xFE, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x07, 0x75, 0x1E, 0x83, 0x7D, 0x0A, 0x03, 0x75, + 0x18, 0x83, 0x7D, 0x1E, 0x40, 0x75, 0x0C, 0x83, 0x7D, 0x0E, 0x00, 0x74, 0x0C, 0xE8, 0xFB, 0xFD, + 0xFF, 0xFF, 0xC3, 0xE8, 0xF5, 0xFD, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, + 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0xC4, 0xFA, 0xFF, 0xFF, 0xE8, 0x0B, 0xFB, 0xFF, 0xFF, 0x83, + 0x7D, 0x16, 0x04, 0x7D, 0x06, 0xE8, 0xD3, 0xFD, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, + 0x23, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0xE8, 0xA2, 0xFA, 0xFF, 0xFF, 0xE8, 0xE9, 0xFA, 0xFF, + 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x06, 0xE8, 0xB1, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, + 0x02, 0x75, 0x06, 0xE8, 0xA5, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x06, 0xE8, + 0x99, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x06, 0xE8, 0x8D, 0xFD, 0xFF, 0xFF, + 0xC3, 0x83, 0x7D, 0x16, 0x05, 0x75, 0x06, 0xE8, 0x81, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, + 0x07, 0x7E, 0x06, 0xE8, 0x75, 0xFD, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, + 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0x90, 0xFA, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x06, + 0xE8, 0x58, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x06, 0xE8, 0x4C, 0xFD, 0xFF, + 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x02, 0x75, 0x11, 0xE8, 0x21, 0xFA, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, + 0x03, 0x74, 0x52, 0xE8, 0x35, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x06, 0xE8, + 0x29, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x11, 0xE8, 0xFE, 0xF9, 0xFF, 0xFF, + 0x83, 0x7D, 0x0A, 0x03, 0x74, 0x2F, 0xE8, 0x12, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x05, + 0x75, 0x06, 0xE8, 0x06, 0xFD, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x06, 0x75, 0x11, 0xE8, 0xDB, + 0xF9, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x74, 0x0C, 0xE8, 0xEF, 0xFC, 0xFF, 0xFF, 0xC3, 0xE8, + 0xE9, 0xFC, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x03, + 0xC3, 0xE8, 0x04, 0xFA, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x06, 0xE8, 0xCC, 0xFC, 0xFF, + 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x06, 0xE8, 0xC0, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, + 0x16, 0x02, 0x75, 0x11, 0xE8, 0x95, 0xF9, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x74, 0x52, 0xE8, + 0xA9, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x06, 0xE8, 0x9D, 0xFC, 0xFF, 0xFF, + 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x11, 0xE8, 0x72, 0xF9, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, + 0x74, 0x2F, 0xE8, 0x86, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x05, 0x75, 0x06, 0xE8, 0x7A, + 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x06, 0x75, 0x11, 0xE8, 0x4F, 0xF9, 0xFF, 0xFF, 0x83, + 0x7D, 0x0A, 0x03, 0x74, 0x0C, 0xE8, 0x63, 0xFC, 0xFF, 0xFF, 0xC3, 0xE8, 0x5D, 0xFC, 0xFF, 0xFF, + 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0xE8, 0x78, 0xF9, + 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x06, 0xE8, 0x40, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, + 0x16, 0x01, 0x75, 0x06, 0xE8, 0x34, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x02, 0x75, 0x15, + 0xE8, 0x09, 0xF9, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x84, 0x7B, 0x00, 0x00, 0x00, 0xE8, + 0x19, 0xFC, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x1D, 0x83, 0x7D, 0x02, 0x10, 0x75, + 0x11, 0xE8, 0xE8, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x74, 0x5E, 0xE8, 0xFC, 0xFB, 0xFF, + 0xFF, 0xC3, 0xE8, 0xF6, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x06, 0xE8, 0xEA, + 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x05, 0x75, 0x06, 0xE8, 0xDE, 0xFB, 0xFF, 0xFF, 0xC3, + 0x83, 0x7D, 0x16, 0x06, 0x75, 0x11, 0xE8, 0xB3, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x74, + 0x29, 0xE8, 0xC7, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x07, 0x75, 0x17, 0x83, 0x7D, 0x02, + 0x10, 0x75, 0x11, 0xE8, 0x96, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x74, 0x0C, 0xE8, 0xAA, + 0xFB, 0xFF, 0xFF, 0xC3, 0xE8, 0xA4, 0xFB, 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, + 0x48, 0x83, 0x45, 0x23, 0x03, 0xC3, 0xE8, 0xBF, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, + 0x15, 0xE8, 0x68, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x85, 0xA0, 0x00, 0x00, 0x00, + 0xE8, 0x78, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x15, 0xE8, 0x4D, 0xF8, 0xFF, + 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x0F, 0x85, 0x85, 0x00, 0x00, 0x00, 0xE8, 0x5D, 0xFB, 0xFF, 0xFF, + 0xC3, 0x83, 0x7D, 0x16, 0x02, 0x75, 0x15, 0xE8, 0x32, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, + 0x0F, 0x85, 0x6A, 0x00, 0x00, 0x00, 0xE8, 0x42, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, + 0x75, 0x11, 0xE8, 0x17, 0xF8, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x53, 0xE8, 0x2B, 0xFB, + 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x04, 0x75, 0x06, 0xE8, 0x1F, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, + 0x7D, 0x16, 0x05, 0x75, 0x11, 0xE8, 0xF4, 0xF7, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x30, + 0xE8, 0x08, 0xFB, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x06, 0x75, 0x11, 0xE8, 0xDD, 0xF7, 0xFF, + 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x19, 0xE8, 0xF1, 0xFA, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, + 0x07, 0x7F, 0x07, 0xE8, 0xC6, 0xF7, 0xFF, 0xFF, 0xEB, 0x06, 0xE8, 0xDE, 0xFA, 0xFF, 0xFF, 0xC3, + 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xE8, 0xF9, 0xF7, 0xFF, + 0xFF, 0x83, 0x7D, 0x16, 0x00, 0x75, 0x11, 0xE8, 0xA2, 0xF7, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, + 0x75, 0x51, 0xE8, 0xB6, 0xFA, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x11, 0xE8, 0x8B, + 0xF7, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x3A, 0xE8, 0x9F, 0xFA, 0xFF, 0xFF, 0xC3, 0x83, + 0x7D, 0x16, 0x02, 0x75, 0x11, 0xE8, 0x74, 0xF7, 0xFF, 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x23, + 0xE8, 0x88, 0xFA, 0xFF, 0xFF, 0xC3, 0x83, 0x7D, 0x16, 0x03, 0x75, 0x11, 0xE8, 0x5D, 0xF7, 0xFF, + 0xFF, 0x83, 0x7D, 0x0A, 0x03, 0x75, 0x0C, 0xE8, 0x71, 0xFA, 0xFF, 0xFF, 0xC3, 0xE8, 0x6B, 0xFA, + 0xFF, 0xFF, 0xC3, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x48, + 0xFF, 0x45, 0x23, 0xC7, 0x45, 0x02, 0x10, 0x00, 0x00, 0x00, 0xFE, 0x45, 0x22, 0x80, 0x7D, 0x22, + 0x0F, 0x75, 0x06, 0xE8, 0x45, 0xFA, 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, + 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC7, 0x45, 0x02, 0x20, 0x00, 0x00, + 0x00, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, 0x22, 0x0F, 0x75, 0x06, 0xE8, + 0x19, 0xFA, 0xFF, 0xFF, 0xC3, 0x8B, 0x4D, 0x06, 0xD1, 0xE9, 0x89, 0x5D, 0x06, 0x48, 0x8B, 0x45, + 0x23, 0x48, 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0x8B, 0x5D, + 0x06, 0xD1, 0xE1, 0x89, 0x4D, 0x06, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, + 0x22, 0x0F, 0x75, 0x06, 0xE8, 0xE4, 0xF9, 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, + 0x00, 0x3C, 0xA4, 0x74, 0x12, 0x3C, 0xA7, 0x74, 0x0E, 0x3C, 0xAE, 0x74, 0x0A, 0x3C, 0xAF, 0x74, + 0x06, 0x3C, 0x0F, 0x74, 0x02, 0xEB, 0x04, 0xC6, 0x45, 0x00, 0x01, 0x48, 0x8B, 0x45, 0x23, 0x48, + 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC6, 0x45, 0x00, 0x00, + 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, 0x22, 0x0F, 0x75, 0x06, 0xE8, 0x9A, + 0xF9, 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x00, 0x3C, 0x90, 0x74, 0x3E, 0x3C, + 0xA4, 0x74, 0x3A, 0x3C, 0xA5, 0x74, 0x36, 0x3C, 0xA6, 0x74, 0x32, 0x3C, 0xA7, 0x74, 0x2E, 0x3C, + 0xAA, 0x74, 0x2A, 0x3C, 0xAB, 0x74, 0x26, 0x3C, 0xAC, 0x74, 0x22, 0x3C, 0xAD, 0x74, 0x1E, 0x3C, + 0xAE, 0x74, 0x1A, 0x3C, 0xAF, 0x74, 0x16, 0x3C, 0x6C, 0x74, 0x12, 0x3C, 0x6D, 0x74, 0x0E, 0x3C, + 0x6E, 0x74, 0x0A, 0x3C, 0x6F, 0x74, 0x06, 0x3C, 0x0F, 0x74, 0x02, 0xEB, 0x04, 0xC6, 0x45, 0x01, + 0x01, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x04, 0xCE, 0x48, 0x03, 0x00, + 0xFF, 0xD0, 0xC6, 0x45, 0x01, 0x00, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, + 0x22, 0x0F, 0x75, 0x06, 0xE8, 0x24, 0xF9, 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, + 0xB6, 0x08, 0x48, 0x8D, 0x84, 0xCE, 0x00, 0x08, 0x00, 0x00, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC3, + 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, 0x80, 0x7D, 0x22, 0x0F, 0x75, 0x06, 0xE8, 0xFB, 0xF8, + 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, 0x48, 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x84, 0xCE, 0x00, + 0x10, 0x00, 0x00, 0x48, 0x03, 0x00, 0xFF, 0xD0, 0xC3, 0x48, 0xFF, 0x45, 0x23, 0xFE, 0x45, 0x22, + 0x80, 0x7D, 0x22, 0x0F, 0x75, 0x06, 0xE8, 0xD2, 0xF8, 0xFF, 0xFF, 0xC3, 0x48, 0x8B, 0x45, 0x23, + 0x48, 0x0F, 0xB6, 0x08, 0x48, 0x8D, 0x84, 0xCE, 0x00, 0x18, 0x00, 0x00, 0x48, 0x03, 0x00, 0xFF, + 0xD0, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, + 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x11, 0xE8, 0xCD, 0xF5, 0xFF, 0xFF, 0x83, 0x7D, 0x16, + 0x07, 0x7E, 0x06, 0xE8, 0x95, 0xF8, 0xFF, 0xFF, 0xC3, 0xE8, 0x70, 0xF5, 0xFF, 0xFF, 0x8B, 0x45, + 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x17, + 0xE8, 0x95, 0xF5, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x01, 0x75, 0x69, 0x83, 0x7D, 0x16, 0x07, 0x7E, + 0x63, 0xE8, 0x57, 0xF8, 0xFF, 0xFF, 0xC3, 0x3D, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0x56, 0x89, 0xC2, + 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, 0xE1, 0x0F, 0x83, 0xFA, 0x0D, 0x75, 0x0B, 0x83, 0xF9, 0x00, + 0x74, 0x42, 0xE8, 0x36, 0xF8, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, 0x0E, 0x75, 0x37, 0x83, 0xF9, 0x02, + 0x75, 0x06, 0xE8, 0x26, 0xF8, 0xFF, 0xFF, 0xC3, 0x83, 0xF9, 0x03, 0x75, 0x06, 0xE8, 0x1B, 0xF8, + 0xFF, 0xFF, 0xC3, 0x83, 0xF9, 0x06, 0x75, 0x06, 0xE8, 0x10, 0xF8, 0xFF, 0xFF, 0xC3, 0x83, 0xF9, + 0x07, 0x75, 0x06, 0xE8, 0x05, 0xF8, 0xFF, 0xFF, 0xC3, 0x83, 0xF9, 0x0F, 0x75, 0x06, 0xE8, 0xFA, + 0xF7, 0xFF, 0xFF, 0xC3, 0xE8, 0xD5, 0xF4, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, + 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, + 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x11, 0xE8, 0xFA, 0xF4, 0xFF, 0xFF, + 0x83, 0x7D, 0x16, 0x07, 0x7E, 0x32, 0xE8, 0xC2, 0xF7, 0xFF, 0xFF, 0xC3, 0x3D, 0xC0, 0x00, 0x00, + 0x00, 0x7C, 0x25, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, 0xE1, 0x0F, 0x83, 0xFA, 0x0E, + 0x75, 0x0B, 0x83, 0xF9, 0x09, 0x74, 0x11, 0xE8, 0xA1, 0xF7, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, 0x0F, + 0x75, 0x06, 0xE8, 0x96, 0xF7, 0xFF, 0xFF, 0xC3, 0xE8, 0x71, 0xF4, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, + 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, 0x00, + 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x1F, 0xE8, + 0x96, 0xF4, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x04, 0x74, 0x0E, 0x83, 0x7D, 0x16, 0x06, 0x74, 0x08, + 0x83, 0x7D, 0x16, 0x07, 0x7F, 0x02, 0xEB, 0x41, 0xE8, 0x50, 0xF7, 0xFF, 0xFF, 0xC3, 0x3D, 0xC0, + 0x00, 0x00, 0x00, 0x7C, 0x34, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, 0xE1, 0x0F, 0x83, + 0xFA, 0x0E, 0x75, 0x15, 0x83, 0xF9, 0x08, 0x7D, 0x20, 0x83, 0xF9, 0x03, 0x74, 0x1B, 0x83, 0xF9, + 0x02, 0x74, 0x16, 0xE8, 0x25, 0xF7, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, 0x0F, 0x75, 0x0B, 0x83, 0xF9, + 0x08, 0x7C, 0x06, 0xE8, 0x15, 0xF7, 0xFF, 0xFF, 0xC3, 0xE8, 0xF0, 0xF3, 0xFF, 0xFF, 0x8B, 0x45, + 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x11, + 0xE8, 0x15, 0xF4, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x07, 0x7E, 0x22, 0xE8, 0xDD, 0xF6, 0xFF, 0xFF, + 0xC3, 0x3D, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0x15, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, + 0xE1, 0x0F, 0x83, 0xFA, 0x0D, 0x75, 0x06, 0xE8, 0xC1, 0xF6, 0xFF, 0xFF, 0xC3, 0xE8, 0x9C, 0xF3, + 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, + 0x1A, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, + 0x00, 0x00, 0x7F, 0x19, 0xE8, 0xC1, 0xF3, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x05, 0x74, 0x08, 0x83, + 0x7D, 0x16, 0x07, 0x7F, 0x02, 0xEB, 0x32, 0xE8, 0x81, 0xF6, 0xFF, 0xFF, 0xC3, 0x3D, 0xC0, 0x00, + 0x00, 0x00, 0x7C, 0x25, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, 0xE1, 0x0F, 0x83, 0xFA, + 0x0C, 0x75, 0x0B, 0x83, 0xF9, 0x08, 0x7C, 0x11, 0xE8, 0x60, 0xF6, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, + 0x0F, 0x75, 0x06, 0xE8, 0x55, 0xF6, 0xFF, 0xFF, 0xC3, 0xE8, 0x30, 0xF3, 0xFF, 0xFF, 0x8B, 0x45, + 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, + 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x11, + 0xE8, 0x55, 0xF3, 0xFF, 0xFF, 0x83, 0x7D, 0x16, 0x07, 0x7E, 0x27, 0xE8, 0x1D, 0xF6, 0xFF, 0xFF, + 0xC3, 0x3D, 0xC0, 0x00, 0x00, 0x00, 0x7C, 0x1A, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, + 0xE1, 0x0F, 0x83, 0xFA, 0x0D, 0x75, 0x0B, 0x83, 0xF9, 0x09, 0x74, 0x06, 0xE8, 0xFC, 0xF5, 0xFF, + 0xFF, 0xC3, 0xE8, 0xD7, 0xF2, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, 0x23, 0x48, 0x83, 0x45, + 0x23, 0x02, 0xC3, 0xC7, 0x45, 0x1A, 0x00, 0x00, 0x00, 0x00, 0x48, 0x8B, 0x45, 0x23, 0x0F, 0xB6, + 0x40, 0x01, 0x3D, 0xBF, 0x00, 0x00, 0x00, 0x7F, 0x11, 0xE8, 0xFC, 0xF2, 0xFF, 0xFF, 0x83, 0x7D, + 0x16, 0x07, 0x7E, 0x52, 0xE8, 0xC4, 0xF5, 0xFF, 0xFF, 0xC3, 0x3D, 0xC0, 0x00, 0x00, 0x00, 0x7C, + 0x45, 0x89, 0xC2, 0xC1, 0xEA, 0x04, 0x89, 0xC1, 0x83, 0xE1, 0x0F, 0x83, 0xFA, 0x0C, 0x75, 0x06, + 0xE8, 0xA8, 0xF5, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, 0x0D, 0x75, 0x06, 0xE8, 0x9D, 0xF5, 0xFF, 0xFF, + 0xC3, 0x83, 0xFA, 0x0E, 0x75, 0x10, 0x83, 0xF9, 0x00, 0x74, 0x1B, 0x83, 0xF9, 0x08, 0x7D, 0x16, + 0xE8, 0x88, 0xF5, 0xFF, 0xFF, 0xC3, 0x83, 0xFA, 0x0F, 0x75, 0x0B, 0x83, 0xF9, 0x08, 0x7C, 0x06, + 0xE8, 0x78, 0xF5, 0xFF, 0xFF, 0xC3, 0xE8, 0x53, 0xF2, 0xFF, 0xFF, 0x8B, 0x45, 0x1A, 0x01, 0x45, + 0x23, 0x48, 0x83, 0x45, 0x23, 0x02, 0xC3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +}; + + + + +//在InlineHook之前调用,构建 LDEx64() 函数 +void LDE_Init64() +{ + LDEx64 = ExAllocatePool(NonPagedPool,12800); + memcpy(LDEx64,szShellCode64,12800); +} + + +//获得Address中需要被Patch的字节数 +ULONG GetPatchSize64(PUCHAR Address) +{ + ULONG LenCount=0,Len=0; + + while(LenCount<=14) //至少需要14字节 + { + Len = LDEx64(Address,64); + Address=Address+Len; + LenCount=LenCount+Len; + } + return LenCount; +} + + + +//卸载驱动,恢复InlineHook后,释放LDEx64的内存 + +void LDE_Del64() +{ + if (LDEx64!=NULL) + { + ExFreePool(LDEx64); + } + + LDEx64 = NULL; +} + +NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegisterPath) +{ + + + PDEVICE_OBJECT DeviceObject; + NTSTATUS Status = STATUS_SUCCESS; + ULONG i; + UNICODE_STRING uniDeviceName; + UNICODE_STRING uniLinkName; + + RtlInitUnicodeString(&uniDeviceName,DEVICE_NAME); + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + //创建设备对象; + Status = IoCreateDevice(DriverObject,0,&uniDeviceName,FILE_DEVICE_UNKNOWN,0,FALSE,&DeviceObject); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + //创建符号链接; + Status = IoCreateSymbolicLink(&uniLinkName,&uniDeviceName); + + if (!NT_SUCCESS(Status)) + { + IoDeleteDevice(DeviceObject); + return Status; + } + + for (i = 0; iMajorFunction[i] = DefaultPassThrough; + } + DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = ControlPassThrough; + DriverObject->DriverUnload = UnloadDriver; + + + DbgPrint("HelloDriver\r\n"); + + return Status; + +} + + +NTSTATUS ControlPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + + NTSTATUS Status = STATUS_SUCCESS; + PVOID InputBuffer = NULL; + PVOID OutputBuffer = NULL; + ULONG_PTR InputSize = 0; + ULONG_PTR OutputSize = 0; + ULONG_PTR IoControlCode = 0; + PIO_STACK_LOCATION IrpSp; + PVOID SSSDTFunctionAddress = NULL; + IrpSp = IoGetCurrentIrpStackLocation(Irp); + + InputBuffer = Irp->AssociatedIrp.SystemBuffer; + OutputBuffer = Irp->AssociatedIrp.SystemBuffer; + InputSize = IrpSp->Parameters.DeviceIoControl.InputBufferLength; + OutputSize = IrpSp->Parameters.DeviceIoControl.OutputBufferLength; + + IoControlCode = IrpSp->Parameters.DeviceIoControl.IoControlCode; + + switch(IoControlCode) + { + case IOCTL_GET_SSSDTSERVERICE: + { + +#ifdef _WIN64 + SSSDTDescriptor = GetKeShadowServiceDescriptorTable64(); +#else + SSSDTDescriptor = GetKeShadowServiceDescriptorTable32(); +#endif + + CurrentProcessID = PsGetCurrentProcessId(); + if (SSSDTDescriptor==NULL) + { + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + + break; + } + + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_SUCCESS; + + break; + + } + case IOCTL_INLINEUNHOOK_SSSDT: + { + + if (SSSDTDescriptor==NULL) + { + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + + break; + } + + else + { +#ifdef _WIN64 + + InlineUnHookSSSDTWin7(CurrentNtUserPostMessageAddress,OrigianlFunctionCode,14); + LDE_Del64(); +#else + + + InlineUnHookSSSDTWinXP(CurrentNtUserPostMessageAddress,OrigianlFunctionCode,5); + +#endif + + + if (OrigianlFunctionCode!=NULL) + { + ExFreePool(OrigianlFunctionCode); + OrigianlFunctionCode = NULL; + } + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_SUCCESS; + + break; + } + + break; + } + case IOCTL_INLINEHOOK_SSSDT: + { + + if (SSSDTDescriptor==NULL) + { + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + + break; + } + + else + { + +#ifdef _WIN64 + + LDE_Init64(); + CurrentNtUserQueryWindowAddress = (pfnNtUserQueryWindow)GetSSSDTFunctionAddress64(IndexOfNtUserQueryWindowWin7); + CurrentNtUserPostMessageAddress = (pfnNtUserPostMessage)GetSSSDTFunctionAddress64(IndexOfNtUserPostMessageWin7); + + + if (CurrentNtUserPostMessageAddress==NULL||CurrentNtUserQueryWindowAddress==NULL) + { + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + + break; + } + + + + + InlineHookSSSDTWin7(CurrentNtUserPostMessageAddress,Fake_NtUserPostMessageAddress,14,&OrigianlFunctionCode); + +#else + + + CurrentNtUserQueryWindowAddress = (pfnNtUserQueryWindow)GetSSSDTFunctionAddress32(IndexOfNtUserQueryWindowWinXP); + CurrentNtUserPostMessageAddress = (pfnNtUserPostMessage)GetSSSDTFunctionAddress32(IndexOfNtUserPostMessageWinXP); + + + if (CurrentNtUserPostMessageAddress==NULL||CurrentNtUserQueryWindowAddress==NULL) + { + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + + break; + } + + + InlineHookSSSDTWinXP(CurrentNtUserPostMessageAddress,Fake_NtUserPostMessageAddress,5, + &OrigianlFunctionCode); + + + +#endif + + + + Irp->IoStatus.Information = 0; + Status = Irp->IoStatus.Status = STATUS_SUCCESS; + + break; + + } + } + + default: + { + + Irp->IoStatus.Status = STATUS_UNSUCCESSFUL; + Irp->IoStatus.Information = 0; + + + + break; + } + } + + + IoCompleteRequest(Irp,IO_NO_INCREMENT); + + return Status; +} + +BOOLEAN InlineHookSSSDTWin7(PVOID OriginalFunctionAddress,PVOID NewFucntionAddress,ULONG ulPatchSize, + PVOID* OrigianlFunctionCode) +{ + PVOID OriginalFunctionAddressHeaderBytes = NULL; + UCHAR szJmpCode[]="\xFF\x25\x00\x00\x00\x00\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"; + ULONG_PTR VirtaulAddress = NULL; + ulPatchSize = GetPatchSize64((PUCHAR)OriginalFunctionAddress); + OriginalFunctionAddressHeaderBytes = ExAllocatePool(NonPagedPool,ulPatchSize); + + if (OriginalFunctionAddressHeaderBytes==NULL) + { + return FALSE; + } + + WPOFF(); + memcpy(OriginalFunctionAddressHeaderBytes,OriginalFunctionAddress,ulPatchSize); + //保存了Original函数的前14个字节 + WPON(); + + *OrigianlFunctionCode = ExAllocatePool(NonPagedPool,(ulPatchSize+14)); + RtlFillMemory(*OrigianlFunctionCode,ulPatchSize+14,0x90); + + + memcpy((PUCHAR)*OrigianlFunctionCode,OriginalFunctionAddressHeaderBytes,ulPatchSize); //保存原先的14个字节 + + + ExFreePool(OriginalFunctionAddressHeaderBytes); + + VirtaulAddress = (ULONG_PTR)OriginalFunctionAddress+ulPatchSize; + memcpy(szJmpCode+6,&VirtaulAddress,8); + memcpy((PUCHAR)*OrigianlFunctionCode+ulPatchSize,szJmpCode,sizeof(szJmpCode)-1); + + + + + VirtaulAddress = (ULONG_PTR)NewFucntionAddress; + memcpy(szJmpCode+6,&VirtaulAddress,8); + + + + //修改原先的14个字节为跳转到Fake的指令 + WPOFF(); + RtlFillMemory(OriginalFunctionAddress,ulPatchSize,0x90); + memcpy(OriginalFunctionAddress,szJmpCode,sizeof(szJmpCode)-1); + WPON(); + + return TRUE; +} + +VOID InlineUnHookSSSDTWin7(PVOID OriginalFunctionAddress,PVOID OrigianlFunctionCode,ULONG ulPatchSize) +{ + WPOFF(); + memcpy(OriginalFunctionAddress,OrigianlFunctionCode,ulPatchSize); + WPON(); +} + + + + +BOOL InlineHookSSSDTWinXP(PVOID OriginalFunctionAddress,PVOID NewFunctionAddress,ULONG ulPatchSize,PVOID* OrigianlFunctionCode) +{ + UCHAR szJmpCode[] = "\xe9\x00\x00\x00\x00"; + + ULONG_PTR VirtualAddress = 0; + PVOID OriginalFunctionAddressHeaderBytes = NULL; + + OriginalFunctionAddressHeaderBytes = ExAllocatePool(NonPagedPool,ulPatchSize); + + if (OriginalFunctionAddressHeaderBytes==NULL) + { + return FALSE; + } + WPOFF(); + memcpy(OriginalFunctionAddressHeaderBytes,OriginalFunctionAddress,ulPatchSize); + WPON(); + + + *OrigianlFunctionCode = ExAllocatePool(NonPagedPool,(ulPatchSize+5)); + RtlFillMemory(*OrigianlFunctionCode,ulPatchSize+5,0x90); + + + memcpy((PUCHAR)*OrigianlFunctionCode,OriginalFunctionAddressHeaderBytes,ulPatchSize); + + VirtualAddress = (ULONG_PTR)OriginalFunctionAddress+ulPatchSize; + + *((int*)&szJmpCode[1]) = (int)VirtualAddress - ((int)(*OrigianlFunctionCode) +5 + 5); //第一个+5 是过前5个字节 第二个加 是 新 - (旧+5) + + + + memcpy((PUCHAR)(*OrigianlFunctionCode)+ulPatchSize,szJmpCode,sizeof(szJmpCode)-1); + + + VirtualAddress = (ULONG_PTR)NewFunctionAddress; + + *((int*)&szJmpCode[1]) = (int)VirtualAddress - ((int)OriginalFunctionAddress +5); + + WPOFF(); + RtlFillMemory(OriginalFunctionAddress,ulPatchSize,0x90); + memcpy(OriginalFunctionAddress,szJmpCode,sizeof(szJmpCode)-1); + WPON(); + + return TRUE; +} +VOID InlineUnHookSSSDTWinXP(PVOID OriginalFunctionAddress,PVOID OrigianlFunctionCode,ULONG ulPatchSize) +{ + WPOFF(); + memcpy(OriginalFunctionAddress,OrigianlFunctionCode,ulPatchSize); + WPON(); +} + +ULONG_PTR Fake_NtUserPostMessageAddress(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if(CurrentNtUserQueryWindowAddress(hWnd,0)==CurrentProcessID && PsGetCurrentProcessId()!=(HANDLE)CurrentProcessID ) + { + + return 0; + } + else + { + return ((pfnNtUserPostMessage)OrigianlFunctionCode)(hWnd,uMsg,wParam,lParam); + } +} + + +PVOID GetKeShadowServiceDescriptorTable64() +{ + PUCHAR StartAddress = (PUCHAR)__readmsr(0xC0000082); + + PUCHAR i = NULL; + UCHAR v1=0,v2=0,v3=0; + int iOffset = 0; + ULONG_PTR SSSDTDescriptor = 0; + for(i=StartAddress;i 0) + { + RtlInitUnicodeString(&uniFunctionName, wzFunctionName); + FunctionAddress = MmGetSystemRoutineAddress(&uniFunctionName); + } + return FunctionAddress; +} + + +PVOID GetSSSDTFunctionAddress32(ULONG ulIndex) +{ + + ULONG_PTR ServiceTableBase= 0 ; + PSYSTEM_SERVICE_TABLE32 SSSDT = (PSYSTEM_SERVICE_TABLE32)SSSDTDescriptor; + ServiceTableBase = (ULONG_PTR)(SSSDT->ServiceTableBase); + return (PVOID)(*(PULONG_PTR)((ULONG_PTR)ServiceTableBase + 4 * ulIndex)); +} + +PVOID GetSSSDTFunctionAddress64(ULONG ulIndex) +{ + + LONG v1 = 0; + ULONG_PTR v2 = 0; + ULONG_PTR ServiceTableBase= 0 ; + PSYSTEM_SERVICE_TABLE64 SSSDT = (PSYSTEM_SERVICE_TABLE64)SSSDTDescriptor; + ServiceTableBase=(ULONG_PTR)(SSSDT ->ServiceTableBase); + v2 = ServiceTableBase + 4 * ulIndex; + v1 = *(PLONG)v2; + v1 = v1>>4; + return (PVOID)(ServiceTableBase + (ULONG_PTR)v1); +} + + +NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp) +{ + Irp->IoStatus.Status = STATUS_SUCCESS; + Irp->IoStatus.Information = 0; + IoCompleteRequest(Irp,IO_NO_INCREMENT); + + return STATUS_SUCCESS; +} + + + + +VOID WPOFF() +{ + ULONG_PTR cr0 = 0; + Irql = KeRaiseIrqlToDpcLevel(); + cr0 =__readcr0(); + cr0 &= 0xfffffffffffeffff; + __writecr0(cr0); + // _disable(); //这句话 屏蔽也没有啥 +} + +VOID WPON() +{ + ULONG_PTR cr0=__readcr0(); + cr0 |= 0x10000; + // _enable(); //这句话 屏蔽也没有啥 + __writecr0(cr0); + KeLowerIrql(Irql); +} + + +VOID UnloadDriver(PDRIVER_OBJECT DriverObject) +{ + UNICODE_STRING uniLinkName; + PDEVICE_OBJECT NextDeviceObject = NULL; + PDEVICE_OBJECT CurrentDeviceObject = NULL; + + RtlInitUnicodeString(&uniLinkName,LINK_NAME); + + IoDeleteSymbolicLink(&uniLinkName); + CurrentDeviceObject = DriverObject->DeviceObject; + while (CurrentDeviceObject != NULL) + { + + NextDeviceObject = CurrentDeviceObject->NextDevice; + IoDeleteDevice(CurrentDeviceObject); + CurrentDeviceObject = NextDeviceObject; + } + return; +} \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.h b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.h new file mode 100644 index 0000000..9dabe67 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.h @@ -0,0 +1,66 @@ + + +#ifndef CXX_INLINEHOOKSSSDT_H +#define CXX_INLINEHOOKSSSDT_H + + + +#include +#include + +typedef struct _SYSTEM_SERVICE_TABLE64{ + PVOID ServiceTableBase; + PVOID ServiceCounterTableBase; + ULONG64 NumberOfServices; + PVOID ParamTableBase; +} SYSTEM_SERVICE_TABLE64, *PSYSTEM_SERVICE_TABLE64; + +typedef struct _SYSTEM_SERVICE_TABLE32 { + PVOID ServiceTableBase; + PVOID ServiceCounterTableBase; + ULONG32 NumberOfServices; + PVOID ParamTableBase; +} SYSTEM_SERVICE_TABLE32, *PSYSTEM_SERVICE_TABLE32; + +#define DEVICE_NAME L"\\Device\\InlineHookSSSDTDevice" +#define LINK_NAME L"\\DosDevices\\InlineHookSSSDTLink" + +#define IOCTL_GET_SSSDTSERVERICE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INLINEHOOK_SSSDT \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_INLINEUNHOOK_SSSDT \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x831,METHOD_BUFFERED,FILE_ANY_ACCESS) + + +NTSTATUS ControlPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp); +NTSTATUS DefaultPassThrough(PDEVICE_OBJECT DeviceObject,PIRP Irp); +VOID UnloadDriver(PDRIVER_OBJECT DriverObject); + +PVOID + GetFunctionAddressByNameFromNtosExport(WCHAR *wzFunctionName); +PVOID GetKeShadowServiceDescriptorTable32(); +PVOID GetKeShadowServiceDescriptorTable64(); +PVOID GetSSSDTFunctionAddress64(ULONG ulIndex); +PVOID GetSSSDTFunctionAddress32(ULONG ulIndex); + +typedef ULONG_PTR (*pfnNtUserQueryWindow)(HWND WindowHandle, ULONG_PTR TypeInformation); +typedef ULONG_PTR (*pfnNtUserPostMessage)(HWND WindowHandle,UINT uMsg,WPARAM wParam,LPARAM lParam); + +VOID WPOFF(); +VOID WPON(); + +BOOLEAN InlineHookSSSDTWin7(PVOID OriginalFunctionAddress,PVOID NewFucntionAddress,ULONG ulPatchSize, + PVOID* OrigianlFunctionCode); +VOID InlineUnHookSSSDTWin7(PVOID OriginalFunctionAddress,PVOID OrigianlFunctionCode,ULONG ulPatchSize); + + + +BOOL InlineHookSSSDTWinXP(PVOID OriginalFunctionAddress,PVOID NewFunctionAddress,ULONG ulPatchSize,PVOID* OrigianlFunctionCode); +VOID InlineUnHookSSSDTWinXP(PVOID OriginalFunctionAddress,PVOID OrigianlFunctionCode,ULONG ulPatchSize); + +ULONG_PTR Fake_NtUserPostMessageAddress(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); +void LDE_Init64() ; +ULONG GetPatchSize64(PUCHAR Address); +#endif diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.sln b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.sln new file mode 100644 index 0000000..3d37377 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.sln @@ -0,0 +1,16 @@ +Microsoft Visual Studio Solution File, Format Version 11.00 +# Visual Studio 2010 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "InlineHookSSSDT", "InlineHookSSSDT.vcxproj", "{4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + WinDDK|Win32 = WinDDK|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.ActiveCfg = WinDDK|Win32 + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41}.WinDDK|Win32.Build.0 = WinDDK|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.suo b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.suo new file mode 100644 index 0000000000000000000000000000000000000000..ee04e1df65a6555537a1a99824c7f86ba9daa93f GIT binary patch literal 11264 zcmeHNYiwLc6`oBR+9W0EBZQKMbQ>omZR}-VwrdB6c=xVjC$?kQt&NZi+Q+rM@p`Yd zk0e%XwMr!TQ>r4600|_JLPhyes1Qg9sS4p25+W7-fuIs|IEh!Z8;C&U&+ zn7*~Tx@u+$f#@Ch0L{R=;PozR4YwiWdfyGa2e=)$1Gp2o3wST^!$2&(*bTfN_yF)h z;2t35fOrQ!I5Y5BVc=I0evuGGge9?rl~jklVp~n;DHmSw-M4=F*4w{%)wh+EC^Ucx zP&C9jF#_r{h$X~Dvq15?7goqQ+ltMk46|-X^oXd4Aq?W%C%W(rBOXL7grA1k7i(N5 zF+*vfUL(^lw)h@Fiuyo4Y6Tt<+Dz&kL5+S&42dxj2kk{sHXB;s9?++59ssJ+r`@*c z+dAtGoi@N-MtU4C*V}CaK7zcxK(=|v3K@SG@%_M$1Ia7r%ny7Nco5hDJOn%p`~>g_ zknJ8r_&D$wuoKt?3;;g~WO)c-*osFHc3bgYE9|qv;|M z4}r#j62*{kFSYXvlVwfMRA(njdRZ@4(v`eXoJeQq)3bV~e^M`%ksb&I1M=7Dk5>zo zYDpg`>eWgqUFh^rR5OKq_Kd!iGUoN-KqeTO>7MDG359aq!E_{jw3^X?aUx z0rsURvdB3lsv<9Ph?y3zByC9{g}7n!!QPxBVYg`rFVc zc_5@fXA%1gX_l=y(5+R_kb7S4OtgND;c;vJ>4&M(r;q1YsJp6T`E1E38#9%_WWHQY z7m}4~E^h>+2+r!IS|nu{g{gcoXIv-;v~(q%$}g4!6Zv8>ohj%tk+@jVi{*SKU&vRM z0uz+fGIFx|u~8Y(OKg{{7$u!@zOyC=jYro!mvVFzsEK|tExm{WX0eEw8N__A#UVHsf-p%Blt$OC080}8YFQ3j_# zw}QUrB)90S3HTv@`%vejKvntUnS$p9f}4H}Jm}zI9$H~w)bvTcY`{^_e-!=DUs0vc z^9+3jf}1}5PwM?5=yJ}Bp4929Y!UQ%*rzIeo}+C0TQESU)o>x zsY;(`xN)iQ)Y+xc$#W0;WzP~|yv%F+cxTv%5NJ2ya| zw#s%o-SivVA15a^=Vlm%{(TJ5R>sfzw*J%J@H|<9Owi)5?G*OOScj}sVC`v(ShL5#KdSOae_@=50Du>L`z)YIpCoNIaD4-tlz;BCw8Zup zO+A~zsAuK=%U#3t16+iyB-l3tKK8bzLFhMbUC!ChVsyL&y|v(o!^Qsr%9eVzKpK>HC{@`@Q}0-qQ<`;?T}_2akQ_m%}gr@rO4a{QlJLQL*dS`wIWr-f{N%)i3}1 z#`UWSwjULL-E;VNKkDc>^|PCAt{llMSO=)2cw%PH^;_2uj9&dt?xk-Wc)PE)_FlZH zlzqm}I~=vs{|J1i^=}6PnAa@4u|-&7zDSsNRPR^c_Smou?3h~q%lOhOzaRa{kH7xX zZ!@nC+GXxgwVu13S2~Uv;SF3_-aF{fMfWb`)tYzq=J}KN`>Oko)Bm*fn11jgc%kP{ zZ`jm!=SxdtK1ja&!zf~$4==yV=4&J8zaBIm zwK}lZ-<(mD+otc`LoX4+j5pQ}fSzG{0-r?XjtZcz={G`F>PZU4MFY6|3{J z7%%Tncqc%dbx6L3oKh1eApb3ozaM=LS^g&j;vBG@JKey#I}!*vfO>lx?+q%qx6SM~ z$H1|iZqt5{MPKxLy!tzYU7IiH^Eg4Jv0C$xUf$vI1v!LWonJ5b+zsyR8;8xlzqz?r zwYxUQ`!^te18B@M5W#-uvEP4^kVNhQyo07@G_!ykk$-x1JTno7q+c489&H?J)g>Zw z&4v&&-~S^`-~V}-kj7up{(l z>)tMVNBiVF$RgP?cuvM8+uaYR+= z+wVkct?OeO8UJt#^y#a50qFbusBjRdI{wqBYma}pJx8ZG5xsV0{HZVf^Th5WPyg+m tr(e9Ts6TC@kLQ$cZT;8c!`bH+{;}^5C;#-?4*Njj)M1SK4%E-Ue*y8(I#d7v literal 0 HcmV?d00001 diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj new file mode 100644 index 0000000..d7e7f80 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj @@ -0,0 +1,62 @@ +锘 + + + + WinDDK + Win32 + + + + {4EE67C57-BE79-4CD7-B3B0-94AECE62DB41} + Win32Proj + "InlineHookSSSDT" + + + + + + + + .sys + false + $(WLHBASE)\bin\x86\x86;$(WLHBASE)\bin\x86 + $(WLHBASE)\inc\api;$(WLHBASE)\inc\crt;$(WLHBASE)\inc\ddk;$(WLHBASE)\inc + + $(WLHBASE)\lib\win7\i386 + + + + + + _X86_;DBG=1 + false + false + StdCall + CompileAsC + + + + + ntoskrnl.lib;hal.lib;wdm.lib;%(AdditionalDependencies) + + + true + Native + Driver + DriverEntry + true + 0x10000 + + + + + + + + + + + + + + \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj.user b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj.user new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/InlineHookSSSDT.vcxproj.user @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/clean.bat b/InlineHook_ShadowSSDT/ring0/clean.bat new file mode 100644 index 0000000..a92852f --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/clean.bat @@ -0,0 +1,28 @@ +rem ///////////////// +rem / Add by ChiChou +rem / +rem / FileName:Clean.bat +rem / Description:Clean +rem / +rem //////////////// +rd .\bin /s /q +rd .\WinDDK /s /q +rd .\objchk_w2k_x86 /s /q +rd .\objchk_wxp_x86 /s /q +rd .\objchk_wnet_x86 /s /q +rd .\objchk_wlh_x86 /s /q +rd .\objfre_w2k_x86 /s /q +rd .\objfre_wxp_x86 /s /q +rd .\objfre_wnet_x86 /s /q +rd .\objfre_wlh_x86 /s /q +del .\*.log +del .\*.err +del .\*.xml +rem ***** del VS2005 file ***** +del .\*.ncb +del .\*.user +del .\*.suo /A:H +rem ***** del VS6.0 file ***** +del .\*.plg +del .\*.opt +exit \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/ddkbuild.cmd b/InlineHook_ShadowSSDT/ring0/ddkbuild.cmd new file mode 100644 index 0000000..8acd7a4 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/ddkbuild.cmd @@ -0,0 +1,1122 @@ +@echo off +@set VERSION=V7.3 +@set OSR_DEBUG=off +@if "%OS%"=="Windows_NT" goto :Prerequisites +@echo This script requires Windows NT 4.0 or later to run properly! +goto :EOF +:Prerequisites +:: Check whether FINDSTR is available. It's used to show warnings etc. +findstr /? > NUL 2>&1 || echo "FINDSTR is a prerequisite but wasn't found!" && goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: $Id: ddkbuild.cmd 27 2008-09-06 12:02:06Z oliver $ +:: +:: This software is supplied for instructional purposes only. +:: +:: OSR Open Systems Resources, Inc. (OSR) expressly disclaims any warranty +:: for this software. THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT WARRANTY +:: OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, +:: THE IMPLIED WARRANTIES OF MECHANTABILITY OR FITNESS FOR A PARTICULAR +:: PURPOSE. THE ENTIRE RISK ARISING FROM THE USE OF THIS SOFTWARE REMAINS +:: WITH YOU. OSR's entire liability and your exclusive remedy shall not +:: exceed the price paid for this material. In no event shall OSR or its +:: suppliers be liable for any damages whatsoever (including, without +:: limitation, damages for loss of business profit, business interruption, +:: loss of business information, or any other pecuniary loss) arising out +:: of the use or inability to use this software, even if OSR has been +:: advised of the possibility of such damages. Because some states/ +:: jurisdictions do not allow the exclusion or limitation of liability for +:: consequential or incidental damages, the above limitation may not apply +:: to you. +:: +:: OSR Open Systems Resources, Inc. +:: 105 Route 101A Suite 19 +:: Amherst, NH 03031 (603) 595-6500 FAX: (603) 595-6503 +:: report bugs to +:: alternatively report them via +:: +:: +:: MODULE: +:: +:: ddkbuild.cmd +:: +:: ABSTRACT: +:: +:: This script allows drivers to be built with Visual Studio 2002 through +:: Visual Studio 2008 and possibly future versions. It will also work fine +:: from the command line. +:: If you are interested in a project wizard that makes use of this script, +:: try DDKWizard from . +:: +:: AUTHOR(S): +:: +:: - OSR Open Systems Resources, Inc. +:: - Oliver Schneider (ddkwizard.assarbad.net) +:: +:: REQUIREMENTS: +:: +:: Environment variables that must be set. +:: %NT4BASE% - Set this up for "-NT4" builds (legacy, support not tested) +:: %W2KBASE% - Set this up for "-W2K*" builds (legacy, support not tested) +:: %WXPBASE% - Set this up for "-WXP*" builds +:: %WNETBASE% - Set this up for "-WNET*" builds +:: %WLHBASE% - Set this up for "-WLH*" builds +:: %WDF_ROOT% - Must be set if attempting to do a WDF Build. +:: +:: Examples: +:: NT4BASE : could be "D:\NT4DDK" +:: W2KBASE : could be "D:\Nt50DDK" +:: WXPBASE : could be "D:\WINDDK\2600" +:: WNETBASE: could be "D:\WINDDK\3790.1830" or "C:\WINDDK\3790" +:: +:: COMMAND FORMAT: +:: +:: Run the script without any parameters to get the whole help content! +:: Note: "-WDF" has been tested with the 01.00.5054 version of the framework +:: +:: RETURN CODES AND THEIR MEANING: +:: +:: 001 == Unknown build type. Check the parameter +:: 002 == No WDF_ROOT given using WDF build type. +:: 003 == The DDK-specific base directory variable (NT4BASE, W2KBASE, WXPBASE, +:: WNETBASE) is not set at all and could not be auto-detected! +:: 004 == BASEDIR variable is empty. Check to see that the DDK-specific +:: variable is set correctly (i.e. NT4BASE, W2KBASE, WXPBASE, WNETBASE) +:: 005 == No mode (checked/free) was given. Check the respective parameter! +:: 006 == No DIR or SOURCES file found in the given target directory. +:: 007 == No target directory given. +:: 008 == Given target directory does not exist. +:: 009 == The SETENV script failed. +:: +:: Note: If %OSR_ERRCODE% and %ERRORLEVEL% are equal, the return code stems +:: from one of the tools being called during the build process. +:: +:: BROWSE FILES: +:: +:: This procedure supports the building of BROWSE files to be used by +:: Visual Studio 6 and by Visual Studio.NET However, the BSCfiles created +:: by bscmake for the two are not compatible. When this command procedure +:: runs, it selects the first bscmake.exe found in the path. So, make sure +:: that the correct bscmake.exe is in the path ... +:: +:: Note that if using Visual Studio.NET the .BSC must be added to the project +:: in order for the project to be browsed. +:: Another alternative is the VS addon named "Visual Assist X" which will +:: parse the header files - no more need for browse files. +:: +:: COMPILERS: +:: +:: If you are building NT4 you should really be using the VC6 compiler. +:: Later versions of the DDK now contain the compiler and the linker. This +:: procedure should use the correct compiler. +:: +:: GENERAL COMMENTS: +:: +:: This procedure has been cleaned up to be modular and easy to understand. +:: +:: As of the Server 2003 SP1 DDK DDKBUILD now clears the NO_BROWSE_FILE and +:: NO_BINPLACE environment variables so that users can use these features. +:: +:: Starting with the Vista WDK, the output in the respective tool window +:: in VS is in Unicode by default. This garbles the output from DDKBUILD +:: and we therefore clear the environment variable VS_UNICODE_OUTPUT. +:: +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MAIN +:: Building "stack frame" +setlocal ENABLEEXTENSIONS & pushd . +:: Check whether the REG utility is available +reg /? > NUL 2>&1 && set OSR_REGAVAILABLE=1 + +:: This is set by client-side keyword substitution +set SVN_REVISION=$Revision: 27 $ +:: Extract the revision number from the revision keyword +set SVN_REVISION=%SVN_REVISION:~0,-2% +set SVN_REVISION=%SVN_REVISION:~11% +:: This is set by client-side keyword substitution +set SVN_REVDATE=$Date: 2008-09-06 12:02:06 +0000 (Sat, 06 Sep 2008) $ +:: Extract the date from the Date keyword +set SVN_REVDATE=%SVN_REVDATE:~7,10% +set VERSION=%VERSION%/r%SVN_REVISION% + +:: Init some special variables +set OSR_VERSTR=OSR DDKBUILD.CMD %VERSION% (%SVN_REVDATE%) - OSR, Open Systems Resources, Inc. +set OSR_PREBUILD_SCRIPT=ddkprebld.cmd +set OSR_POSTBUILD_SCRIPT=ddkpostbld.cmd +set OSR_SETENV_SCRIPT=ddkbldenv.cmd +set OSR_ECHO=@echo DDKBLD: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set error messages +:: Possible codes: 1 +set ERR_UnknownBuildType=Unknown type of build. Please recheck parameters. +:: Possible codes: 2 +set ERR_NoWdfRoot=WDF_ROOT is not defined, are you using 00.01.5054 or later? +:: Possible codes: 3 +set ERR_BaseDirNotSet=To build using type %%OSR_TARGET%% you need to set the %%%%%%BASEDIRVAR%%%%%% environment variable to point to the %%BASEDIROS%% DDK base directory! +:: Possible codes: 4 +set ERR_NoBASEDIR=NT4BASE, W2KBASE, WXPBASE and/or WNETBASE environment variable(s) not set. Environment variable(s) must be set by user according to DDK version(s) installed. +:: Possible codes: 5 +set ERR_BadMode=^ must be 'checked', 'free', 'chk' or 'fre' (case-insensitive). +:: Possible codes: 6 +set ERR_NoTarget=Target directory must contain a SOURCES or DIRS file. +:: Possible codes: 7, 8 +set ERR_NoDir=The ^ parameter must be a valid directory. +:: Possible codes: 9 +set ERR_SetEnvFailed=The SETENV script failed. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Clear the error code variable +set OSR_ERRCODE=0 +set prefast_build=0 + +:: Turn on tracing, use %OSR_TRACE% instead of ECHO +if /i "%OSR_DEBUG%" == "on" (set OSR_TRACE=%OSR_ECHO% [TRACE]) else (set OSR_TRACE=rem) +:: Turn on echoing of current line if %OSR_DEBUG% is set to "on" +@echo %OSR_DEBUG% + +:: Output version string +@echo %OSR_VERSTR% +%OSR_TRACE% ^(Current module: ^"%~f0^"^) +@echo. + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Set the target platform variable +set OSR_TARGET=%~1 +:: Remove any dashes in the variable +if not "%OSR_TARGET%" == "" set OSR_TARGET=%OSR_TARGET:-=% +:: Show help if the target parameter is empty after removal of the dashes +if "%OSR_TARGET%" == "" goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: In the build directory check for this script and call it if it exists. +:: This allows to override any global system variable setting, if desired. +if not "%3" == "" call :GetCustomEnvironment "%~f3" +if not "%OSR_ERRCODE%" == "0" goto :USAGE +:: Additional error handling for better usability +:: These subroutines will also attempt to locate the requested DDK!!! +set OSR_ERRCODE=3 +%OSR_TRACE% Checking whether the environment variable for the build type was set +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Check > NUL 2>&1 +:: If the BASEDIROS/BASEDIRVAR variable is not defined, it means the subroutine did not exist! +if not DEFINED BASEDIROS call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIROS)" & goto :USAGE +if not DEFINED BASEDIRVAR call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (BASEDIRVAR)" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BaseDirNotSet%" & goto :USAGE + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +set BASEDIR=%%%BASEDIRVAR%%% +call :ResolveVar BASEDIR +call :MakeShort BASEDIR "%BASEDIR%" +:: Check for existing %BASEDIR% +if "%BASEDIR%" == "" call :ShowErrorMsg 4 "%ERR_NoBASEDIR%" & goto :USAGE +set PATH=%BASEDIR%\bin;%PATH% +%OSR_TRACE% Now jump to the initialization of the commandline +:: Calling as a subroutine has 2 advantages: +:: 1. the script does not quit if the label was not found +:: 2. we return to the line after the call and can check variables there +call :%OSR_TARGET%Build + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_TRACE% We returned from the variable initialization +if not DEFINED OSR_CMDLINE call :ShowErrorMsg 1 "%ERR_UnknownBuildType% (OSR_CMDLINE)" & goto :USAGE + +%OSR_TRACE% Hurrah, all the variables have been initialized, continuing +:: Proceed with common build steps +goto :CommonBuild + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Check whether the parameter makes sense and try to +:: correct it if possible +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WLH64Check +:WLHA64Check +:WLHXP64Check +:WLHNET64Check +:WLHNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WLHCheck +:WLHX64Check +:WLHI64Check +:WLHNETX64Check +:WLHNETI64Check +:WLHXPCheck +:WLH2KCheck +:WLHNETCheck +set BASEDIROS=Windows Vista/Windows 2008 Server +set BASEDIRVAR=WLHBASE +:: Compatibility between BUILD and VS ... prevent pipes from being used +%OSR_ECHO% Clearing %%VS_UNICODE_OUTPUT%% ... +set VS_UNICODE_OUTPUT= +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "6001.18000 6000" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:WNETW2KCheck +:WNETA64Check +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WNET2KCheck +:WNETXPCheck +:WNETWXPCheck +:WNETXP64Check +:WNET64Check +:WNETI64Check +:WNETAMD64Check +:WNETX64Check +:WNETCheck +set BASEDIROS=Windows 2003 Server +set BASEDIRVAR=WNETBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "3790.1830 3790.1218 3790" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: These labels are for compatibility with the respective +:: modes supported by another flavor of DDKBUILD. +:XPCheck +:XP64Check +:XPW2KCheck +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:WXP64Check +:WXPI64Check +:WXPCheck +:WXP2KCheck +set BASEDIROS=Windows XP +set BASEDIRVAR=WXPBASE +:: Other flavor of DDKBUILD +if not DEFINED WXPBASE if DEFINED XPBASE set BASEDIRVAR=XPBASE +:: Return to caller if the BASEDIR is already defined (either customized or global) +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :DetectBaseDirTemp "2600.1106 2600" +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :CommonCheckSetVarWithReturn +goto :CommonCheckErrorNotDetectedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:W2K64Check +:W2KI64Check +:W2KCheck +set BASEDIROS=Windows 2000 +set BASEDIRVAR=W2KBASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:NT4Check +set BASEDIROS=Windows NT4 +set BASEDIRVAR=NT4BASE +:: Return to caller +if DEFINED %BASEDIRVAR% goto :CommonCheckNoErrorWithReturn +call :CommonCheckMsg2 +goto :CommonCheckErrorNotSupportedWithReturn + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg1 +echo. +%OSR_ECHO% WARNING: %%%BASEDIRVAR%%% NOT SET! +%OSR_ECHO% Attempting to auto-detect the installation folder and set %%%BASEDIRVAR%%%. +%OSR_ECHO% (If this fails *you* will have to set it!) +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckMsg2 +echo. +%OSR_ECHO% WARNING: +%OSR_ECHO% Auto-detection of the folder settings is not supported for the requested DDK. +%OSR_ECHO% Please set %%%BASEDIRVAR%%% yourself! +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckSetVarWithReturn +%OSR_ECHO% Found! +echo. +set %BASEDIRVAR%=%BASEDIRTEMP% +set BASEDIRTEMP= +:: Tell the caller it was successful +:CommonCheckNoErrorWithReturn +set OSR_ERRCODE=0 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CommonCheckErrorNotDetectedWithReturn +echo. +%OSR_ECHO% None of the usual default paths works. Set %%%BASEDIRVAR%%% manually! +:CommonCheckErrorNotSupportedWithReturn +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Initialize variables specific to the respective platform +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: +:: Valid parameters for setenv in different DDKs/WDKs: +:: +:: 2600 - "setenv [fre|chk] [64] [hal]" +:: 2600.1106 - "setenv [fre|chk] [64] [hal] [WXP|W2K]" +:: 3790 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K]" +:: 3790.1830 - "setenv [fre|chk] [64|AMD64] [hal] [WXP|WNET|W2K] [no_prefast] [bscmake]" +:: 6000 - "setenv [fre|chk] [64|AMD64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" +:: 6001.18000 - "setenv [fre|chk] [64|x64] [hal] [WLH|WXP|WNET|W2K] [bscmake]" + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: NT 4.0 build using NT4 DDK +:NT4Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% "%%MSDEVDIR%%" +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WXP DDK +:XPW2KBuild +:WXP2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\w2k\set2k.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 64bit (Intel) using W2K DDK +:W2K64Build +:W2KI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv64.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using W2K DDK +:W2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WXP DDK +:XP64Build +:WXP64Build +:WXPI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WXP DDK +:XPBuild +:WXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WNET DDK +:WNETW2KBuild +:WNET2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% W2K %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WNET DDK +:WNETXPBuild +:WNETWXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit using WNET DDK +:WNETXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WNET DDK +:WNET64Build +:WNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WNET DDK +:WNETA64Build +:WNETAMD64Build +:WNETX64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% AMD64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WNET DDK +:WNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 32bit using WLH DDK +:WLHBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (AMD) using WLH DDK +:WLHA64Build +:WLHX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WLH build for 64bit (Intel) using WLH DDK +:WLH64Build +:WLHI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WLH +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (AMD) using WLH DDK +:WLHNETA64Build +:WLHNETX64Build +call :DetectVistaWDK +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% %OSR_AMD64FLAG% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 64bit (Intel) using WLH DDK +:WLHNET64Build +:WLHNETI64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 32bit using WLH DDK +:WLHXPBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WXP build for 64bit (Intel) using WLH DDK +:WLHXP64Build +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% 64 WXP +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: W2K build for 32bit using WLH DDK +:WLH2KBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% W2K +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: WNET build for 32bit using WLH DDK +:WLHNETBuild +set OSR_CMDLINE="%%BASEDIR%%\bin\setenv.bat" %%BASEDIR%% %%BuildMode%% WNET +goto :EOF + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: All builds go here for the rest of the procedure. Now, +:: we are getting ready to call build. The big problem +:: here is to figure our the name of the buildxxx files +:: being generated for the different platforms. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:CommonBuild +:: Remove first command line arg +shift +call :SetMode %1 +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_BadMode%" & goto :USAGE +set OSR_BUILDNAME=%OSR_TARGET% (%BuildMode%) using the %BASEDIROS% DDK and %%%BASEDIRVAR%%% + +call :CheckTargets %2 +if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :USAGE +if not "%OSR_ERRCODE%" == "0" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :USAGE + +:: Resolve any variables in the command line string +call :ResolveVar OSR_CMDLINE + +pushd . +set ERRORLEVEL=0 +:: This external script prepares the build environment (e.g. setenv.bat) +call %OSR_CMDLINE% +:: Will only work with newer SETENV.BAT versions, but will be helpful in this case. +if not "%ERRORLEVEL%" == "0" call :ShowErrorMsg 9 "%ERR_SetEnvFailed%" & goto :USAGE +popd + +:: ---------------------------------------------------------------------------- +:: Setting global variables for the scope of this CMD session +set NO_BROWSER_FILE= +set NO_BINPLACE= +set buildDirectory=%~fs2 +call :MakeShort buildDirectory "%buildDirectory%" +set buildDirectory_raw=%2 +set buildDirectory_fname=%~n2 +%OSR_TRACE% buildDirectory == %buildDirectory% +%OSR_TRACE% buildDirectory_raw == %buildDirectory_raw% +%OSR_TRACE% buildDirectory_fname == %buildDirectory_fname% + +set mpFlag=-M +if "%BUILD_ALT_DIR%" == "" goto :NT4 + +:: W2K sets this! +set OSR_EXT=%BUILD_ALT_DIR% +set mpFlag=-MI + +:NT4 +if "%NUMBER_OF_PROCESSORS%" == "" set mpFlag= +if "%NUMBER_OF_PROCESSORS%" == "1" set mpFlag= + +:: Set additional variables at this point or do whatever you please +@if exist "%buildDirectory%\%OSR_PREBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing pre-build steps [%OSR_PREBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_PREBUILD_SCRIPT%" > "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_PREBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished pre-build steps [%OSR_PREBUILD_SCRIPT%] ... +) +:: Save the current directory (before changing into the build directory!) +:: AFTERPREBUILD +pushd . + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Determine the settings of flags, WDF and PREFAST in +:: other words what was set for %3 and beyond.... +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +%OSR_ECHO% %OSR_BUILDNAME% +set OSR_ARGS= + argument(s): +if not "%3" == "" set OSR_ARGS=%OSR_ARGS% %3 +if not "%4" == "" set OSR_ARGS=%OSR_ARGS% %4 +if not "%5" == "" set OSR_ARGS=%OSR_ARGS% %5 +if /i "%OSR_ARGS%" == " + argument(s):" set OSR_ARGS= +%OSR_ECHO% Directory: %buildDirectory%%OSR_ARGS% +%OSR_ECHO% %BASEDIRVAR%: %BASEDIR% + +cd /D %~s2 +set bFlags=-Ze +set bscFlags= + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ContinueParsing +if "%3" == "" goto :DONE +if "%3" == "/a" goto :RebuildallFound +if /i "%3" == "-WDF" goto :WDFFound +if /i "%3" == "-PREFAST" goto :PrefastFound +set bscFlags=/n +set bFlags=%bFlags% %3 +:: Remove next arg +shift +goto :ContinueParsing + +:WDFFound +shift +:: Note, that the setwdf.bat is called from setenv.bat in the WDK, +:: therefore we skip it. +if /i "%BASEDIRVAR%" == "WLHBASE" goto :WDFOkay +if "%WDF_ROOT%" == "" call :ShowErrorMsg 2 "%ERR_NoWdfRoot%" & goto :USAGE +pushd . +if exist "%WDF_ROOT%\set_wdf_env.cmd" call "%WDF_ROOT%\set_wdf_env.cmd" +popd +:WDFOkay +goto :ContinueParsing + +:PrefastFound +shift +set prefast_build=1 +goto :ContinueParsing + +:RebuildallFound +shift +set bscFlags=/n +set bFlags=%bFlags:-Ze=-cfeZ% +set bFlags=%bFlags: -cZ=% +goto :ContinueParsing +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:DONE +for %%x in (build%OSR_EXT%.err build%OSR_EXT%.wrn build%OSR_EXT%.log prefast%OSR_EXT%.log) do @( + if exist "%%x" del /f /q "%%x" +) + +if not "%prefast_build%" == "0" goto :RunPrefastBuild +%OSR_ECHO% Run build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +pushd . +build %mpFlag% %bFlags% +popd +goto :BuildComplete + +:RunPrefastBuild +%OSR_ECHO% Run prefast build %mpFlag% %bFlags% for %BuildMode% version in %buildDirectory_raw% +setlocal ENABLEEXTENSIONS & pushd . +set PREFASTLOG=PREfast_defects_%OSR_EXT%.xml +prefast /log=%PREFASTLOG% /reset build %mpFlag% %bFlags% > NUL 2>&1 +if "%errorlevel%" GTR "0" set OSR_ERRCODE=%errorlevel% +prefast /log=%PREFASTLOG% list > prefast%OSR_EXT%.log +%OSR_ECHO% The PREfast logfile is ^"%prefastlog%^"! +popd & endlocal + +:BuildComplete +if not "%errorlevel%" == "0" set OSR_ERRCODE=%errorlevel% + +@echo %OSR_DEBUG% +:: Assume that the onscreen errors are complete! +setlocal +set WARNING_FILE_COUNT=0 +if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+1 +) +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ================ Build warnings ======================= + if exist "build%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][DRCLU][0-9][0-9]* error[^.][DRCLU][0-9][0-9]*" "build%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set WARNING_FILE_COUNT_PRE=0 +if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + set /a WARNING_FILE_COUNT_PRE=%WARNING_FILE_COUNT_PRE%+1 +) +:: Reset if this is no PREfast build +if "%prefast_build%" == "0" set WARNING_FILE_COUNT_PRE=0 +if not "%WARNING_FILE_COUNT_PRE%" == "0" ( + %OSR_ECHO% =============== PREfast warnings ====================== + if exist "prefast%OSR_EXT%.log" for /f "tokens=*" %%x in ('findstr "warning[^.][CLU]*" "prefast%OSR_EXT%.log"') do @( + @echo %%x + ) +) +set /a WARNING_FILE_COUNT=%WARNING_FILE_COUNT%+%WARNING_FILE_COUNT_PRE% +if not "%WARNING_FILE_COUNT%" == "0" ( + %OSR_ECHO% ======================================================= +) +endlocal +@echo. +%OSR_ECHO% Build complete +%OSR_ECHO% Building browse information files +if exist "buildbrowse.cmd" call "buildbrowse.cmd" & goto :postBuildSteps +set sbrlist=sbrList.txt +if not exist sbrList%CPU%.txt goto :sbrDefault +set sbrlist=sbrList%CPU%.txt + +:sbrDefault +if not exist %sbrlist% goto :postBuildSteps +:: Prepend blank space +if not "%bscFlags%" == "" set bscFlags= %bscFlags% +:: bscmake%bscFlags% prevents a double blank space ... +bscmake%bscFlags% @%sbrlist% + +:: Perform whatever post-build steps +:postBuildSteps +:: Restore the current directory (after changing into the build directory!) +:: Search upwards for "AFTERPREBUILD" to find the corresponding PUSHD +popd +@if exist "%buildDirectory%\%OSR_POSTBUILD_SCRIPT%" @( + %OSR_ECHO% ^>^> Performing post-build steps [%OSR_POSTBUILD_SCRIPT%] ... + pushd "%buildDirectory%" + call "%OSR_POSTBUILD_SCRIPT%" > "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_POSTBUILD_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished post-build steps [%OSR_POSTBUILD_SCRIPT%] ... +) +goto :END +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MAIN function of the script +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / GetCustomEnvironment +:: First parameter is the "directory" that supposedly contains the SOURCES +:: or DIRS file (and the build scripts) +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:GetCustomEnvironment +pushd . +call :CheckTargets "%~f1" +@if not "%OSR_ERRCODE%" == "0" @( + echo. + %OSR_ECHO% The target directory seemed to not contain a DIRS or SOURCES file + %OSR_ECHO% when trying to set a custom environment! Quitting. + set buildDirectory=%~f1 + if "%OSR_ERRCODE%" == "6" call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoTarget%" & goto :GetCustomEnvironment_ret + call :ShowErrorMsg %OSR_ERRCODE% "%ERR_NoDir%" & goto :GetCustomEnvironment_ret + goto :GetCustomEnvironment_ret +) +:: If the user provided a script to customize the environment, execute it. +@if exist "%~f1\%OSR_SETENV_SCRIPT%" @( + %OSR_ECHO% ^>^> Setting custom environment variables [%OSR_SETENV_SCRIPT%] ... + pushd "%~f1" + call "%OSR_SETENV_SCRIPT%" > "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + for /f "tokens=*" %%x in ('type "%TEMP%\%OSR_SETENV_SCRIPT%.tmp"') do @( + %OSR_ECHO% %%x + ) + if exist "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" del /f /q "%TEMP%\%OSR_SETENV_SCRIPT%.tmp" + popd + %OSR_ECHO% ^<^< Finished setting custom environment variables [%OSR_SETENV_SCRIPT%] ... +) +:GetCustomEnvironment_ret +popd +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ GetCustomEnvironment +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetMode +:: Subroutine to validate the mode of the build passed in. It must be free, +:: FREE, fre, FRE or checked, CHECKED, chk, CHK. Anything else is an error. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetMode +set BuildMode= +if /i "%OSR_TARGET%" == "WLH2K" goto :SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=free +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=checked +goto :SetModeCommonEnd +:SetModeWLH2K +for %%f in (free fre) do if /i "%%f" == "%1" set BuildMode=f +for %%f in (checked chk) do if /i "%%f" == "%1" set BuildMode=c +:SetModeCommonEnd +%OSR_TRACE% Mode set to ^"%BuildMode%^" +if "%BuildMode%" == "" set OSR_ERRCODE=5 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetMode +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / CheckTargets subroutine +:: Subroutine to validate that the target directory exists and that there is +:: either a DIRS or SOURCES and MakeFile in it. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:CheckTargets +:: Building "stack frame" +setlocal & pushd . & set OSR_ERRCODE=0 +set lTarget=%~1 +if not "%lTarget%" == "" goto :CheckTargets1 +set OSR_ERRCODE=7 +goto :CheckTargets_ret +:CheckTargets1 +if exist "%lTarget%" goto :CheckTargets2 +set OSR_ERRCODE=8 +goto :CheckTargets_ret +:CheckTargets2 +if not exist "%lTarget%\DIRS" goto :CheckTargets3 +set OSR_ERRCODE=0 +goto :CheckTargets_ret +:CheckTargets3 +if exist "%lTarget%\SOURCES" goto :CheckTargets4 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets4 +if exist "%lTarget%\MAKEFILE" goto :CheckTargets5 +set OSR_ERRCODE=6 +goto :CheckTargets_ret +:CheckTargets5 +set OSR_ERRCODE=0 +:CheckTargets_ret +:: Cleaning "stack frame" and returning error code into global scope +popd & endlocal & set OSR_ERRCODE=%OSR_ERRCODE% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ CheckTargets subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ResolveVar subroutine +:: There is only one parameter, the name of the variable to be resolved! +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ResolveVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +set VAR_TEMPRET2=%%%VAR_NAME%%% +:ResolveVarLoop +set VAR_TEMPRET1=%VAR_TEMPRET2% +set VAR_TEMPRET2=%VAR_TEMPRET1% +for /f "tokens=*" %%i in ('echo %VAR_TEMPRET1%') do ( + set VAR_TEMPRET2=%%i +) +if not "%VAR_TEMPRET1%" == "%VAR_TEMPRET2%" goto :ResolveVarLoop +:: Re-export the variable out of the local scope +endlocal & set %VAR_NAME%=%VAR_TEMPRET1% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ResolveVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / MakeShort subroutine +:: Two parameters. First parameter is the variable name, second is the path +:: to convert into a short filename. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:MakeShort +setlocal ENABLEEXTENSIONS +:: Get the name of the variable we are working with and the path to convert +set VAR_NAME=%~1 +set PATH_SHORT=%~dpns2 +set PATH_EXTSHORT=%~xs2 +if not "" == "%PATH_EXTSHORT%" set PATH_EXTSHORT=%PATH_EXTSHORT:~0,4% +set PATH_SHORT=%PATH_SHORT%%PATH_EXTSHORT% +endlocal & set %VAR_NAME%=%PATH_SHORT% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ MakeShort subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / ErrorWithUsage subroutine +:: This one will take the passed in parameters and build a nice error +:: message which is returned to the user along with the usage hints. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:ShowErrorMsg +@set OSR_ERRCODE=%~1 +@set OSR_ERRMSG=%~2 +@set OSR_ERRMSG=%OSR_ERRMSG:'="% +@set OSR_ERRMSG=ERROR #%OSR_ERRCODE%: %OSR_ERRMSG% +@echo. +%OSR_ECHO% %OSR_ERRMSG% +if DEFINED buildDirectory %OSR_ECHO% -^> Target directory: %buildDirectory% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ ErrorWithUsage subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / SetVar subroutine +:: Param1 == name of the variable, Param2 == value to be set for the variable +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:SetVar +:: Get the name of the variable we are working with +setlocal ENABLEEXTENSIONS & set VAR_NAME=%1 +endlocal & set %VAR_NAME%=%~2 +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ SetVar subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectVistaWDK subroutine +:: No parameters expected +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectVistaWDK +setlocal ENABLEEXTENSIONS +:: Newer flag (starting with W2K8) is default +set OSR_AMD64FLAG=x64 +:: The Vista WDK accepted *only* "AMD64", the newer W2K8 WDK accepts only "x64" +:: We detect the older one by checking the setenv.bat for a certain string +findstr /C:"Windows Server Longhorn" "%BASEDIR%\bin\setenv.bat" > NUL 2>&1 && set OSR_AMD64FLAG=AMD64 +endlocal & set OSR_AMD64FLAG=%OSR_AMD64FLAG% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectVistaWDK subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / DetectBaseDirTemp subroutine +:: The first parameter is the list of directory names to check, separated by +:: blank spaces. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:DetectBaseDirTemp +:: Get the name of the variable we are working with +if "%~1" == "" goto :EOF +setlocal ENABLEEXTENSIONS +call :CommonCheckMsg1 +:: Try to find an installed DDK/WDK from the registry keys +if DEFINED OSR_REGAVAILABLE if not "%OSR_REGAVAILABLE%" == "0" ( + for %%i in (%~1) do @( + call :RegTryBaseDirTemp "%%i" + ) +) +:: Try all the "default" locations +if not DEFINED BASEDIRTEMP ( + for %%i in (%~1) do @( + for %%a in (WINDDK DDK) do @( + call :BruteTryBaseDirTemp "%SystemDrive%\%%a\%%i" + call :BruteTryBaseDirTemp "%ProgramFiles%\%%a\%%i" + ) + ) +) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ DetectBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTemp subroutine +:: Attempt to find the install key in the registry. +:: This functions tests old-style DDKs and new-style WDKs. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +call :RegTryBaseDirTempSingle "%~1" "LFNDirectory" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +call :RegTryBaseDirTempSingle "%~1\Setup" "BUILD" BASEDIRTEMP +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :RegTryBaseDirTemp_EOF +if not DEFINED BASEDIRTEMP (endlocal & goto :EOF) +:RegTryBaseDirTemp_EOF +%OSR_ECHO% Found directory (%BASEDIRTEMP%) from install key +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / RegTryBaseDirTempSingle subroutine +:: Attempt to find the install key in the registry. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:RegTryBaseDirTempSingle +setlocal ENABLEEXTENSIONS +set REGSUBKEY=%~1 +set REGVALUE=%~2 +set VARIABLETOSET=%~3 +set REGMAINKEY=HKLM\SOFTWARE\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_WOW64 +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_WOW64 +set REGMAINKEY=HKLM\SOFTWARE\Wow6432Node\Microsoft\WINDDK +:: Test whether we can read the value below this key +reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%" > NUL 2>&1 || goto :RegTryBaseDirTempSingle_EOF +for /f "tokens=2*" %%i in ('reg query "%REGMAINKEY%\%REGSUBKEY%" /v "%REGVALUE%"^|findstr /C:"%REGVALUE%"') do @( + call :SetVar _SETVARIABLE "%%j" +) +endlocal & set %VARIABLETOSET%=%_SETVARIABLE% +:RegTryBaseDirTempSingle_EOF +endlocal +goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ RegTryBaseDirTempSingle subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: / BruteTryBaseDirTemp subroutine +:: Brute-force test the given directory. +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:BruteTryBaseDirTemp +if DEFINED BASEDIRTEMP if exist "%BASEDIRTEMP%" goto :EOF +setlocal ENABLEEXTENSIONS +:: We will not overwrite BASETEMPDIR if it has been set and is valid +:: Just try +set BASEDIRTEMP=%~1 +%OSR_ECHO% Trying %BASEDIRTEMP% ... +if not exist "%BASEDIRTEMP%" (endlocal & goto :EOF) +endlocal & set BASEDIRTEMP=%BASEDIRTEMP% & goto :EOF +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: \ BruteTryBaseDirTemp subroutine +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:: Usage output +::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:USAGE +@echo. +@echo USAGE: +@echo ====== +@echo %~n0 ^ ^ ^ [flags] [-WDF] [-PREFAST] +@echo. +@echo Values for ^: +@echo -------------------------------------------------------------------------- +@echo Target platform and OS ^| Miscellaneous +@echo --------------------------^|----------------------------------------------- +@echo Target ^| Windows ^| CPU ^| Base directory ^| Target alias(es) +@echo ------------^|-------------^|---------^|----------------^|-------------------- +@echo -W2K ^| 2000 ^| x86 ^| %%W2KBASE%% ^| +@echo -W2K64 ^| 2000 ^| Itanium ^| %%W2KBASE%% ^| -W2KI64 +@echo -WXP ^| XP ^| x86 ^| %%WXPBASE%% ^| -XP +@echo -WXP64 ^| XP ^| Itanium ^| %%WXPBASE%% ^| -WXPI64, -XP64 +@echo -WXP2K ^| 2000 ^| x86 ^| %%WXPBASE%% ^| -XPW2K +@echo -WNET ^| 2003 ^| x86 ^| %%WNETBASE%% ^| +@echo -WNET64 ^| 2003 ^| Itanium ^| %%WNETBASE%% ^| -WNETI64 +@echo -WNETXP ^| XP ^| x86 ^| %%WNETBASE%% ^| +@echo -WNETXP64 ^| XP ^| Itanium ^| %%WNETBASE%% ^| +@echo -WNETAMD64 ^| 2003/XP x64 ^| x64 ^| %%WNETBASE%% ^| -WNETX64, -WNETA64 +@echo -WNET2K ^| 2000 SP3 ^| x86 ^| %%WNETBASE%% ^| -WNETW2K +@echo -WLH ^| Vista/2008 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLH2K ^| 2000 SP4 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP ^| XP ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHXP64 ^| XP ^| Itanium ^| %%WLHBASE%% ^| +@echo -WLHNET ^| 2003 ^| x86 ^| %%WLHBASE%% ^| +@echo -WLHNETI64 ^| 2003 ^| Itanium ^| %%WLHBASE%% ^| -WLHNET64 +@echo -WLHNETX64 ^| 2003/XP x64 ^| x64 ^| %%WLHBASE%% ^| -WLHNETA64 +@echo -WLHI64 ^| Vista/2008 ^| Itanium ^| %%WLHBASE%% ^| -WLH64 +@echo -WLHX64 ^| Vista/2008 ^| x64 ^| %%WLHBASE%% ^| -WLHA64 +@echo -NT4 ^| NT 4.0 ^| x86 ^| %%NT4BASE%% ^| +@echo -------------------------------------------------------------------------- +@echo Support for NT4 and W2K DDKs is deprecated and not checked anymore +@echo in new versions. It may or may not work properly. +@echo -------------------------------------------------------------------------- +@echo. +@echo Values for ^: +@echo checked, chk indicates a checked build +@echo free, fre indicates a free build +@echo. +@echo Remaining parameters ("opt!" = optional parameter): +@echo ^ path to build directory, try . (current directory) +@echo [flags] opt! any flags you think should be passed to build (try /a +@echo for clean) +@echo -WDF opt! performs a WDF build +@echo -PREFAST opt! performs a PREFAST build +@echo. +@echo Special files: +@echo The build target directory (where the DIRS or SOURCES file resides) can +@echo contain the following files: +@echo - %OSR_PREBUILD_SCRIPT% +@echo Allows to include a step before the BUILD tool from the DDK is called +@echo but after the environment for the respective DDK has been set! +@echo - %OSR_POSTBUILD_SCRIPT% +@echo Allows to include a step after the BUILD tool from the DDK is called, +@echo so the environment is still available to the script. +@echo - %OSR_SETENV_SCRIPT% +@echo Allows to set (or override) _any_ environment variables that may exist +@echo in the global environment. Thus you can set the base directory for the +@echo DDK from inside this script, making your project more self-contained. +@echo. +@echo DDKBUILD will only handle those files which exist, so you may choose to +@echo use none, one or multiple of these script files. +@echo (All scripts execute inside their current directory. Consider this!) +@echo. +@echo Examples: +@echo ^"%~n0 -NT4 checked .^" (for NT4 BUILD) +@echo ^"%~n0 -WXP64 chk .^" +@echo ^"%~n0 -WXP chk c:\projects\myproject^" +@echo ^"%~n0 -WNET64 chk .^" (IA64 build) +@echo ^"%~n0 -WNETAMD64 chk .^" (AMD64/EM64T build) +@echo ^"%~n0 -WNETXP chk . -cZ -WDF^" +@echo ^"%~n0 -WNETXP chk . -cZ -PREFAST^" +@echo. +@echo In order for this procedure to work correctly for each platform, it +@echo requires an environment variable to be set up for certain platforms. +@echo There is an auto-detection mechanism in this script, which will work best +@echo if the DDK/WDK was installed using the normal installer (i.e. not just +@echo copied). The auto-detection is based on the DDK/WDK for which you request +@echo a build. Whenever you set the variable explicitly, this will take +@echo precedence over the auto-detected path! +@echo The environment variables are as follows: +@echo. +@echo %%NT4BASE%% - Set this up for ^"-NT4^" builds +@echo %%W2KBASE%% - Set this up for ^"-W2K^" and ^"-W2K64^" builds +@echo %%WXPBASE%% - Set this up for ^"-WXP^", ^"-WXP64^", ^"-WXP2K^" builds +@echo %%WNETBASE%% - Set this up for ^"-WNET*^" builds +@echo %%WLHBASE%% - Set this up for ^"-WLH*^" builds +@echo. +@echo %%WDF_ROOT%% must be set if attempting to do a WDF Build previous to the +@echo Vista WDK (in later DDKs there is no need to set WDF_ROOT). +@echo. +@echo Path to this script: +@echo %~f0 +@echo. +@echo %OSR_VERSTR% +@echo -^> report any problems to ^ or ^ +@echo. + +:END +popd & endlocal & exit /b %OSR_ERRCODE% \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/makefile b/InlineHook_ShadowSSDT/ring0/makefile new file mode 100644 index 0000000..98801a4 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/makefile @@ -0,0 +1,6 @@ +# +# DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source +# file to this component. This file merely indirects to the real make file +# that is shared by all the components of NT OS/2 +# +!INCLUDE $(NTMAKEENV)\makefile.def \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/mybuild.bat b/InlineHook_ShadowSSDT/ring0/mybuild.bat new file mode 100644 index 0000000..6f271c6 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/mybuild.bat @@ -0,0 +1,3 @@ +set WLHBASE=C:\WINDDK\6001.18002 +set WDF_ROOT=C:\WINDDK\6001.18002 +ddkbuild.cmd -WLHXP chk . -cZ -WDF \ No newline at end of file diff --git a/InlineHook_ShadowSSDT/ring0/readme.txt b/InlineHook_ShadowSSDT/ring0/readme.txt new file mode 100644 index 0000000..f2b78db --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/readme.txt @@ -0,0 +1,157 @@ +----------------------- +ithurricane [http://hi.baidu.com/ithurricane] +2010/02/04 +----------------------- +support WDK7/VS2008 +fix Privilege Problem +modify register source + +----------------------- +bobo 2009/05/21 +----------------------- +修复bug: VC6 + DDK2003 -> vc6.dsp --> # PROP Cmd_Line "ddkbuild -WNETWXP free ." + 修改: 在ddkbuild.cmd中,关于DDk2003没有WNETWXP参数,现在增加WNETWXP参数,效果等同于WNETXP + +----------------------- +bobo 2009/05/08 +----------------------- +exe: + 1.TestApp由Unicode改为Multi-Byte(为了省事,字符拼接,注册柄伊写都是Multi-Byte版的), + 即TestApp.vcproj的CharacterSet="1" 改为CharacterSet="2" + 2.TestApp加载和卸载sys(modify from MyZwDriverControl.c), 貌似解决这个问虂E + a.启动app,load driver + b.把app强制关祦E此时没有正常unload driver + c.再启动app,此时不会再次load driver(或者说没有load失败),一切正常使用driver + d.正常退出app,unload driver + + ps: MyZwDriverControl 觼Eclass LoadNTDriver(copy from 0ginr.com)有区别处, + MyZwDriverControl在load和unload内,都会做注册柄楮赜,删除工讈E + class LoadNTDriver的load内铁赜注册眮Eunload内删除注册眮E + MyZwDriverControl可以LockXxxDatabase. + 3.加载和卸载sys可以用class LoadNTDriver, 方法紒ELoadNTDriver.h" + +sys: + DriverEntry纴E蛴∽⒉岜肪 + default uIoControlCode 输硜EIoCode + 所有函数增加分页、非分页声脕E#pragma alloc_text(PAGE, DispatchXX)) + +----------------------- +bobo 2009/04/27 +----------------------- +1.各个target os互硜E只能选一个os +2.根据DDK版本,限制OS选詠E +3.fix bug : "mybuild.bat" 内的 PROJECT_MYBUILD_CMD_LINE 参数根据(DDK + OS)写死, + DDK路径都是默认的,再搞个读写麻烦个。 + + DDK 2000 --- C:\\NTDDK + DDK XP --- C:\\WINDDK\\2600 + DDK 2003 --- C:\\WINDDK\\3790.1830 + WDK 6001.18002 --- C:\\WINDDK\\6001.18002 + +4.支持WDK + win2008 +// todo : 5.增加check, free选詠E(mybuild.bat脚本纴E嘁丒问 "chk ." 觼E"fre .") + +6.第一次启动EasySys时,会自动设定用户环境变量(WXPBASE,WNETBASE...), + 这是根据注册眮EHKEY_LOCAL_MACHINE -- SOFTWARE\\Microsoft\\WINDDK 设定DDK路径的。 + (万一用户安装了多个DDK,再加个WDK,这个路径就要龙殁判断了) + + 但"mybuild.bat"也会set环境变量,所以这纴E涫得挥昧恕 + +7.脚本脕E问咛蹇 "ddkbuild.cmd":: Usage output + +----------------------- +bobo 2009/04/23 +----------------------- +1.参照MS sample格式修改"sources" + +-----------------------. +bobo 2009/04/18 +----------------------- +1. 增加common.h, 用于定义exe、sys的共通IOCTL +2. 增加console APP (for VS2005)工程, 用于测试sys. 从哪个hello world搬来的. + (这样只要配合DriverMonitor就可以测试驱动了) +// todo : 3. 在dsp_proj.htm(VC6)纴E黾觕lean编襾E问,让VC6使用clean.bat +// todo : 4. 增加MFC APP工程,用于测试sys +5. 铁赜修改注释 +6.修改print宏,对应check和free版本的build + #if DBG + #define dprintf DbgPrint + #else + #define dprintf + #endif + +越写越复杂了,不easy了..... + +----------------------- +bobo 2009/04/16 +----------------------- +1.OnInitDialog()纴E黾覱nChangeAuthor() +2.修改OnChangeAuthor()字符串 +3.修改hfile.htm,cfile.htm来适应自己习惯 +----------------------- + +bobo 2009/04/10 +----------------------- +1.GenerateRandomStrings()的new 没有释放, + 改为局部数讈E名字不太长就行,64大小) +2.OnInitDialog()纴E黾覱nSelectIdeType(),初始化IdeType + 增加OnSelchangeDdkVersion(),初始化DDK type +3.ddkbuild.cmd 竵E挛 VERSION=V7.3 +4.VC6的ddkbuild.bat改为ddkbuild.cmd +5.修改OnSelchangeDdkVersion()内的DDK2000的逻辑判断 +6.在VC6的dsp.htm中增加struct.h + +----------------------- +ChiChou [http://hi.baidu.com/517826104] +2009/02/03 +----------------------- + +ChiChou 根据 sudami修改皝E制讈E + +* 修正BUG + 1.非常严重的BUG……程序退出时没有移除托盘图标,在某些机器上退出时 +会崩溃(至少我的电脑是这褋E- -!)。 + + 2.原版获得DDK路径时,读取的注册柄薹径写代菟,导致无法获得 DDK 的 +Path(貌似大米直接帖逑自家的DDK路径了之。。未免有点。。。)。 + + 3.原版没有紒E楣こ堂绻丒姘丒欠ㄗ址敲创唇üこ棠柯嫉氖焙丒 +就会出代剑修正时增加对非法字符的check功能。皝Eǎ/\|"<>*?: + + 4.还有一个BUG没有修复。如果在工程名中帖鋪E稳纭皃roject..”的名称时, +也会引发文件访问代牦。但是我没有皝Eㄐ薷础飧鲎址呐卸嫌械隳讯取! +水平低劣。。(- -...) + +* 美化界脕E + 1.把大米弄的 XPBUTTON 给去掉了...图编襾E俣取 + 2.然后P了张背景图,放在主界面,还蛮好看的~~ + 3.习惯性的 XP Manifest 处历肼。 + +* 修改模皝E + 1.根据个人喜好代聛E母袷叫薷牧讼聗 + 2.顺便把《虂E橐苟痢防丒婵吹降哪掣龆鳎ㄅ卸戏帕唇佑没喙匦匀缓丒 +创建不同的设备符号名)加了进去…… + +* 蛠E乒δ + 1.sudami版的有点麻烦,退出程序还要点托盘。直接在主界面设置了退出按 +钮。 + 2.工程创建之后EasySYS基本没用处了,便增加了“蛠E珊笸顺觥毖∠麤 + 3.生成工程后可以源聛E刑尤掌凇⒆髡叩刃畔ⅰ + 4.生成工程后的操作也是可选的。可以选择自动打开工程文件、工程目录。 + 5.增加Clean功能~~~ +----------------------- + + +----------------------- +sudami [sudami@163.com] +2008/08/13 +----------------------- + + VS 2005下写驱动比VC 6.0方便很秮E但好多EasySYS版本(Include DIY)都只 +支持VC 6.0.今儿早上在VBGOOD论坛看到IceBoy小同学用VB写了个支持vs 2005的 +demo.于是,俺也试着写个适用于自己的工具,方便以后縼E俚目⑶绦丒 + + 哈哈,主要是方便自己写code,故生成的code风格都是按照自己的意愿来安排 +滴... + +----------------------- diff --git a/InlineHook_ShadowSSDT/ring0/sources b/InlineHook_ShadowSSDT/ring0/sources new file mode 100644 index 0000000..46b5ba9 --- /dev/null +++ b/InlineHook_ShadowSSDT/ring0/sources @@ -0,0 +1,9 @@ +TARGETNAME=InlineHookSSSDT +#TARGETPATH=$(BASEDIR)\lib +TARGETPATH=obj +TARGETTYPE=DRIVER + +INCLUDES=.\ + +SOURCES=InlineHookSSSDT.c + diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.opensdf" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.opensdf" new file mode 100644 index 0000000000000000000000000000000000000000..1fd60b656a7280fb3d4e6fa56b0d411f1ac3f601 GIT binary patch literal 28 jcmWG$$Y981$YV%lU|R7Bwc)CWN7Q^*?<3eB*ZXo z_Q%{fnf=t_HkxbOGBeQ#(73SFnt zfaZZ{iVNa2(3fzR6f4#Xm)C=0c*xn)Ey9d%-^Nm%tj>4-SAQ!69%MOx&oQ#_V*?PL)h5oj`sZ zoB-?KB$)4}kWPb7+t1G2g6Wj6TF18?eY{N%^}?|=Qk zb7)FmluV@94Fgkhb}~Ki$J_AX2MMlpTOdwm4mwlPUe2y_3pL%yHVX4qqh^%rnR?MI z&u4PWnSwFmSum6Y)2`6oa2S}^i)j03+el}CR>Q2%1HTT-V#31KtyiwD zhwS##zPZJxeNmOCfm^})!Zz3JJ}~T2(2;uy7EY7aPkqszJ_9eDxQg1}Zu~?)PYF=- z%@@n%Otxe|8EU@dO5G^eirHeRSikI>r>54BlQT}t$Qz?dy-C&0szE*9<5T14MCwO> z`91CUlo%6>(hDe|7s_b)G{(Y&W~Ag#heljGcf7IZm8<6#Z7}LD$C5Ol{MN^~vYuDL zx|GB6N(va03}%G~t4mRoq^5YVDy@i7cnwcO-dW`5P|C#EnV3cNqZZ^SHt=N$Pn%}B1$E2<+pXDHKaMDLVV{VmVr8!g@gtCsDo!AcO9~vm#u{`J;($7{~XG2 z{ihE0C@x>q;?h?jb>hb%g8>(5%se4Kba$)5^;obkcIQwkP=yaDePHoNve8K_2|a(^Gkau zR3$RqO5T6knRbbs@(;D4_W!V3EMPeq79R}hV;X)}w4gp3)wF;&6bi}MkB(|x#;X{Iq6}{E z52BFTbadixy#6>PX-5bR;C~%L70Ui|yn=yRC%E|EK@t7N7pYBArl>4vfw4)m}iCYgESi zpyTR8`?;R8Pu=1>+s}2DmRz;b>gOf2x**qIT29Lk=m54Kp??yW*rbh1wdX#K$0|2L zpgGL33-BZ9Yj%$D0{qNg^f=m2eP-OnEq)MXziC$ti|7I~$N^+jGq6H1PtF>agLX6`yiF8uN=&oP~6vWIQ6;a%2 zh~IgUA3`4EuOaM`g2-hgHY`hcvD?zYG4LqfNAM}-nqm}Jt z+N~?g?v!!I?Ud~#Y87HTYxK!@1$Uy1niyggs|VxPK6vkOX(hRHi(@qMKyLN=$!(XT zwQjnV;VauN17kNSacs|r6DQvI_4GS`{OQd{esuQ18L{s-hfDw3b#(5#>#zOe=8d+ehOXG&OuGjcDLZ=SSRUQf%@swr1ZgIvN05hZ zF(TKCwu;YLn?tmN>pyq=-22bi{n5?uQF5vMKl`4f^1G!GyyRI1sof5yAw>hNt~bx) ztf=tjJ`nxChfojqt8Vd~{m(d%Cu7MxvvP}1uc~YV%%Q!ED{xOtF4*e? zJ#8I1)gFQ<{UUhgORdm7`UqQu9r+O_v!4f?bI-#~*O!B{I#2sfv% z-sJ9KaJt*iztlO4I)6#Qf8g$$F<{P&UKVf={b%e|?SCi51WsQx_%KOW0zbSy`hI>` zVRil<>~;R$xBaJA#{DYE9e&sI_rCE@0axKKpoh~^gG(~nvI6_VmFE&{5983ii2FbG zCFALC?GHUMg^!WAPFuivsDC^{TK#Ql(e5^~wl{xj=Iy-x7yCZ$O{J|EXK*x{%lb$2 z-iSXOM2s^W@x}t-s5h3$1(#w0Et<_5Yt0(E-Z*`EEA|q^eyEo}zy13Pr?qx32W{sB z^pyU=C1`5``;Y?ixSQgMgtJy_r^2-bM3 zYd!pblZkz{Q-r?un(=r3{iI1-ZNKvW7>BG#Pn_p(RfiYUgxc_i=kNS~55swG?ay;4 zd&>5IHmtPIOyVl)^V4l9uCSSIOND(_vK9QR=X8vE0Tw5R@vi`x1M{sdcw}4E$d*Ls OAqn>t_vpXZ1OEn(vlDgz literal 0 HcmV?d00001 diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.aps" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.aps" new file mode 100644 index 0000000000000000000000000000000000000000..ed4e7111393846683cdaf2f50ad6e78223242560 GIT binary patch literal 106036 zcmeFacU+U#|2F={t*xuJbt{f4)=?6+lT3()1e1WV|=b)CK6=iC-BQOrPY^y*?#8y z>;I{Hr>GDNc$h>O?+GS4SK#7p!ML=5sIcfUR*oJy`U21ryIrA`u{0Fl@m zDig;5qeQ9=GDx+3!8P91Rpbg)h_jq?7P-1YRpO?n-9&)-Bs`Tyt4xE_$ZqgS4@o> zlorUK)v67uKs~0Cv@bRG8Md^P>V8s^c2`V=8dNq{t;Apq2tq#$=8jlTek^Ws2JuFu zmj&@x$rV_Gfoh3N!GNybYEWB1y{f;$DDQ`rhBZp!b9Glk01YZteHCn=u3|N4ERa%- zNl|J1SU(~)Xf1%BP8Ar4wNJt#6-Kh#+k$CzDuu>i^w;Y8gA3Ivu)q_kpKLj{13ljx zwkZS88);0mKc;fpfr0Ohlsg+46+P?C;y?m!2SFBZ61CcrcqP8nIEb-TqR}!t^4V6VU(CrGSvrtyhfymP|7=PW9}^G2EW>49xUb#h4z>yi+R9t zd(4Z)JmG{r=FMVWaMB+0VKHwwWshO5Nuh~+;IsqKQZf=a;{dc2jTC-!09wjM24@|B zmco(4IR~JnbQEyj0ca^6C0yWxYKgUmm2i=P6mpfpC{rsW%%CL_yTTQLJFaxt)+83e zRSLs4$drj#4A&^SM+z^8L zK!prfpDgYLH#uCV2vkTciSUM7JixMKP>>brZ4S{Z)YwhAj7s1R2L@^6S~eOf6miZv zh1FRGcNynCm`QCP+YsjF3J+*^iB2ccumiKmO#}~VOeWFGByzSW+{EyR#tdX!WR@7D z1-iLGu^q~+BpB2k9@D5kP_1H%!p#GoFbElXnQZ`*CwEtPWph^awUFIK@S1TYQwEtx z6=cVt5V?!t4d+fOm01`e;0A9wAV_bSI7II5@Q!gOD}J&wAOW&LdBEQ`AFPWflrS!G zg;Ih`LW=7J9~gw$T;SZp7LFyP$?`CxI@7cOK*Baypd;%nOz zEGr^6One0V*cnZa9tBbBN;}lnuZWzGm`GCP5?F zJ4o4K$Q!d&pF_z0EJ$y(fg)(YfjWiF-5nZo?vfybmg;ien3_f$st>?X&00g=SjbH{ zOfAv*DL707O({&p4xrv5F*M_xC)368l(y*;RDRDI_p%JuX;0m1023EP0#tagD zFSVsTD6!UM92kIG4}X=Kne&t)B`7#ZuF&_A$Yi)m*Xo!FR4JE$ABU5*E?Ej=KFCHN zdU6n1`*Dy6dT|i8W<(6kaE#u>pyse34YOY$i9yH>0yxMTB3V$fusditSUBFGcMs5V zc#wv)Vba2^>Ggy_4kjCQCRC9KdRv_XjT)^{q0`~MOcIQpMk2NN#ifVAN%ZXt`m6!-Yr?$Fv!n1SBy8bEE)802a3}95?90QG#$n5E9&>FGo;m z(42)m5{CyN&jb2#yg;&H&}vB1ndIUeJCH-Q8r;`0gR{~V=h;CVV(6pg5HSqq5GF)| zv0GB~=mtg_X0{Q8fUS#cF_Ga8Ludvj$uh69T^ku5Fw`-F4ZstI31F&)xqCr~0L87e zt%lsaAyfbxw6<2_?gL>Qiu*;f_zJ+xsSFCTZPME1fbgn8Kmf;XoFo(saxF6uh;WXb?uf*+ zEgMM;nH&k{H4+SAkfexk&dB0WE*_Z~&5k@;Kq1(+@`$l-W6!YOnb3HCz_IEb0Ek>U-rIEwY?fXDEG z*&M@?Im>i`z1o^L3FLCDAdODphxukUA{dDj<_JMv6f&60;c^@*(AbQ#CQ|@xj^!|q z&yXSkhct3p!7>z($1%_{s3&_Erb~)&`MN-eVbze$u~LL{??NGn9*x$`C^E#bNXQ`G zX^I;x7E<&Eoag+EmQ@}G;|@!N9Gyh2(i){fc&5Q-1DCo>g(PV|#t48Rc)~Iv7-Y+& z7yKjy>3$^=dBbucf$p2cc(X!C@C#zhkQlcFRtiCDmlcVmuu2G8>~rW-2CF&H(tvFJ z)iyQ~)5^MXd4UpxKT}<}wpnk-lB=*sDuWn1j8cRKmko9lc1ejRZxUvmCqnzn#_~vg zbU5I%vAM%0I~LX$yFTLr^MIerr%}Oq!e)+#Msii4fenj^4J{(u>|o3rW*)mWZ}~Nf5yM#lfiyAntHpK(dSoa)n04oOfbUJm7+W zWGxWu+FT^@go^@>4);#v(1BU!urrRt3oZ#*c+|lSQ4(*sEWk;g^a=&B=weEI;EDkE z$9gxanANyQB7v&{SdTbsRYc!XxF&#cp6+FXW$?QICIhH#{KOIRx&T*bm2A2c@COG; zbT};8>RIXvHw747&r%WG62N5q)N0i1fFKpaZ2^w0ORKb%ywnZu2nfu`%7x$#MFIjA zs?|EH6iGecu01Y8BM-B-7fC(go;|LY`6~j*(IW=n1^2B4y-_Pe+m1}4Rs?BO2E8#5 zkIfkimr^8ig@+u^Vx6;?S(RcO<^SYR%Z&hR@9bhlj05{q4#u!$cqB=|VtB^E#12Mb zZt&cS1se6e)z;CT8G=a`#5m-?;Zs;67#V|bCEtfMGHZc~aRzwHCo2L14gD}wbx;7_ z?O<&?7^oY(kb=t5*?Y3hw9F@R=Sg_Hl#Cd@dRH zn3mO*5;f4oz~ z?tH{Jebnc3<#?k*io-XPAe=rL@L`KxjO5aC|3N9nNu(j4g|&r4EcOuA*eJ$Xq#2)q za|DTnx$;JaNU1wC=QG&xE=a?($BJ<}akldGMt_5WyLX}#%SG^=03>6B#kMGxi=mAG zCi6dO_zLC#1w(LywgL(+Nd5VpL+%bP0upvxDc(h7t#D$w2ecCq_{~D@3Ev9{mW=?j z$6?A|?gi}y91@5s0Ec9>+gZDc+#5P@G#vY7jQJn0QyPg~0)H~0k$V#5&?u4^MCFhI zEcertVuc%sITBf}Ge#RSV&hJR+yLoiBv%iR=?QD}2@@YlH5Jn@+c>}TTF(l>koakc0f7MCFo6S@^Its8#x~1HhGgvl|QJ5o7_Y&mTR8r5k8PwL2Z52J=j1e)AU4pEXqG`43r1Ti%@ zPPoE!M<|Aipa?P@f&Re^DuygaC>yRD%y0yfQp14VA=@F!fF3Z@A;<>o2|12X=6Vnb z+6!hm!g0DVFrjADHV1xB5p*^E^j5TPA2~&J&^mI7yM1(a4-{#iY1p z!gfv`PGFCwNJY8BLJsFmu09@2O?tu-D?w+w2}6t=Y6eF0uoYI}jefiZDQBa=*u~gE zSMpKzA|!#_VU-oa3;#G&lAcc{5m(s22gsnVCx{3(@)5nEpPGflut@;nl?BF=8~n^6 zdNiK*Qjm)W`xXw-OUQ!6GQ)YoRt~`h9Il+Dc)P6^;Awy> z>=0so{E5jIF%j$(Vq_0~l3Q%W1wxpKoXjvJ;dl+?h>$>H=W>n5Bu5=FEIG#ml3xTc+aAg3$T1Gl z_e1+`08{bUx}{R4`u~|hYlh*K>;e6fgFvYyBJP#?v@D>o!#IR=gi&~t zk?S0VZSmwT4SDi_!QJ5xA&x7nK3d!W2C`3zU?3iFLrChQk&|_nAG;A#V5_|8fMVU+ zD6nbX65`}=pS^{KQFy~`M>rRN58M$Fm|F~%i)!lywQyyif5HsR7Bhc_HZ4&~Gm9AcOwUaRd^AyUBG@<{ApKzbtHcY9YJ%i8A& z4-Z8D=6Dtam+O{uD+O*x-t%$Xs^C_exzE8A51xdU*fXpadj)PvKG?(TtrXV3JAAY! zSZ}?s6c6~vo?^Kjih1yaPaMpSN`ZmoDKf;oq0|9pq%KM+@E&>@#~}r6w0W0+*&gEi z#>Y`B+MW!ulpq%XKI`WY<%c1M3U(}ZKCnJ!q{M5)P?00CU7lI<7|C-Hh~pJ$$2eo3 zP~i5dGKb@8QfeeyHpVYrkEMLrpsd*}#&^zAVE7YS}S}O`Nk{D$p8Vo8zFJkG1V9(f&gWeRx{J94RXB zOzbcB_QjehXPLo8__rkK%yqa+s{^ucq-VK=E%{^AXBKcHcOoX4+fji3@Q}7=%zQY za|oUfHl$MvrtH6(2VBLCxqk#kL5EH_ycc;ML1 z0g0rHIh|n#2&p%G?|@|)B>J(>n3GXR>I3aRLnKcF^s^n8;%W;z&}=-B!mQfv981VK ziS-7MLMnxhpCPkZmO&?)qfsd2)9mctJ;m5rOJTP#R+#FFB$M04<}#b?r|1kq>6 zO#1NHR!noOY2#I}OayK;$x^{GwJK1G&r`^$dXb62-2s)J;$?2&K~pTYQ?9|u&~Qx? z$f!j?Kz4T60U%?G~z!$}69br{U%TBr+=g31h05C+jO z5T9`$4Uzb8@M!$)4`cAZk@x^O`A?2dbk7;=GX9GRGY5AO-5kSyZ? zoH_{4l0^*K8snv1#SUHFY_7QcC4vxqiHQHMbcGa)%WU=_1`I|v!lpX$-;E{!P<4WO z0>y0p+z&0v2iVdjX3|xToW*}Pm3=WPCT>ie1P`UvP=TLlQdYRP7lBZp;=h}YADPVK zju~Yun6p4~^-)0#O?q3~@B}aByWk(597vb|6#gXHA#cDFDPep50kug0TABXI?y+ZcS-KMIDzC~!vUiV@gPNuPBF7l;RM z@I(=ifv6cldM4pU<2xK;5D!MTXbg2I`f$dc9E0CO(QOR=!i6rzgO7S3ONRdrMKls) z2**$cB4;#yMl$>`1`Wr!*mVB?FLiNDdg;{3{;$i9jC;M9k+BaGdMK7!9P>LCTOBDm ziGy;A#hQu2|Dy37VyQ>chSuPlKPGo{BJQMZVY6di^r(nqCH)fzN%|*_jt+-K2SXTf z`t0c8uq&6-?b!adwwo|7o$T^bLJkUPMF?at^eT1Wj1*l2}8+P0gBM*P! zXspA-0QQGYVZf)*+}R&EGLUE8JlJ3TaA5FcziPBtMT}?mNjY!!2Xlz!!+y8d7Q#BP z(-uN5Nh_;m!9THOf)~gRG4$#-I(3qZY))=SC>Lajxt!sh)E^UY6g@ow2J=@;o`dtogD(MaEG1pzsvgo+oRMeG6nLFFAyLzB76OwSXB+= zW;D*qc#(-z1XlpWA9cFH_ZXz1yowxorH?<*FIO{`lV_Wh6DfMGBuK2}@d3;62$c`P z@d$+ojz=g&a6CdGtXYOS90|Yb1pa@vGdA19&w0TbBfkkhd6gUVh0P4N9+i8$0H6I-0_GICfgWt z0>UdU`{NPH8}Y#%kI(>pJVLqC$0L+8bv#13I=FFxsH1xxth3;rhs}|`=V5c?-}69c zwx%8209`!lIZ8t^iQ0k_L4Rd&tLx9pZIc!ilr__#cvI=1iv8fzW-mT^=_LLd} zpjS8cN|d(c4K8J^YHDc0VwBo!vFlO%%ucC|Ldn9~fl?dAu!U`})JCx!DYa2B4v&tN z+9(c*h*N4q04Fjs5L=aVh>eGGwb=6Uq?cJKSjjel4YK&A=$1!}k#5l-j6p$+KlVr8Ww)Q);6yJEb-|j8bZIfLY|oc-6y(smA-pq{Q)v-GM)H z)fX{dJz4$Pl-eBlvnjPXz-&rw4ltWin*+>;O^an4%GQH5EjaKn3FTFi4J5~rm3TMncB<=3jan+Gh z8ygDQyik&C);WRw|s@5h}H@!8lfG<1nUuvlqWHVdS!#0K?o^i=13} z6QcG?Z2|__D%x%$Upm{SLg7 z;$%_E0%41rnGRW)Nwy$qe5E$~s0mIfwIKm#bMhdOov5x5qD6Iu7^`5!i0TRg!hPtl9D*)nMtD9!Oa&`NU@z*m}M0roxw&YTv>S0W9^L#*=;k%r>|7PAB+4aWnl zjgd&hA;7jap$;4mpmpH*0A3I0q~55OPl5{&=)m!OlGM>cZ&br4en}c>n5ii)rMBKm zbl`a53UuIjm{13f0);wo6h!W>+UdYiI9W-Pg*LWrMhA|9tOw*Q#MF;94|Y0mlsBOc z90gfJq;=pZm=qh4Xtb6OqXS3bj&$HCnAU-_Ie$(E&PEbEy2;lFA&*K?Oq)rbCnVyE zcLXU?c{*?u1$V*@bl@n0RWre%4jjc}#$Ub;9EA#W;3!0(14kiDhyoor9?VpePzR33 zz&((?4qQ15rhT!Ky|sNYDZplFxufZdI&ebI)b&PJ)PWPid>uFnWsP;r10l2y9K~Q} zdot@X3ByPIDU7+ZEYyLcaMsXgU8yoUa1=_0a5hlhfWg;+qxgIsI0~@Sfuk^HS4-=_ zQJCdcV0(Qknc9OapT9qGVP96KF23S%O-(}AN1)*G=zLV?nOqZsx&a1`iJ z2adv-1)L)tIEv#)2abZ7{Rs(&uLDOh9O%GNsJ#vx1v2YlD(m>TJB3<@16peepTl!R zA(~OvD`i9n&OsuH7ViB-$pabWS#55k8gc~(j;^xC%2hL#- z_BwDhjTnpY@)chPjwaaTlN{*4IpjIefundh!a3A|qbTL*z)=iKAv)55qgeJjaCRUG z$R_6F|6y*XO>%dVV5C&d773#oI3_Be-I}GoD+H~OTKrAX+4xAl<)`7DFtzDMr zz}bN$ZZ=+C?OGa;b#UND4}6-64n)ASsXozb8=J%!x!22yEYT|)8^wVR9F=5CY!(tF z+(u1%wxAs9z}W|8qfx<8t7p_)ai9Z71!IB9BPWh^;ApNR9XJZNiPy7#%o@Q?3pi#X-Zoy}FACReUIpCHL4EXdO6;z$Kfn17}aM(}ANX z)@~`(fuksvi0pLWXbN)F*}2CBhz^{PWGxWuj+5xX2|12+;Djup4xA7td7^dTgt$NlP6!Kh;DoS12Tll+ z0hHE(6XKK(90l3wzzH$Bp7DVVAxxgbu!@d}q`Ycog0|Cv69!3=)h4Zxqgp-8P00sMVUCNob>oqpS=zo<=ajN&W4q*11F%c z7B4ae;aqH|11BJts{<$CeO3ofz;&bpC!l;@2Tnjny(PywaP~Z+8zPXE<4qVu5sfP! zy15b^I6-)hbl?P(@^s(?w9o3m3AmrvffJC+(SZ}N%F}_f+Ai6qc9zLi(QN?7OYQ75*;`J3u_C9Se_1?fPr&_ zPzO%Hz}upzdntGVk?6qLc#d@7grGnNP6(6vU!Vggq~LA(p&BoGHWa1@PqNll;wS00V016Ll2rvpck$a0-A+K>?&t)T)PxPN8Zbm0D# zNv=Gg5*x4N9LG-XKOmE57jw+C>A?MK>^2>^&oDV1IEqBhY?*sPv{V3ljAb=rv-hF} z@*z|ZERF~8cJd*1BzyS~M-*a0BxOY8L+o&Ye27Dw3xJxC^{fPoQ6LRMSq!ZVn_7p2 z6_&t1Szs59y?lrr#TpEk8fy1ujmwdINVy^Lsd$Ajc(V3Xeo)rSn4~Asb~GYS&8R|fM^i*Tgo=&e4&*}| zFlhM@2QXhg!~wy2Si)q6y)9+Uj5QIodG@16)`7hcJd*-0LqmQ;jzk- z58;tWW^mz48ZYy=3lvhG>5+(UmMb5^3yAPAAf9{(k6KEx4;lp}ZE zqCoi&M=Z-A!IuyD98oCYL5;70M&{3lV^+(T58(xkW+)HrIX^EjWE58+YS;Oyi> zc$|Ne5BVIKNgv9G@Ho~2&4Kiu(c00s2Le^sDCH2^gP;nVN3u7P=NMLe#9$YQ*S} z$nl|J&MjkxMn#0hpwdaF;VscUY;@>|a2g*P9*@ajL7OL=FbaCXbOmA3KcBaXBx}69 zwZepr7#-$}*2lhh_+w{l|)l;(PP46oP$S1j~^Q8ENkE1d27*uO*@ZWJ9T*n z9aLl|jBB8!8lpll2=c;Uw*GnTz_lj_%8+cSHB!dIs{lCTr`cT5)~4!Ex*9Hs;h(#P zA^3KJO87583j4u)=l_#}AiAWaupjs@e#LhR6ciL7fMOm*4F^R%m=FAy=zEySKf+hl z6rl_GT{T=uTDIU-H9RsjG%-TpS}h_xF*dd^TsedXR1Hr|jED@4NlXkKO9NH1ii;y7 z!Xv}OgOwJbDn4cawc;WoO(j_o5g3v$@le&R)sR+gp=$B7nKNfji;Rs>7NUDqFSn2o zw-B9c)#FJsOR}fMMka;_4*@T9_7V?m+p0oRc6`aSh{D3y@R-mcFma97E^)Njt5ry~ zxECd(k4HotFDyiNuZgDA=vE;i?&9w0ruWBVBV+M(+!y)g>CuG$oeKtE{A^leabZOG z5Qy77Gc|fmTd%g_W+v17Y15LBURW3iyVsagP0?Ph#NT>nCz}&ZS&3Q25#a@pzPrRc zGd0A^Qyll$gavOJ9h(>#I|MRQ&E}G5ueNR>E~es{=91#L;^7gIV9Of?ae8)AdNHQQwA-9+O84?w5$*jr{V}>G zrY8+f91Es&j4X3PbaYz`KQSpWD|_^bxDyyoCZ=Kf#OUZ~@A0$xBqk-r#T7qJB79T) z?ul_;Yec;pHuU*6Hty_+$i!)5A=8wZo*D1$m5Z;238LV_xZ=rUnQ?jf^AmjP&q`=0s_PeSB9&;`W6F%*y)Z8?H@{?lg2$}f z`otBWq-0O}^wflm_>%k*pM>1pZ|bn_wfC5I@7ZhmaCm0EDK~G{+*vuSJ5%FoZ=jm5+Ze-FCu*|RqeJqY-w zJs3*HL_xeJbk2;+UpPNKA%zMb3pIUDLdM>VjJ!BHd{U@!d-4+!;uhx7e5|&K7)pNr z!hXDPFv#?{i5QU36@iI)`T2AjtZ~QDnogea91Pz!^CV2e)zw%kz5-+BoylPuMo8xB+{wAMAmQPGQ^ZS$KlTZn6 zF8VKjVnj^17!mVn1}8I#$6U~y{k)4M52(dU&qM6mL^uyQV;X(&ZJmcu0IQr=3Y+1S z6ei!~U;O$%orm}{P&MAnQ!O_9cqBFBOnYdWri@kklJry+kA-RRru4|zNSv#xMvJ4O z#%7gdC*o|R1RTSoTSYr(mym%yJQ%!Jq_!20^^7lxcy#<(VmM6fk?s}}-74Nxd^|ih zA`-mTzKL>+ib^t@-e+aS7D8rn$@{2i&-i5XwBq9MSTK2)q~aiq^G(*YtgHweAKy&y zS`lS3JQ-Mq~c&3H`gz5+O*6D1 z_skDCaAhPgN;t$V)s&u)jzgIhH|>tk#Bt0LJ{jXP4lc~k;P5?r@^>cWXIS~wO!<3p zaLc#;hH3}NC}R5wkg=DU6wt+NE=x9>i+W(UuWkMWRm++{#iB~MBu9bV|G~Ql2`Yu{ zPGsaDqX^sF9et)CR#ee!e%ZtP7}v(m#51!VBT)hf`#}SAbH%r{A2_2Q$FCG@^oU^N zXFl*>{Q5uY2iBns8**r91cpUk)57D!6NliJs;x*%PmB#Ei=v3Oi8Eshu?@S0MAZ{d zD+!M+Rzlosw}`e$rsLQd!0WxIml#`a+`|Y+FL7(@g^QJlX@!uAEgD;_DcgkZ=F~X1 z^w^}t;n|Rh4b`h|eFOd=^LTmdwPK zRtMd2Mkq-)=Ub+&islTnmt~5qX3qD?pU+MSI7egSA!SJ>I}^@NIm~xl9>h(|Phr1T zOTgx6`HoX1`^{`V4Ca#BU@oW%B?T3+WdE&skdo|yykscA_e*@22;QIYcNxCT>1J@@ zwS!7bN`&ozvG}?t35Ovzr?}t^sI=~ zD7Utz!r0KL*KIwsW3%E?OT4^h{yi-s^?h91;yBY;lPNVWE_<{oGczuC{?~ECOHBFk zd9$$8aR6d_^30|AObVdVj*fL`KQ)MOuVL6ieAA)ZusK(%^2Fblh-y&~(C3dX>y*<64L68U<_V<9s zgMFasux>C~)&fHPyF-&k1EIrr{h*usV5r|b37SPnz=GfJg0|4r<~y+o--0W7es;AiUcsEj|BPrSO}dv5oD{9Ve{n9ur0L<>@@X&O_Qat zWr`GbO_#u)8B*9bRRuez_rmXLI50~A2j=vI!})4-)4`tXAlQ=H9}dp#14~Siuyxun zIFL6K4$O^&!}G_$)>-jzWPUIBWpN)UT;3OsEDXcXP&m12D4baz2FF&6!p|R}aAh={ zULOU&V%kn^oB)@1$3w+hsZh7!6sYp`BKV@wTBy}@3)E@81)6tT2j8~Y1D-uLK^w0_ z&^CBBv{S4CZ}}GRi&_n1#%+M6osK|r*Q4;A=LzW0{XBH=JqO?}YgD-(ljs zo6tY?DTHS{fw<{^!thzoV0`{xFf#uoj9>f`Cait~i)PJ*)SXKqYu_r!IkXsR@zXt+yP*i?ZodmtHogVZuD>C7@87U)-viir z@DXI(ItsIH9EC&I&cckMUt!+;Q?U5)1z7p#W!U!D4cPJO4$S@a11z~z3hR&Fhh0aD z;o$kZu*s z6DYh?3>SZY0!RM%2W~wohEs2g;nK4*c=EUyUcPt%?_NEJKcBsYw{PD-$@}*>7vlo; z-(UR?{5!|W7}&0PlSb{@TYrA`^G9!&)-78!Z{DPRixz!8%LEu1=z*$yF0F}&Ca(BT z%g=ex^i-)l@PTp{m+xA)Xwh6md^PS|z7L%yK;=(7bix=~v=Fy$g~@8%Y%t%4vUa7) z-!e`*okoQo!cU$)eG+33yO3BKJ6VQPLRr?WZrxgyD_8!yvK)UI(L>JxPha8d^mnaW zxsh0!H*aL&uaNn6@7ndNx^-&Rto3!R%9W6h9)`U7@apN|gCjeA*V-GCMRGv+3+BsY zQi+7|P^(t0Z!nTd4I+l>bf-Uj9O>`o=Gv(f!*AWPdDF(oUrap67IjAtn4-GhkW^KS zj0_uE`tcMgB)3kTI{A=%w`|#*ei}Rxl&|gX*G^rK z|6MDL0K;Fhc)^laul|sd6m_lpRS(QX<;uq*BY!O`8`)Q*^7h9RsY$^S4}`yD$>LWZ zo=F)GUv=&A6^Q`(C(FtXh71^@>4MduW~#1L%NEFAgZvL4pUIXNEGIGaAi1b=>{#UR zva+(_y$79qs`c>*_7G!LyR;&0V&mG?i$CJ)LummiRR!VKDnt)2(F4Ao>I1vHV-OUdi+RhVbr9^HtCLi7;vg3w?57~DH>SZ}pA;{n4za%AJ`veLg-ERxA25?@~h zDc4#jh=<6?ABPVL8!)7A?_t5cyATiGvHay_WzSbHUCh)Q!>@b7;vq63Y{ZC&u!xXg z5<`0z$iBhaE_gv0;N}g&C$Hy= z7y2pudiY`vPMkRL>+XI72J{^|G<4`tBfi20p$Bh-#){{^6s%agcJ*(zt zpwZ}14KzU0cUTbNqX*2x#QJLVRpe(xk+gM8Z#u8e5}H2eG$G70@$46QI@f zMgHwuH*enf{m4dq&77TTa?)2Ff?CQVA55;JacVhnCb$5gM1KD5ILm%NJbb^8`3X#M)x>BIxRl74>vFeb)C zvVk5(HDsCWzwe*i!5kdfxMBU8+}!jzQ`4@#x{!4774kC@iHEUc$Ix_u_qT6hem5}u zw;yI_eR%aY<-&)DiHRALED`Yem<2ZYHJj&t_%QAKr%xYdUHtGG`Iv7e0wEt8-NyB6 z)~w#S`QyiFZ$G^Kc=f`^*GY-fv0#}j+wa@{BY#f|zpo+mQHn+m^fsWv@3)ot%@Fl1$pt=lK`5D)AOdMO=cQj zdEwvP_U6Lbv)gy%Z_b-DXGVHX=5%aMnB{W$cduN&v}-5pArH-sGp3s+C&!k{zjycU z<;$1O?L2pG`}Q64=FOd#pMxG!V#^Ev-o3k5?q0ca<Wv!J2y8sCnqz5*)urw zQvCRF@uRz#A}f9N>^XUv)2%yxJ3l3l@7==$?IOXG&}WlZPR?{YqRpWgGqBT^n%U{I zr%p|ukz<4Hzr4GAiQ%)sr%xp>-0Xbjb%jmMTue%Odiv+NY%p7x)X&b{`k7F9(7Czu z&hi}SAGikkfA&#a2AYfhckH8Uack;~6~gXgt1wj~+{Y5!7vHvhEH063FR~~iZ+s}0W=MA!An6LpdKYNd(g58(20{I1lb~6+FEk%6W%jWxEqmDS;sS9W zs{@y$KHwd#hb|NPLA%&+5RHgu_O2PqFCa@@2luSsz-&FfgBrqI+_TOf)C}?mw`BIJ zi$->W#Us1IvJve5bQSJTe;R{-U2{wqSQ#URb+K-+K3)u~V!Faw+@Eet>I_SwePLak z1ox>*_#XGCZ8MC}F)I|r(?j70+?%@1{t-MDMnRXwvEaTk0ld~Hfg&vwlo`Xpe?}zq zoD&VQ`7xkeIstkuOn_n8<3YYM5dwcohM!Y>aR1s3_GIQx z?q53=fb$PWaQ}K7I(EMRUW!8S^t%i`h8xf==q~tbPJ%4xH}LOs83Kmgf}qf=U`)IX zLvWuOGU+-*CEo$*fP3H{@em9n?lXH;ef(pHn1uV(4JpuV%T(}NI2~fAE&|oMG|;b3 zgZ?Y0Lf>^JknYL?zx}fyX#YHjUOpYdcg=^WgG*u3{^g)OG9UUMT?|8xE`dRX%OUL4 zYKT6*4n|+t4CBskf-#r2!uX5ZA>rZ2YcFusy zd#B;Pb^%=8HybV;m=9MDEr$iaY=x9-`ylPcA-H)o74DwOgnMV_F?-sp1#98jneA}% z^bWXl`4FV!-hk{iHz8-mZAhE-6sE3u0=X;xg7h`7@a*$%n1A>^tlRT|+0V|sbqw}j zJp+fYpM}F`Zb5cYA>`dZ4T~P1hZRpQ!Cu_c=AFR(>u=9sXW>IwbNT~py6_Qp{Qe2{ z;a>KaD`()>KQ6$XTeslu(4M8{&P^&q)|f`XNTC)KJD8$H*4Ia zQHN%YTG=y(tNq#q9y;8%aT8bE?>68Fi@vV(4gMPLr~d85ix+*GHWM{(*0=#XJ}vbX z*R5T%a@Wc-i1a`A?ra}TTil!CewGBVa8_qecX7SCwQF^&S*gl^kdnXJwQtj=O$$xy z7R?&t3U&VM&fbgN-Rst^-M!YA6$k$E>2MoAW&1X*HEminZ`O$H3p?L@;Y|oVYS*ef z=$F!Cy?XWR(7uhX4G91@qzk&-dgtvfb{F@kTl>qwA*H2f&XyW_wa0v7008S&%)V7} z>rf@8|iTLT0 zr;Zj34;?ma$k0*!dv?Ti`kmF!KHc2kW4L{) zF+L_0BZ(SktJ>E^e{5X4a#Q->>5txBzxZx^V%mh5=x7edEUa6(V(X5Qo&S9L`@$#0 zaj6>3UktDOY1{5kk3Mbw^y*X0q_o5dm;zh)?3ahTKmGG+>Z?zsF_WfYHe#X$IP5Mh zy*~APX=!5ev`L8*CfF^8FPD~PY@aqQH95_MIkjIbUq1iy-rYGlGp6p$!JjW-coH0r4I)oOP&XJtWy<@Z%zKacn? z-6Z^b((!oinm7nL4jT=L5rbh!pGh!TQXM8s(cZ484JN;ukdC(Zbk$cdBj78T9`Frh z1=feG;Kqy%ezxITw81xq`GcFmtp3h0&)5QT2e(B#ybI)oe8;SB^1{A{#bGY6II#V_@^NH7e%lz1 z>zGkcxMCcxWn!UlQxvnF`E64Su3_Tf!j2@U*LW&atD6VazFi2l8m@$zjn_flrt28H zd|l_wP_N|FD{)Djc4`9@U zduXq}2a4Qu&~8eHz!fPlU{yKFzVdT5O?Nh7=3XI#9rA6+7w*Zq@I9&v(Lk@nP(t*=5@5; zUxz-EpTeN@=P+W*6I{1Gh4EAF!Pu!!AbidXn6U6ZMCU$-#JSHQaz5Jim%WB0w6V{f zxfGUe$c9}9r^2;^Cb)8VDWqN92N_rP!yiYp;m(N+xP2lQ?e`1d`ib>$^TK|3e04eG zEPM{r&}MI1UIcSiK7iTF|AI_h(=6Uz1he=24VlDNfBRQha_cy(x{Y@F;&ZU_;W=1V zd>(fFc^zgKl)%no4`I(Q#qd*M32Zxy>zYd+Vb_gMZ~)ge`|p)O;f;%M@6u6bP4mZ{ z=WzY@E4cCaF5J2I7z$rMfO|zn@aH3ZKY0uaUwO07l7EW zrzae6q+eZ(~&pT4Ux7Iu>K2dmJao*hYIY($dz|-T059H@f zo3`*8-yPuCfI8Wxvz%c z-?bgq0~&`(aITX;!x3_5I$jHn5(A-iQZTrUH^8W9C1m!hgY#59AoJAx!Q`yC87v9^ z4i*k?4~u^6igQqFSTV*0)fi`CZ^qVmbg6GDZ4_w^P4}M)b z1Wv4pf>RqN!fo91zB-=_HR@+W#jn>v^+vm(uJbndrp-ZUfb&G7?+!yJpWUDvlLI41 zErDK|4e(9dModgV;c;f`wE85cn%Y$K7xeIr;wEO zC&bNo3#0K2c5LoHFgaxr{PNReIQr96_;r0MoZNtW)GcXnZf6!;#J%*CBWq#G*$t3} z`_Mmr$%CT8Jh+8>=36J%!PJ~bFm>q*$o%OAEM4^w=5Brq)3%sl)6UnBcl{UGeeEP1 zynPl{Jva+n{`?)bJ--3dkCwv0qc331@eksdt^wS6U@DcBDm;FcQqg3Pme_#KT z5)kg!Cs3Yx)T>jgQ7zWx`wjr#PFv{e-lV4U0ID=Sv& zRJG0G?hP7yH?P|w^*eLU7bB~A`kGfXNfOm-H8W!M@OB+r`$)QW^G-`?h9n&p${WAa!c^gE)QpPjklh&K@vNHApGz#iVCUWb9J&5>z!) zSd$lT?r#npqV>1_p0TRW;NWPT#`=5ixTvg*=|c?G-wWpFMTHKFF=bjE^5eon`VM9G zT>rQCe@^Gp<1l-%haQJB0yTa$YcwK{rPNgU%XRFaiz6~Iu?~z{8&16A-#RqJFM4)x zC~;*8{7Zb_2AX( z-wy_#TejrN{c%5>Q*U2gfBVhnyVh(8*gx@8mD44a2dWOF)t%F9NT}27IrOnLeWGje&F=^09P8F%@xEE}XU&>5|J9^_ZggqsHhEm5HJ1PXNI2Q` zTFnM)Hm%CteehlI*E4SPo|h@#k+p5$>ZCCripJnk=ehAW3ZG0}SXk+0SM8dlC!_pM ze0zMx)@!NN##YiLuj}BnJZ#SB`KQWW|8(c$eo>38OY<(}!;<4qE^j_idTYy!8#TW? z;p6I*vZ(6eRs~MZRqOaZNc8bLJr<)locK7dySPo-xJLOTaJAO_=Z(#>74MoAG^tqE zdC0ZazOyPx8+uomyu0GqC3Q^08>WTriTd#J)y(YbLl?E4QN1W(&XTfKF9sDnyZ7An zZ%LtwWt! z)|pzxr)nKdohdhxEa;&E_BDpebnbZz3B0GJ(or=M1`Fu^lCOKQCF#`qjzZp9@R0{1@t!>J(Iw=p^m)*D(A}wj73aJoZ>!RD?vQ~cT z72}&Io=(X4v&$OaXLCNKN7g?dzUmVL-ilP_e0KZG(F?YrJe&J#Cs_l(*B6 z`3I!l;~vz0k@T!_Qr+Vt24H>;9eMK1{2}*+=Wi!5oh`S1to6+|%R&#Yg*K)}70xG3 zs?<&1(RojeV<$Ajs!p%8NSf5Ny7%liuYRuB?bKftQXaNSe!ErF;(#v+N%G|8m;+Dy zyB&;avdgoptl=DcbD zUH6>5)l%yC-u%nly~aavlMlHwXI8(PumD@ecuhp|^G8#MJt-RHvS4?`Hrcfn? z$&@mC&ac_Wa{S8fFM=_5SA6R83YtF4b#7tk3hQd*1XT22_GgU~!{*djKk#OWOS`FK z-)fJiy-dWSE9t!Y&5P1?PtP2CHty>gD*~6z{Ps>e=k)87!kjC0tGZ0wWbLiV>dKX- z1~z_nNg|#1zU#uk8CBxF3c^x?TQ92?(z?1SF|c27HFdRQ&o*hr-(z(?%?VDr-}H;v z7Z=_ac#al@R`4G5XK`lpbI!$24)*`1(uP604(-djpN@anJ=Cd(F5%UidYRgFnFT9z zHh}YAn_t)ORbl!Ub9%n4AyGC;dAK6EEaRVDZ<4Yu6}h)b8KtS8R9rkpyy?mP)x$gJ z=J)(Gy~f%)DY`0qFGqys^i6vHZCbI@qIn;hxSen9+ip+2ZLnii^PUx&RJ+;ftMgAM zf78^^_2Xnwi^PLiJGmL%-em-Ap*_|FlP>w`(h?Id+Lx;M}qayPVrkdtBkfiIi=B zsykF~fsOk{!qU2}Do(h+Dkr7vcs*$e_Kk~V>`?Tdc<0>Uk@f#RoZj|rPRPh}Lw;yK z&$z#0g+Fwg*JL^8MAp-tXkPo#tE5_uURO)0lGwfL+V2hpe-ZfY;9SY?gZv8~rfh04 zxwCI^>zotjj=3qCjMFcdA8t_ZXfOueNi^!y$-@)8+SDKIwZ$pR>Dj|-U!Az=X;nx1r~G*8>Nh9- zmmRHMy+u~@$<1;KD~+8s;=VTNLua>x|Lkek-|v#?;NMT8&4=Flw!8mw@LU+Su% z&nK?v*=zrW#q*oT8{;N4s#oys#Ye`{g$vI-I6Cg@O^Px7PM=@b@a5M9wQ?$FeNnV) zXqTx=emGX}u;RCEbs#e9$H##cbdCp3y@IKhTKpn8+=A?$5vwcfn4;%eHyJtv+2DAT2ei`z`-vv95 z|MuYCZ_6(BDmj1Y`jp0%wluCX3f7C9x6}v>{=LDNEA3M9vR?c$@N7$$8nfSl;#X%_ zou=;Vxp2tbcAsWwnk7hU^iDpaX%?3Ix=I`9*84`AR+HC$v%YoUtk=e>U!6e9&$si= z&+q4Z{pr*Z*G8Whbo=@UHB{6UuQ1=(6#nE=N9kl&~<)F%M6z-6Hhn)ZC9PDUytisGHFpp%C2t<_io98c(elUuT$mg4sQ3x z$r2h&)djVgE&u-A$gqi0_58y#`<8BR>9nfCnP*K-t(x@s?_PnMzxe)EJ}6g;oI=;_ z|1@UikRM;|ncw$7v!CBCKHjLHT~Y42e|Eq7zWtaPeTO!0oYJ!DyNb&{74Pd;Ic0Lw zKerWDeNy4^y=}go^-Z&C{nBY)+v<5I6OC(Iet1~&^{w>Bzq$=B& zxm;K=W_>Fs!_&17oR(dH*yoanVU2#iQ~&(aJKk5;h@945-d}v@aAW;Hqtmx`zu4(@ zw<*`Y9=iAK)gG01&3m9sX*emdUh0Ial{PfpHQ@ET&h<8pxi>mZxoyLdBYw{NYFusa z1U;uZ?^-%(($>FT9v`2goZGgRLKeFje|-$ARAInibjm za?Hoic3ggVN7aL)>#uBW#xZPOVI^3WeD3i6T9>NcPJQ%N)bNl#$~a|$Qf01Fbm_*9 z2im`f>Z)D6{m=WJK9zjiJgvUmCA2X#>=)>pwQcZ-QEh5C|6D(%{iQ@g=tMq%M+l2@Jho!HMYx@1(Uenz@y1R3uK`904MnaGl1SCc%U;qLFDlru44k>|A zf}n(w0y06mMh_V9@cDh8*K7apexLiC>(q75y^ngq%wq5pV1+RDv;JTN_V;Cd_wrQOYK!zW;i3=Yvej zRt9KX3qfLl*GflM3Xik-Tjdd^)mB|saR7omN)z(EP3QiMA zs`?6MHJ)+EE}YIKwM1xmN|WODSIVQg6fFVZUn#tRhxyQX**aOpHRKN)v^<&HJMZC~!OV<~&s_Ijd^l?}OKUQ4yNl)WBkT>~J4?{`|1^ z4+`u2h)HPblP58&&d)SYvNYhV&RJd`Q`kM+?qpy(Di;D?{6|E0?-hCDJItTnb>$a9vXC<^lmf>eHp(!^QSCN2sFc!<8i*Q4ceGq{;I&mO z2)T}q1j~8GPLUh=0COG!7AVa8!RwFJgmIB5wKO414KE<+A;G1`9w5Jv&BaQZ4X9 zw`d@vy$@rtJXls4Y)y8gsF^2^o<1(Z{7UFwO!bcCf{wV6j6X$FXS}3>@+Tlw)|2pq zwI_w)F&rCAkCArA01vkbGqz9IEQ}!kZp??3w?;>U0C-Va8i3jX%E)T|3sVhVKOw1J zs5Zf}z|L_8nFNa4CI-%Gtr5g3DOH2N;X{295mD;Ay#Aav<7lXZr2Li>0k^0=--0g1W@+_d%p4PQWxbtGj~P77v}j~8gioTE-OCh0M@xQ!Z;0jhf; z$4p~whbpqmHWejwmz)o& z#U8O`;W;)pLPMRfj?F=i+5aVL+JX3oBgxzdEnQr|v1ml!tEBV-&2NVcLe}1&Al821 zKpjmnC0)Sqptc^Z*e~;uWJY!tlJ(^WO&CrT{sQLV0rS{^x9xD+m*fFjNh7rKKn9iV z0svq%A5c*M75iX-27n@dD1_GTlJKF%6ZKK>?IGV+1nf*AC174AJw_uKBXP_Ki`irF zj6L}HHy~uW7ePB=p1z20CIL#Yj803^(vbN8n91DonpY|JyLlygUPlR#XI=dET>GoZ zp^fAtK}~Auflz7juVs=}h^49+Yq#L%9<(dJpEaL{*QUfrDVN3{PrDluYiB_CFWRJm zCGECApZh z2V?A6)VlAZzY#tnu3WqqO;??;&-J?p3s1Qr*rVw;U&|D3Y!6Q1T@=&_iY~&AE)l(! zOUtU_CjnSQgwzHC`RTNLM1&G_XJ$b{ibyslL@uq>slPEK{6j(A}}zl;&mS*XD9Wf23g~SwVX??sd10dJty+1Nk$(?-}BvR z2r(Ig@^F^?ZUmD6NJ`C-C5&Ha*)5(sw}_&r3+o*!V9j-~${M|a*73N!{KEt(C%~mb zX%y$gEF@$uIi^OC+OW~_8F(@nmI>wRb;rRFPxggoHiLmXL4Cu_f){;3gv13J)n+oe zCZdjGh1_V%F3>rSzM%eyc$`pW`-FvpT9I1>b#osksy7Wf^aqV4r$Cy!xHadRU>bu- zCI(=+-&5+B;Bz)1#i>h;uNXN2=MvA@GTj+vvP|ExRj4U(-Ye$Uqg-HxjbIqy3mHw) z*KDv-U%{7Z^5;l`uKCR!kY)ZGjf?XLV)fXUI)6{O@>G63@v+F1BlPe9zzI9Ux7ouY zc}Vwx>F410ugr~ayfdzn=gMB=1+N*%`~H@F=(IfO9mGdnhm%P{q#u$@P zjERVrR}Cmnp|pL2%jYwx@a{%hJx7KSBIIC_u|1+A? zvOt=jHD|>altCO`aA_qoRq8lisxMQJ?eAjGzlG<_f}W|MM?`8{DSyxFgfOBFKdH5! zCTA>`Kgc0x7*}KH58JJ3ZsDtNkS_ z({3F=wOQ+Df_k5cHKhT+M0_wM=Suh+huiVtVaKH<+#4kn9@GbxSe+YBt2I zE75+63>Q4+55*6)UDU8|Bx~%~KrZQ7@IE)rx%X!ZFX~p`q6_vB_EullNFo>WzSWkQ zljki3Gr;sf#jg1s#`MQG&U)xLh$x8(;JE>?||B2qnbV3_3rpN!)LK7>(2vL<$Pc-i88 zC_Avok`pPeBwq^OYFw#F;kh3jqb1|Qr7IWx{5Fc@xeU}+gcf!>DVZJcK@QkNlSPkMVLb)2YeF0lr>v=)> z)V3K?zkYd%?P}G@kt{2?3{kXEG5J2Cuvhst~3+t(v8Cd<*{NEApa$&a4y{_$pt1fmI>2j&zk z_qy|^^f%`l{l%Rh)?DakW{38M6qF4<0Y(X&$*;RDoYiuPf+%qFo3he^Vqb5`$78VoD&h)P%zW&1l zhqAflRPnVB%dE+?LFuWqh=TC}w2^yMZrl6wy$$AQO8f)`HPZ7ID%N!NjHdNp#7fuy zVxvur6Sxi1!hrM{`vCL$LaC)x7q9h(;(l+#EF|q6dpVYCm502Z@U6|614xUSj3?cU z=a(%CLivCX?fRU6b}VMV z$FAMM!#C{4zO)+w9rO3yj457RovD1@{T4E|yw+-m-l_mT*4WPeMu6aZ?_Zf=r{fVF zM4cTeIm9%hTdnJ!l4*^+B-nJ`D^>!CT&H##PiPA9cwT7h8ET}<_>uPtWyCj>VpEp| zsy@QMcD68rU$dIhei_!}O1#|saE@+qs6eq3GUE}-R!ylIf+3Q;sj0%wX7x9vozC&( zo-PKQphnl8TF0?*rP>KS-%>%mNb{ibjO;fJ>cOUe0Qdf;A#?)0cU5$BE?+1$*u890 z|8wq29@*i=rBB`}1Ks zZMl3 z?{J8jXv6DUUNA~xqCbzowq!3_4)mjG0b?2=w4Qs{>?2Vpbk=7_`gM;26d5Uob$mvai|MNTG1T*tt148lpdqt6cM%XH41 zpq;!?d3PV|Wwhn9|GuA|!Q)1Ila$!xrC3o> zDd?#*)=IAl-rfHFL;HM}=_H_UiMQ@(BeZLTUx#CXiPV|N9W54p3*yq{kL-#l{4ZJj zJ#;&fjedVIZbe8yueVTyfyedNFYldUrf+2<6C*dUYw zxSO{PsU?YGIJrt2c5OPy@p6Dt4Asd(qVXRVK%_D0+c(qL8rqNbH??j0x2!ySvRHi< z0C(Jf#*_vyTO4mZUg^pXODc=HkUm~md=Y#a0}EJ_fouP3r6euZMh!ie<({-YGhjBD za|DKY8-~oXxR>pR*Z@bLdcmWvY0q!^Rw6Fas>Z$gIBZ+ zg%Y?ca={a|k}cdLzY`!*0CpPDGyw8eUFQ(PN^azIZJU96Qx8#!I=~6|& zW}&22)uFCF!RJcgIc72)B37Fe`&7gbqy-{0QyRY|1!dkWAHV#KNxY6e&9F!3je28 zyZvud2@F$vT}-k+1d2U9#vd9B;XFcC=zJgbIoZSrmv~-ED>=;P69GT=6QwI*064lk z*!fZqTCDlIL{O*X@HR4VZsy!yc*o!dFifa^JkSM9u1Uz-kf}r-uP1eRo9nV96hzHR z=Xi*IE)kMyy{4wzMkIh24;27N|6`D47lC@@@^T<>^M)I{`jxe~*h5NIwSd|P;&hoC z5yW3Qedu%~%~(B6wX<}v;np6}=C?9FPg-~fW|^P_sre=rZM~|tSn(W`=FN-yL{OUi z&zSm>MpSR>vJ7(azCp&galG1i8#_n!=Sbq{di8YNORn$Tmf#ib0SooM6CwtvAG49I z|M`=$YNEq*Cu4hcl(-|oygAN3`ITVjb22A_T0Y^`W4FKuk4d8`M(U}icY2Q7H2;Vq zwbUVeI&VjoYsx90kM3$jdvtT`%YfCJ@%xs5jVeQEr+{x~wHuSO_3uJyfbSdcDQQ4+ zj*6!V#X{%S%+~&QH>WDwa9yoI%*Sri6x`9P>Dj}Gp2~P3PFyI2c5ToX`pDnKVrB6{`+S?O^7Gm?1w;FP2{qKg>Utt6Fp)s7%Ihh3>TN6Xk~>R!=Y5 z{S>XwIS1bW&4xC4zzEm(KR4PpRVIN2F>m{8=D~e#7WAkQGMc_N9lp{iU?@?7LjKB| zi&bM)6Cn9>{1(wIIebV7$C2tac1t4~oL83m7m;6eg;pP-go5 zY)UrOHlXVohvkjP+txOSVYSBL`&b4ThR_#&oj3 ztiy4CUay?Y<3}F-97SzlXsO^mPlHS9F6R7O{vFO%vEEGd{f`S!#RrY9`=BC;Es?94 z6HHx^!8y1-C*kYX!*#tgYT+QkF`S{_O=H&F*Ll6L!R=vN%-8={_Vab9uoS;2qmcRNlyy34>Y1$nvkd9aLbRaJ8`eENb$HNBc`d5H6s>pw+$urx# z&b3zE1tLjdlr+I&liZjP?BS~AYui6@$7`2o)UC&f5~gi0rz}U66 z`ue!)s@GG$IW`;7+#(5UhhqamMa|oMq;v!+)I8`NR_|uj+SZV)o@zUy)V&29kd{@ksr#0A9 zl6dwmB%j#4!#Hy%WaisOZ2$HIxx#y>#~WG~oOu^j^Jh};=0KN2kmFGlLhfLuWUmc; zdvSktd1${JE~Fq2=zH=B#g(Ym{3ty1 zendA7CdR(=tgS~O)oxDdmJZyk2_WpQB>ET5FU%&O^RmK)u0YPGhT>F z5aiWU_1@H-Te+8giw`^E?ZBH>QH1izl5T(p?&C89@6*HKY?W=rne#-q&9*d~n7%`n zlJlcDZq#+ynjI7AuLx5YK|g7!fPm-}N;`QTW;f?M80&VgWIx!thd$-?U;i%ur%74< z)*V5w6`G*K;17ocf&FI$k+H&Ea}fmnMqq9b-n}EloCz2uCl%M zp8G0nDoG5&SG6xjn>R>D&3~}|m#xDp0|)1fNx%I5NKxiVYLfG-r*$5$ll&Zo+mzA` z_vAR!t{zbbc**E()}_XfR4*n9!<>G9t-iEgwC~r_2kKrf$Z@bo>`?HgK3ToK@HOh# zv}>*eL{dvx-B2@G0-E|KSERq6gGrX;sGmNf?Myolf~F0I^=TRjpgE>NvlD#Um8{ff)uRD`jKp6R3^&$X(HfeF%QA`WJfRpGjP|q55750<}SF z1*!9%S51oO#OTuefBvIKb$e9^ji76?f-@o8ORb54tmtkcW{!O;)QgvQfLm}ZS*Cn4 zAEsuCKU)PXQ5GunC$?NdJ=!=r7gn;CM}|}7iWz9CTHW6FkPbJRd0$csB<@i=zfQoG zuq_N+rZI_;x8BF!K9=C4iQ%9(%AaOZV9wWy@^j-@>7a`B+W>0Mqg(?ee;3EYjE64> z0O#Psr^&-LtPh$@y7sR1G9-U6iswozdl{}Qx2n9c3V4=Tbf09iAm@{(;$l~d4)bw{ zA8Mj{u7^*?BQ|y;{1YJh`WNDS_wBb1K>^l=ftPjN?})a1sf(g(cP))n$v>udVE%}3P*hK?FqIyu)@Tnm1Kxm`OH*3256o!W6E6-inr4CnZKjxD43Drkc8&}r_yTFT|qAqJ$&uqoC zDcNG8h#o4XP-tSr`G>15jB6$8T3j8q^FMw}3yG%({GA;=U3`9==m?vrbsH5#a9FFuFf<$+lu37n@rDk*NAhju5Kvs_VKm2&s<#Ll_%M|PaOn-#GctdzZ5e8SL>YxogvYiW65u)^50hp%ZU1a z2uTDI0W;wFcfqcw#!3_wr>DY{P!S5vQZ?B37xh*a# zCekShtK`H9i8xf^Mq3Z%v9=%hBE{N5I=?F8e-f-lnR ze6dW17Vm`rnC`cYiCVSiDqE>L=F0Efh2UaGujktZS;?9exA~ITb8~=ME8`=tBy!{jPK|xJP!ofQr&PVp?;A+L=ZJfvh;U68>X)zY31SuZkJ^N+MleCSi> zq63+Y(F7EBxq&nd&0xLSAnX6P>jBqC;226#z=-;8aY3CCMC5kn+GtNzt_k5p1qYgc zt0#r44MAO4|o+5B1o+cm8PZMWU0a5;{Tu?ALH0X~x4`u*U{vGl~_c*SyR zEf3XH4xqpBlUDx<549krpljO7uEzLL@a&acn~bWWFBvcr`vTE%Beo}z#jR@|KCA(K zrdx-V>Xb82g*qs&?!3gsi#gld3r=aYLFlLI-elKu)4`;z!X~i}z^-%^-=oe@TA^VG zp)EN1IPm8yJ@9w<$l997zZxzI%qf9=(Ec}?O#M)3C?k*9ai&kQ_Ti z#Sy*T0QXVt-2Eu7B_SuKLXkuYO~Gwd*DZ764rCL z3R7Tv2{41@r2Xc%jVTzv&GG=b!^YS;lwiGO$Oi+RF~8RNN-w44AairUxKU1<9HpSh z^17`EFj${by42Iz+B_*BI{I*5+4+DIQdmyt& zk6N=-hhRga6O_bD^ig1DPzd#olpGhWv3QAJOsOpSygRU~xmWhXK!?0IZH*a|B>)Qi z00Z~Q3XfHrA@OO;1>ow`tf68$r#d$k~Yax{nUX7xD3N=b5juwFJvDS9w`w{63 zyf>iTaEn&sGoan3)#p~L66~lJSgJA9oC;w-?}`$AUXfZDHv1TDuM}6WY$Yi?DcZr~ zq65WB9AP;-*&gjsJv>`AIvR0X>D1>$(A-SS|&NHvu|;dI9eVs$J4ftwO9 zf{#Bcb(-D>DgnC+;1DMhD1|b!Py)3p>;Row3cSk;D3q`y!f{|`yfk^R+MP?3kf51I z0aSUqXZ@+@Q%|mE4qku;=<^Dv*ssH#42{?Kgi1o=?IlBpNUcAzuE#9-YfgW08&({+ zT+UlB*b>OIpJrml3^;vGGs+>!w7XQn6qCX!!7`ebu{E2z3({tFS7qC4%eORdmc#d3 z@qMU@x#hKw|6Rpg;>~IR71*lj>4JHJd{9NW+na& z7K{U|!g5Z_b?h;!SRY|%dBXE#6TqL0t{+TFuqwspL zV?BD^F^7b#y&Wq12^@H@HmLIu$MU_gK<{zT-a4Bbh2{0p<=dwfx9oc}o_tQ%QP(AV zhiU{_XJON_iv)V3m2p1bbR8C1Y5%@QM}_`f{eDhHQW`~f3Mps*dH%IbW0DqAVsiEV zJ)^CphQ=K+aav_15%oTL-15uLM>ZFGwoq#sp|@g5@aVR8%zaxT4d9HjF7}lY10>*| zxTg1RjUZdKwo$_)uZ%BP<4l6_J38wYJ*SXwakMIlVtQ zt6$B-R{y@~`#`E$M(8(!u8u!1|5Q_BXZLd`Ui%&JzVfj7XWf);n<~IWlSi0OtB^wVdr84z1byhz1jb>^x@+L7l z_OH`D)#w5#L4^$miWzYYq4}M`18Rh$`31Lc8OFvB(5P~#& zMQgnbj=L)ez>HpH+<~0T(HO>A*dtTu#MDN`_#}ROL5|C(O~(a#8t`0AhP;D+ctJfZ z5cB4kyvwEu!N}(J>t)gQOcC{AIf*;x>PPS_}Kz)jDHX)+K z+W`c*v~sX!lT_{2p$qL@DE^&6`56TN+&c2J_oZ$iGS<%jMvLQ7Xk?Zc3cnL2RvC5Q(2a)qD8)uxBzD3)2kjIU`<$YxAj5P!v=ZdJwDCd*;GI+o%AH2 z-rWJ`Y=EW%+qL5KPwI9+$v$GX0U zAU$75MK?VGRdtx>sI(Einx02_H1xfdEU39d(|Yfwl>I^zBSo49p5WqZ8ml`ypBZD( zh1BJdbQ=^B6GS$7aZhz7LaHb)Hrnov4IGq5J-7H;_KuaP#9wJ#E*QS4%|m#5O(`{q zFJus3j=%R;%3gsA036#MwqwqGuEt{>@`!75X7H;Z^U~Yv_D=HDuf2+XW^}un*qEd75Rf z))ms!1dQhWI7tTG)$X|KIjaa0k2{!g?E@x4DJ(yGf@3QN!DeUWK?bOz19A|{+@e-} zWsXeR3f5D->K2m!GEp0U2vWPsUUNEqOM%EgZE#U>0Q;27Bi)OjtFr`fc^O5)FjzN&o%=Voq2#? z9PKXG1?!Zgp%>}Xg|fl)9PhMhD!XQ-iLK3>K~Lh$|8}ure+gkd6F{9By;X=c_XcmO zG6jAe%(NM02?Hhv1pB175dmoXGu8_zMri_Hz|H3$~M4B6n^|QQiS- zM~wZk_D&LC65W9Du*wH;+d~rTWsWu4o81%!a9Ua7`zYqpWvojskC8OWV1rB(baW?> zE|U%ZD;kP_PEPD?0_Zmu^JG~6v^;4Wd2D4<;}Wj%GOIqFC_P0@X{aU{KGi)>AIo3) ztVvMPc_;Z0y)uBjK9iu&fHFGOv&m+Ux}CgQd@4Vzi3#g`qZaS91}%M#7Wy$DtN(L1 z3>apvC-I!U$u$WxJxw;YsYz@#0&EJ2au4E4i5|8qQ;)$Vh;P^5{OUr_e7Nw_YjwRD zX9s79%wYx_OG&Us(pvYwf-4`)Z&=@XFAD2qbuaxf3p-8H5S-)k35fVgTvOtUc+%md zFW;Q<9;Sdi7+!Lq;}UbQb?g+>$dNrrE>ENEnjKYTaec+VK9E96mJSL;bNe-?Zif zB{61iibJ3HRX0|Doy26}VWLI|vXMlD1POvrAh@D zakl|2wZdCRt9^@c{ zKeH@7FAs4d$4|;*r>0^Hnx7rlJyeVNLoM!S{9bs$YC4aah>I<<>MXiwTJ^K;rGbPx zpvTiwV&LHRpJzYbI(W^1ily#>YEN?NPI82|eZSg%*)Hffy(y8_H-*kJw-d1bS1(=FF+Z!a==8+!Az-jXmdB%2^7aZq0PRz z?4p*!L9GepcKah5O%;Kd9hAH{Cq6I((CIFy0ycTB!inZ-t!1&^2LKC=IEGCXvP?d% zZyyh6sCJLZg+glZDAt^ibSJwtQap({AGgMFY;#EfO&2>MBQRRyog9h2dS)@xJQT4lgr!V(;a*RnIQ2BjBBU>pRKRybbc=z8{4VQRAWxlr z!tq*^MOL=lgMhhZ@gsS)I1<9j?ZxM^Pn;<2!Yce97NY!}bExGo;j;;*!}|&!le+Q8 zQn0TxAHQN5-M))|WsSVJCM2e^x@Eb1ua^!zqigQEgz6Jh0A-!-`W_oDU;*oWLwrTu zM!Q9v5?c@@{)lQSEw=3nyD%-U9L9HEg+ZN!+dI9Qo(`{#dz>st{eRF<(#l@MoO)?zSPBUKZ4EntspNiI zV02sTQOzCH+dTu-gv=q$fT4YlWX4 zv2mk)LDdU!29dzO=zb#>4r`}BFOb%MCEbj{G6L{|*INbZ-sD-Yq=!*9ofl4BJK?6p z6dSg0C?(Vp>9LR4r7BwuEP$H=Pqz9w2EVD?VHhdo((btS70MH06* zF|0(Mk>s(77x)eUyY)*+i01qVMRrn*m){A_REs)k8vL#4uNpWZ*6v4Qy6aCKK5QVxX1IJzG>A}Z3JvZlmC3Z(8@1KOXy`P7k%;59+SdH z4$M56jU=QAW*@eEJ6_TP^4amKU~i2yPy~;!B+n98&0C}yae$Py?15Q`+1&!r>k+cg zzs_l;+{5dRL=e=35UhnWeUFY~Oa%D@S&R3r&HWPG7web8K5p{}$97pAe1-O6a*SF8 z_@T?V^V?BNCsBa!ar}g$E~GgNzXT($t@=&*w&nxEor=#JuoTC-;ja&7nFj%;FV8td z9XXueqE=L6Rxa{`wY-Y*($e3vcf*^xLmxF65AjqDY#hrUf30U#s{`vjt>q>ylrpCO zoct^gB`v$&PD%b|z13K06T?hI`jMPK4vrDU(58ZP;M|-V&`8&ft!`VOL1Cl5jW5wqP_doOw2o==E(#grh$nL+SFr`%H#f)6mGs z6Vgch(4J;%fRxTDFV5Kd^6d(?^hSf%{)kH2cXleU>+N~tFrZ~~W)_`U2z@l@GZhA8R z;{sf<4@G1$MI^pzIh1pD}=YbkTg&bp5c9TCblz)tUW zlp^oDm&C;KXStAnX$b>AAQ}N@?*k5=@1caB1FqJhCdxE;;s z4qz#v)gm@5164tmJU&W9Q&(Vkoc&;fbUihTb#XWEjAZQ*CTkGfIg)CJPcl(ys6+KEIT_bx zlTFR-kL^OlZ7YI==f zv;aV#kzqaGPSp6>Huz<3(N8z!Nr?x%{Vv8IlqyX9d3heH^dx##W7H*MROi1->@7E} zcy3ikMp6Zg^mfr|yuMJGDX|B9#^E49I?eoxvzt&K;YhbuWFV{ydI$J zG(wQj#c78OsV$8b6yH@8{ho6(89L^{XZAxMYiZc?30qSJ{x?BCZlEJkMkn-;jABl! z*W@M&i*P53n$`^rW%%W!{K6r%xehlYVk^2Jf)owE@2f>YECFi~4xfNsel|<=>%|fJ z!#v@a9}NvndPE?($4}#eG8xP0*QepmU78_$Rk@|00TFziWk_3j*xk{-39 z|Jcpt{dzcO4Y+w%a zW4Erq`74Narr|1&NTi2~5+{raW`PR<;r}k3Xt|sURqax=P*L$o^Y|$ri_epRTJYcIQ z4x<9Bs&7T-C8`v+36QoJabl+qiwtKuN13{=(?>>G6fP&7^~jY;r8hs=>=SC@pUcS_@U zKfFV7>zZ4AGlBlKOF60DYotB9G3YiO)T7n^p>}x`vq45|XKcMVu+izVlJ`m;n__v( ze_FEiC5F+4BpvM-;aDBPzBVR2t=TBT)L2XBMV}!Qx~KJc4;XnY?;BaxO!8zG(m9O(9K;orQ-@ks|T!7JAraH9{f(J;K}B*qcqB$S@wTr z1$*O__W+QwrMW~)Hn)G54SKKEo-*8l4%Q>q@G9-(IiOWfeGuK#?tIJG9-3SFcF`2` zrSuK}-`UsVo@X;Otzb{oFZX+%uk;x%}` ze9r7Cy$FW${&+L;hD@B}Z!IQAnt4eZ#iO+L`87a9Q8`ZF&5S{F;>ca5{lr}Z0CH9g zSvQq5@bi8zqn*mJ6!x%|TMg5V)C&FHczFjZBr_PDLVS6pqVT|YiS36g=?_;{kDE6f z9&k9l_s9OpRv2Gb-Bz9(SP|u?ED#TLo^<(19u8%Ksbe!@-;9=OL2PcI^c`_p<=Q!V zGd}Z00u6~$2dDC1o%C-hWSxJs9&gTQT=O^LVzn1z8ze9MtbNACzBD!uEsn-Vf+Eyk zNV0S_gU;{wq~w=o5M5$=A751nCogi{J!kZ3a%6bEuz+;b=9q@imb%1o_c)i=&dhlO zbk>h=13N$ZS^%y*e4|pjV5#OSau1T&1+*3doId44@O5tb@BlV*9-ak_?22S!Z>E#A zWl|198wyNiuOI@w-~g77?SHGAi-_UW<$d&7FV>S%KHx+upa96K-jgruU>{nX81H#L z^SIkZMCob5Ci}I8GWlSmYVVVD6c zp)y@M`fGTzTw8bAWn+VqGJn_QdV}+%GSiENZZ45{p3hVT0jRXmu*{&-BptC&rl@B7 zOSko!y5+~%K(e?MCUxMPU4H*>#bVr{)t3=Olc)GYUeF?=V~<_5oR#U^J?%)>zwVBm zcYcM5qfx`Bi5BP-lDK`gsHm9OMr|bPV60U6*dfYP+DW|i4H|3I>$-OzY@zaKSO)mz zU-LB7>}BfFvrkhhY2c(TI^p3ajQJS~$BH?C&T91`ekRv%y5yzcJ+Y&y8wO^1zKPU! zOEO6ZW?LLfUxM9cjx*njMQJ&BDZ1dkuVg3%pYiPy6^@6@gp|LyG`(2d4d!Q!WMb~q zN|1M6dENxA9-f|jZR1{ECRwGbW~#YA^Jdx50c8uO4rt?>uM3m!JlK2;%8>P9B;2J$ z_)ZH1En583c=?!u?*kQ?8!_=#W!4$_BZe=_58C<0qjhKv=)00z0hZiAop1j5h!y5h ziWnWW@`|5%@1J&eeiN{TA6@XD^T&d4!$#-rJLDkm3i3&1Z%wwnNXQRrGO>_=R@N={ z?Acozz8eYfKMEpC2(cDxVCQ-3??@G!r&|p$A<_)%=+3Hr)n}Q1Ji!~(mn8A#*{0Zu z74cl+=|`uArm*b1P1ozP{AO)%?0Z@(bsA#xlJMQka>~-fSEml4DW}qzZzg|AxNG%D ztLWep@_H8r{v=;@X5+ITK`;a17qbm#+^KwniTA}2uw&{&)b}N~EefPMTd{g*D8pST z9mTu}QVgr;G?%^AQ;7HOW1;sM$j;Fv9lHMqv_MP0i{Ya!-F}&XymT>u9rMl$vTaB* z3ZTI*w^D(d0a%UrYwH+06Lgt6@F%1J42t+`;3wc0P^MrPHBlGw=lX|`fE+^u-l_HB z=OwGDxA-RQ1@h){V%L#EUV#k2nf*MT9@ zx+mKPkw<{7T(7tfH&W{6d^mrT94jLo21q#e6Mcsd9)1H(zWkrUOwRac^<`Y20bgVJ z^J%*_`tuS4P{Vg5!+cT7GqyzLBa#3SD}ng+$po)NAznbT54c?J4h$fH3g+t+zX2w! z!QP1`TGpV~@7MeK72n@&vjR}yk9lR;6#%y*;$QC`Y(3)d>p>Rr&q&Paj-MZs-y}Q& z^m=_wd1FL@LbTt&Byf^N0l$fW)F6T(JiV`llY5%D@0C+()Lz@amh;-~ZC^k`61DpMh_adHXT2=dC~D zBf8q!Ga0Diyco?#1ih#LgxAXXB|-=h5CB-&jr57Y$O~m<+n`&!WfI7J17P<=152#} z{eFo~x7;%5w|x{qgV}=#&=G&OurHa^@Ou)NDlGO-HDQU+?Um@49^6E6f{$~q67hGA#0}s+xE-kx zEoY6@Wbo%!LjO(jsWsLL;o>9yz`!~FIruXmr&d24*Qv4>6Y)oC{rP73=gJ|y%D;*% zy|{vPqG$n3w9X2O;jf-@mysTqR~G!qeGPo=2mc35T8pKL0#gq?fY!qgqI~!tuyN1b z=$(2J{dPOFMIBL*Ts0p%KHpCR^05|O2C=E9OTtHHkKm!}ei)eBjh229XY%N-8q?1o z%T?2N{U^+V3V@Zl`Du_3a`E%)?%ga4jbGK=@ESQjpFjsvUnENtv^o<=EeYg$Uz30u z8L-A+_e2AWO^aUNVY6QadFh-F{M8Kkr3zphM*)D?@l$5!&d)__Ug=c>LJ;AJCr;zw z!QD01Th*h9f)r3y{dM4nb6LGLE`zjPMf{WYA_2BMvZ^BfF62{Ui1o7zz=nta^7Ztc zfrJJ4g~rk=0i_DLO}s6Fov#7k7jeUUPX-at?mKMs9q91Yu$NzriSIU8ytRSpCmuob ziw~f@@6%Yn=VR!fdJ_GO4Fz6`ZB_SOgC8L8Qb9lD%0vX*Q#NqtRsR&7m*1dX(vbpR zzk)kX>Olhc`;+x8ehBF7UzBk6z%@N2*?bpTj-;sAEr ztMCtx-h-zuJcxt)cjL+{4`5=lk%Bp^CwDW%_hxvwxV-}S0c0d~WWTy~L{aublVTVK zi!TlJR?*lx*FQqq2b3Ux)kXCs3_~ObCqIr-{XXDtyBc)_Yyh!XcQ~ zAHw7tZp8dA6qtDYE0}xuLD2o5M*E(-(Ru1AlN4a$Rl zvD4LoUjy%-y!uUe-7DXSx8er?0Ou~8#aEwt1ou4fQGD_7Phx%-VgF^juz&v|w0jUc zSqA=a(w7?X*LBts!H9^zbCBcv^2#s;zuw>TXtlK*pioAjZX%eZj3%Lk(2)I1Ql9%M zaXpaBC>DLaM_B8Ypk0SyUw;UV@3;{QKVM+_YmcD$@B_g8pGNyrccJstQ|PzX!5|T} zqmI=f!d?9)KKt4qM*qmQXoS~rr!VU;*$`jNgdVo?+0Y(KaXnR61C{-B?c?)yx%37g zvT_gj+IS@v$}^A!v^7#*-Ac;0V>k&cPByToRe+pByVplq4!828gMBq+C@;TV1W;?q zE8tJ9vLw=0i+@gCJ)f55cVTIM7p}efH2{EKzl)P+p2UM+`Wznk(#P@mxd(9c$Ua=Q zZvm}|hL8duBS!pn$7jGIX=j?>o`}CFl%N8{Dh8>@!96eY**1~nb;l7xlO;tAYCF^x zB32}jc5|I1{V#%FF^dASUta>~_e->UC1~jo?6)06_lz7Kk8ER6qcDLINsOkf%oB<^FU5bb8+Em!ZE6 zCV&k18uWTO*>`&;0?2E@#rh%zzjQ_gegRhk{MeC4rDmgr%l99}<@=A~#y7qlfL95R zpL_(L`NCaz;E`oa&6U`Imqn4(5CwF zeI#Jy*6U>fE?;XMtQ0FArwmuO0TJk^ssMG}BSFNrl?3!rVsoPeEgph--9a?J?MBS~ zT!EQ$PhX460La0YABr0InL<4&! z8gQk&Z92kFL|fWHvm0c zD!;-nM2qX!v4ZhMSlei_g~T^_nfMLHn)otA$Lr2*(BO~iBc5Y*S>0;i9tZR(D1_Dm z%(uJ|jaPmrc1;v`XHj5tV-shdS;JGO&*N)PokiDC^1QxPZ{gA7`x5Lk@UP^83I041 z5|GQOMX&n)sYTBKKcF0`y0#-Vv{iM|kw!%PrIRWvrnUj9172ckHClMlp_k%C zhhB=eUH?M>fR)v=_`+B2!#{rYK78`QKgZ&(Ca$__Uub)bBc$zxA~s4Q{+xH>Dkx&e z!OsNAq{3a$#BqLw#1M=^c;TpS7XSe|$;V0MeLGS-TKa?tl=Y8gA$1FRBPTc@5(LGT zs%s?oRMqE*&?mxXzx1&W0L{f&T(xHbufFCe+8Z65JHLU`D;qeyvWi|w$t$^%xAL(6 zt_UFl-G=Lyl7Q|;A@mADcz8EhZ@Cy`Jqa*Uc|SsA3I%kYF~G+V=YUDT1XnKW%1i>* z0J|p&EKL+B`wr`!a)7VzYW?_H|Gs7&sck|I+eQG1Wf@`VrEKhhb>+;ZNPsP*#kpO0 z!?icy4cFd)Ti$vb{`l{H4`=aLNt=d8{8L~t&>2MjB2*Ovvu?lap=9jW4<0$H9*q(glqtkSc@Z|A0+M> z^1gU;W(r4_X7TdoLG-&_tgdx%=0Y1Q>znBG18XP(@JK88bB*9Bx;o&;*4L=ZX#oEv z>CjMP!eiCo*?R!OC*M-taOQ~!Qiir_zwVot^)FM->5XvngsQOMXmvUMbcBW z?3FzEdUV9UbS3)zKKf-Br7NR_1P~sL^Z!Z5Pzpeksai&I4Hd|Op84-dRW=$ zU}d9=|G&L2kFxA4>;0Wux2n3ks=KSYI_b_p29gjUn2s1UD40f^!1v<3)a6tAxt8-3 z5O^Xi?JS<4;t_x^p~ z-scWg)tS7z*X_FJ?0vrdO~2pXXP};_xBdS=?K*>%YfaR>)2W!L#LBtrP=Pg!ryDkuSfqJLf86> zIwXm~J<5K)r4Es3#or~WohtgICcwBlK0d2$h;Dt0TX@r8NPKch&I~L;h@g0fK(~o@ zr(LkQ0$>anlz$lP412h3M>qhT=a;hp{_R5PY6VV&Z4m_7G-{{7uSRzg%>DRw_ITGk z0e(wfp--SIIXYcnrPYBfmotR13^UW4arWFaq?2R0-Niz)gM~&5%}z<6$h@B64BR`{ zzZqH?U7%FW8UQI55^KmLH>13t^p_VJ+?JE?6v)iw!D78<>-ZSXoT#H#6RbAd<#qjP z&_^r(iU@K7wF5oMoU^k4l*FJ1t&J%4)QZ0YG-rVZJ|(#M@ehwWr@Lgx=#gFs{r4b( z!r8%*B7$z-L95+FyW2{Dp25!vU)q;BpCS0mj-*bf^2Q%Og6HMxz9A1iLW>6~V0EAn zkqSUeAn-&G`mgH4x6MV%Ah~>c5RS2A4CKhsZ3C;V4vsAqc$%oyuyuS4XKa~9h72p+ zE|ywdEVepWZPOB|gwZ+Z5ndTzCIOLT3GyuX#@+2F;;b-f5!O#=0?47(=AF+E;G ztJA^CYB$`sFR78-p8o^lZva9$(o?Mt59w8Djk?@s!7r-O1>8q09fsGu+l1Gk)e3v?WTGSGgFhO z)iSJh1uLB#3#|^CovvFh0Z?4R%d%S0SuNNeuJhA+A8L>+FOMmS!)fLg^4%FY<+zz{`3+Lo&^9H zM8CtwAH_RwxDIZki?{GB$=ryNzb6TQ2fd zo!_T#@pS`I)!lp%=*@y)0e*c$o4;Ls1B!Yqc-42LUgDtwtgpXk?p&>3$$)LUmaw|{ zR^0UOpTrY~PXe83T(tWoxcuU)aM8Ih#P;dg>cg{;cpmh;4Jkn1Sw*YULY@cEyHW-4 zc%P{YFenp^K)_@u0LrPpXKiyt1fy4}uEphOELq1^; zfd9P$luiisR)+GW?kh)ey0F~r080f}C&n^N)@#^3Sx0^II99qjmb=C6&CO01D3<(! zK_R`$^?_nNfUoYmm3@DGza)}c4VWFTV{Uv5-8{!)v*kzq;%B<<$2)+~dHX=u@ok;k z=D*_3`NLlksAD&D1`q-j0~|h?b>hb}gpeF1wGIM*A0&|+v$I<;Gqbr|-1rLq{fWEr ziMvi={^SaFY`F+mUiv+F!G(LUd+s?HD`yFATBoM|c{#mrH_&RY6hEs3YMFK<4dc^P{Tw$!{+)J&YBp<_~uD0cLl569E+_SjdrKVA@>VG zk#ZrhxH3>!nRy?$bA}ASrdkbWPS!D5%g|`G(P(!)*!e#F)Z$(*&?m3!i`f_L2a!X3 zOZ&!M22_A{evvZh9HjJ$e*i>yq?fzi+Q0a;qC_l=tB=)i_E|GH>#Xe%S;B$U58>|5 ze*j01E~1X@c;4AB#lw$2fVuOF|=V5uB^eS4N4e68xi4FeGXp}#PbDZdZ7;ty|!wk7n33jLkmT<#=DO%X|m zMUEURO~G=b4ah14f=%^0Hr2}1dSNeN_-b~|D=k;oupPKd)*!{L|%Y?ta;%^1^QS13gueh#=pnjwm z4BdYHu0|$;rj?a2_QuPkn@=!Iz|DWbr&t)3spcP5E@%m|GAN&bkN{t@J6G!B@gx) z2>iUxpyENK2%)PcIq5IKo*Y(dWm z_DPS03^O>+!(6b^Y-6b*ki`Z7V6tArrg{ytlXdLgGKof4&;&3pg3VcRXXB}6t9VdH z1!#L-@^ftmUDtA#t#qcPhxiY)i#o59q{f!0T;}(*q-Y zHtezB9%uwW18$W>1H8n;-PJW%F@}+xPToedy^Lmi8Qr|20ca9OfrbF3fw)exfB}R7 zzE55n{k$5bKUf#Sj@lR6#qvB+c$pTQ)GvccZ4=m1`%~a@ZP&EoU+qul14VM;aw>IG zR*(myH`@Z$R>Emq4lH*&m~MA)#+FGOU2VlT@W|RhpIYRLr~B?vb5h>n7i{xDryQ{B z0RemKFZ5#|=RT-TB4AQ-C@0f2ewb5$;;t7;yJn5*v3-h*WiDuU8)&qb(CVxd*Xw~e(d^&KHftjbtyFKa zfbvgo9RS(}ygVb$fZPy71Wc`(2fCLhfNIZ4lLmj%7UK_9@ACpZz|VOV{F{y|0ap3L zkwSbdqGRJYco3O31$g-~pSw+$FZ-c#wO^4zw32WCqWtc30@S%a13WKLrE)=Ia1eM6 zQtDc;D0YVEx}w+qFY&Oy3Cbj_0GjRVy_hQqOVDlCZd@7jzL7d(<1X(0k{1aqh zfUN=DD^U@FhGz#(sMR|dfY8P(00L^LQ~iVVr4|1`2{E``MGR8gpY@g7?GfmE(ROK~ z34Thi_^W=1Nch~^`CJ*akezZ!7O8i0u2 z=L5ISQs)kwhn*7sp%vo86$Ll-+HN=y^eLMrrtyp4_s0;)vD{d|!-v0uuO9q7?tlEV zkopoPCV{cKN0mx&pXfRd*H0ESidM?<$xFaS(2KE5yUPu&lNw-2z6Mqd=u~^Hza|xb zj9KwlWaExeqqM2_u{S_wS(G>FSp@Kb$;*5@;4O%&^5t9;}F2rz=-)z4KZBXW& zCUzS;(y3y_U(Ez0jNXA{gf7`3Jg`#|)A@3NE`Zy;E23&~FSU>L2mlYdGrl;d%G2yz z2VFP`HlWls@I?n@kk@uoou5f$!xBJ3vDyT7&0c_Avlrm%%YPIiIaZpBIC%7{_}ZZ_ z;O;{oLw%x4i546?9EdCGP)!ydz|@xoJwV{7APLa6mO~#4YTtiZysoBi10Eo5Cq|y? z6G*K1r-7_uko2eL9ZKNfv*P$3EBDHnoE)k)CLfH}$b-=3!y~%=-5-EA{$AcSsA3*)3YzXul>sBetfZv=4d*Dz) zg}4(i!N;WuB-V$Ln3Rg!_XoeTf8Z5=w$tXc(B(IQKfhO30{nL%{Ipm6Ou*mxBh;Su z=|1#|e++)|X{4*enghOxi);)7ME3z`Wn40HUG+;my4^OGnfP7;VtSVV88vw*H zn8A)y2;#r!OBOtu`9x<@aQ$#HQlBx9OdrtOmJmS4IGeOgXJ-t4Zy$`W4DqOXpBLI+ z%Fil^gP!TQxKB>Ungo|vZw7y;3+qrh5`Eb9gVL_({GR|@kOO>fM~ixD5l_PPe7oPr zF|4WSoU}T|G56b)wi{LIE-5V$6ut0@e+5H{pxIu+N^2gi&T5%>;rG?2t7KV5PPB<^ z0h9)D`fqQtNF8Uv3+@|;!R^4S+DY6G7#InHaO4c5539^8{=VOeW0D|s{lI^E=`#F^ zKl>rrqxvBtN&ZL%q_3Un@Ol7)t>5CGJEnX>lwQt964t$JBPz2qr&%oO*k&S(7n^*kHg{^4C z-?i_z;_uFxy}VS6b43mjaR7<{^yqHx(|6y^=r2+=-PbzjE*}tdb_(YzKSEps&~-k9 zSZ@rD>fwCe1%Qn3!DZm*SZSQZN^2gubamU1PpAD9pq6Fm_5*ldLKvPbd|=9iC2SXV z6EIVwWoR!^+b|*~h=PLd!0Zyj2~fxMTk&^w6?O+>2*}Wc!iiit6J!55A3%^?@we@r z3ig`0AD~2!@X?AtAQqH#>#aI}w~KyBz*8TR8uhIogC2g(%=^pbgUcbIxH|ua#9-ne zw5_|;1Dm8@+wH*L&0AP%9LH*F!6c55!;9~OUItulp1{rbz6Y0_^-}Dfy%<|Joq-I4 zJx?&pGPCNRNajTHC);B^+o>q2ssUL>&s z$e{h4$m&D#l|BBLHLUm(U{rh8uFr~pAcN2!qHF$v80@*cTIBP(y1H0)2_5R+_{+!0 zyFAo$-gv)p&hdfkE9D}fexz4OfZ_)^OO0a%@XG`Vi6L6~^0>h-0}38lxD^jC{40>x z0U5`($=!JVIj_VyvzKD$)(bFR+nhYIHkP570>C>J+F`(7wc;;YzW<&(dwTl>MrNoZol7MbPpx3#)CvT^S!eGEJ{w}i zKdv`Z`MxXu2DGGaG4dlm=NCy|*DnDbuR#Fz&PC;4MW#0PIxjd8d>;9EK*%}2y#b{j z62c{}1AYt3jpJBpoeJ#5MskvKGL?Ge(qBRMi^js{HUw>)Xgr8pA9xUuG1O4UST>0Z z&-`Y*;OuY5-1K?aGC79~waP_6O9;O3zV(m=%-jgjE^k5aT z*APVn9I4n3tuu8%`q0OXEUfZ?kMz>t4Wv7T}XmRA0Kkvd)b>oV*-o6<_#x>TSV8_dkZ0 zoUs)j`K|B6risBH|9)R*|~W0PrnS096p7Q-Sz<9_vx?Ttn<&n<}DLC z4+zj2galIcUEA31bkXkQXqT_?YIVYGy#?Sc2~^9{PpJZZm+~#o!S5U|!gLuQ1~Fra zbBb9cma*Pa&+`tJTPLy7IDxKo153GnD9d%ixP&v#DBBKl3P3rmkEev!pr`8yeq8%n%6YrCnb7G|DmTo109kwr5HAAt0l3qo-*E#i2$DS}5Gp9S1GBRfL-}N(KeAR0t~m}59lBGux$wf zVVQ@&b_jp_=I_UN-TemR^nadv_6%;g?uT&jz)@wVe==@)FMp%m#o}u52IA#LrvSgt z8AFIZ*Tu&meO z>{E9skU^$?yi*c{%WFYsrx*UbR{?SdwI^g69!1s!9B6>E2cZSM- z6t@ibE0UF`0D~;zIlGfUO|-8Bai4xF0GK*11!7dlRQrP)O)x`pXi$P9`Y~p%Z zCdn1}6Z%vBK}4{v(ZZ$AnHw&vHn=pqIgTwg$d8)90#LNSLB0#^01iN5Zyv7dR9?^5 zIZzbw|La(=4iqbsGnRP$@wT3Nfg__0Vt{&35P^Nbii$EQuwftupWM#SVeSJc-{F=V zz19k1vS$#o$cOC5k1}Kj?PlyLK-qxzwO1t)LI*0rS+CGhrQKd(_7(Nxw*~iq?NNO2 z*S>SGSoSE79a}<&E(@PEH;wVJ!CxWYrKjSgY_Prv?ZQB&>loB@gHP(oyH=L-kb?@v zM(8_yJwiUjG~w|BgnmOkVm*w^^_IHo#B}Nvc1gvCla(P^g8}&f_W?-8h7Sl>r%7e| z@-yg)zgI>B%YscE=U-f;Nx_2Jr>aUKko>Z1?#|d^n=68YPQpkI$JTXhY*)Yl14?lI z)C8tBjSrGXQF-LZ0^a_iJ8;K=fasV1ZK6}l6U z6HrKL2Yhlmj3W_P3c%nG1gQz#2t-b-1Z)L}Q*~h7s@lVlMRh+Kt@IO51svxuEh`-7 z%rvsecJ4zZ7q>I}BAG7nc*UQ{+t)MrIrai9F0SGizw1Rqr&*_)X z`OiPw_u;@ayJH$6f}@=--hAViaQN^%Ui}T{;8(ACF`jegwpeI++c$$Qd`|$5>uj7{ zTUFN=M*&}AG0POH&(d#%z6ts^5u2c;)^p-*z?>oY==ER3(HM>$D2Nk&bDdH%}rCn2Jm;fITlx2IJ~fm zV~Y)RGGNE98GQcm60UjsC-5_G|2PgFSx|D_+omJCT((vK&XX>+fMhAu?u6ASO$n8<|^U1FRh;r zxRN7efC;{h3ER#waY@q~{0<<3DFJG=EV#4Jrz?VA`m;~tk{6ug?-g*l)XfDe%?^$% zuHx{*Di#`Tbi29I9RQ}cZ^46&4qpAXf5abs_>09Wx}l%`K0R>+UDXyH!~>4keFKVrCZMx|r;vfw3>bWta*_o{KXl+f z@PIr7ksC0xZ9Ar?rm$<~Je;@fW!NO=q1M@ob}K{X0%d^*mfHiU1HQz=l0{#D_mP!* z1vRi0{>YY)6ox?T$0e3Yn%*|LWVCI0L<{}LI�_Pu;%n$_qeQ-?x0|v-d-`ZZ2e$ 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 KR>zNZ)Bgj5=w+Ay literal 0 HcmV?d00001 diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.cpp" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.cpp" new file mode 100644 index 0000000..d4a92f4 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.cpp" @@ -0,0 +1,94 @@ + +// InlineHookSSSDT应用程序.cpp : 定义应用程序的类行为。 +// + +#include "stdafx.h" +#include "InlineHookSSSDT应用程序.h" +#include "InlineHookSSSDT应用程序Dlg.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// CInlineHookSSSDT应用程序App + +BEGIN_MESSAGE_MAP(CInlineHookSSSDT应用程序App, CWinApp) + ON_COMMAND(ID_HELP, &CWinApp::OnHelp) +END_MESSAGE_MAP() + + +// CInlineHookSSSDT应用程序App 构造 + +CInlineHookSSSDT应用程序App::CInlineHookSSSDT应用程序App() +{ + // 支持重新启动管理器 + m_dwRestartManagerSupportFlags = AFX_RESTART_MANAGER_SUPPORT_RESTART; + + // TODO: 在此处添加构造代码, + // 将所有重要的初始化放置在 InitInstance 中 +} + + +// 唯一的一个 CInlineHookSSSDT应用程序App 对象 + +CInlineHookSSSDT应用程序App theApp; + + +// CInlineHookSSSDT应用程序App 初始化 + +BOOL CInlineHookSSSDT应用程序App::InitInstance() +{ + // 如果一个运行在 Windows XP 上的应用程序清单指定要 + // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, + //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 + INITCOMMONCONTROLSEX InitCtrls; + InitCtrls.dwSize = sizeof(InitCtrls); + // 将它设置为包括所有要在应用程序中使用的 + // 公共控件类。 + InitCtrls.dwICC = ICC_WIN95_CLASSES; + InitCommonControlsEx(&InitCtrls); + + CWinApp::InitInstance(); + + + AfxEnableControlContainer(); + + // 创建 shell 管理器,以防对话框包含 + // 任何 shell 树视图控件或 shell 列表视图控件。 + CShellManager *pShellManager = new CShellManager; + + // 标准初始化 + // 如果未使用这些功能并希望减小 + // 最终可执行文件的大小,则应移除下列 + // 不需要的特定初始化例程 + // 更改用于存储设置的注册表项 + // TODO: 应适当修改该字符串, + // 例如修改为公司或组织名 + SetRegistryKey(_T("应用程序向导生成的本地应用程序")); + + CInlineHookSSSDT应用程序Dlg dlg; + m_pMainWnd = &dlg; + INT_PTR nResponse = dlg.DoModal(); + if (nResponse == IDOK) + { + // TODO: 在此放置处理何时用 + // “确定”来关闭对话框的代码 + } + else if (nResponse == IDCANCEL) + { + // TODO: 在此放置处理何时用 + // “取消”来关闭对话框的代码 + } + + // 删除上面创建的 shell 管理器。 + if (pShellManager != NULL) + { + delete pShellManager; + } + + // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序, + // 而不是启动应用程序的消息泵。 + return FALSE; +} + diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.h" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.h" new file mode 100644 index 0000000..1967003 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.h" @@ -0,0 +1,32 @@ + +// InlineHookSSSDT应用程序.h : PROJECT_NAME 应用程序的主头文件 +// + +#pragma once + +#ifndef __AFXWIN_H__ + #error "在包含此文件之前包含“stdafx.h”以生成 PCH 文件" +#endif + +#include "resource.h" // 主符号 + + +// CInlineHookSSSDT应用程序App: +// 有关此类的实现,请参阅 InlineHookSSSDT应用程序.cpp +// + +class CInlineHookSSSDT应用程序App : public CWinApp +{ +public: + CInlineHookSSSDT应用程序App(); + +// 重写 +public: + virtual BOOL InitInstance(); + +// 实现 + + DECLARE_MESSAGE_MAP() +}; + +extern CInlineHookSSSDT应用程序App theApp; \ No newline at end of file diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.rc" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.rc" new file mode 100644 index 0000000000000000000000000000000000000000..6cc3a8adfce22421a500c7c57e057c092c23a842 GIT binary patch literal 10370 zcmd^FOK%%h6h7((0qvIc;7BMDX=*3wQxzhy^RP&4H+I}cgj#7+rxA%0*-i-$@sN;U z0|f~Qi8T_x0}1gH*!2&vV}sa0`M!I6Iy3f+Jx*Kd3XSaRxpVKi=bZbU*Bw9n=bW4q zPgZ4DZc9@Rq=ipi+UTpIuO&yaC40Eb%Imm1*^xWaz^94+Hrj3UHPLe35q{mqZx45* zwkwAiGbLx_C9HDJwPWaQ;OQPlZ@aOnp7~R9S5j^?XO6jXbvKW+=cFWMsmQwIBrip& z$(k&nH;3N^S&4I<#~k`;fm4?NARDNPPp} zc}SgwoYcnx`ls>f-jUutsAC1{zmCzp8YRstwD%S$=3@7)4Gc6LBHD5fw3^s!+qp3( z!!~xU9y@;v&yG91250snM5#A{D6ifV?~@Z{ByeQ(P+@VE$Mt6i6Y!gW}97D%iCiz~QD_aj_h z?92*itig_In70fMFyU5RL2m)Q>u8sptyqtaBkC70dO;>ZyNq%3SWV}2kD!mq!^e~` zA`gD^n5CBD%QlRCjV6K(#lbet^B79m@{@rM<9rmK&qHHN&U^9B>s-;%U{lhah_HY? z^7Tw#cak+2g@*BfoA5iEuw#u%KCe;HECml8?H5y^5l4p}U%h4gm|nk_!b;sfwBIUG z6ry}uc3z?Gw2n{eYD!2HnRhIl_y8B z0$OwMIgFc6me&&K6`>2#t+*T~IoJIV_1}5mI4;b?`d)d~`QPb2`x=E~&3QI4D-SH~ zb@Ih!WK9S1E)c^j2i;A%9AX-_oN_)#W7o~^hslCp`Q+RCpWn-U^-UvAs%X!!ht)MA zkR_c4ZOZ(*kL-NHSolPcHX98%rG#mejb&eMIg zn)j1qdZShNCgwPcxSPWrtA(g54~(*wih35+XEA%Q?R|H1{OIKm?%$m1Nb6U5qlum% za(o2kz&-VSfZE4;4Mo&-4!WLm)#p0=4Xe-_&?T$YIYgYI%RSkXc79I3Gjg$We*qO7 zsj~3w1VB^-c&H38L&QCMPJTQ5ALo1ocZYu%;x9~e01)0N412xCFHuL zP;VC0N?3&zHjzMDI$kLdJq64nr`=;y(z^C_ftJ$G4;vN~1HM$3omNu7C;2S9YFDwH zgU)y0Bbl8Cb(cmJnQ@#%=ahr+9B&_!kRb>8sC(8F)JGQUXM{0Izo*eoV$af!1GA46 zjMe(wdctigp>|F`%)pA%ka)RC$)ow1#rnoiro-1I^f2btuut4!<_n4g?wN5jn9nS5 zeh9C^^PC;*27S&rw7@EiQfK76+mn8rP0IzxpK9zld|R;a9C>F0g>?Y36`Nv~xS!9h7xyX>WhE8)8CG|02J z>rU!!>Pd0_^t}LmTr|Se7E<5-ECMdTQ_Wfww~r8%tfYP zFVWgG`eC}{l=VszE%WAXjU|(03KWi=o)y8iR=5qXyn^vNZq42-#^eg_m*qA7zMV=x zC~h3RdF#cU?9Rm6sq`>%7dtuAZbxp@FSQUv%+r&<1P%^xu6TsnvE8HhpyXHOr^3&b zVUZf9e{$UT@yd3yw?z2h^eZDu0p(7s9u>GPC8>z>t~8Rt>q z1my~2%=k17Q4Z7dpt|PSYi|azn5KOF`M>^u=b*u?i*M1k%8!@bGmoY9ufVh!8J{V&W6C=B{9O#gR;N!~x|KJ=#(|E@8~?7{C9lTb + + + + Debug + Win32 + + + Debug + x64 + + + Release + Win32 + + + Release + x64 + + + + {03D87002-4439-4130-B570-6D696846B780} + InlineHookSSSDT搴旂敤绋嬪簭 + MFCProj + + + + Application + true + Unicode + Dynamic + + + Application + true + Unicode + Dynamic + + + Application + false + true + Unicode + Dynamic + + + Application + false + true + Unicode + Dynamic + + + + + + + + + + + + + + + + + + + true + + + true + + + false + + + false + + + + Use + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + + + Windows + true + + + false + true + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Use + Level3 + Disabled + WIN32;_WINDOWS;_DEBUG;%(PreprocessorDefinitions) + + + Windows + true + + + false + _DEBUG;%(PreprocessorDefinitions) + + + 0x0804 + _DEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + false + true + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + Level3 + Use + MaxSpeed + true + true + WIN32;_WINDOWS;NDEBUG;%(PreprocessorDefinitions) + + + Windows + true + true + true + + + false + NDEBUG;%(PreprocessorDefinitions) + + + 0x0804 + NDEBUG;%(PreprocessorDefinitions) + $(IntDir);%(AdditionalIncludeDirectories) + + + + + + + + + + + + + + + + + + + Create + Create + Create + Create + + + + + + + + + + + + + + \ No newline at end of file diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.filters" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.filters" new file mode 100644 index 0000000..aeca38d --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.filters" @@ -0,0 +1,59 @@ +锘 + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + + 璧勬簮鏂囦欢 + + + 璧勬簮鏂囦欢 + + + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + 澶存枃浠 + + + + + 婧愭枃浠 + + + 婧愭枃浠 + + + 婧愭枃浠 + + + + + 璧勬簮鏂囦欢 + + + \ No newline at end of file diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.user" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.user" new file mode 100644 index 0000000..ace9a86 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217.vcxproj.user" @@ -0,0 +1,3 @@ +锘 + + \ No newline at end of file diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.cpp" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.cpp" new file mode 100644 index 0000000..edb4ec2 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.cpp" @@ -0,0 +1,296 @@ + +// InlineHookSSSDT应用程序Dlg.cpp : 实现文件 +// + +#include "stdafx.h" +#include "InlineHookSSSDT应用程序.h" +#include "InlineHookSSSDT应用程序Dlg.h" +#include "afxdialogex.h" + +#ifdef _DEBUG +#define new DEBUG_NEW +#endif + + +// 用于应用程序“关于”菜单项的 CAboutDlg 对话框 +HANDLE g_hDevice = NULL; +class CAboutDlg : public CDialogEx +{ +public: + CAboutDlg(); + +// 对话框数据 + enum { IDD = IDD_ABOUTBOX }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + +// 实现 +protected: + DECLARE_MESSAGE_MAP() +}; + +CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) +{ +} + +void CAboutDlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) +END_MESSAGE_MAP() + + +// CInlineHookSSSDT应用程序Dlg 对话框 + + + + +CInlineHookSSSDT应用程序Dlg::CInlineHookSSSDT应用程序Dlg(CWnd* pParent /*=NULL*/) + : CDialogEx(CInlineHookSSSDT应用程序Dlg::IDD, pParent) +{ + m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); + + m_bHook = FALSE; +} + +void CInlineHookSSSDT应用程序Dlg::DoDataExchange(CDataExchange* pDX) +{ + CDialogEx::DoDataExchange(pDX); +} + +BEGIN_MESSAGE_MAP(CInlineHookSSSDT应用程序Dlg, CDialogEx) + ON_WM_SYSCOMMAND() + ON_WM_PAINT() + ON_WM_QUERYDRAGICON() + ON_BN_CLICKED(IDC_BUTTON_PROTECT, &CInlineHookSSSDT应用程序Dlg::OnBnClickedButtonProtect) + ON_BN_CLICKED(IDC_BUTTON_UNPROTECT, &CInlineHookSSSDT应用程序Dlg::OnBnClickedButtonUnprotect) + ON_WM_CLOSE() +END_MESSAGE_MAP() + + +// CInlineHookSSSDT应用程序Dlg 消息处理程序 + +BOOL CInlineHookSSSDT应用程序Dlg::OnInitDialog() +{ + CDialogEx::OnInitDialog(); + + // 将“关于...”菜单项添加到系统菜单中。 + + // IDM_ABOUTBOX 必须在系统命令范围内。 + ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); + ASSERT(IDM_ABOUTBOX < 0xF000); + + CMenu* pSysMenu = GetSystemMenu(FALSE); + if (pSysMenu != NULL) + { + BOOL bNameValid; + CString strAboutMenu; + bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); + ASSERT(bNameValid); + if (!strAboutMenu.IsEmpty()) + { + pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + } + } + + // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 + // 执行此操作 + SetIcon(m_hIcon, TRUE); // 设置大图标 + SetIcon(m_hIcon, FALSE); // 设置小图标 + + // TODO: 在此添加额外的初始化代码 + + return TRUE; // 除非将焦点设置到控件,否则返回 TRUE +} + +void CInlineHookSSSDT应用程序Dlg::OnSysCommand(UINT nID, LPARAM lParam) +{ + if ((nID & 0xFFF0) == IDM_ABOUTBOX) + { + CAboutDlg dlgAbout; + dlgAbout.DoModal(); + } + else + { + CDialogEx::OnSysCommand(nID, lParam); + } +} + +// 如果向对话框添加最小化按钮,则需要下面的代码 +// 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, +// 这将由框架自动完成。 + +void CInlineHookSSSDT应用程序Dlg::OnPaint() +{ + if (IsIconic()) + { + CPaintDC dc(this); // 用于绘制的设备上下文 + + SendMessage(WM_ICONERASEBKGND, reinterpret_cast(dc.GetSafeHdc()), 0); + + // 使图标在工作区矩形中居中 + int cxIcon = GetSystemMetrics(SM_CXICON); + int cyIcon = GetSystemMetrics(SM_CYICON); + CRect rect; + GetClientRect(&rect); + int x = (rect.Width() - cxIcon + 1) / 2; + int y = (rect.Height() - cyIcon + 1) / 2; + + // 绘制图标 + dc.DrawIcon(x, y, m_hIcon); + } + else + { + CDialogEx::OnPaint(); + } +} + +//当用户拖动最小化窗口时系统调用此函数取得光标 +//显示。 +HCURSOR CInlineHookSSSDT应用程序Dlg::OnQueryDragIcon() +{ + return static_cast(m_hIcon); +} + + + +void CInlineHookSSSDT应用程序Dlg::OnBnClickedButtonProtect() +{ + if (m_bHook==FALSE) + { + g_hDevice = OpenDevice(L"\\\\.\\InlineHookSSSDTLink"); + + if (g_hDevice==(HANDLE)-1) + { + MessageBox(L"打开设备失败"); + + return; + } + + if(SendIoControlCode(INITILIZE)==FALSE) + { + + + CloseHandle(g_hDevice); + return; + } + + + if(SendIoControlCode(HOOK)==FALSE) + { + + + CloseHandle(g_hDevice); + return; + } + + CloseHandle(g_hDevice); + + m_bHook = TRUE; + } +} + + +void CInlineHookSSSDT应用程序Dlg::OnBnClickedButtonUnprotect() +{ + if (m_bHook==TRUE) + { + g_hDevice = OpenDevice(L"\\\\.\\InlineHookSSSDTLink"); + + if (g_hDevice==(HANDLE)-1) + { + MessageBox(L"打开设备失败"); + + return; + } + + if(SendIoControlCode(UNHOOK)==FALSE) + { + + CloseHandle(g_hDevice); + return; + } + + CloseHandle(g_hDevice); + + + m_bHook = FALSE; + } + +} + + +void CInlineHookSSSDT应用程序Dlg::OnClose() +{ + // TODO: 在此添加消息处理程序代码和/或调用默认值 + OnBnClickedButtonUnprotect(); + + CDialogEx::OnClose(); +} + +BOOL CInlineHookSSSDT应用程序Dlg::SendIoControlCode(ULONG_PTR ulControlCode) +{ + BOOL bRet = FALSE; + DWORD ulReturnSize = 0; + + if (ulControlCode==INITILIZE) + { + bRet = DeviceIoControl(g_hDevice,IOCTL_GET_SSSDTSERVERICE, + NULL, + NULL, + NULL, + NULL, + &ulReturnSize, + NULL); + + if (bRet==FALSE) + { + return FALSE; + } + + + } + + if (ulControlCode==HOOK) + { + + bRet = DeviceIoControl(g_hDevice,IOCTL_INLINEHOOK_SSSDT, + NULL, + NULL, + NULL, + NULL, + &ulReturnSize, + NULL); + + if (bRet==FALSE) + { + return FALSE; + } + } + + + if (ulControlCode==UNHOOK) + { + + bRet = DeviceIoControl(g_hDevice,IOCTL_INLINEUNHOOK_SSSDT, + NULL, + NULL, + NULL, + NULL, + &ulReturnSize, + NULL); + + if (bRet==FALSE) + { + return FALSE; + } + } + + + + return TRUE; +} diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.h" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.h" new file mode 100644 index 0000000..ef3406a --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217Dlg.h" @@ -0,0 +1,69 @@ + +// InlineHookSSSDT应用程序Dlg.h : 头文件 +// + +#pragma once + +#include + + +#define INITILIZE 20 +#define HOOK 10 +#define UNHOOK 30 + + +#define IOCTL_GET_SSSDTSERVERICE CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS) + +#define IOCTL_INLINEHOOK_SSSDT \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x830,METHOD_BUFFERED,FILE_ANY_ACCESS) + +#define IOCTL_INLINEUNHOOK_SSSDT \ + CTL_CODE(FILE_DEVICE_UNKNOWN,0x831,METHOD_BUFFERED,FILE_ANY_ACCESS) +// CInlineHookSSSDT应用程序Dlg 对话框 +class CInlineHookSSSDT应用程序Dlg : public CDialogEx +{ +// 构造 +public: + BOOL m_bHook; + BOOL CInlineHookSSSDT应用程序Dlg::SendIoControlCode(ULONG_PTR ulControlCode); + CInlineHookSSSDT应用程序Dlg(CWnd* pParent = NULL); // 标准构造函数 + HANDLE CInlineHookSSSDT应用程序Dlg::OpenDevice(LPCTSTR wzLinkPath) + { + HANDLE hDevice = CreateFile(wzLinkPath, + GENERIC_READ | GENERIC_WRITE, + FILE_SHARE_READ | FILE_SHARE_WRITE, + NULL, + OPEN_EXISTING, + FILE_ATTRIBUTE_NORMAL, + NULL); + + if (hDevice == INVALID_HANDLE_VALUE) + { + + } + + return hDevice; + + } +// 对话框数据 + enum { IDD = IDD_INLINEHOOKSSSDT_DIALOG }; + + protected: + virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 + + +// 实现 +protected: + HICON m_hIcon; + + // 生成的消息映射函数 + virtual BOOL OnInitDialog(); + afx_msg void OnSysCommand(UINT nID, LPARAM lParam); + afx_msg void OnPaint(); + afx_msg HCURSOR OnQueryDragIcon(); + DECLARE_MESSAGE_MAP() +public: + afx_msg void OnBnClickedButtonProtect(); + afx_msg void OnBnClickedButtonUnprotect(); + afx_msg void OnClose(); +}; diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/ReadMe.txt" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/ReadMe.txt" new file mode 100644 index 0000000..1dcb361 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/ReadMe.txt" @@ -0,0 +1,77 @@ +================================================================================ +MICROSOFT 基础类库: InlineHookSSSDT应用程序 项目概述 +=============================================================================== + +应用程序向导已为您创建了这个 InlineHookSSSDT应用程序 应用程序。此应用程序不仅演示 Microsoft 基础类的基本使用方法,还可作为您编写应用程序的起点。 + +本文件概要介绍组成 InlineHookSSSDT应用程序 应用程序的每个文件的内容。 + +InlineHookSSSDT应用程序.vcxproj +这是使用应用程序向导生成的 VC++ 项目的主项目文件。 +它包含生成该文件的 Visual C++ 的版本信息,以及有关使用应用程序向导选择的平台、配置和项目功能的信息。 + +InlineHookSSSDT应用程序.vcxproj.filters + 这是使用“应用程序向导”生成的 VC++ 项目筛选器文件。 + 它包含有关项目文件与筛选器之间的关联信息。在 IDE 中,通过这种关联,在特定节点下以分组形式显示具有相似扩展名的文件。例如,“.cpp”文件与“源文件”筛选器关联。 + +InlineHookSSSDT应用程序.h +这是应用程序的主要头文件。它包括其他项目特定的头文件(包括 Resource.h),并声明 CInlineHookSSSDT应用程序App 应用程序类。 + +InlineHookSSSDT应用程序.cpp +这是包含应用程序类 CInlineHookSSSDT应用程序App 的主要应用程序源文件。 + +InlineHookSSSDT应用程序.rc +这是程序使用的所有 Microsoft Windows 资源的列表。它包括 RES 子目录中存储的图标、位图和光标。此文件可以直接在 Microsoft Visual C++ 中进行编辑。项目资源位于 2052 中。 + +res\InlineHookSSSDT应用程序.ico +这是用作应用程序图标的图标文件。此图标包括在主要资源文件 InlineHookSSSDT应用程序.rc 中。 + +res\InlineHookSSSDT.rc2 +此文件包含不在 Microsoft Visual C++ 中进行编辑的资源。您应该将不可由资源编辑器编辑的所有资源放在此文件中。 + + +///////////////////////////////////////////////////////////////////////////// + +应用程序向导创建一个对话框类: + +InlineHookSSSDT应用程序Dlg.h,InlineHookSSSDT应用程序Dlg.cpp - 对话框 +这些文件包含 CInlineHookSSSDT应用程序Dlg 类。该类定义应用程序主对话框的行为。该对话框的模板位于 InlineHookSSSDT应用程序.rc 中,该文件可以在 Microsoft Visual C++ 中进行编辑。 + + +///////////////////////////////////////////////////////////////////////////// + +其他功能: + +ActiveX 控件 +应用程序包括对使用 ActiveX 控件的支持。 + +打印及打印预览支持 +应用程序向导已通过从 MFC 库调用 CView 类中的成员函数,生成了用于处理打印、打印设置和打印预览命令的代码。 + +///////////////////////////////////////////////////////////////////////////// + +其他标准文件: + +StdAfx.h,StdAfx.cpp +这些文件用于生成名为 InlineHookSSSDT应用程序.pch 的预编译头 (PCH) 文件和名为 StdAfx.obj 的预编译类型文件。 + +Resource.h +这是标准头文件,它定义新的资源 ID。 +Microsoft Visual C++ 读取并更新此文件。 + +InlineHookSSSDT应用程序.manifest + 应用程序清单文件供 Windows XP 用来描述应用程序 + 对特定版本并行程序集的依赖性。加载程序使用此 + 信息从程序集缓存加载适当的程序集或 + 从应用程序加载私有信息。应用程序清单可能为了重新分发而作为 + 与应用程序可执行文件安装在相同文件夹中的外部 .manifest 文件包括, + 也可能以资源的形式包括在该可执行文件中。 +///////////////////////////////////////////////////////////////////////////// + +其他注释: + +应用程序向导使用“TODO:”指示应添加或自定义的源代码部分。 + +如果应用程序在共享的 DLL 中使用 MFC,则需要重新发布这些 MFC DLL;如果应用程序所用的语言与操作系统的当前区域设置不同,则还需要重新发布对应的本地化资源 MFC100XXX.DLL。有关这两个主题的更多信息,请参见 MSDN 文档中有关 Redistributing Visual C++ applications (重新发布 Visual C++ 应用程序)的章节。 + +///////////////////////////////////////////////////////////////////////////// diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/res/InlineHookSSSDT.rc2" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/res/InlineHookSSSDT.rc2" new file mode 100644 index 0000000000000000000000000000000000000000..09fa67f594b8b275e7fcabeb1e5d80033a9ff1cc GIT binary patch literal 686 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 NK9A-8OQnhX{{?OVn?wKr literal 0 HcmV?d00001 diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/resource.h" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/resource.h" new file mode 100644 index 0000000000000000000000000000000000000000..89569126373e0b9bb707611b954f256985fb206c GIT binary patch literal 1568 zcmbu9&raJw5Ql%~R=k6yUMe9G5)OqU*lCHdohWfod%-FpuF^(CN-(8GJOdY=7x-ok zZGvnQ39U9eJDL4ueUmbP>-7q%v4%>!2MVe@&xn^20 zGhLuNMz>I|@0zmnwaM`GLt~vY=jbn3&(KZKjIhetjoD{trbt^$Hwq^^qWZ>cej%4Lq2dhOzrAKmi9Et~;o@BM zcTw3B>m79|1j5%n$$o literal 0 HcmV?d00001 diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.cpp" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.cpp" new file mode 100644 index 0000000..bd9eca2 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.cpp" @@ -0,0 +1,8 @@ + +// stdafx.cpp : 只包括标准包含文件的源文件 +// InlineHookSSSDT应用程序.pch 将作为预编译头 +// stdafx.obj 将包含预编译类型信息 + +#include "stdafx.h" + + diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.h" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.h" new file mode 100644 index 0000000..fac7631 --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/stdafx.h" @@ -0,0 +1,58 @@ + +// stdafx.h : 标准系统包含文件的包含文件, +// 或是经常使用但不常更改的 +// 特定于项目的包含文件 + +#pragma once + +#ifndef _SECURE_ATL +#define _SECURE_ATL 1 +#endif + +#ifndef VC_EXTRALEAN +#define VC_EXTRALEAN // 从 Windows 头中排除极少使用的资料 +#endif + +#include "targetver.h" + +#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS // 某些 CString 构造函数将是显式的 + +// 关闭 MFC 对某些常见但经常可放心忽略的警告消息的隐藏 +#define _AFX_ALL_WARNINGS + +#include // MFC 核心组件和标准组件 +#include // MFC 扩展 + + +#include // MFC 自动化类 + + + +#ifndef _AFX_NO_OLE_SUPPORT +#include // MFC 对 Internet Explorer 4 公共控件的支持 +#endif +#ifndef _AFX_NO_AFXCMN_SUPPORT +#include // MFC 对 Windows 公共控件的支持 +#endif // _AFX_NO_AFXCMN_SUPPORT + +#include // 功能区和控件条的 MFC 支持 + + + + + + + + + +#ifdef _UNICODE +#if defined _M_IX86 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"") +#elif defined _M_X64 +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"") +#else +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#endif +#endif + + diff --git "a/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/targetver.h" "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/targetver.h" new file mode 100644 index 0000000..0afac5b --- /dev/null +++ "b/InlineHook_ShadowSSDT/ring3/InlineHookSSSDT\345\272\224\347\224\250\347\250\213\345\272\217/targetver.h" @@ -0,0 +1,8 @@ +#pragma once + +// 包括 SDKDDKVer.h 将定义最高版本的可用 Windows 平台。 + +// 如果要为以前的 Windows 平台生成应用程序,请包括 WinSDKVer.h,并将 +// WIN32_WINNT 宏设置为要支持的平台,然后再包括 SDKDDKVer.h。 + +#include