summaryrefslogtreecommitdiff
path: root/thirdparty/mhook/disasm-lib/misc.c
diff options
context:
space:
mode:
Diffstat (limited to 'thirdparty/mhook/disasm-lib/misc.c')
-rw-r--r--thirdparty/mhook/disasm-lib/misc.c185
1 files changed, 185 insertions, 0 deletions
diff --git a/thirdparty/mhook/disasm-lib/misc.c b/thirdparty/mhook/disasm-lib/misc.c
new file mode 100644
index 00000000..c5b0ac61
--- /dev/null
+++ b/thirdparty/mhook/disasm-lib/misc.c
@@ -0,0 +1,185 @@
+// Copyright (C) 2002, Matt Conover (mconover@gmail.com)
+#include "misc.h"
+
+BOOL IsHexChar(BYTE ch)
+{
+ switch (ch)
+ {
+ case '0': case '1': case '2': case '3':
+ case '4': case '5': case '6': case '7':
+ case '8': case '9':
+ case 'A': case 'a': case 'B': case 'b':
+ case 'C': case 'c': case 'D': case 'd':
+ case 'E': case 'e': case 'F': case 'f':
+ return TRUE;
+ default:
+ return FALSE;
+ }
+}
+
+// NOTE: caller must free the buffer returned
+BYTE *HexToBinary(char *Input, DWORD InputLength, DWORD *OutputLength)
+{
+ DWORD i, j, ByteCount = 0;
+ char temp_byte[3];
+ BYTE *p, *ByteString = NULL;
+
+ if (!InputLength || !OutputLength) return NULL;
+ else *OutputLength = 0;
+
+ while (*Input && isspace(*Input)) { Input++; InputLength--; }
+ if (!*Input) return NULL;
+ if (Input[0] == '\"') { Input++; InputLength--; }
+ p = (BYTE *)strchr(Input, '\"');
+ if (p) InputLength--;
+
+ if (InputLength > 2 && Input[2] == ' ') // assume spaces
+ {
+ for (i = 0; i < InputLength; i += 3)
+ {
+ while (i < InputLength && isspace(Input[i])) i++; // skip over extra space, \r, and \n
+ if (i >= InputLength) break;
+
+ if (!IsHexChar(Input[i]))
+ {
+ //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i);
+ goto abort;
+ }
+
+ if (i+1 >= InputLength || !Input[i+1])
+ {
+ //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1);
+ goto abort;
+ }
+
+ if (i+2 < InputLength && Input[i+2] && !isspace(Input[i+2]))
+ {
+ //fprintf(stderr, "ERROR: Hex string is malformed at offset %lu (0x%04x)\n", i, i);
+ //fprintf(stderr, "Found '%c' (0x%02x) instead of space\n", Input[i+2], Input[i+2]);
+ goto abort;
+ }
+
+ ByteCount++;
+ }
+
+ if (!ByteCount)
+ {
+ //fprintf(stderr, "Error: no input (byte count = 0)\n");
+ goto abort;
+ }
+
+ ByteString = malloc(ByteCount+1);
+ if (!ByteString)
+ {
+ //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount);
+ goto abort;
+ }
+
+ memset(ByteString, 0, ByteCount+1);
+ for (i = 0, j = 0; j < ByteCount; i += 3, j++)
+ {
+ while (isspace(Input[i])) i++; // skip over extra space, \r, and \n
+ temp_byte[0] = Input[i];
+ temp_byte[1] = Input[i+1];
+ temp_byte[2] = 0;
+ ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16);
+ }
+ }
+ else if (InputLength > 2 && Input[0] == '\\')
+ {
+ for (i = 0; i < InputLength; i += 2)
+ {
+ if (Input[i] != '\\' || (Input[i+1] != 'x' && Input[i+1] != '0'))
+ {
+ //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i);
+ goto abort;
+ }
+ i += 2;
+
+ if (!IsHexChar(Input[i]))
+ {
+ //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i);
+ goto abort;
+ }
+ if (i+1 >= InputLength || !Input[i+1])
+ {
+ //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1);
+ goto abort;
+ }
+
+ ByteCount++;
+ }
+
+ if (!ByteCount)
+ {
+ //fprintf(stderr, "Error: no input (byte count = 0)\n");
+ goto abort;
+ }
+
+ ByteString = malloc(ByteCount+1);
+ if (!ByteString)
+ {
+ //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount);
+ goto abort;
+ }
+
+ memset(ByteString, 0, ByteCount+1);
+ for (i = j = 0; j < ByteCount; i += 2, j++)
+ {
+ i += 2;
+ temp_byte[0] = Input[i];
+ temp_byte[1] = Input[i+1];
+ temp_byte[2] = 0;
+ ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16);
+ }
+ }
+ else // assume it is a hex string with no spaces with 2 bytes per character
+ {
+ for (i = 0; i < InputLength; i += 2)
+ {
+ if (!IsHexChar(Input[i]))
+ {
+ //fprintf(stderr, "ERROR: invalid hex character at offset %lu (0x%04x)\n", i, i);
+ goto abort;
+ }
+ if (i+1 >= InputLength || !Input[i+1])
+ {
+ //fprintf(stderr, "ERROR: hex string terminates unexpectedly at offset %lu (0x%04x)\n", i+1, i+1);
+ goto abort;
+ }
+
+ ByteCount++;
+ }
+
+ if (!ByteCount)
+ {
+ //fprintf(stderr, "Error: no input (byte count = 0)\n");
+ goto abort;
+ }
+
+ ByteString = malloc(ByteCount+1);
+ if (!ByteString)
+ {
+ //fprintf(stderr, "ERROR: failed to allocate %lu bytes\n", ByteCount);
+ goto abort;
+ }
+
+ memset(ByteString, 0, ByteCount+1);
+ for (i = 0, j = 0; j < ByteCount; i += 2, j++)
+ {
+ temp_byte[0] = Input[i];
+ temp_byte[1] = Input[i+1];
+ temp_byte[2] = 0;
+ ByteString[j] = (BYTE)strtoul(temp_byte, NULL, 16);
+ }
+ }
+
+ *OutputLength = ByteCount;
+ return ByteString;
+
+abort:
+ if (OutputLength) *OutputLength = 0;
+ if (ByteString) free(ByteString);
+ return NULL;
+}
+