|
1 |
| -#include <stdio.h> |
2 |
| -#include <malloc.h> |
3 |
| -#include <string.h> |
4 |
| - |
5 |
| -#include <conio.h> |
| 1 | +#include <Windows.h> |
| 2 | +#include <intrin.h> |
6 | 3 |
|
7 | 4 | #include "llshost.h"
|
8 | 5 |
|
9 |
| -int32_t main(const int32_t argc, const char **pArgv) |
| 6 | +__forceinline void SetZero(void *pData, const size_t size) |
| 7 | +{ |
| 8 | + uint8_t *pData8 = (uint8_t *)(pData); |
| 9 | + size_t i = 0; |
| 10 | + |
| 11 | + if (size >= sizeof(__m128i)) |
| 12 | + for (; i < size - (sizeof(__m128i) - 1); i += sizeof(__m128i)) |
| 13 | + _mm_storeu_si128((__m128i *)(pData8 + i), _mm_setzero_si128()); |
| 14 | + |
| 15 | + for (; i < size; i++) |
| 16 | + pData8[i] = 0; |
| 17 | +} |
| 18 | + |
| 19 | +#pragma function(memset) |
| 20 | +extern void *memset(void *pDst, int data, size_t size) |
| 21 | +{ |
| 22 | + size_t i = 0; |
| 23 | + uint8_t *const pDst8 = (uint8_t *const)pDst; |
| 24 | + const __m128i data128 = _mm_set1_epi8((char)data); |
| 25 | + |
| 26 | + if (size >= sizeof(__m128i)) |
| 27 | + for (; i < size - (sizeof(__m128i) - 1); i += sizeof(__m128i)) |
| 28 | + _mm_storeu_si128((__m128i *)(pDst8 + i), data128); |
| 29 | + |
| 30 | + for (; i < size; i++) |
| 31 | + pDst8[i] = (uint8_t)data; |
| 32 | + |
| 33 | + return pDst; |
| 34 | +} |
| 35 | + |
| 36 | +#pragma function(memcpy) |
| 37 | +extern void *memcpy(void *pDst, const void *pSrc, size_t size) |
10 | 38 | {
|
| 39 | + size_t i = 0; |
| 40 | + const uint8_t *const pSrc8 = (const uint8_t *)pSrc; |
| 41 | + uint8_t *const pDst8 = (uint8_t *)pDst; |
| 42 | + |
| 43 | + if (size >= sizeof(__m128i)) |
| 44 | + for (; i < size - (sizeof(__m128i) - 1); i += sizeof(__m128i)) |
| 45 | + _mm_storeu_si128((__m128i *)(pDst8 + i), _mm_loadu_si128((const __m128i *)(pSrc8 + i))); |
| 46 | + |
| 47 | + for (; i < size; i++) |
| 48 | + pDst8[i] = pSrc8[i]; |
| 49 | + |
| 50 | + return pDst; |
| 51 | +} |
| 52 | + |
| 53 | +#pragma comment (linker, "/ENTRY:entry_point") |
| 54 | +void entry_point() |
| 55 | +{ |
| 56 | + int32_t argc = 0; |
| 57 | + const wchar_t **pArgv = CommandLineToArgvW(GetCommandLineW(), &argc); |
| 58 | + |
| 59 | + HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE); |
| 60 | + |
11 | 61 | if (argc != 2)
|
12 | 62 | {
|
13 |
| - puts("Invalid Parameter.\n\nUsage: llscript_exec <Filename>"); |
14 |
| - puts("Build Time: " __TIMESTAMP__); |
15 |
| - return -1; |
| 63 | + const char out[] = "Invalid Parameter.\n\nUsage: llscript_exec <Filename>\nBuild Time: " __TIMESTAMP__ "\n"; |
| 64 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 65 | + ExitProcess((UINT)-1); |
16 | 66 | }
|
17 | 67 |
|
18 | 68 | uint8_t *pByteCode = NULL;
|
19 | 69 |
|
20 | 70 | // Read Bytecode from file.
|
21 | 71 | {
|
22 |
| - FILE *pFile = fopen(pArgv[1], "rb"); |
| 72 | + HANDLE file = CreateFileW(pArgv[1], GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); |
23 | 73 |
|
24 |
| - if (pFile == NULL) |
| 74 | + if (file == NULL || file == INVALID_HANDLE_VALUE) |
25 | 75 | {
|
26 |
| - fputs("Failed to open file.", stderr); |
27 |
| - return -1; |
| 76 | + const char out[] = "Failed to open file."; |
| 77 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 78 | + ExitProcess((UINT)-1); |
28 | 79 | }
|
29 | 80 |
|
30 |
| - fseek(pFile, 0, SEEK_END); |
31 |
| - const int64_t fileSize = _ftelli64(pFile); |
32 |
| - fseek(pFile, 0, SEEK_SET); |
| 81 | + LARGE_INTEGER fileSize = { 0 }; |
| 82 | + |
| 83 | + if (FALSE == GetFileSizeEx(file, &fileSize)) |
| 84 | + { |
| 85 | + const char out[] = "Failed to retrieve file size."; |
| 86 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 87 | + ExitProcess((UINT)-1); |
| 88 | + } |
33 | 89 |
|
34 |
| - if (fileSize <= 0) |
| 90 | + if (fileSize.QuadPart <= 0) |
35 | 91 | {
|
36 |
| - fputs("Invalid File.", stderr); |
37 |
| - return -1; |
| 92 | + const char out[] = "Invalid file size."; |
| 93 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 94 | + ExitProcess((UINT)-1); |
38 | 95 | }
|
39 | 96 |
|
40 |
| - pByteCode = (uint8_t *)malloc(fileSize); |
| 97 | + pByteCode = (uint8_t *)VirtualAlloc(NULL, (size_t)fileSize.QuadPart, MEM_COMMIT, PAGE_READWRITE); |
41 | 98 |
|
42 | 99 | if (pByteCode == NULL)
|
43 | 100 | {
|
44 |
| - fputs("Memory Allocation Failure.", stderr); |
45 |
| - return -1; |
| 101 | + const char out[] = "Memory Allocation Failure."; |
| 102 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 103 | + ExitProcess((UINT)-1); |
46 | 104 | }
|
47 | 105 |
|
48 |
| - if ((size_t)fileSize != fread(pByteCode, 1, (size_t)fileSize, pFile)) |
| 106 | + if (FALSE == ReadFile(file, pByteCode, fileSize.LowPart, NULL, NULL)) |
49 | 107 | {
|
50 |
| - fputs("Failed to read file.", stderr); |
51 |
| - return -1; |
| 108 | + const char out[] = "Failed to read file."; |
| 109 | + WriteFile(stdOut, out, sizeof(out), NULL, NULL); |
| 110 | + ExitProcess((UINT)-1); |
52 | 111 | }
|
53 | 112 |
|
54 |
| - fclose(pFile); |
| 113 | + CloseHandle(file); |
55 | 114 | }
|
56 | 115 |
|
57 | 116 | llshost_state_t state;
|
58 |
| - memset(&state, 0, sizeof(state)); |
| 117 | + SetZero(&state, sizeof(state)); |
59 | 118 |
|
60 | 119 | state.pCode = pByteCode;
|
61 | 120 |
|
62 | 121 | static uint8_t stack[LLS_DEFUALT_STACK_SIZE];
|
63 |
| - memset(stack, 0, sizeof(stack)); |
| 122 | + SetZero(stack, sizeof(stack)); |
64 | 123 | state.pStack = stack;
|
65 | 124 | state.stackSize = sizeof(stack);
|
66 | 125 |
|
67 | 126 | llshost_from_state(&state);
|
68 | 127 |
|
69 |
| - return 0; |
| 128 | + ExitProcess((UINT)0); |
| 129 | + return; |
70 | 130 | }
|
0 commit comments