void MyGetWindowModuleFileName(ScriptValue &s, ScriptValue *args) { wchar_t temp[MAX_PATH*2]; unsigned char *name; DWORD id; if (GetWindowThreadProcessId((HWND)args[0].intVal, &id)) { HANDLE h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, id); if (h == 0) { getDebugPriv(); h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, 0, id); } if (!h) return; int len = GetModuleFileNameEx(h, 0, temp, MAX_PATH*2); CloseHandle(h); if (len > 0 && len < MAX_PATH*2 && (name = UTF16toUTF8Alloc(temp))) { unsigned char *name2 = name; if (args[1].intVal == 0) { unsigned char * temp = name; while (*temp) { if (*temp == '\\') name2 = temp+1; temp++; } } CreateStringValue(s, name2); free(name); } } }
void MyGetWindowText(ScriptValue &s, ScriptValue *args) { int len = GetWindowTextLengthW((HWND)args[0].intVal); if (len > 0) { len += 200; wchar_t *temp = (wchar_t*) malloc(sizeof(wchar_t) * len); int len2 = GetWindowTextW((HWND)args[0].intVal, temp, len); CreateStringValue(s, temp, len2); free(temp); } }
void DictionaryValue::SetString(const std::string& path, const string16& in_value) { Set(path, CreateStringValue(in_value)); }
int BeDecode(ScriptValue &sv, StringValue *s, int *pos) { if (s->len < pos[0]) return 0; if (s->value[pos[0]] == 'i') { pos[0] ++; unsigned char *end = strchr(s->value + pos[0], 'e'); __int64 val; if (!ReadInt(s->value + pos[0], end, val)) return 0; CreateIntValue(sv, val); pos[0] = 1+(int)(end-s->value); } else if (s->value[pos[0]] == 'l') { pos[0] ++; CreateListValue(sv, 3); while (s->len > pos[0]) { if (s->value[pos[0]] == 'e') { pos[0] ++; return 1; } ScriptValue sv2; if (!BeDecode(sv2, s, pos) || !sv.listVal->PushBack(sv2)) { sv.Release(); return 0; } } sv.Release(); return 0; } else if (s->value[pos[0]] == 'd') { pos[0] ++; CreateDictValue(sv, 3); while (s->len > pos[0]) { if (s->value[pos[0]] == 'e') { pos[0] ++; return 1; } ScriptValue sv2, sv3; if (!BeDecode(sv2, s, pos)) { sv.Release(); return 0; } if (sv2.type != SCRIPT_STRING || !BeDecode(sv3, s, pos)) { sv2.Release(); sv.Release(); return 0; } if (!sv.dictVal->Add(sv, sv2)) { sv.Release(); return 0; } } sv.Release(); return 0; } else if (s->value[pos[0]] == 'n') { CreateNullValue(sv); pos[0]++; } else if (s->value[pos[0]] == 'f') { pos[0]++; if (pos[0] + 8 > s->len) return 0; double d; memcpy(&d, s->value+pos[0], 8); pos[0] += 8; CreateDoubleValue(sv, d); return 1; } else { unsigned char *end = strchr(s->value + pos[0], ':'); __int64 val; if (!ReadInt(s->value + pos[0], end, val) || val < 0) return 0; pos[0] = 1+(int)(end-s->value); if (pos[0] + val > s->len) return 0; if (!CreateStringValue(sv, s->value+pos[0], (int) val)) return 0; pos[0] += (int) val; } return 1; }
StringValue* StringValue::DeepCopy() const { return CreateStringValue(value_); }