This commit is contained in:
parent
64a85111a2
commit
95c8b5dc04
|
@ -0,0 +1,171 @@
|
||||||
|
EXPORTS
|
||||||
|
__C_specific_handler
|
||||||
|
__chkstk
|
||||||
|
__isascii
|
||||||
|
__iscsym
|
||||||
|
__iscsymf
|
||||||
|
__misaligned_access
|
||||||
|
__toascii
|
||||||
|
_atoi64
|
||||||
|
_fltused
|
||||||
|
_i64toa
|
||||||
|
_i64toa_s
|
||||||
|
_i64tow
|
||||||
|
_i64tow_s
|
||||||
|
_itoa
|
||||||
|
_itoa_s
|
||||||
|
_itow
|
||||||
|
_itow_s
|
||||||
|
_lfind
|
||||||
|
_local_unwind
|
||||||
|
_ltoa
|
||||||
|
_ltoa_s
|
||||||
|
_ltow
|
||||||
|
_ltow_s
|
||||||
|
_makepath_s
|
||||||
|
_memccpy
|
||||||
|
_memicmp
|
||||||
|
_setjmp
|
||||||
|
_setjmpex
|
||||||
|
_snprintf
|
||||||
|
_snprintf_s
|
||||||
|
_snscanf_s
|
||||||
|
_snwprintf
|
||||||
|
_snwprintf_s
|
||||||
|
_snwscanf_s
|
||||||
|
_splitpath
|
||||||
|
_splitpath_s
|
||||||
|
_strcmpi
|
||||||
|
_stricmp
|
||||||
|
_strlwr
|
||||||
|
_strnicmp
|
||||||
|
_strnset_s
|
||||||
|
_strset_s
|
||||||
|
_strupr
|
||||||
|
_swprintf
|
||||||
|
_ui64toa
|
||||||
|
_ui64toa_s
|
||||||
|
_ui64tow
|
||||||
|
_ui64tow_s
|
||||||
|
_ultoa
|
||||||
|
_ultoa_s
|
||||||
|
_ultow
|
||||||
|
_ultow_s
|
||||||
|
_vscwprintf
|
||||||
|
_vsnprintf
|
||||||
|
_vsnprintf_s
|
||||||
|
_vsnwprintf
|
||||||
|
_vsnwprintf_s
|
||||||
|
_vswprintf
|
||||||
|
_wcsicmp
|
||||||
|
_wcslwr
|
||||||
|
_wcsnicmp
|
||||||
|
_wcsnset_s
|
||||||
|
_wcsset_s
|
||||||
|
_wcstoui64
|
||||||
|
_wcsupr
|
||||||
|
_wmakepath_s
|
||||||
|
_wsplitpath_s
|
||||||
|
_wtoi
|
||||||
|
_wtoi64
|
||||||
|
_wtol
|
||||||
|
abs
|
||||||
|
atan
|
||||||
|
atoi
|
||||||
|
atol
|
||||||
|
bsearch
|
||||||
|
ceil
|
||||||
|
cos
|
||||||
|
fabs
|
||||||
|
floor
|
||||||
|
isalnum
|
||||||
|
isalpha
|
||||||
|
iscntrl
|
||||||
|
isdigit
|
||||||
|
isgraph
|
||||||
|
islower
|
||||||
|
isprint
|
||||||
|
ispunct
|
||||||
|
isspace
|
||||||
|
isupper
|
||||||
|
iswalpha
|
||||||
|
iswctype
|
||||||
|
iswdigit
|
||||||
|
iswlower
|
||||||
|
iswspace
|
||||||
|
iswxdigit
|
||||||
|
isxdigit
|
||||||
|
labs
|
||||||
|
log
|
||||||
|
longjmp
|
||||||
|
mbstowcs
|
||||||
|
memchr
|
||||||
|
memcmp
|
||||||
|
memcpy
|
||||||
|
memcpy_s
|
||||||
|
memmove
|
||||||
|
memmove_s
|
||||||
|
memset
|
||||||
|
pow
|
||||||
|
qsort
|
||||||
|
sin
|
||||||
|
sprintf
|
||||||
|
sprintf_s
|
||||||
|
sqrt
|
||||||
|
sscanf
|
||||||
|
sscanf_s
|
||||||
|
strcat
|
||||||
|
strcat_s
|
||||||
|
strchr
|
||||||
|
strcmp
|
||||||
|
strcpy
|
||||||
|
strcpy_s
|
||||||
|
strcspn
|
||||||
|
strlen
|
||||||
|
strncat
|
||||||
|
strncat_s
|
||||||
|
strncmp
|
||||||
|
strncpy
|
||||||
|
strncpy_s
|
||||||
|
strnlen
|
||||||
|
strpbrk
|
||||||
|
strrchr
|
||||||
|
strspn
|
||||||
|
strstr
|
||||||
|
strtok_s
|
||||||
|
strtol
|
||||||
|
strtoul
|
||||||
|
swprintf
|
||||||
|
swprintf_s
|
||||||
|
swscanf_s
|
||||||
|
tan
|
||||||
|
tolower
|
||||||
|
toupper
|
||||||
|
towlower
|
||||||
|
towupper
|
||||||
|
vDbgPrintEx
|
||||||
|
vDbgPrintExWithPrefix
|
||||||
|
vsprintf
|
||||||
|
vsprintf_s
|
||||||
|
vswprintf_s
|
||||||
|
wcscat
|
||||||
|
wcscat_s
|
||||||
|
wcschr
|
||||||
|
wcscmp
|
||||||
|
wcscpy
|
||||||
|
wcscpy_s
|
||||||
|
wcscspn
|
||||||
|
wcslen
|
||||||
|
wcsncat
|
||||||
|
wcsncat_s
|
||||||
|
wcsncmp
|
||||||
|
wcsncpy
|
||||||
|
wcsncpy_s
|
||||||
|
wcsnlen
|
||||||
|
wcspbrk
|
||||||
|
wcsrchr
|
||||||
|
wcsspn
|
||||||
|
wcsstr
|
||||||
|
wcstol
|
||||||
|
wcstombs
|
||||||
|
wcstoul
|
|
@ -6,11 +6,12 @@
|
||||||
;
|
;
|
||||||
;----------------------------------------------------------------------------
|
;----------------------------------------------------------------------------
|
||||||
|
|
||||||
.386
|
.386
|
||||||
_TEXT segment use32 para public 'CODE'
|
|
||||||
public __except_handler3
|
|
||||||
|
|
||||||
;EXTERN __ValidateEH3RN : PROC
|
_TEXT segment use32 para public 'CODE'
|
||||||
|
|
||||||
|
|
||||||
|
public __except_handler3
|
||||||
|
|
||||||
;__except_handler3 proc near
|
;__except_handler3 proc near
|
||||||
|
|
||||||
|
@ -136,24 +137,8 @@ __seh_longjmp_unwind@4:
|
||||||
|
|
||||||
;__except_handler3 endp
|
;__except_handler3 endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;EXTERN C P_RtlUnwind : DWORD
|
|
||||||
EXTERN _RtlUnwind@16 : PROC
|
EXTERN _RtlUnwind@16 : PROC
|
||||||
|
|
||||||
|
|
||||||
;MAGIC_NUMBER1 equ 019930520h
|
|
||||||
;
|
|
||||||
;_NLG_INFO struc
|
|
||||||
; dwSig dd MAGIC_NUMBER1
|
|
||||||
; uoffDestination dd 0
|
|
||||||
; dwCode dd 0
|
|
||||||
; uoffFramePointer dd 0
|
|
||||||
;_NLG_INFO ends
|
|
||||||
|
|
||||||
;extern __NLG_Destination:_NLG_INFO
|
|
||||||
extern __NLG_Destination: FAR
|
|
||||||
|
|
||||||
;__global_unwind2 proc near
|
;__global_unwind2 proc near
|
||||||
|
|
||||||
__global_unwind2:
|
__global_unwind2:
|
||||||
|
@ -285,15 +270,8 @@ __NLG_Dispatch:
|
||||||
;__global_unwind2 endp
|
;__global_unwind2 endp
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
;EXTERN C _NtQueryVirtualMemory : DWORD
|
|
||||||
EXTERN _NtQueryVirtualMemory@24: PROC
|
EXTERN _NtQueryVirtualMemory@24: PROC
|
||||||
|
|
||||||
EXTERN C _nValidPages : DWORD
|
|
||||||
EXTERN C _rgValidPages : DWORD
|
|
||||||
EXTERN C _lModifying : DWORD
|
|
||||||
|
|
||||||
|
|
||||||
;__ValidateEH3RN proc near
|
;__ValidateEH3RN proc near
|
||||||
|
|
||||||
__ValidateEH3RN:
|
__ValidateEH3RN:
|
||||||
|
@ -534,6 +512,41 @@ label03:
|
||||||
|
|
||||||
;__ValidateEH3RN endp
|
;__ValidateEH3RN endp
|
||||||
|
|
||||||
|
|
||||||
_TEXT ends
|
_TEXT ends
|
||||||
end
|
|
||||||
|
|
||||||
|
.model flat
|
||||||
|
.data
|
||||||
|
|
||||||
|
; Global variables for __NLG_Destination
|
||||||
|
;typedef struct {
|
||||||
|
; unsigned long dwSig;
|
||||||
|
; unsigned long uoffDestination;
|
||||||
|
; unsigned long dwCode;
|
||||||
|
; unsigned long uoffFramePointer;
|
||||||
|
;} _NLG_INFO;
|
||||||
|
;_NLG_INFO _NLG_Destination = { 0x019930520, 0, 0, 0 };
|
||||||
|
__NLG_Destination LABEL DWORD
|
||||||
|
dd 1 dup (019930520h) ; MAGIC_NUMBER1
|
||||||
|
dd 1 dup (0)
|
||||||
|
dd 1 dup (0)
|
||||||
|
dd 1 dup (0)
|
||||||
|
public __NLG_Destination
|
||||||
|
|
||||||
|
|
||||||
|
; Global variables for __ValidateEH3RN
|
||||||
|
;INT _nValidPages = 0;
|
||||||
|
_nValidPages LABEL DWORD
|
||||||
|
dd 1 dup (0)
|
||||||
|
public _nValidPages
|
||||||
|
;PVOID _rgValidPages[0x10] = { NULL };
|
||||||
|
_rgValidPages LABEL DWORD
|
||||||
|
dd 16 dup (0)
|
||||||
|
public _rgValidPages
|
||||||
|
;BOOL _lModifying = FALSE;
|
||||||
|
_lModifying LABEL DWORD
|
||||||
|
dd 1 dup (0)
|
||||||
|
public _lModifying
|
||||||
|
|
||||||
|
|
||||||
|
end
|
|
@ -0,0 +1,184 @@
|
||||||
|
EXPORTS
|
||||||
|
_CIcos
|
||||||
|
_CIlog
|
||||||
|
_CIpow
|
||||||
|
_CIsin
|
||||||
|
_CIsqrt
|
||||||
|
__isascii
|
||||||
|
__iscsym
|
||||||
|
__iscsymf
|
||||||
|
__toascii
|
||||||
|
_alldiv
|
||||||
|
_alldvrm
|
||||||
|
_allmul
|
||||||
|
_alloca_probe
|
||||||
|
_alloca_probe_16
|
||||||
|
_alloca_probe_8
|
||||||
|
_allrem
|
||||||
|
_allshl
|
||||||
|
_allshr
|
||||||
|
_atoi64
|
||||||
|
_aulldiv
|
||||||
|
_aulldvrm
|
||||||
|
_aullrem
|
||||||
|
_aullshr
|
||||||
|
_chkstk
|
||||||
|
_fltused
|
||||||
|
_ftol
|
||||||
|
_i64toa
|
||||||
|
_i64toa_s
|
||||||
|
_i64tow
|
||||||
|
_i64tow_s
|
||||||
|
_itoa
|
||||||
|
_itoa_s
|
||||||
|
_itow
|
||||||
|
_itow_s
|
||||||
|
_lfind
|
||||||
|
_ltoa
|
||||||
|
_ltoa_s
|
||||||
|
_ltow
|
||||||
|
_ltow_s
|
||||||
|
_makepath_s
|
||||||
|
_memccpy
|
||||||
|
_memicmp
|
||||||
|
_snprintf
|
||||||
|
_snprintf_s
|
||||||
|
_snscanf_s
|
||||||
|
_snwprintf
|
||||||
|
_snwprintf_s
|
||||||
|
_snwscanf_s
|
||||||
|
_splitpath
|
||||||
|
_splitpath_s
|
||||||
|
_strcmpi
|
||||||
|
_stricmp
|
||||||
|
_strlwr
|
||||||
|
_strnicmp
|
||||||
|
_strnset_s
|
||||||
|
_strset_s
|
||||||
|
_strupr
|
||||||
|
_swprintf
|
||||||
|
_ui64toa
|
||||||
|
_ui64toa_s
|
||||||
|
_ui64tow
|
||||||
|
_ui64tow_s
|
||||||
|
_ultoa
|
||||||
|
_ultoa_s
|
||||||
|
_ultow
|
||||||
|
_ultow_s
|
||||||
|
_vscwprintf
|
||||||
|
_vsnprintf
|
||||||
|
_vsnprintf_s
|
||||||
|
_vsnwprintf
|
||||||
|
_vsnwprintf_s
|
||||||
|
_vswprintf
|
||||||
|
_wcsicmp
|
||||||
|
_wcslwr
|
||||||
|
_wcsnicmp
|
||||||
|
_wcsnset_s
|
||||||
|
_wcsset_s
|
||||||
|
_wcstoui64
|
||||||
|
_wcsupr
|
||||||
|
_wmakepath_s
|
||||||
|
_wsplitpath_s
|
||||||
|
_wtoi
|
||||||
|
_wtoi64
|
||||||
|
_wtol
|
||||||
|
abs
|
||||||
|
atan
|
||||||
|
atoi
|
||||||
|
atol
|
||||||
|
bsearch
|
||||||
|
ceil
|
||||||
|
cos
|
||||||
|
fabs
|
||||||
|
floor
|
||||||
|
isalnum
|
||||||
|
isalpha
|
||||||
|
iscntrl
|
||||||
|
isdigit
|
||||||
|
isgraph
|
||||||
|
islower
|
||||||
|
isprint
|
||||||
|
ispunct
|
||||||
|
isspace
|
||||||
|
isupper
|
||||||
|
iswalpha
|
||||||
|
iswctype
|
||||||
|
iswdigit
|
||||||
|
iswlower
|
||||||
|
iswspace
|
||||||
|
iswxdigit
|
||||||
|
isxdigit
|
||||||
|
labs
|
||||||
|
log
|
||||||
|
mbstowcs
|
||||||
|
memchr
|
||||||
|
memcmp
|
||||||
|
memcpy
|
||||||
|
memcpy_s
|
||||||
|
memmove
|
||||||
|
memmove_s
|
||||||
|
memset
|
||||||
|
pow
|
||||||
|
qsort
|
||||||
|
sin
|
||||||
|
sprintf
|
||||||
|
sprintf_s
|
||||||
|
sqrt
|
||||||
|
sscanf
|
||||||
|
sscanf_s
|
||||||
|
strcat
|
||||||
|
strcat_s
|
||||||
|
strchr
|
||||||
|
strcmp
|
||||||
|
strcpy
|
||||||
|
strcpy_s
|
||||||
|
strcspn
|
||||||
|
strlen
|
||||||
|
strncat
|
||||||
|
strncat_s
|
||||||
|
strncmp
|
||||||
|
strncpy
|
||||||
|
strncpy_s
|
||||||
|
strnlen
|
||||||
|
strpbrk
|
||||||
|
strrchr
|
||||||
|
strspn
|
||||||
|
strstr
|
||||||
|
strtok_s
|
||||||
|
strtol
|
||||||
|
strtoul
|
||||||
|
swprintf
|
||||||
|
swprintf_s
|
||||||
|
swscanf_s
|
||||||
|
tan
|
||||||
|
tolower
|
||||||
|
toupper
|
||||||
|
towlower
|
||||||
|
towupper
|
||||||
|
vDbgPrintEx
|
||||||
|
vDbgPrintExWithPrefix
|
||||||
|
vsprintf
|
||||||
|
vsprintf_s
|
||||||
|
vswprintf_s
|
||||||
|
wcscat
|
||||||
|
wcscat_s
|
||||||
|
wcschr
|
||||||
|
wcscmp
|
||||||
|
wcscpy
|
||||||
|
wcscpy_s
|
||||||
|
wcscspn
|
||||||
|
wcslen
|
||||||
|
wcsncat
|
||||||
|
wcsncat_s
|
||||||
|
wcsncmp
|
||||||
|
wcsncpy
|
||||||
|
wcsncpy_s
|
||||||
|
wcsnlen
|
||||||
|
wcspbrk
|
||||||
|
wcsrchr
|
||||||
|
wcsspn
|
||||||
|
wcsstr
|
||||||
|
wcstol
|
||||||
|
wcstombs
|
||||||
|
wcstoul
|
|
@ -23,190 +23,25 @@ typedef long NTSTATUS;
|
||||||
#include "win32_ntddk.h"
|
#include "win32_ntddk.h"
|
||||||
|
|
||||||
//
|
//
|
||||||
// Do not include any external CRT into sboxdll project.
|
// Do not include any external CRT into sboxdll (SbieDll.dll) project !!!
|
||||||
// This DLL is injected early into the process start up sequence and adding dependencies may break Sandboxie.
|
// This DLL is injected early into the process start up sequence and adding dependencies may break Sandboxie.
|
||||||
// Normally we link directly to the CRT build into ntdll.dll.
|
// Normally we link directly to the CRT build into ntdll.dll.
|
||||||
// As more recent versions of ntdll.lib are not offering many CRT functions we have to dynamically link them.
|
//
|
||||||
// If you are missing some expected functions we probably just not added them here yet, so just add what you need.
|
// As more recent versions of ntdll.lib are not offering many CRT functions we have to create own libs.
|
||||||
|
// See NtCRT_x64.def and NtCRT_x86.def respectively for the functions, we use a custom build step
|
||||||
|
// "lib /def:%(FullPath) /out:$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib /machine:x64"
|
||||||
|
// on the apropriate def file, for x86 we use the switch /machine:x86 instead.
|
||||||
|
//
|
||||||
|
// For the x86 build we also need _except_handler3 which we have recreated in except_handler3.asm
|
||||||
|
//
|
||||||
|
// Alternatively we could link all the required functions dynamically from InitMyNtDll
|
||||||
//
|
//
|
||||||
|
|
||||||
int(*P_vsnwprintf)(wchar_t *_Buffer, size_t Count, const wchar_t * const, va_list Args) = NULL;
|
int(*P_vsnwprintf)(wchar_t *_Buffer, size_t Count, const wchar_t * const, va_list Args) = NULL;
|
||||||
int(*P_vsnprintf)(char *_Buffer, size_t Count, const char * const, va_list Args) = NULL;
|
int(*P_vsnprintf)(char *_Buffer, size_t Count, const char * const, va_list Args) = NULL;
|
||||||
|
|
||||||
#ifndef OLD_DDK
|
|
||||||
void*(__cdecl *Pmemcpy)(void* _Dst, void const* _Src, size_t _Size) = NULL;
|
|
||||||
void* __cdecl memcpy(void* _Dst, void const* _Src, size_t _Size) { return Pmemcpy(_Dst, _Src, _Size); }
|
|
||||||
|
|
||||||
void*(__cdecl *Pmemset)(void* _Dst, int _Val, size_t _Size) = NULL;
|
|
||||||
void* __cdecl memset(void* _Dst, int _Val, size_t _Size) { return Pmemset(_Dst, _Val, _Size); }
|
|
||||||
|
|
||||||
|
|
||||||
wchar_t*(__cdecl *Pwcscpy)(wchar_t *dest, const wchar_t *src) = NULL;
|
|
||||||
wchar_t* __cdecl wcscpy(wchar_t *dest, const wchar_t *src) { return Pwcscpy(dest, src); }
|
|
||||||
|
|
||||||
size_t(__cdecl *Pwcslen)(wchar_t const* _String) = NULL;
|
|
||||||
size_t __cdecl wcslen(wchar_t const* _String) { return Pwcslen(_String); }
|
|
||||||
|
|
||||||
int(__cdecl *Pmemcmp)(void const* _Buf1, void const* _Buf2, size_t _Size) = NULL;
|
|
||||||
int __cdecl memcmp(void const* _Buf1, void const* _Buf2, size_t _Size) { return Pmemcmp(_Buf1, _Buf2, _Size); }
|
|
||||||
|
|
||||||
wchar_t*(__cdecl *Pwcscat)(wchar_t *dest, const wchar_t *src) = NULL;
|
|
||||||
wchar_t* __cdecl wcscat(wchar_t *dest, const wchar_t *src) { return Pwcscat(dest, src); }
|
|
||||||
|
|
||||||
int(__cdecl *Pwcscmp)(char const* _String1, char const* _String2) = NULL;
|
|
||||||
int __cdecl wcscmp(wchar_t const* _String1, wchar_t const* _String2) { return Pwcscmp(_String1, _String2); }
|
|
||||||
|
|
||||||
size_t(__cdecl *Pstrlen)(char const*_Str) = NULL;
|
|
||||||
size_t __cdecl strlen(char const* _Str) { return Pstrlen(_Str); }
|
|
||||||
|
|
||||||
char*(__cdecl *Pstrcpy)(char * destination, const char * source) = NULL;
|
|
||||||
char * __cdecl strcpy(char * destination, const char * source) { return Pstrcpy(destination, source); }
|
|
||||||
|
|
||||||
int(__cdecl *Pstrcmp)(char const* _Str1, char const* _Str2) = NULL;
|
|
||||||
int __cdecl strcmp(char const* _Str1, char const* _Str2) { return Pstrcmp(_Str1, _Str2); }
|
|
||||||
|
|
||||||
|
|
||||||
int(__cdecl *P_wcsnicmp)(wchar_t const* _String1, wchar_t const* _String2, size_t _MaxCount) = NULL;
|
|
||||||
int __cdecl _wcsnicmp(wchar_t const* _String1, wchar_t const* _String2, size_t _MaxCount) { return P_wcsnicmp(_String1, _String2, _MaxCount); }
|
|
||||||
|
|
||||||
wint_t(__cdecl *Ptowupper)(wint_t _C) = NULL;
|
|
||||||
wint_t __cdecl towupper(_In_ wint_t _C) { return Ptowupper(_C); }
|
|
||||||
|
|
||||||
wint_t(__cdecl *Ptowlower)(wint_t _C) = NULL;
|
|
||||||
wint_t __cdecl towlower(_In_ wint_t _C) { return Ptowlower(_C); }
|
|
||||||
|
|
||||||
int(__cdecl *Piswctype)(_In_ wint_t _C, _In_ wctype_t _Type) = NULL;
|
|
||||||
int __cdecl iswctype(_In_ wint_t _C, _In_ wctype_t _Type) { return Piswctype(_C, _Type); }
|
|
||||||
|
|
||||||
void*(__cdecl *Pmemmove)(void* _Dst, void const* _Src, size_t _Size) = NULL;
|
|
||||||
void* __cdecl memmove(void* _Dst, void const* _Src, size_t _Size) { return Pmemmove(_Dst, _Src, _Size); }
|
|
||||||
|
|
||||||
wchar_t *(__cdecl *Pwcschr)(wchar_t const* _Str, wchar_t _Ch) = NULL;
|
|
||||||
wchar_t * __cdecl wcschr(wchar_t const* _Str, wchar_t _Ch) { return Pwcschr(_Str, _Ch); }
|
|
||||||
|
|
||||||
wchar_t*(__cdecl *P_itow)(int value, wchar_t *buffer, int radix) = NULL;
|
|
||||||
wchar_t * __cdecl _itow(int value, wchar_t *buffer, int radix) { return P_itow(value, buffer, radix); }
|
|
||||||
|
|
||||||
int(__cdecl *Pwcsncmp)(wchar_t const* _String1, wchar_t const* _String2, size_t _MaxCount) = NULL;
|
|
||||||
int __cdecl wcsncmp(wchar_t const* _String1, wchar_t const* _String2, size_t _MaxCount) { return Pwcsncmp(_String1, _String2, _MaxCount); }
|
|
||||||
|
|
||||||
int(__cdecl *P_wcsicmp)(wchar_t const* _String1, wchar_t const* _String2) = NULL;
|
|
||||||
int __cdecl _wcsicmp(wchar_t const* _String1, wchar_t const* _String2) { return P_wcsicmp(_String1, _String2); }
|
|
||||||
|
|
||||||
wchar_t *(__cdecl *Pwcsrchr)(wchar_t const* _Str, wchar_t _Ch) = NULL;
|
|
||||||
wchar_t * __cdecl wcsrchr(wchar_t const* _Str, wchar_t _Ch) { return Pwcsrchr(_Str, _Ch); }
|
|
||||||
|
|
||||||
wchar_t *(__cdecl *Pwcsstr)(wchar_t const* _Str, wchar_t const* _SubStr) = NULL;
|
|
||||||
wchar_t * __cdecl wcsstr(wchar_t const* _Str, wchar_t const* _SubStr) { return Pwcsstr(_Str, _SubStr); }
|
|
||||||
|
|
||||||
wchar_t*(__cdecl *P_wcslwr)(wchar_t *string) = NULL;
|
|
||||||
wchar_t *__cdecl _wcslwr(wchar_t *string) { return P_wcslwr(string); }
|
|
||||||
|
|
||||||
int(__cdecl *P_stricmp)(char const* _String1, char const* _String2) = NULL;
|
|
||||||
int __cdecl _stricmp(char const* _String1, char const* _String2) { return P_stricmp(_String1, _String2); }
|
|
||||||
|
|
||||||
long(__cdecl *Pwcstol)(wchar_t const* _String, wchar_t ** _EndPtr, int _Radix) = NULL;
|
|
||||||
long __cdecl wcstol(wchar_t const* _String, wchar_t** _EndPtr, int _Radix) { return Pwcstol(_String, _EndPtr, _Radix); }
|
|
||||||
|
|
||||||
wchar_t*(__cdecl *Pwcsncpy)(wchar_t* dest, wchar_t const* src, size_t count) = NULL;
|
|
||||||
wchar_t* __cdecl wcsncpy(wchar_t* dest, const wchar_t* src, size_t count) { return Pwcsncpy(dest, src, count); }
|
|
||||||
|
|
||||||
__int64(__cdecl *P_wtoi64)(wchar_t const *_String) = NULL;
|
|
||||||
__int64 __cdecl _wtoi64(wchar_t const* _String) { return P_wtoi64(_String); }
|
|
||||||
|
|
||||||
char*(__cdecl *Pstrchr)(const char *s, int c) = NULL;
|
|
||||||
char* __cdecl strchr(const char *s, int c) { return Pstrchr(s, c); }
|
|
||||||
|
|
||||||
int(__cdecl *Pstrncmp)(const char * str1, const char * str2, size_t num);
|
|
||||||
int __cdecl strncmp(const char * str1, const char * str2, size_t num) { return Pstrncmp(str1, str2, num); }
|
|
||||||
|
|
||||||
unsigned long(__cdecl *Pwcstoul)(wchar_t const* _String, wchar_t ** _EndPtr, int _Radix) = NULL;
|
|
||||||
unsigned long __cdecl wcstoul(wchar_t const* _String, wchar_t** _EndPtr, int _Radix) { return Pwcstoul(_String, _EndPtr, _Radix); }
|
|
||||||
|
|
||||||
int(__cdecl *Ptolower)(int _C) = NULL;
|
|
||||||
int __cdecl tolower(int _C) { return Ptolower(_C); }
|
|
||||||
|
|
||||||
int(__cdecl *P_wtoi)(wchar_t const *_String) = NULL;
|
|
||||||
int __cdecl _wtoi(wchar_t const* _String) { return P_wtoi(_String); }
|
|
||||||
|
|
||||||
char *(__cdecl *Pstrstr)(char const* _Str, char const* _SubStr) = NULL;
|
|
||||||
char * __cdecl strstr(char const* _Str, char const* _SubStr) { return Pstrstr(_Str, _SubStr); }
|
|
||||||
|
|
||||||
char*(__cdecl *P_strlwr)(const* str) = NULL;
|
|
||||||
char* __cdecl _strlwr(char* str) { return P_strlwr(str); }
|
|
||||||
|
|
||||||
#ifdef _WIN64
|
|
||||||
EXCEPTION_DISPOSITION(__cdecl *P__C_specific_handler)(struct _EXCEPTION_RECORD *ExceptionRecord, void* EstablisherFrame, struct _CONTEXT* ContextRecord, struct _DISPATCHER_CONTEXT *DispatcherContext) = NULL;
|
|
||||||
EXCEPTION_DISPOSITION __cdecl __C_specific_handler(struct _EXCEPTION_RECORD *ExceptionRecord, void* EstablisherFrame, struct _CONTEXT* ContextRecord, struct _DISPATCHER_CONTEXT *DispatcherContext) {
|
|
||||||
return P__C_specific_handler(ExceptionRecord, EstablisherFrame, ContextRecord, DispatcherContext);
|
|
||||||
}
|
|
||||||
|
|
||||||
ULONG(__cdecl *P__chkstk)() = NULL;
|
|
||||||
ULONG __cdecl __chkstk() { return P__chkstk(); }
|
|
||||||
#else
|
|
||||||
|
|
||||||
// Global variables for __NLG_Destination
|
|
||||||
typedef struct {
|
|
||||||
unsigned long dwSig;
|
|
||||||
unsigned long uoffDestination;
|
|
||||||
unsigned long dwCode;
|
|
||||||
unsigned long uoffFramePointer;
|
|
||||||
} _NLG_INFO;
|
|
||||||
_NLG_INFO _NLG_Destination = { 0x019930520, 0, 0, 0 };
|
|
||||||
|
|
||||||
// Global variables for __ValidateEH3RN
|
|
||||||
INT _nValidPages = 0;
|
|
||||||
PVOID _rgValidPages[0x10] = { NULL };
|
|
||||||
BOOL _lModifying = FALSE;
|
|
||||||
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
void InitMyNtDll(HMODULE Ntdll)
|
void InitMyNtDll(HMODULE Ntdll)
|
||||||
{
|
{
|
||||||
*(FARPROC*)&P_vsnwprintf = GetProcAddress(Ntdll, "_vsnwprintf");
|
*(FARPROC*)&P_vsnwprintf = GetProcAddress(Ntdll, "_vsnwprintf");
|
||||||
*(FARPROC*)&P_vsnprintf = GetProcAddress(Ntdll, "_vsnprintf");
|
*(FARPROC*)&P_vsnprintf = GetProcAddress(Ntdll, "_vsnprintf");
|
||||||
|
|
||||||
#ifndef OLD_DDK
|
|
||||||
|
|
||||||
*(FARPROC*)&Pmemcpy = GetProcAddress(Ntdll, "memcpy");
|
|
||||||
*(FARPROC*)&Pmemset = GetProcAddress(Ntdll, "memset");
|
|
||||||
*(FARPROC*)&Pwcscpy = GetProcAddress(Ntdll, "wcscpy");
|
|
||||||
*(FARPROC*)&Pwcslen = GetProcAddress(Ntdll, "wcslen");
|
|
||||||
*(FARPROC*)&Pmemcmp = GetProcAddress(Ntdll, "memcmp");
|
|
||||||
*(FARPROC*)&Pwcscat = GetProcAddress(Ntdll, "wcscat");
|
|
||||||
*(FARPROC*)&Pwcscmp = GetProcAddress(Ntdll, "wcscmp");
|
|
||||||
*(FARPROC*)&Pstrlen = GetProcAddress(Ntdll, "strlen");
|
|
||||||
*(FARPROC*)&Pstrcpy = GetProcAddress(Ntdll, "strcpy");
|
|
||||||
*(FARPROC*)&Pstrcmp = GetProcAddress(Ntdll, "strcmp");
|
|
||||||
*(FARPROC*)&P_wcsnicmp = GetProcAddress(Ntdll, "_wcsnicmp");
|
|
||||||
*(FARPROC*)&Ptowupper = GetProcAddress(Ntdll, "towupper");
|
|
||||||
*(FARPROC*)&Ptowlower = GetProcAddress(Ntdll, "towlower");
|
|
||||||
*(FARPROC*)&Piswctype = GetProcAddress(Ntdll, "iswctype");
|
|
||||||
*(FARPROC*)&Pmemmove = GetProcAddress(Ntdll, "memmove");
|
|
||||||
*(FARPROC*)&Pwcschr = GetProcAddress(Ntdll, "wcschr");
|
|
||||||
*(FARPROC*)&P_itow = GetProcAddress(Ntdll, "_itow");
|
|
||||||
*(FARPROC*)&Pwcsncmp = GetProcAddress(Ntdll, "wcsncmp");
|
|
||||||
*(FARPROC*)&P_wcsicmp = GetProcAddress(Ntdll, "_wcsicmp");
|
|
||||||
*(FARPROC*)&Pwcsrchr = GetProcAddress(Ntdll, "wcsrchr");
|
|
||||||
*(FARPROC*)&Pwcsstr = GetProcAddress(Ntdll, "wcsstr");
|
|
||||||
*(FARPROC*)&P_wcslwr = GetProcAddress(Ntdll, "_wcslwr");
|
|
||||||
*(FARPROC*)&P_stricmp = GetProcAddress(Ntdll, "_stricmp");
|
|
||||||
*(FARPROC*)&Pwcstol = GetProcAddress(Ntdll, "wcstol");
|
|
||||||
*(FARPROC*)&Pwcsncpy = GetProcAddress(Ntdll, "wcsncpy");
|
|
||||||
*(FARPROC*)&P_wtoi64 = GetProcAddress(Ntdll, "_wtoi64");
|
|
||||||
*(FARPROC*)&Pstrchr = GetProcAddress(Ntdll, "strchr");
|
|
||||||
*(FARPROC*)&Pstrncmp = GetProcAddress(Ntdll, "strncmp");
|
|
||||||
*(FARPROC*)&Pwcstoul = GetProcAddress(Ntdll, "wcstoul");
|
|
||||||
*(FARPROC*)&Ptolower = GetProcAddress(Ntdll, "tolower");
|
|
||||||
*(FARPROC*)&P_wtoi = GetProcAddress(Ntdll, "_wtoi");
|
|
||||||
*(FARPROC*)&Pstrstr = GetProcAddress(Ntdll, "strstr");
|
|
||||||
*(FARPROC*)&P_strlwr = GetProcAddress(Ntdll, "_strlwr");
|
|
||||||
|
|
||||||
#ifdef _WIN64
|
|
||||||
*(FARPROC*)&P__C_specific_handler = GetProcAddress(Ntdll, "__C_specific_handler");
|
|
||||||
*(FARPROC*)&P__chkstk = GetProcAddress(Ntdll, "__chkstk");
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
<Keyword>Win32Proj</Keyword>
|
<Keyword>Win32Proj</Keyword>
|
||||||
<ProjectName>SboxDll</ProjectName>
|
<ProjectName>SboxDll</ProjectName>
|
||||||
<ProjectGuid>{8E0EAA5B-6F5B-E0E2-338A-453EF2B548E4}</ProjectGuid>
|
<ProjectGuid>{8E0EAA5B-6F5B-E0E2-338A-453EF2B548E4}</ProjectGuid>
|
||||||
<WindowsTargetPlatformVersion>10.0</WindowsTargetPlatformVersion>
|
<WindowsTargetPlatformVersion>8.1</WindowsTargetPlatformVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'" Label="Configuration">
|
||||||
|
@ -30,28 +30,28 @@
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'" Label="Configuration">
|
||||||
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<UseOfMfc>false</UseOfMfc>
|
<UseOfMfc>false</UseOfMfc>
|
||||||
<CharacterSet>Unicode</CharacterSet>
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
<PlatformToolset>v142</PlatformToolset>
|
<PlatformToolset>v140</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
@ -71,22 +71,18 @@
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>SbieDll</TargetName>
|
<TargetName>SbieDll</TargetName>
|
||||||
<LibraryPath>$(WindowsSDK_LibraryPath_x86)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>SbieDll</TargetName>
|
<TargetName>SbieDll</TargetName>
|
||||||
<LibraryPath>$(WindowsSDK_LibraryPath_x64)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'">
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>SbieDll</TargetName>
|
<TargetName>SbieDll</TargetName>
|
||||||
<LibraryPath>$(WindowsSDK_LibraryPath_x86)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">
|
||||||
<TargetExt>.dll</TargetExt>
|
<TargetExt>.dll</TargetExt>
|
||||||
<TargetName>SbieDll</TargetName>
|
<TargetName>SbieDll</TargetName>
|
||||||
<LibraryPath>$(WindowsSDK_LibraryPath_x64)</LibraryPath>
|
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">
|
||||||
<ClCompile>
|
<ClCompile>
|
||||||
|
@ -375,7 +371,7 @@
|
||||||
<Midl Include="pstore.idl" />
|
<Midl Include="pstore.idl" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<CustomBuild Include="..\..\common\except_handler3.asm">
|
<CustomBuild Include="..\..\common\NtCRT\x86\except_handler3.asm">
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">true</ExcludedFromBuild>
|
||||||
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">true</ExcludedFromBuild>
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">true</ExcludedFromBuild>
|
||||||
<FileType>Document</FileType>
|
<FileType>Document</FileType>
|
||||||
|
@ -384,6 +380,22 @@
|
||||||
<Command Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">ml -c -Cx -nologo -Zi -Zm -Fo$(Configuration)\%(Filename).obj %(FullPath)</Command>
|
<Command Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">ml -c -Cx -nologo -Zi -Zm -Fo$(Configuration)\%(Filename).obj %(FullPath)</Command>
|
||||||
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">%(ProjectDir)$(Configuration)\%(Filename).obj</Outputs>
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">%(ProjectDir)$(Configuration)\%(Filename).obj</Outputs>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\common\NtCRT\x64\ntdll.def">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">true</ExcludedFromBuild>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">lib /def:%(FullPath) /out:$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib /machine:x64</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib</Outputs>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">lib /def:%(FullPath) /out:$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib /machine:x64</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\common\NtCRT\x86\ntdll.def">
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieRelease|x64'">true</ExcludedFromBuild>
|
||||||
|
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='SbieDebug|x64'">true</ExcludedFromBuild>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'">lib /def:%(FullPath) /out:$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib /machine:x86</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieRelease|Win32'">$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib</Outputs>
|
||||||
|
<Command Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">lib /def:%(FullPath) /out:$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib /machine:x86</Command>
|
||||||
|
<Outputs Condition="'$(Configuration)|$(Platform)'=='SbieDebug|Win32'">$(SolutionDir)Bin\$(PlatformName)\$(Configuration)\NtCRT.lib</Outputs>
|
||||||
|
</CustomBuild>
|
||||||
<None Include="SboxDll32.def" />
|
<None Include="SboxDll32.def" />
|
||||||
<None Include="SboxDll64.def" />
|
<None Include="SboxDll64.def" />
|
||||||
<None Include="util_32.asm">
|
<None Include="util_32.asm">
|
||||||
|
|
|
@ -233,7 +233,10 @@
|
||||||
<None Include="util_32.asm">
|
<None Include="util_32.asm">
|
||||||
<Filter>hook</Filter>
|
<Filter>hook</Filter>
|
||||||
</None>
|
</None>
|
||||||
<None Include="..\..\common\except_handler3.asm">
|
<None Include="..\..\common\NtCRT\x64\ntdll.def">
|
||||||
|
<Filter>common</Filter>
|
||||||
|
</None>
|
||||||
|
<None Include="..\..\common\NtCRT\x86\ntdll.def">
|
||||||
<Filter>common</Filter>
|
<Filter>common</Filter>
|
||||||
</None>
|
</None>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -278,5 +281,8 @@
|
||||||
<CustomBuild Include="util_asm.asm">
|
<CustomBuild Include="util_asm.asm">
|
||||||
<Filter>hook</Filter>
|
<Filter>hook</Filter>
|
||||||
</CustomBuild>
|
</CustomBuild>
|
||||||
|
<CustomBuild Include="..\..\common\NtCRT\x86\except_handler3.asm">
|
||||||
|
<Filter>common</Filter>
|
||||||
|
</CustomBuild>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
Loading…
Reference in New Issue