From f7b99942f85f4c8c35058f1a8b1194cd4468bc6d Mon Sep 17 00:00:00 2001 From: midipix Date: Wed, 29 Jun 2016 10:49:47 -0400 Subject: free-standing environment: remove fluff from the argv/envp parsing facility. --- src/argv/ntapi_tt_env_vars.c | 93 +++++++------------------------------------- 1 file changed, 15 insertions(+), 78 deletions(-) (limited to 'src/argv/ntapi_tt_env_vars.c') diff --git a/src/argv/ntapi_tt_env_vars.c b/src/argv/ntapi_tt_env_vars.c index 4fe590c..5642101 100644 --- a/src/argv/ntapi_tt_env_vars.c +++ b/src/argv/ntapi_tt_env_vars.c @@ -9,104 +9,41 @@ #include "ntapi_impl.h" int32_t __stdcall __ntapi_tt_get_env_var_meta_utf16( - __in const uint32_t * crc32_table, __in wchar16_t * env_var_name, - __in uint32_t env_var_name_hash __optional, __in wchar16_t ** envp, __out nt_env_var_meta_utf16 * env_var_meta) { int idx; - uint32_t crc32; - unsigned char * byte_buffer; wchar16_t * wch; - #define EQUAL_SIGN 0x3D + #define EQUAL_SIGN 0x3D - /* step 1: crc32 of the target env_var_name */ - if (env_var_name_hash) - crc32 = env_var_name_hash; - else { - crc32 = 0 ^ 0xFFFFFFFF; + /* init */ + env_var_meta->name = 0; + env_var_meta->value = 0; + env_var_meta->envp_index = 0; + env_var_meta->flags = 0; - /* initialize byte_buffer */ - byte_buffer = (unsigned char *)env_var_name; - - /* iterate */ - while (*byte_buffer) { - /* two bytes at a time */ - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; - } - crc32 = (crc32 ^ 0xFFFFFFFF); - } - - /* initialize the env_var_meta structure */ - env_var_meta->name_hash = crc32; - env_var_meta->name = (wchar16_t *)0; - env_var_meta->value = (wchar16_t *)0; - env_var_meta->value_hash = 0; - env_var_meta->envp_index = 0; - env_var_meta->flags = 0; - - /* step 2: look for the environment variable in envp[] */ - idx = 0; - while (envp[idx] && (!env_var_meta->value)) { + /* lookup */ + for (idx=0; envp[idx] && !env_var_meta->value; idx++) { wch = envp[idx]; - /* find the equal sign */ - while ((*wch) && (*wch != EQUAL_SIGN)) + while (*wch && (*wch != EQUAL_SIGN)) wch++; if (*wch != EQUAL_SIGN) return NT_STATUS_ILLEGAL_CHARACTER; - /* hash the current environment variable */ - crc32 = 0 ^ 0xFFFFFFFF; - - /* initialize byte_buffer */ - byte_buffer = (unsigned char *)envp[idx]; - - /* iterate */ - while ((uintptr_t)(byte_buffer) < (uintptr_t)wch) { - /* two bytes at a time */ - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; - } - - if (env_var_meta->name_hash == (crc32 ^ 0xFFFFFFFF)) { - /* found it, get ready to hash the value */ + if (!(__ntapi->tt_strncmp_utf16( + envp[idx], + env_var_name, + wch - envp[idx]))) { wch++; - env_var_meta->name = envp[idx]; - env_var_meta->value = wch; + env_var_meta->name = envp[idx]; + env_var_meta->value = wch; env_var_meta->envp_index = idx; - } else { - idx++; - } - } - - if (env_var_meta->value) { - /* hash the value: utf-16, null-terminated */ - crc32 = 0 ^ 0xFFFFFFFF; - - /* initialize byte_buffer */ - byte_buffer = (unsigned char *)env_var_meta->value; - - /* iterate */ - while (*byte_buffer) { - /* two bytes at a time */ - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; - crc32 = (crc32 >> 8) ^ crc32_table[(crc32 ^ *byte_buffer) & 0xFF]; - byte_buffer++; } - - env_var_meta->value_hash = (crc32 ^ 0xFFFFFFFF); } return NT_STATUS_SUCCESS; } - -- cgit v1.2.3