diff --git a/.gitignore b/.gitignore index cf2fa14..41ded14 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,4 @@ /target -*.bndb \ No newline at end of file +*.bndb +/toolchain +/research \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 4014b09..cd1c15f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,139 @@ adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [0.4.0] - 2026-10-08 + +P-Code analysis: the opcode table covers every handler of `MSVBVM60.DLL` +6.00.8176 and 6.00.9848, and new APIs give each instruction's stack effect, +call target and signature, a stack simulation over a procedure, and the +interfaces of the objects in its frame. Form data, hosted controls and many +structure readers were corrected against compiled fixtures. + +### Added + +- **Stack effects** (`pcode::stackeffect`, `pcode::movement`): + `Instruction::{stack_effect, pr_source, movement, procedure_return, + value_type, frame_slots, jump_targets}`: what an instruction pops and + pushes on the evaluation and x87 stacks, where Pr comes from, what a load + or store moves and its side effects, and how an `ExitProc*` returns. +- **Stack simulation** (`pcode::stacksim`): `ProcedureStack::simulate` + gives the stacks at every instruction over the control flow, including + `GoSub` depths (`shared_gosub_code`) and paths cut at unknown callees. +- **Call resolution** (`pcode::calltarget`): `CallResolver`, `CallSignature` + and `Callee` name the callee and argument widths of every call opcode: + project procedures through vtables built from method link tables (forms + and UserControls after their designer interface and control getters), + `Declare`s, runtime imports, control getters, variable accessors, + `RaiseEvent`, late-bound members and external interfaces. +- **External interfaces**: `InterfaceCatalog`, `InterfaceMember` (with + `returns_interface`) and `CallResolver::with_interfaces` let a host supply + type library members; `RuntimeInterfaces` covers the runtime's own + (control arrays, `Err`). +- **Object slot typing**: `SlotInterfaces`, `ProjectSlots` and + `CallResolver::{resolve_with_slots, simulate_procedure, + simulate_procedure_seeded, infer_project_slots, returned_interface}` infer + the interface of the object in each frame slot from casts, typed calls, + call results and arguments across procedures, so typed `VCall*` without an + IID resolve. +- **Opcode table**: columns `stack`, `popped`, `object`, `movement` and + per-build handler addresses; `OpcodeInfo::{popped, rule_at, fpu_callee, + pr_load, stack, receiver, handler, value_type}`, `StackRule`, `Receiver`; + `OpcodeSemantics::{GoSub, GoSubReturn, Resume, OnError, Raise, End}`; + `CallKind::Event`, `ArgumentOrder`; `Operand::{JumpTable, FrameList}`. +- **Procedures**: `ProcDscInfo::{zeroed_frame, line_numbers, + line_table_offset}`, `PCodeMethod::error_handling`, + `FrameResolver::{for_method, declarations}`, `FrameVar::{ReturnValue, + HiddenResult}`, `FrameOwner`. +- **Constant pool and imports**: `ConstantPool::{entry_at, entries, va_at, + string_at, name_at, guid_at, api_stub_at}` and `PoolEntry`; + `imports::ImportTable` (`VbProject::imports`). +- **Objects**: `vb::designer::Designer`, `VbObject::{designer, object_kind, + static_bytes, instancing}`, `Instancing`, + `ObjectTypeFlags::{is_exposed, is_global_namespace}`, + `VbProject::com_registration`, `MethodLink::kind`, `MethodEntry::Declare`, + `OptionalObjectInfo::basic_class_object_size`, `proc_dsc_va` on + `CodeEntry` and `CodeEntrypoint`, `ProjectInfo2Iter`, `ProjectData::path`, + `GuiTableEntry::object_index`, `ExternalDeclareInfo::{ordinal, + is_by_ordinal, resolve_cache_va}`. +- **Hosted ActiveX controls**: `ExternalComponentEntry::{clsid, + events_iid, default_iid, instance_events_iid, array_events_iid, + declared_event_count, license_key, event_dispids, event_conversions, + bindable_properties, extender_flags, control_flags}`, `BindableProperty`, + `ParamConversion`, `ConversionKind`; extender events are named. +- **Form data**: `FormDataParser::{form_name, form_type}`, + `FormControlRecord::has_submenu`, `Property::index`, + `PropertyIter::{position, at_terminator}`, `PropertyValue::{Single, + Bounds, Scale}`, `ControlBounds`, `ScaleState`, `UserScale`. +- `impl FromStr for Guid` and `Error::InvalidGuid`. +- 34 runtime exports missing from the export table. +- Compiled test fixtures covering classes, forms, MDI, controls, ActiveX + DLL/OCX/EXE projects, hosted ActiveX controls, every intrinsic control + property, native builds and opcode coverage, with a Docker/Wine build and + test suites for the stack simulation, call resolution and structures. + +### Changed + +- Opcode table stack effects: a Variant on the evaluation stack is its + address (one slot); `Mem*`, `VCall*` and `Late*` take their object from + Pr and the Pr loaders push nothing; the x87 result of `ImpAdCallFPR4`, + `VCallFPR8` and `ThisVCall*` is the callee's. +- `FuncTypDesc` reads the entry count, property kind, `ParamArray` flag and + type list as the compiler writes them; `ArgType` is a struct. +- Every P-Code procedure's arguments start at `ebp+0x0C` + (`pcode_frame::FIRST_ARG`); `FrameResolver` names `ebp+8` `me` or + `module_data`. +- `ProcOptFlags::{FRIEND, ADJUSTED_ME_AS_PRIMARY}` replace + `HAS_ERROR_HANDLER` / `HAS_RESUME_NEXT`. +- Renamed: `Callee::Api` to `Declare`; `StackEffect::writes_pr` to `pr`; + `PrivateObjectDescriptor::{func_count, func_count2, var_count, + desc_size}` to `member_count`, `event_count`, `var_stub_count`, + `instance_size`; `VbObject::class_form_public_bytes` to `public_bytes` + (covers modules); `OptionalObjectInfo::pcode_count_raw` to + `inherited_vtable_slots`; `EventHandlerThunk::{event_dispatch_id, + return_handler_va}` to `this_adjust`, `engine_thunk_va`; + `PropType::LongPair` to `Bounds`. +- An unknown property index is named `"?"` (with `Property::index`) + instead of a leaked string. +- `examples/dump` annotates calls with their callee and effect. + +### Removed + +- `ControlPosition` / `PropertyValue::Position` (now `ControlBounds`), + `decode_form_type`, `MethodLink::this_adjust`, `OpcodeInfo::{mem_read, + mem_write}` (now `movement`), `ClassFormPublicBytes::{default_iid, + events_iid}`, `eventname::standard_event_name`. +- `ExternalComponentEntry::{info_block_size, event_count, event_names}`: + the fields are the licence key length and bindable properties. +- `ConstantPool`'s byte-offset accessors and `ConstPoolEntry`, + `ImportResolver` / `CallTarget`, `PublicVarTable` and its iterator, + `OptionalObjectInfo::{pcode_count, is_native_sentinel}`, + `ExternalDeclareInfo::{api_stub, native_stub_va}`. + +### Fixed + +- Opcode table rows (arities of `ForVar`, `ForStepVar`, `PutMem8`, + `PutMemVar`, `VerifyVarObj`, the `Next*` and `ExitProcCb*` forms; + operand kinds of `ParmAry1St`, `WMemSt*`, `LitVarStr`, `CStrVarVal`; + several instruction sizes) and runtime export signatures (`Rnd`, + `rtcDateAdd`, `rtcVarFromFormatVar`, `rtDecFromVar`, the `VBDll*` + exports). +- Late-bound member names are null-terminated UTF-16, not BSTRs. +- Form data: the designer's own record is no longer decoded as properties; + `ScaleMode` carries its scale and `AutoRedraw` / `FontTransparent` (a + PictureBox's misaligned the rest of its record); every menu after the + first was lost; control bounds, Singles and signed coordinates decode + correctly; an empty OLE container's `OleObjectBlob` has no data; 52 + property names and the control GUID table follow the runtime. +- `GuiObjectType` codes, designer vtable bases, control getters of + controls without handlers, and the IDs and DISPIDs of hosted controls. +- `VbObject::{func_type_descs, has_pcode, events, methods, method_name}`, + module variable tables, `ControlTypeIter`, `MethodLinkIterator`, + `ExternalTableEntry::as_typelib` and the `ComRegObject` type tests. +- `code_entrypoints` resolves P-Code `Sub Main`; `code_entries` lists each + method once. +- Counts read from the file are capped at what the data can hold, and a + packer's `push imm32; ret` entry point is not taken for a VB6 header. + ## [0.3.2] - 2026-09-13 ### Added @@ -360,7 +493,8 @@ Affects `vbobject.rs`, `pcodemethod.rs`, `methodlink.rs`, Initial public release. -[Unreleased]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.3.2...HEAD +[Unreleased]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.4.0...HEAD +[0.4.0]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.3.2...v0.4.0 [0.3.2]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.3.1...v0.3.2 [0.3.1]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.3.0...v0.3.1 [0.3.0]: https://github.com/ATRAPSLLC/visualbasic-rs/compare/v0.2.1...v0.3.0 diff --git a/Cargo.lock b/Cargo.lock index c417ea0..b64036d 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -357,7 +357,7 @@ checksum = "e6e4313cd5fcd3dad5cafa179702e2b244f760991f45397d14d4ebf38247da75" [[package]] name = "visualbasic" -version = "0.3.2" +version = "0.4.0" dependencies = [ "goblin", "proptest", diff --git a/Cargo.toml b/Cargo.toml index caff93c..218afae 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "visualbasic" -version = "0.3.2" +version = "0.4.0" edition = "2024" rust-version = "1.88" description = "Parse and inspect Visual Basic 6 compiled binaries" diff --git a/README.md b/README.md index 8e802c5..1e877a1 100644 --- a/README.md +++ b/README.md @@ -50,11 +50,15 @@ for obj in project.objects()? { - **PE entry point** detection (EXE push-stub and DLL export patterns) - **VBHeader**, **ProjectData**, **ObjectTable** and the full structure chain - **PublicObjectDescriptor**, **ObjectInfo**, **OptionalObjectInfo**, **PrivateObjectDescriptor** -- **P-Code bytecode**: opcode tables, operand decoding, streaming instruction iterator +- **P-Code bytecode**: opcode tables, operand decoding, streaming instruction + iterator; each opcode's effect on the evaluation and x87 stacks and on Pr, + the object register, read from the runtime's handlers - **Controls**: ControlInfo, event sink vtables, event handler thunks - **COM metadata**: GUIDs, TypeLib registration, external component tables - **Form binary data**: control trees, property streams, font/picture resources -- **MSVBVM60.DLL exports**: 169 runtime function signatures with parameter types +- **MSVBVM60.DLL exports**: every export by name and ordinal, with signatures + for most, so the runtime functions P-Code imports by ordinal are named +- **Imports**: the PE import table by import address table slot ## High-level walkers @@ -73,6 +77,56 @@ each substructure by hand: - [`VbProject::diagnostics()`] - eager parse-health probe surfacing missing optional structures and known-anomaly patterns. +## Analysing P-Code + +The `pcode` module documents the interpreter (dispatch, the two stacks, Pr, +the frame, calling conventions) and describes each instruction's runtime +effect, as the handlers of `MSVBVM60.DLL` implement it: + +```rust,no_run +use visualbasic::{ + VbProject, + pcode::{calltarget::CallResolver, decoder::Instruction, stacksim::ProcedureStack}, + project::MethodEntry, +}; + +# fn main() -> Result<(), Box> { +let bytes = std::fs::read("sample.exe")?; +let project = VbProject::from_bytes(&bytes)?; +let calls = CallResolver::new(&project)?; +for (object_index, object) in project.objects()?.enumerate() { + let object_index = u16::try_from(object_index)?; + for entry in object?.methods()? { + let Ok(MethodEntry::PCode(method)) = entry else { continue }; + let code: Vec = method.instructions()?.collect::>()?; + // Each instruction's effect: values popped (last operand first, from + // both stacks), the value pushed, the receiver, Pr's source. + for insn in &code { + let effect = insn.stack_effect(calls.resolve(object_index, insn).as_ref()); + println!("{insn} {effect:?}"); + } + // The stacks over the procedure's control flow, every value + // resolved to the width its producer pushed. + let stack = ProcedureStack::simulate(&code, method.pcode_bytes(), &|insn, pr| { + calls.resolve_with_pr(object_index, insn, pr) + }); + for (index, cut) in stack.cuts() { + println!("path cut at {:04x}: {cut:?}", code[index].offset); + } + } +} +# Ok(()) +# } +``` + +- [`CallResolver`] gives each call's callee (a project procedure, a + `Declare` function, an imported runtime function, an external interface by + IID and vtable offset, a late-bound member) and signature. +- [`FrameResolver`] names `%a` frame offsets: arguments, locals, the + interpreter's slots. +- [`ConstantPool`] reads pool entries by the index `%s` / `%c` operands + carry. + ## Cargo features | Feature | Default | Effect | diff --git a/build.rs b/build.rs index 5461c11..81553ce 100644 --- a/build.rs +++ b/build.rs @@ -17,6 +17,47 @@ use std::fs; use std::io::Write; use std::path::Path; +/// Splits one CSV line into its fields, honouring double-quoted fields (a +/// quoted field may hold commas; `""` inside one is a quote). +fn split_csv_line(line: &str) -> Vec { + let mut fields = Vec::new(); + let mut field = String::new(); + let mut quoted = false; + let mut chars = line.chars().peekable(); + while let Some(c) = chars.next() { + match c { + '"' if quoted && chars.peek() == Some(&'"') => { + field.push('"'); + chars.next(); + } + '"' => quoted = !quoted, + ',' if !quoted => fields.push(std::mem::take(&mut field)), + _ => field.push(c), + } + } + fields.push(field); + fields +} + +/// One row of `data/opcodes.csv`. +#[derive(Clone)] +struct OpcodeEntry { + size: i8, + mnemonic: String, + operand_format: String, + pops: i8, + pushes: i8, + fpu_pops: u8, + fpu_push: u8, + fpu_callee: bool, + stack: String, + popped: String, + object: String, + movement: String, + category: String, + handler: u32, +} + fn main() { println!("cargo:rerun-if-changed=data/opcodes.csv"); println!("cargo:rerun-if-changed=data/vb6_control_guids.csv"); @@ -29,19 +70,6 @@ fn main() { let csv_content = fs::read_to_string(csv_path).expect("Failed to read data/opcodes.csv"); // Parse CSV into (table, opcode) -> OpcodeEntry - #[derive(Clone)] - struct OpcodeEntry { - size: i8, - mnemonic: String, - operand_format: String, - pops: i8, - pushes: i8, - fpu_pops: u8, - fpu_push: u8, - mem_read: u8, - mem_write: u8, - category: String, - } let mut entries: HashMap<(u8, u8), OpcodeEntry> = HashMap::new(); @@ -55,8 +83,10 @@ fn main() { continue; } - // Parse: table,opcode,size,mnemonic,operand_format,pops,pushes,fpu_pops,fpu_push,mem_read,mem_write,category,handler,notes - let parts: Vec<&str> = line.splitn(14, ',').collect(); + // Parse: table,opcode,size,mnemonic,operand_format,pops,pushes,fpu_pops,fpu_push, + // stack,popped,object,movement,category,handler_8176,handler_9848,notes + let fields = split_csv_line(line); + let parts: Vec<&str> = fields.iter().map(String::as_str).collect(); if parts.len() < 5 { panic!("too few columns at line {}", line_num + 1); } @@ -88,22 +118,37 @@ fn main() { .get(7) .and_then(|s| s.trim().parse().ok()) .unwrap_or(0); - let fpu_push: u8 = parts - .get(8) - .and_then(|s| s.trim().parse().ok()) - .unwrap_or(0); - let mem_read: u8 = parts + let fpu_push_text = parts.get(8).map(|s| s.trim()).unwrap_or(""); + let fpu_callee = fpu_push_text == "c"; + let fpu_push: u8 = if fpu_callee { + 0 + } else { + fpu_push_text.parse().unwrap_or(0) + }; + let stack = parts .get(9) - .and_then(|s| s.trim().parse().ok()) - .unwrap_or(0); - let mem_write: u8 = parts + .map(|s| s.trim().to_string()) + .unwrap_or_default(); + let popped = parts .get(10) - .and_then(|s| s.trim().parse().ok()) - .unwrap_or(0); - let category = parts + .map(|s| s.trim().to_string()) + .unwrap_or_default(); + let object = parts .get(11) .map(|s| s.trim().to_string()) .unwrap_or_default(); + let movement = parts + .get(12) + .map(|s| s.trim().to_string()) + .unwrap_or_default(); + let category = parts + .get(13) + .map(|s| s.trim().to_string()) + .unwrap_or_default(); + let handler = parts + .get(14) + .and_then(|s| u32::from_str_radix(s.trim().trim_start_matches("0x"), 16).ok()) + .unwrap_or(0); entries.insert( (table, opcode), @@ -115,9 +160,13 @@ fn main() { pushes, fpu_pops, fpu_push, - mem_read, - mem_write, + fpu_callee, + stack, + popped, + object, + movement, category, + handler, }, ); } @@ -166,14 +215,19 @@ fn main() { pushes: 0, fpu_pops: 0, fpu_push: 0, - mem_read: 0, - mem_write: 0, + fpu_callee: false, + stack: String::new(), + popped: String::new(), + object: String::new(), + movement: String::new(), category: String::new(), + handler: 0, }; let entry = entries.get(&(table_idx as u8, opcode)).unwrap_or(&default); let semantics_str = classify_semantics(&entry.mnemonic, &entry.category); let data_type_str = classify_data_type(&entry.mnemonic); + let value_type_str = classify_value_type(&entry.mnemonic, &entry.category); let fpu_inplace = classify_fpu_inplace( &entry.mnemonic, &entry.category, @@ -181,13 +235,16 @@ fn main() { entry.fpu_push, ); + let stack_str = classify_stack_rule(&entry.stack, table_idx, opcode); + let (receiver_str, pr_load) = classify_object(&entry.object, table_idx, opcode); + let (popped, rule_at) = parse_popped(entry, table_idx, opcode); writeln!( out, - " OpcodeInfo {{ table: {}, index: 0x{:02X}, size: {}, mnemonic: {:?}, operand_format: {:?}, pops: {}, pushes: {}, fpu_pops: {}, fpu_push: {}, fpu_inplace: {}, mem_read: {}, mem_write: {}, category: {:?}, semantics: {}, data_type: {} }},", + " OpcodeInfo {{ table: {}, index: 0x{:02X}, size: {}, mnemonic: {:?}, operand_format: {:?}, pops: {}, pushes: {}, popped: {}, rule_at: {}, fpu_pops: {}, fpu_push: {}, fpu_callee: {}, fpu_inplace: {}, stack: {}, receiver: {}, pr_load: {}, movement: {:?}, category: {:?}, semantics: {}, data_type: {}, value_type: {}, handler: {:#010X} }},", variant, opcode, entry.size, entry.mnemonic, entry.operand_format, - entry.pops, entry.pushes, entry.fpu_pops, entry.fpu_push, fpu_inplace, - entry.mem_read, entry.mem_write, entry.category, - semantics_str, data_type_str + entry.pops, entry.pushes, popped, rule_at, entry.fpu_pops, entry.fpu_push, + entry.fpu_callee, fpu_inplace, stack_str, receiver_str, pr_load, entry.movement, + entry.category, semantics_str, data_type_str, value_type_str, entry.handler ) .unwrap(); } @@ -307,6 +364,57 @@ fn main() { generate_msvbvm60_exports(&out_dir); } +/// Parses the `popped` column into `Pop` initializers, last operand first, +/// and the position of the `*` marking the operand-dependent run (0 when +/// absent). +/// +/// Panics when the evaluation-stack widths do not sum to `pops`, the `f`s do +/// not count `fpu_pops`, a `*` disagrees with the `stack` column, or the +/// opcode would push onto both stacks. +fn parse_popped(entry: &OpcodeEntry, table: usize, opcode: u8) -> (String, usize) { + let mut pops = Vec::new(); + let mut slots = 0i32; + let mut fpu = 0u8; + let mut rule_at = None; + for token in entry.popped.split_whitespace() { + match token { + "*" => rule_at = Some(pops.len()), + "f" => { + fpu += 1; + pops.push("Pop::X87".to_string()); + } + _ => { + let width = token.parse::().unwrap_or_else(|_| { + panic!("{table},0x{opcode:02X}: bad popped token {token:?}") + }); + slots += i32::from(width); + pops.push(format!("Pop::Eval({width})")); + } + } + } + let implemented = entry.size != 0 && entry.mnemonic != "InvalidExcode"; + if implemented && (slots != i32::from(entry.pops) || fpu != entry.fpu_pops) { + panic!( + "{table},0x{opcode:02X} {}: popped {:?} is {slots} slots and {fpu} x87 values, \ + pops {} and fpu_pops {}", + entry.mnemonic, entry.popped, entry.pops, entry.fpu_pops + ); + } + if implemented && rule_at.is_some() != !entry.stack.is_empty() { + panic!( + "{table},0x{opcode:02X} {}: popped {:?} disagrees with stack {:?}", + entry.mnemonic, entry.popped, entry.stack + ); + } + if implemented && entry.pushes > 0 && (entry.fpu_push > 0 || entry.fpu_callee) { + panic!( + "{table},0x{opcode:02X} {}: pushes onto both stacks", + entry.mnemonic + ); + } + (format!("&[{}]", pops.join(", ")), rule_at.unwrap_or(0)) +} + /// Generates `vb6_data_generated.rs` containing control GUIDs, event templates, /// and constant name tables. fn generate_vb6_data(out_dir: &str) { @@ -318,14 +426,16 @@ fn generate_vb6_data(out_dir: &str) { generate_vb6_constants(&mut out); } -/// Generates exact CLSID-to-name lookup for VB6 intrinsic controls. +/// Generates the GUID-to-control-class lookup for the GUIDs a ControlInfo +/// names (the control's events interface, its control-array variant, its +/// coclass). fn generate_control_guids(out: &mut fs::File) { let guid_csv = fs::read_to_string("data/vb6_control_guids.csv") .expect("Failed to read data/vb6_control_guids.csv"); writeln!( out, - "/// Exact CLSID-to-name lookup for VB6 intrinsic controls." + "/// Exact GUID-to-class lookup for VB6 intrinsic controls and designers." ) .unwrap(); writeln!(out, "/// Generated from data/vb6_control_guids.csv.").unwrap(); @@ -336,16 +446,17 @@ fn generate_control_guids(out: &mut fs::File) { .unwrap(); writeln!(out, " static TABLE: &[([u8; 16], &str)] = &[").unwrap(); - for (i, line) in guid_csv.lines().enumerate() { - if i == 0 || line.trim().is_empty() { + for line in guid_csv.lines() { + let line = line.trim(); + if line.is_empty() || line.starts_with('#') || line == "guid,name" { continue; } let mut parts = line.splitn(2, ','); - let clsid_str = parts.next().expect("missing clsid").trim(); + let guid_str = parts.next().expect("missing guid").trim(); let name = parts.next().expect("missing name").trim(); - // Parse GUID string: "33AD4ED0-6699-11CF-B70C-00AA0060D393" - let guid_bytes = parse_guid_string(clsid_str); + // Parse GUID string: "33AD4EE2-6699-11CF-B70C-00AA0060D393" + let guid_bytes = parse_guid_string(guid_str); writeln!( out, " ([{}], {:?}),", @@ -369,103 +480,47 @@ fn generate_control_guids(out: &mut fs::File) { writeln!(out).unwrap(); } -/// Generates event template arrays for intrinsic controls. +/// Generates the event names of each control class by event sink slot. fn generate_event_templates(out: &mut fs::File) { let events_csv = fs::read_to_string("data/vb6_events.csv").expect("Failed to read data/vb6_events.csv"); - let mut standard_events: Vec<(usize, String)> = Vec::new(); - let mut form_events: Vec<(usize, String)> = Vec::new(); - let mut timer_events: Vec<(usize, String)> = Vec::new(); - let mut usercontrol_events: Vec<(usize, String)> = Vec::new(); - - for (i, line) in events_csv.lines().enumerate() { - if i == 0 || line.trim().is_empty() { + // Control classes in first-seen order, each with its (slot, name) rows. + let mut classes: Vec<(String, Vec<(u16, String)>)> = Vec::new(); + for line in events_csv.lines() { + let line = line.trim(); + if line.is_empty() || line.starts_with('#') || line == "control,slot,name" { continue; } let mut parts = line.splitn(3, ','); - let template = parts.next().expect("missing template").trim(); - let slot: usize = parts + let class = parts.next().expect("missing control").trim().to_string(); + let slot: u16 = parts .next() .expect("missing slot") .trim() .parse() .expect("bad slot"); let name = parts.next().expect("missing name").trim().to_string(); - - match template { - "standard" => standard_events.push((slot, name)), - "form" => form_events.push((slot, name)), - "timer" => timer_events.push((slot, name)), - "usercontrol" => usercontrol_events.push((slot, name)), - _ => panic!("unknown event template: {template}"), + match classes.iter_mut().find(|(c, _)| *c == class) { + Some((_, rows)) => rows.push((slot, name)), + None => classes.push((class, vec![(slot, name)])), } } - standard_events.sort_by_key(|(s, _)| *s); - form_events.sort_by_key(|(s, _)| *s); - timer_events.sort_by_key(|(s, _)| *s); - usercontrol_events.sort_by_key(|(s, _)| *s); - writeln!( out, - "/// Standard 24-event template for intrinsic controls." + "/// Event names by control class: `(class, [(sink slot, event name)])`." ) .unwrap(); writeln!(out, "/// Generated from data/vb6_events.csv.").unwrap(); - writeln!( - out, - "pub static STANDARD_EVENTS: [&str; {}] = [", - standard_events.len() - ) - .unwrap(); - for (_, name) in &standard_events { - writeln!(out, " {name:?},").unwrap(); - } - writeln!(out, "];").unwrap(); - writeln!(out).unwrap(); - - writeln!(out, "/// Form lifecycle event template.").unwrap(); - writeln!( - out, - "pub static FORM_EVENTS: [&str; {}] = [", - form_events.len() - ) - .unwrap(); - for (_, name) in &form_events { - writeln!(out, " {name:?},").unwrap(); - } - writeln!(out, "];").unwrap(); - writeln!(out).unwrap(); - - // Timer overrides: slot 0 = "Timer" instead of "Click" - writeln!(out, "/// Timer event overrides (slot, name).").unwrap(); - writeln!(out, "pub static TIMER_EVENTS: &[(usize, &str)] = &[",).unwrap(); - for (slot, name) in &timer_events { - writeln!(out, " ({slot}, {name:?}),").unwrap(); - } - writeln!(out, "];").unwrap(); - writeln!(out).unwrap(); - - // UserControl extra events (slots 24+ beyond standard template) - writeln!( - out, - "/// UserControl extra events beyond the standard 24-event template." - ) - .unwrap(); - writeln!( - out, - "/// Slot numbers are relative (0 = slot 24 in the vtable)." - ) - .unwrap(); - writeln!( - out, - "pub static USERCONTROL_EVENTS: [&str; {}] = [", - usercontrol_events.len() - ) - .unwrap(); - for (_, name) in &usercontrol_events { - writeln!(out, " {name:?},").unwrap(); + writeln!(out, "pub static EVENTS: &[(&str, &[(u16, &str)])] = &[").unwrap(); + for (class, mut rows) in classes { + rows.sort_by_key(|(slot, _)| *slot); + writeln!(out, " ({class:?}, &[").unwrap(); + for (slot, name) in rows { + writeln!(out, " ({slot}, {name:?}),").unwrap(); + } + writeln!(out, " ]),").unwrap(); } writeln!(out, "];").unwrap(); writeln!(out).unwrap(); @@ -564,7 +619,7 @@ fn normalize_operand_format(raw: &str) -> String { if chars[i] == '%' && i + 1 < chars.len() { let spec = chars[i + 1]; match spec { - '1' | '2' | '4' | 'a' | 's' | 'l' | 'c' | 'v' | 'x' | '}' => { + '1' | '2' | '4' | 'a' | 's' | 'l' | 'c' | 'v' | 'x' | 'N' | 'D' | 'L' | 'F' => { result.push(format!("%{spec}")); i += 2; continue; @@ -634,10 +689,10 @@ fn generate_control_properties(out_dir: &str) { (4, 0) => "Byte", (5, 0) => "Long", // OLE_COLOR (6, 0) => "Byte", // Enum - (6, 3) => "Long", // Byte + 3B callback (ScaleMode) + (6, 3) => "Scale", // ScaleMode + scale state (7, 0) => "Long", // Single (8, 0) | (9, 0) | (10, 0) | (11, 0) => "Long", // Twips - (8, 4) => "LongPair", // Left + Top callback + (8, 4) => "Bounds", // Left, Top, Width, Height (8, 12) => "Size16", // ClientSize + 12B callback (13, 0) => "TagStr", (20, _) => "Font", // 11B + nameLen callback @@ -684,7 +739,7 @@ fn generate_control_properties(out_dir: &str) { ) .unwrap(); writeln!(out, " pub ser_type: u8,").unwrap(); - writeln!(out, " /// Extra callback bytes (0=none, 3=ScaleMode, 4=LeftTop, 12=ClientSize, -1=Font nameLen).").unwrap(); + writeln!(out, " /// Extra callback bytes (0=none, 3=ScaleMode's scale state, 4=Bounds, 12=ClientSize, -1=Font nameLen).").unwrap(); writeln!(out, " pub callback_bytes: i8,").unwrap(); writeln!(out, "}}").unwrap(); writeln!(out).unwrap(); @@ -804,12 +859,12 @@ fn generate_control_properties(out_dir: &str) { /// Detected via: unary category + FPU data type suffix + no explicit /// fpu push/pop (the push/pop are implicit, cancelling out). fn classify_fpu_inplace(mnemonic: &str, category: &str, fpu_pops: u8, fpu_push: u8) -> bool { - // Only unary and arithmetic categories can modify TOS in place - if category != "unary" && category != "arith" { + // Only unary, arithmetic and conversion categories rewrite ST0 in place + if category != "unary" && category != "arith" && category != "convert" { return false; } - // Must not have explicit FPU push/pop (those are stack-changing) - if fpu_pops != 0 || fpu_push != 0 { + // In place: consumes ST0 and produces one value where it was + if fpu_pops != 1 || fpu_push != 1 { return false; } // Must operate on an FPU data type @@ -817,6 +872,22 @@ fn classify_fpu_inplace(mnemonic: &str, category: &str, fpu_pops: u8, fpu_push: matches!(dt, Some("R4" | "R8" | "FPR4" | "FPR8" | "Date")) } +/// The VB type an instruction's handler and the compiler fix, as a +/// `Some(PCodeDataType::X)` / `None` expression: an operation's operand type +/// (arithmetic, unary, comparison), a conversion's target type, an x87 move's +/// float type, a string or Variant literal's type; `None` for a move whose +/// suffix names only a width. +fn classify_value_type(mnemonic: &str, category: &str) -> String { + match category { + "arith" | "unary" | "compare" => classify_data_type(mnemonic), + "convert" => classify_convert_types(mnemonic).1, + "load_lit" if mnemonic == "LitStr" => "Some(PCodeDataType::Str)".to_string(), + "load_lit" if mnemonic.starts_with("LitVar") => "Some(PCodeDataType::Var)".to_string(), + _ if mnemonic.contains("FPR4") || mnemonic.contains("FPR8") => classify_data_type(mnemonic), + _ => "None".to_string(), + } +} + fn classify_data_type(mnemonic: &str) -> String { let dt = extract_data_type_suffix(mnemonic); match dt { @@ -898,6 +969,68 @@ fn extract_data_type_suffix(mnemonic: &str) -> Option<&'static str> { /// Classifies an opcode into an `OpcodeSemantics` variant. /// Returns a Rust expression string for code generation. +/// Parses the `object` column into a `Receiver` initializer and whether the +/// opcode writes Pr. +fn classify_object(object: &str, table: usize, opcode: u8) -> (String, String) { + let mut receiver = "Receiver::None"; + let mut pr_load = "None".to_string(); + for token in object.split_whitespace() { + match token { + "pr" => receiver = "Receiver::Pr", + "me" => receiver = "Receiver::Me", + "tos" => receiver = "Receiver::Popped", + _ => { + let source = token.strip_prefix(">pr:").unwrap_or_else(|| { + panic!("unknown object token {token:?} at {table},{opcode:#04x}") + }); + let variant = match source { + "frame" => "Frame", + "me" => "Me", + "pool" => "Pool", + "indirect" => "FrameIndirect", + "member" => "PrMember", + "frame_member" => "FrameMember", + "array" => "ArrayElement", + "variant" => "Variant", + "new" => "NewIfNull", + "with" => "WithMember", + "late" => "LateGet", + _ => panic!("unknown Pr source {source:?} at {table},{opcode:#04x}"), + }; + pr_load = format!("Some(PrLoad::{variant})"); + } + } + } + (receiver.to_string(), pr_load) +} + +/// Parses the `stack` column into a `StackRule` initializer. +fn classify_stack_rule(rule: &str, table: usize, opcode: u8) -> String { + if rule.is_empty() { + return "StackRule::Fixed".to_string(); + } + if rule == "callee" { + return "StackRule::Callee".to_string(); + } + let (name, arg) = rule + .strip_suffix(')') + .and_then(|r| r.split_once('(')) + .unwrap_or_else(|| panic!("bad stack rule {rule:?} at {table},{opcode:#04x}")); + let operand: u8 = arg + .parse() + .unwrap_or_else(|_| panic!("bad stack rule operand {rule:?} at {table},{opcode:#04x}")); + let variant = match name { + "arg_bytes" => "ArgBytes", + "variants" => "Variants", + "count" => "Count", + "pairs" => "Pairs", + "pairs1" => "PairsAtLeastOne", + "bytes" => "Bytes", + _ => panic!("unknown stack rule {rule:?} at {table},{opcode:#04x}"), + }; + format!("StackRule::{variant} {{ operand: {operand} }}") +} + fn classify_semantics(mnemonic: &str, category: &str) -> String { match category { "load_frame" => "OpcodeSemantics::Load { source: LoadSource::Frame }".to_string(), @@ -920,15 +1053,14 @@ fn classify_semantics(mnemonic: &str, category: &str) -> String { let (from, to) = classify_convert_types(mnemonic); format!("OpcodeSemantics::Convert {{ from: {from}, to: {to} }}") } - "branch" => { - let conditional = mnemonic.contains("BranchF") - || mnemonic.contains("BranchT") - || mnemonic.starts_with("Next") - || mnemonic.starts_with("For") - || mnemonic.starts_with("ExitFor") - || mnemonic.starts_with("On"); - format!("OpcodeSemantics::Branch {{ conditional: {conditional} }}") - } + "branch" => "OpcodeSemantics::Branch { conditional: false }".to_string(), + "branch_cond" => "OpcodeSemantics::Branch { conditional: true }".to_string(), + "gosub" => "OpcodeSemantics::GoSub".to_string(), + "return_gosub" => "OpcodeSemantics::GoSubReturn".to_string(), + "resume" => "OpcodeSemantics::Resume".to_string(), + "on_error" => "OpcodeSemantics::OnError".to_string(), + "raise" => "OpcodeSemantics::Raise".to_string(), + "end" => "OpcodeSemantics::End".to_string(), "call" => { let kind = if mnemonic.starts_with("ThisVCall") { "ThisVCall" @@ -936,8 +1068,10 @@ fn classify_semantics(mnemonic: &str, category: &str) -> String { "VCall" } else if mnemonic.starts_with("ImpAdCall") { "ImpAdCall" - } else if mnemonic.starts_with("Late") { + } else if mnemonic.starts_with("Late") || mnemonic.starts_with("VarLate") { "LateCall" + } else if mnemonic == "RaiseEvent" { + "Event" } else { "Other" }; @@ -1079,6 +1213,7 @@ fn map_calling_conv(s: &str) -> &'static str { "stdcall" => "CallingConv::Stdcall", "cdecl" => "CallingConv::Cdecl", "special" => "CallingConv::Special", + "unknown" => "CallingConv::Unknown", other => panic!("unknown calling convention: {other}"), } } @@ -1112,6 +1247,7 @@ fn map_param_type(s: &str) -> &'static str { "Int16Ptr" => "VbParamType::Int16Ptr", "UInt8Ptr" => "VbParamType::UInt8Ptr", "Int64Ptr" => "VbParamType::Int64Ptr", + "unknown" => "VbParamType::Unknown", other => panic!("unknown param type: {other}"), } } diff --git a/data/msvbvm60_exports.csv b/data/msvbvm60_exports.csv index 03dde9e..7b442bf 100644 --- a/data/msvbvm60_exports.csv +++ b/data/msvbvm60_exports.csv @@ -4,8 +4,8 @@ # Columns: # name - Export name (or rtcXxx for ordinal-only rtc* functions) # ordinal - Export ordinal (0 = named export, looked up by name) -# calling_convention - fastcall|stdcall|cdecl|special -# return_type - void|int16|uint16|int32|uint32|int64|uint8|float|double|bool|Bstr|BstrPtr|VariantPtr|SafeArrayPtr|SafeArrayPtrPtr|IUnknownPtr|IUnknownPtrPtr|IDispatchPtr|IDispatchPtrPtr|Hresult|GuidPtr|VoidPtr|Int32Ptr|Int16Ptr|UInt8Ptr|Int64Ptr +# calling_convention - fastcall|stdcall|cdecl|special|unknown +# return_type - unknown|void|int16|uint16|int32|uint32|int64|uint8|float|double|bool|Bstr|BstrPtr|VariantPtr|SafeArrayPtr|SafeArrayPtrPtr|IUnknownPtr|IUnknownPtrPtr|IDispatchPtr|IDispatchPtrPtr|Hresult|GuidPtr|VoidPtr|Int32Ptr|Int16Ptr|UInt8Ptr|Int64Ptr # variadic - 0|1 (1 = cdecl varargs) # params - Semicolon-separated: Type name (e.g. BstrPtr pbstr;Bstr src) # category - free|string|variant|convert|object|array|foreach|late|error|currency|fpu|file|misc|crt|fdiv|evtsink|entry|mem|internal @@ -117,7 +117,7 @@ rtcTrimBstr,519,stdcall,Bstr,0,Bstr bstrSrc,string,retn 0x4; VB Trim$(); delegat rtcTrimVar,520,stdcall,VariantPtr,0,VariantPtr presult;VariantPtr psrc,string,VB6 Trim$() rtcUpperCaseBstr,527,stdcall,Bstr,0,Bstr bstrSrc,string,retn 0x4; VB UCase$(); delegates to internal case converter rtcUpperCaseVar,528,stdcall,VariantPtr,0,VariantPtr retval;VariantPtr pSrcVar,string,retn 0x8; Variant wrapper; calls rtcUpperCaseBstr internally -rtcVarFromFormatVar,660,stdcall,VariantPtr,0,VariantPtr presult;VariantPtr psrc;VariantPtr format,string,VB6 Format$() +rtcVarFromFormatVar,660,stdcall,VariantPtr,0,VariantPtr presult;VariantPtr pexpr;VariantPtr pformat;int32 firstDayOfWeek;int32 firstWeekOfYear,string,VB6 Format(); retn 0x14; tests/fixtures/data passes 0x14 bytes (the two day/week options as Longs) # # === TYPE CONVERSION === # @@ -276,7 +276,7 @@ __vbaVerifyVarObj,604,stdcall,VariantPtr,0,VariantPtr pvar,variant,validates VT_ # # === ARRAY OPERATIONS === # -__vbaAryConstruct,165,stdcall,void,0,SafeArrayPtr ppAry;VoidPtr pDescriptor,array,Thin wrapper: calls sub_660482ba(ppAry; pDescriptor; 0) then error handler. Creates array from descriptor with no extra bounds. retn 0x8. +__vbaAryConstruct,165,stdcall,void,0,SafeArrayPtr ppAry;VoidPtr pDescriptor,array,Thin wrapper: calls the array constructor at 0x660482BA (ppAry; pDescriptor; 0) then error handler. Creates array from descriptor with no extra bounds. retn 0x8. __vbaAryConstruct2,164,stdcall,void,0,SafeArrayPtr ppAry;VoidPtr pDescriptor;VoidPtr pBounds,array,Like AryConstruct but with explicit bounds pointer (3rd param). If descriptor has FADF_AUTO (0x20) bit; dereferences pBounds. retn 0xc. __vbaAryCopy,166,stdcall,void,0,SafeArrayPtr ppDst;SafeArrayPtr ppSrc,array,Erases dst if different from src; then copies src array to dst via SafeArrayCopy. retn 0x8. __vbaAryDestruct,167,stdcall,void,0,uint16 arrayDesc;SafeArrayPtrPtr ppArray,array,calls __vbaErase then SafeArrayDestroyData @@ -481,8 +481,10 @@ MethCallEngine,199,special,void,0,VoidPtr param,entry,Custom CC: sub [esp+4];eax ProcCallEngine,186,special,void,0,,entry,Custom CC: edx=RTMI ptr; return addr on stack; sets up P-Code frame; dispatches opcodes via jump table at 0x6610aa24 ThunRTMain,100,stdcall,void,0,VoidPtr pVbHeader,entry,runtime initialization; noreturn UserDllMain,105,stdcall,int32,0,VoidPtr ppProject;VoidPtr pProjectData;VoidPtr hInstance;uint32 fdwReason;VoidPtr lpvReserved,entry,VB6 user DLL entry; handles DLL_PROCESS_ATTACH(1); DLL_PROCESS_DETACH(0); DLL_THREAD_ATTACH(2); retn 0x14 -VBDllGetClassObject,104,stdcall,int32,0,VoidPtr ppProject;VoidPtr pVBHeader;VoidPtr rclsid;VoidPtr riid;VoidPtr ppv;VoidPtr pUnkOuter;VoidPtr ppClassFactory,entry,User-project class factory creation; compares IIDs; creates basic_class object; retn 0x18 -VBDllUnRegisterServer,101,stdcall,int32,0,VoidPtr pVBHeader;VoidPtr rclsid,entry,Unregisters VB project classes; retn varies +VBDllCanUnloadNow,102,stdcall,Hresult,0,VoidPtr stubArg,entry,0x6605CC5B (6.00.8176); retn 4; the one value its DllCanUnloadNow stub (58 68 imm32 50 E9) pushes; returns S_OK (0) or S_FALSE (1) +VBDllGetClassObject,104,stdcall,Hresult,0,VoidPtr phModule;VoidPtr stubArg2;VoidPtr pVBHeader;GuidPtr rclsid;GuidPtr riid;VoidPtr ppv,entry,0x6604D2E7 (6.00.8176); retn 0x18; the DllGetClassObject stub (58 68 imm32 68 imm32 68 imm32 50 E9) pushes the first three under the caller's rclsid/riid/ppv; reads *phModule and the VBHeader; compares riid with IID_IClassFactory +VBDllRegisterServer,103,stdcall,Hresult,0,VoidPtr phModule;VoidPtr stubArg2;VoidPtr pVBHeader,entry,0x660CAAE0 (6.00.8176); retn 0xC; the three values its DllRegisterServer stub pushes; GetModuleFileNameA(*phModule) and VBHeader +0x3C and +0x22; E_UNEXPECTED (0x8000FFFF) or E_FAIL (0x80004005) on failure +VBDllUnRegisterServer,101,stdcall,Hresult,0,VoidPtr phModule;VoidPtr stubArg2;VoidPtr pVBHeader,entry,0x6605CF04 (6.00.8176); retn 0xC on every path; the three values its DllUnregisterServer stub pushes; reads *phModule and VBHeader +0x22 and +0x54; E_UNEXPECTED (0x8000FFFF) on failure # # === MEMORY ACCESS (GetMem/PutMem/SetMem) === # @@ -583,7 +585,7 @@ rtcCreateObject2,716,stdcall,void,0,VariantPtr result;Bstr progId;Bstr serverNam rtcCurrentDir,647,stdcall,void,0,VariantPtr result;VariantPtr drive,misc,retn 0x8; CurDir variant version; returns VT_BSTR in VARIANT rtcCurrentDirBstr,646,stdcall,Bstr,0,VariantPtr drive,misc,retn 0x4; CurDir$ string version rtcCVErrFromVar,643,stdcall,void,0,VariantPtr result;VariantPtr errVar,misc,retn 0x8; converts error number to VT_ERROR variant (0x800A0000 | errnum) -rtcDateAdd,661,stdcall,void,0,VariantPtr result;Bstr interval;double number;VariantPtr date;int16 firstDayOfWeek,misc,retn 0x14; DateAdd(); adds time interval to date +rtcDateAdd,661,stdcall,void,0,VariantPtr result;Bstr interval;double number;VariantPtr date,misc,retn 0x14; DateAdd(); tests/fixtures/data passes the result pointer (top); the interval BSTR; the Double; the date Variant rtcDateDiff,662,stdcall,void,0,VariantPtr result;Bstr interval;VariantPtr date1;VariantPtr date2;int16 firstDayOfWeek;int16 firstWeekOfYear,misc,retn 0x18; DateDiff(); computes interval difference rtcDateFromVar,641,stdcall,double,0,VariantPtr var,misc,retn 0x4; CDate(); wraps __vbaDateVar; returns DATE double via FPU rtcDatePart,663,stdcall,void,0,VariantPtr result;Bstr interval;VariantPtr date;int16 firstDayOfWeek;int16 firstWeekOfYear,misc,retn 0x14; DatePart(); extracts year/month/day/etc. @@ -650,7 +652,7 @@ rtcPPMT,675,stdcall,double,0,double rate;double per;double nper;double pv;Varian rtcPV,677,stdcall,double,0,double rate;double nper;double pmt;VariantPtr pvarFv;VariantPtr pvarType,misc,push ebp; present value; optional VARIANT Missing; retn 0x20 rtcQBColor,589,stdcall,int32,0,int16 color,misc,no frame ptr; table lookup (16-entry QBColor table); retn 0x4 rtcRandomize,594,stdcall,void,0,VariantPtr pvarSeed,misc,no frame ptr; optional VARIANT seed; calls Randomize helper; retn 0x4 -rtcRandomNext,593,stdcall,void,0,VariantPtr pvarSeed,misc,no frame ptr; optional VARIANT seed; calls Rnd helper with float; retn 0x4 +rtcRandomNext,593,stdcall,float,0,VariantPtr pvarSeed,misc,VB Rnd(); optional VARIANT seed; returns the Single in ST0 (tests/fixtures/data stores it with FStFPR4); retn 0x4 rtcRate,680,stdcall,double,0,double nper;double pmt;double pv;VariantPtr pvarFv;VariantPtr pvarType;VariantPtr pvarGuess,misc,push ebp; Newton-Raphson iteration (max 40); FPU return; retn 0x24 rtcRgb,588,stdcall,int32,0,int16 red;int16 green;int16 blue,misc,no frame ptr; clamps 0-255; packs BGR into int32; retn 0xc rtcSaveSetting,690,stdcall,void,0,Bstr bstrAppName;Bstr bstrSection;Bstr bstrKey;Bstr bstrValue,misc,push ebp; registry write to HKCU; retn 0x10 @@ -670,3 +672,39 @@ rtcTan,584,stdcall,double,0,double value,misc,retn 0x8; VB Tan(); validates rang rtcTypeName,591,stdcall,Bstr,0,VariantPtr pVar,misc,retn 0x4; VB TypeName(); inspects VT; IDispatch/IUnknown; returns type string rtcVarType,563,stdcall,int32,0,VariantPtr pVar,misc,retn 0x4; VB VarType(); returns VT code as zero-extended uint16 rtcWeekdayName,706,stdcall,Bstr,0,int32 nWeekday;int16 bAbbreviate;int32 nFirstDayOfWeek,misc,retn 0xc; VB WeekdayName(); uses calendar-aware lookup +# +# === EXPORTS WHOSE SIGNATURE IS NOT ANALYZED === +# +# Named so an ordinal import resolves; convention and types unknown. +# +VarPtr,644,stdcall,int32,0,VoidPtr p,misc,mov eax [esp+4]; retn 4; VB VarPtr() returns its ByRef argument's address (8176 0x660eb536) +__vbaVarLateMemCallSt,114,unknown,unknown,0,,unanalyzed, +__vbaVarZero,147,unknown,unknown,0,,unanalyzed, +CopyRecord,190,unknown,unknown,0,,unanalyzed, +TipCreateInstanceProject2,230,unknown,unknown,0,,unanalyzed, +__vbaLateIdNamedCall,286,unknown,unknown,0,,unanalyzed, +__vbaLateIdNamedCallLd,287,unknown,unknown,0,,unanalyzed, +__vbaLateIdNamedCallSt,288,unknown,unknown,0,,unanalyzed, +__vbaLateIdNamedStAd,289,unknown,unknown,0,,unanalyzed, +__vbaLateMemCallSt,294,unknown,unknown,0,,unanalyzed, +__vbaLateMemNamedCall,295,unknown,unknown,0,,unanalyzed, +__vbaLateMemNamedCallLd,296,unknown,unknown,0,,unanalyzed, +__vbaLateMemNamedCallSt,297,unknown,unknown,0,,unanalyzed, +__vbaLateMemNamedStAd,322,unknown,unknown,0,,unanalyzed, +EVENT_SINK_GetIDsOfNames,403,unknown,unknown,0,,unanalyzed, +Zombie_AddRef,431,unknown,unknown,0,,unanalyzed, +Zombie_Release,432,unknown,unknown,0,,unanalyzed, +rtDecFromVar,564,stdcall,Hresult,0,VariantPtr pSrc;VariantPtr pResult,convert,CDec(); tests/fixtures/data calls it through ImpAdCallHresult with 8 bytes: the source Variant on top; the result temp below +rtBstrFromErrVar,634,unknown,unknown,0,,unanalyzed, +rtBoolFromErrVar,635,unknown,unknown,0,,unanalyzed, +rtCyFromErrVar,636,unknown,unknown,0,,unanalyzed, +rtI2FromErrVar,637,unknown,unknown,0,,unanalyzed, +rtI4FromErrVar,638,unknown,unknown,0,,unanalyzed, +rtR4FromErrVar,639,unknown,unknown,0,,unanalyzed, +rtR8FromErrVar,640,unknown,unknown,0,,unanalyzed, +rtUI1FromErrVar,686,unknown,unknown,0,,unanalyzed, +TipInvokeMethod2,999,unknown,unknown,0,,unanalyzed, +TipInvokeMethod,1016,unknown,unknown,0,,unanalyzed, +IID_IVbaHost,1024,unknown,unknown,0,,unanalyzed, +EbGetObjConnectionCounts,1025,unknown,unknown,0,,unanalyzed, +EbGetVBAObject,2010,unknown,unknown,0,,unanalyzed, diff --git a/data/opcodes.csv b/data/opcodes.csv index 8d8ac02..0b0d4dc 100644 --- a/data/opcodes.csv +++ b/data/opcodes.csv @@ -1,1558 +1,1632 @@ -# VB6 P-Code opcodes - encoding + verified runtime semantics -# Merged from opcodes.csv (encoding) and opcode_semantics.csv (semantics) +# VB6 P-Code opcodes: encoding and runtime semantics. +# +# Every implemented row describes its handler in MSVBVM60.DLL 6.00.8176 (the +# Visual Basic 6.0 release) and 6.00.9848, whose handlers are the same code at +# other addresses: the operands it reads, its effect on the evaluation and x87 +# stacks, the object registers it uses. # # Encoding columns: -# table - dispatch table (0=primary, 1-5=lead0-lead4) -# opcode - hex opcode byte within the table -# size - instruction size in bytes (excl. lead byte; -1=variable; 0=invalid) +# table - dispatch table (0 = primary, 1-5 = lead bytes 0xFB-0xFF) +# opcode - opcode byte within the table +# size - instruction bytes after the lead byte (-1 = variable: +# a u16 byte count, then that payload; 0 = invalid) # mnemonic - opcode name -# operand_format - format specifiers (%a=frame, %s=pool, %l=branch, %c=import, etc.) +# operand_format - operands in order: +# %1 %2 %4 1/2/4-byte literal +# %a i16 frame offset from ebp +# %s %c u16 constant pool index (%c: the entry is an address) +# %l u16 jump target (offset from the procedure's code start) +# %v u16 vtable offset, u16 pool index of the interface's IID +# %x u16 pool index of a procedure's address, u16 argument bytes +# %N %D named-argument list to the payload's end: u16 pool +# indices of names / u32 DISPIDs +# %L jump table to the payload's end: u16 targets +# %F frame slots to the payload's end: i16 offsets +# (a variable-length opcode with no format has an opaque +# payload: GetRecOwner*/PutRecOwner*, an inline record +# descriptor) # -# Semantics columns (verified from MSVBVM60.DLL 6.00.9848 handler disassembly): -# pops - evaluation stack slots consumed (4 bytes each; -1=variable) +# Semantics columns (evaluation stack slots are 4 bytes; a Variant on the +# stack is its address unless a note says by value, then it takes 4 slots): +# pops - fixed evaluation stack slots consumed # pushes - evaluation stack slots produced -# fpu_pops - x87 FPU stack values consumed -# fpu_push - x87 FPU stack values produced -# mem_read - bytes read from memory (0=none) -# mem_write - bytes written to memory (0=none) -# category - semantic category (arith, compare, convert, load_frame, etc.) -# handler - MSVBVM60.DLL handler address (reference only) -# notes - human-readable description +# fpu_pops - x87 values consumed (read below the entry depth) +# fpu_push - x87 values produced; c = a call that pushes nothing and +# leaves ST0 as its callee left it (a Single, Double or Date +# function's result; nothing for a Sub) +# stack - operand-dependent slots consumed on top of `pops`: +# callee the callee releases its arguments (signature) +# arg_bytes(i) operand i's argument bytes / 4 +# variants(i) 4 * operand i (Variants by value) +# count(i) operand i +# pairs(i) 2 * operand i +# pairs1(i) 2 * max(operand i, 1) +# bytes(i) (operand i - 4) / 4 +# popped - every value popped, from both stacks, last operand first +# (on one stack: top first; a binary operation's right +# operand, then its left): a width in slots, f for an x87 +# value, * where the `stack` rule's values sit (4 each for +# variants(i), 1 for count/pairs, the callee's parameters for +# callee/arg_bytes) +# object - object registers: pr (the receiver or base is Pr, +# [ebp-0x4c]), me (Me, [ebp+8]), tos (the receiver is the +# Variant whose address it pops), >pr: (loads Pr from: +# frame [ebp+%a]; me; pool the pool entry %c itself; indirect +# [[ebp+%a]]; member [Pr+%2]; frame_member [[ebp+%a]+%2]; +# array a popped array element's address; variant a popped Variant's +# object; new a popped object variable, created when Nothing; +# with [[ebp+0x10]+%2]; late a late-bound get's result) +# movement - what a load, store or literal moves, from its handler: one +# move or several joined by + (in order): +# ld::[z|u] push n bytes (a 1- or 2-byte load +# fills its slot with zeros, z, or +# leaves the high bytes undefined, u) +# ldfp:: fld an n-byte float +# ad: push the address of place +# st:: pop and store n bytes (nothing freed) +# stfp:: fstp ST0 as an n-byte float +# zero:: store n zero bytes +# lit:[s|s8] push the n-byte literal operand +# (sign-extended to a slot / 8 bytes) +# litfp:[i] fld the float operand (i: fild) +# const:0 push 0 +# pool: push the pool entry itself +# var:[=]: build a Variant literal at place +# (data: a constant, lit or pool) and +# push its address +# prn / pr / prad: load Pr with the 4 bytes at place +# (error 91 on 0 / unchecked) or with +# its address +# x::[:] a move with side effects +# (freeing or releasing the old value, +# AddRef, copies, Variant conversions) +# places: f(%a) [ebp+%a]; fi(%a) [[ebp+%a]]; m(%a,%2) +# [[ebp+%a]+%2]; pr(%2) [Pr+%2]; g(%c) [pool[%c]]; w(%2) +# [[ebp+0x10]+%2]; wi(%2) [[[ebp+0x10]+%2]]; s(%2) [esp+%2]; +# pop (an address popped first); a1 (a popped 1-D array's +# element at a popped index); an(%2) (of %2 dimensions); +# ar(%s,%2) (a fixed array in a popped record); f(8), f(-0x88), +# f(-0x94). An operand named twice is written %a and %a#2. +# category - semantic category (branch = unconditional, branch_cond, +# gosub, return_gosub, resume, on_error, raise (Error: raises +# the popped number), end (End, Stop), call, ...) +# handler_8176, handler_9848 - handler address in each build +# notes - description; Pr is the object register ([ebp-0x4c]) # -table,opcode,size,mnemonic,operand_format,pops,pushes,fpu_pops,fpu_push,mem_read,mem_write,category,handler,notes -0,0x00,2,LargeBos,%1,0,0,0,0,0,0,bos,0x66108E87,Beginning-of-statement marker; %1=byte distance to next BOS (0=last statement); used by Resume Next / Erl -0,0x01,1,InvalidExcode,,0,0,0,0,0,0,,, -0,0x02,2,LargeBos,%1,0,0,0,0,0,0,bos,0x66108E87,Beginning-of-statement marker (same handler as 0x00); %1=byte distance to next BOS -0,0x03,1,InvalidExcode,,0,0,0,0,0,0,,, -0,0x04,3,FLdRfVar,%a,0,1,0,0,4,0,load_frame,0x66108E95,Push address of [EBP+sext(operand)] (LEA not LOAD); 4B pointer to 16B Variant -0,0x05,3,ImpAdLdRf,%c,0,1,0,0,4,0,load_ind,0x66108EA3,Push *(const_pool_addr + sext(op)); indirect address load -0,0x06,3,MemLdRfVar,%2,0,1,0,0,4,0,load_mem,0x66108EB3,Pop obj ptr; push addr of Variant at obj+offset (LEA) -0,0x07,5,FMemLdRf,%a %2,0,1,0,0,4,0,load_mem,0x66108EC5,Push addr of member at [this+offset] (LEA not LOAD) -0,0x08,3,FLdPr=,%a,0,1,0,0,4,0,load_frame,0x66108EC5,Load object ref from [EBP+sext(op)]; push 4B (COM interface ptr) -0,0x09,5,ImpAdCallHresult,::call %c(%a),-1,0,0,0,0,0,call,0x6610A370,Import API call (DllFunctionCall); %x=import+argsize; HRESULT checked -0,0x0A,5,ImpAdCallFPR4,%x,-1,0,0,1,0,0,call,0x6610E534,Import API call; result R4 on FPU ST0 -0,0x0B,5,ImpAdCallI2,%x,-1,1,0,0,0,0,call,0x6610A3C4,Import API call; result i16 (zext to i32) pushed on eval -0,0x0C,5,ImpAdCallCy,%x,-1,2,0,0,0,0,call,0x6610E508,Import API call; result 8B Currency pushed as 2 eval slots -0,0x0D,5,VCallHresult,%v,-1,0,0,0,0,0,call,0x6610A43B,COM vtable call; %v=offset+argsize; pops args+this; HRESULT checked; no push -0,0x0E,3,VCallFPR8,%2,-1,0,0,1,0,0,call,0x6610E560,COM vtable call; pops args+this; result R8 on FPU ST0 -0,0x0F,3,VCallAd,%2,-1,1,0,0,0,0,call,0x6610E4EC,COM vtable call; pops args+this; result i32/ptr pushed on eval -0,0x10,5,ThisVCallHresult,%2 %c,-1,0,0,0,0,0,call,0x6610A4A0,Like VCallHresult but uses 'this' from frame (not from eval stack) -0,0x11,3,ThisVCall,%2,-1,1,0,0,0,0,call,0x6610A4C2,Like VCallAd but uses 'this' from frame; pushes return value -0,0x12,3,ThisVCallAd,%2,-1,1,0,0,0,0,call,0x6610A4E4,Like VCallAd but uses 'this' from frame; pushes addr return value -0,0x13,1,ExitProcHresult,%},0,0,0,0,0,0,return,0x6610A51D,Return from Function with HRESULT; cleanup + frame restore -0,0x14,1,ExitProc,%},0,0,0,0,0,0,return,0x6610A529,Return from Sub (no return value); calls cleanup + frame restore -0,0x15,1,ExitProcI2,,0,0,0,0,0,0,return,0x6610A535,Return from Function As Integer; return value in eval stack TOS -0,0x16,1,ExitProcR4,,0,0,0,0,0,0,return,0x6610A541,Return from Function As Single; return value on x87 ST0 -0,0x17,1,ExitProcR8,,0,0,0,0,0,0,return,0x6610A54D,Return from Function As Double; return value on x87 ST0 -0,0x18,1,ExitProcCy,,0,0,0,0,0,0,return,0x6610A559,Return from Function As Currency; return value in EDX:EAX -0,0x19,3,FStAdFunc,%a,1,0,0,0,0,4,store_frame,0x66108F00,Pop addr; store to function return value slot -0,0x1A,3,FFree1Ad,%a,0,0,0,0,0,0,stack,0x66108F04,Free COM object at [EBP+sext(op)]; Release + set to NULL; no stack change -0,0x1B,3,LitStr,%s,0,1,0,0,0,0,load_lit,0x66108EDA,Push constant pool pointer: *(const_pool + sext(operand)); resolved BSTR VA -0,0x1C,3,BranchF,%l,1,0,0,0,0,0,branch,0x66108F5C,Pop TOS; if low i16==0 (False) take branch; else skip 2B target -0,0x1D,3,BranchT,%l,1,0,0,0,0,0,branch,0x66108F76,Pop TOS; if low i16!=0 (True) take branch; else skip 2B target -0,0x1E,3,Branch,%l,0,0,0,0,0,0,branch,0x66108F38,Unconditional branch; target = pcode_base + zx(u16 operand) -0,0x1F,3,CRec2Ansi,%s,0,0,0,0,0,0,convert,0x6610E2C0,Convert UDT record fields from Unicode to ANSI in-place -0,0x20,3,CRec2Uni,%s,0,0,0,0,0,0,convert,0x6610E2D0,Convert UDT record fields from ANSI to Unicode in-place -0,0x21,1,FLdPrThis,,0,1,0,0,4,0,load_frame,0x66108F07,Push this pointer from frame slot [EBP-0x30] -0,0x22,3,ImpAdLdPr,[%c],0,1,0,0,4,0,load_ind,0x661096CE,Load COM obj via *(const_pool+sext(op)); AddRef; push 4B -0,0x23,3,FStStrNoPop,%a,0,0,0,0,0,4,store_frame,0x6610A098,Like FStStr but does NOT pop TOS; TOS BSTR stays on eval stack -0,0x24,3,NewIfNullPr,%t,1,1,0,0,0,0,stack,0x6610A158,Pop obj ptr; if null create new instance; push (non-null) ptr -0,0x25,1,PopAdLdVar,,1,1,0,0,16,0,stack,0x66108F32,Pop addr; load 16B Variant from *addr; push as 4 slots (16B) -0,0x26,3,AryDescTemp,%a,0,1,0,0,0,0,stack,0x6610A168,Push addr of temp SafeArray descriptor from frame housekeeping -0,0x27,3,LitVar_Missing,%a,0,4,0,0,0,0,load_lit,0x6610A174,Push 16B Variant with vbError/Missing type; 4 eval slots -0,0x28,5,LitVarI2,%a %2,0,4,0,0,0,0,load_lit,0x6610A1A0,Read i16 from stream; push as 16B Variant(vbInteger); 4 eval slots -0,0x29,-1,FFreeAd,,-1,0,0,0,0,0,stack,0x6610A0E8,Free N COM objects; var-length: u16 count + N×i16 frame offsets -0,0x2A,1,ConcatStr,,2,1,0,0,0,0,arith,0x66108F1D,Pop 2 BSTR ptrs; concatenate via __vbaStrCat; push result BSTR ptr -0,0x2B,3,PopTmpLdAd2,%a,0,1,0,0,0,0,stack,0x66108F22,Push addr of temp 2-byte slot in frame housekeeping -0,0x2C,5,LateIdSt,%4,-1,0,0,0,0,0,call,0x6610E300,Late-bound property set via IDispatch::Invoke; pops value+args; DISPID from operand -0,0x2D,3,AryUnlock,%a,1,0,0,0,0,0,stack,0x6610E2E0,Pop SafeArray ptr; SafeArrayUnlock; no push -0,0x2E,3,AryLock,%a,1,0,0,0,0,0,stack,0x6610E2F0,Pop SafeArray ptr; SafeArrayLock; no push -0,0x2F,3,FFree1Str,%a,0,0,0,0,0,0,stack,0x6610A0C8,Free BSTR at [EBP+sext(op)]; SysFreeString + set to NULL -0,0x30,3,PopTmpLdAd8,%a,0,1,0,0,0,0,stack,0x66108F2A,Push addr of temp 8-byte slot in frame housekeeping -0,0x31,3,FStStr,%a,1,0,0,0,0,4,store_frame,0x6610A05D,Pop BSTR ptr; swap with frame slot; SysFreeString old; ownership transfer -0,0x32,-1,FFreeStr,,-1,0,0,0,0,0,stack,0x6610A0F8,Free N BSTRs; var-length: u16 count + N×i16 frame offsets -0,0x33,3,LdFixedStr,%2,1,1,0,0,0,0,stack,0x6610A088,Pop dest addr; __vbaStrFixedLenAssign; push result BSTR ptr -0,0x34,1,CStr2Ansi,,1,1,0,0,0,0,convert,0x6610A0B0,Pop BSTR; convert to ANSI string; push result ptr -0,0x35,3,FFree1Var,%a,0,0,0,0,0,0,stack,0x6610A0D8,Clear Variant at [EBP+sext(op)]; __vbaVarClear; no stack change -0,0x36,-1,FFreeVar,,-1,0,0,0,0,0,stack,0x6610A108,Clear N Variants; var-length: u16 count + N×i16 frame offsets -0,0x37,1,PopFPR4,,0,1,1,0,0,0,stack,0x66108FA4,Pop x87 ST0 → store as f32 on eval stack; ESP-=4; fpu_pop=1 push=1 -0,0x38,3,CopyBytes,%2,-1,0,0,0,0,0,stack,0x6610A148,Variable-length memcpy; reads u16 size from operand stream -0,0x39,1,PopFPR8,,0,2,1,0,0,0,stack,0x66108FB8,Pop x87 ST0 → store as f64 on eval stack (2 slots); ESP-=8; fpu_pop=1 push=2 -0,0x3A,5,LitVarStr,%a %s,0,4,0,0,0,0,load_lit,0x6610A1CC,Read %s const pool ref; push as 16B Variant(vbString); 4 eval slots -0,0x3B,1,Ary1StStrCopy,,3,0,0,0,0,4,store_ind,0x6610D1A0,Pop BSTR + index + array; SysCopy BSTR to array[index] -0,0x3C,1,GetLastError,,0,1,0,0,0,0,stack,0x6610A118,Push GetLastError() result as i32 -0,0x3D,3,CastAd,%c,1,1,0,0,0,0,convert,0x6610A128,Pop ptr; cast/validate COM interface; push validated ptr -0,0x3E,3,FLdZeroAd,%a,0,1,0,0,0,0,load_lit,0x66108F97,Push i32 zero (0x00000000) onto eval stack -0,0x3F,3,CVarCy,%a,2,4,0,0,0,0,convert,0x6610A1F0,Pop 2 Cy slots (8B); push as 16B Variant(vbCurrency); 4 slots -0,0x40,1,Ary1LdRf,,2,1,0,0,4,0,load_ind,0x6610CF5C,Pop index+array; push address of array[index] (LEA not LOAD) -0,0x41,1,Ary1LdPr,,2,1,0,0,4,0,load_ind,0x6610CF78,Pop index+array; push COM obj ref from array[index]; AddRef -0,0x42,1,CR4Var,,4,0,0,1,0,0,convert,0x6610A940,Pop 16B Variant (4 slots); convert to R4; push FPU ST0 -0,0x43,3,FStStrCopy,%a,1,0,0,0,0,4,store_frame,0x6610A0A0,Pop BSTR; __vbaStrCopy to frame slot (copy semantics; orig freed) -0,0x44,3,CVarI2,%a,1,4,0,0,0,0,convert,0x6610A1A0,Pop i32 (i16 val); push as 16B Variant(vbInteger); 4 slots -0,0x45,1,Error,,1,0,0,0,0,0,stack,0x6610A140,Pop error number; raise VB runtime error via Err.Raise -0,0x46,3,CVarStr,%a,1,4,0,0,0,0,convert,0x6610A1CC,Pop BSTR ptr; push as 16B Variant(vbString); 4 slots -0,0x47,3,StFixedStr,%l %a,1,0,0,0,0,4,store_frame,0x6610A080,Pop BSTR; write to fixed-length string slot via __vbaStrFixedLenAssign -0,0x48,3,ILdPr,%a,0,1,0,0,4,0,load_ind,0x661097B2,Load COM object ptr via double-deref; AddRef; push 4B -0,0x49,1,PopAdLd4,,1,1,0,0,4,0,stack,0x66108F9B,Pop address; load i32 from that address; push value (deref) -0,0x4A,1,FnLenStr,,1,1,0,0,0,0,stack,0x6610A110,Pop BSTR ptr; push SysStringLen result as i32 -0,0x4B,3,OnErrorGoto,%l,0,0,0,0,0,0,branch,0x66109F58,Set error handler target in frame; no stack effect -0,0x4C,1,FnLBound,,1,1,0,0,0,0,stack,0x6610A130,Pop array SafeArray ptr; push LBound as i32 -0,0x4D,5,CVarRef,%a %2,0,4,0,0,0,0,convert,0x6610A218,Push 16B Variant ByRef pointing to [EBP+sext(op)]; 4 slots -0,0x4E,3,FStVarCopyObj,%a,4,0,0,0,0,16,store_frame,0x6610A248,Pop 4 Variant slots; copy to frame slot with COM semantics -0,0x4F,3,MidStr,%2,3,1,0,0,0,0,stack,0x6610A278,Pop str+start+len; Mid$(); push result BSTR ptr -0,0x50,1,CI4Str,,1,1,0,0,0,0,convert,0x6610A988,Pop BSTR; convert to i32 via __vbaI4Str; push -0,0x51,3,FLdZeroAd,%a,0,1,0,0,0,0,load_lit,0x66108F97,Push i32 zero (duplicate opcode; same handler as 0x3E) -0,0x52,1,Ary1StVar,,6,0,0,0,0,16,store_ind,0x6610D168,Pop 4 Var slots + index + array; store 16B Variant to array[index] -0,0x53,1,CBoolCy,,2,1,0,0,0,0,convert,0x6610A96A,Pop 2 Cy slots; convert to VB Bool (i16 -1/0); push as i32 -0,0x54,5,FMemStStrCopy,%a %2,1,0,0,0,0,4,store_mem,0x6610A0A0,Pop BSTR; __vbaStrCopy to [this+offset] (copy semantics) -0,0x55,1,CI2Var,,4,1,0,0,0,0,convert,0x6610A95A,Pop 16B Variant (4 slots); convert to i16; push as i32 -0,0x56,3,NewIfNullAd,%c,1,1,0,0,0,0,stack,0x6610A160,Pop addr ptr; if null allocate; push (non-null) ptr -0,0x57,5,LateMemLdVar,%a %2,-1,-1,0,0,0,0,call,0x6610E320,Late-bound member load via IDispatch; pops obj+args; pushes result (type varies) -0,0x58,3,MemLdPr,%2,1,1,0,0,4,0,load_mem,0x661098F2,Pop obj ptr; load COM obj from member; AddRef; push 4B -0,0x59,3,PopTmpLdAdStr,%a,0,1,0,0,0,0,stack,0x66108F2E,Push addr of temp BSTR slot in frame housekeeping -0,0x5A,1,Erase,,-1,0,0,0,0,0,stack,0x6610A2E0,Erase array; reads frame offset; calls __vbaErase -0,0x5B,3,FStAdFuncNoPop,%a,0,0,0,0,0,4,store_frame,0x6610A0D0,Copy TOS to return value slot without popping; duplicate of 0x19 NoPop variant -0,0x5C,3,BranchFVar,%l,4,0,0,0,0,0,branch,0x6610A208,Pop 16B Variant (4 slots); test for False; branch if false -0,0x5D,1,HardType,,1,1,0,0,0,0,convert,0x6610A2B0,Pop ptr; verify/cast COM type; push validated ptr -0,0x5E,5,ImpAdCallI4,%x,-1,1,0,0,0,0,call,0x6610A3C4,Import API call (alias of 0x0B); result i32 pushed on eval -0,0x5F,5,FMemLdPr,%a %2,0,1,0,0,4,0,load_mem,0x661099D0,Load COM obj from [this+offset]; AddRef; push 4B -0,0x60,1,CStrVarTmp,,4,1,0,0,0,0,convert,0x6610A2C8,Pop 16B Variant (4 slots); convert to BSTR; push ptr -0,0x61,7,LateIdLdVar,%a %4,-1,-1,0,0,0,0,call,0x6610E340,Late-bound identifier load via IDispatch; pops args; pushes result -0,0x62,3,IStDarg,%a,1,0,0,0,0,4,store_ind,0x6610A298,Pop value; store to dispatch arg (DARG) slot -0,0x63,3,LitVar_TRUE,%a,0,1,0,0,0,0,load_lit,0x6610A098,Push VB True (-1) as i32 onto eval stack -0,0x64,5,NextI2,%a %l,0,0,0,0,2,2,branch,0x6610E380,For/Next i16: increment [EBP+op] by step; branch if not done -0,0x65,5,NextStepI2,%a %l,1,0,0,0,2,2,branch,0x6610E3A0,For/Next i16 with Step: pop step; increment; branch if not done -0,0x66,5,NextI4,%a %l,0,0,0,0,4,4,branch,0x6610E3C0,For/Next i32: increment [EBP+op] by 1; compare with limit; branch -0,0x67,5,NextStepI4,%a %l,1,0,0,0,4,4,branch,0x6610E3E0,For/Next i32 with Step: pop step; increment; compare; branch -0,0x68,5,NextStepR4,%a %l,0,0,1,0,4,4,branch,0x6610E400,For/Next R4 with FPU Step: increment via FPU; compare; branch -0,0x69,5,NextStepR8,%a %l,0,0,1,0,8,8,branch,0x6610E410,For/Next R8 with FPU Step: increment via FPU; compare; branch -0,0x6A,5,NextStepCy,%a %l,2,0,0,0,8,8,branch,0x6610E420,For/Next Cy: pop 2 step slots; increment; compare; branch -0,0x6B,3,FLdI2,%a,0,1,0,0,2,0,load_frame,0x66109372,Read i16 from [EBP+sext(operand)]; zero-extend to i32; push 4B -0,0x6C,3,ILdRf,%a,0,1,0,0,4,0,load_ind,0x66108EB3,Push address from double-deref: LEA of *[EBP+sext(op)] (ref to indirect var) -0,0x6D,3,FLdR8,%a,0,2,0,0,8,0,load_frame,0x6610DEF5,Read 8B (R8/Double) from [EBP+sext(operand)]; push as 2x4B stack slots -0,0x6E,3,FLdFPR4,%a,0,0,0,1,4,0,load_frame,0x661093BA,Load f32 from [EBP+sext(op)] onto x87 FPU stack (fld dword); NO eval stack change -0,0x6F,3,FLdFPR8,%a,0,0,0,1,8,0,load_frame,0x661093CD,Load f64 from [EBP+sext(op)] onto x87 FPU stack (fld qword); NO eval stack change -0,0x70,3,FStI2,%a,1,0,0,0,0,2,store_frame,0x6610940B,Pop i32 (use low 16); store i16 to [EBP+sext(operand)] -0,0x71,3,FStR4,%a,1,0,0,0,0,4,store_frame,0x6610DF1A,Pop 1 slot (4B); store R4 to [EBP+sext(operand)] -0,0x72,3,FStR8,%a,2,0,0,0,0,8,store_frame,0x6610DF31,Pop 2 slots (8B); store R8 to [EBP+sext(operand)] -0,0x73,3,FStFPR4,%a,0,0,1,0,0,4,store_frame,0x6610940D,Pop x87 ST0; store f32 to [EBP+sext(op)] (fstp dword); NO eval stack change -0,0x74,3,FStFPR8,%a,0,0,1,0,0,8,store_frame,0x66109420,Pop x87 ST0; store f64 to [EBP+sext(op)] (fstp qword); NO eval stack change -0,0x75,3,ImpAdLdI2,%c,0,1,0,0,2,0,load_ind,0x661096D4,Load i16 via *(TOS_addr + sext(op)); pop addr push val; net: modify TOS -0,0x76,3,ImpAdLdI4,%c,0,1,0,0,4,0,load_ind,0x661096F4,Load i32 via *(TOS_addr + sext(op)); pop addr push val; net: modify TOS -0,0x77,3,ImpAdLdCy,%c,0,2,0,0,8,0,load_ind,0x66109714,Load 8B Cy via *(TOS_addr + sext(op)); pop addr push 2 slots -0,0x78,3,ImpAdLdFPR4,%c,0,0,0,1,4,0,load_ind,0x6610973C,Load f32 via *(TOS_addr + sext(op)) → FPU; pop addr from eval -0,0x79,3,ImpAdLdFPR8,%c,0,0,0,1,8,0,load_ind,0x66109754,Load f64 via *(TOS_addr + sext(op)) → FPU; pop addr from eval -0,0x7A,3,ImpAdStI2,%c,1,0,0,0,0,2,store_ind,0x66109714,Pop val; store i16 via *(addr + sext(op)) where addr popped earlier -0,0x7B,3,ImpAdStR4,%c,1,0,0,0,0,4,store_ind,0x66109730,Pop val; store R4 via *(addr + sext(op)) -0,0x7C,3,ImpAdStCy,%c,2,0,0,0,0,8,store_ind,0x6610974C,Pop 2 slots (8B Cy); store via *(addr + sext(op)) -0,0x7D,3,ImpAdStFPR4,%c,0,0,1,0,0,4,store_ind,0x6610976C,Pop FPU ST0; store f32 via *(addr + sext(op)) -0,0x7E,3,ImpAdStFPR8,%c,0,0,1,0,0,8,store_ind,0x66109784,Pop FPU ST0; store f64 via *(addr + sext(op)) -0,0x7F,3,ILdI2,%a,0,1,0,0,2,0,load_ind,0x66109774,Load i16 via double-deref: ptr=[EBP+sext(op)]; val=*(i16*)ptr; zext push 4B -0,0x80,3,ILdI4,%a,0,1,0,0,4,0,load_ind,0x66109798,Load i32 via double-deref: ptr=[EBP+sext(op)]; val=*ptr; push 4B -0,0x81,3,ILdR8,%a,0,2,0,0,8,0,load_ind,0x661097BC,Load R8 via double-deref: ptr=[EBP+sext(op)]; push 8B as 2 slots -0,0x82,3,ILdFPR4,%a,0,0,0,1,4,0,load_ind,0x661097E6,Load f32 via double-deref: ptr=[EBP+sext(op)]; fld dword *ptr → FPU -0,0x83,3,ILdFPR8,%a,0,0,0,1,8,0,load_ind,0x661097FA,Load f64 via double-deref: ptr=[EBP+sext(op)]; fld qword *ptr → FPU -0,0x84,3,IStI2,%a,1,0,0,0,0,2,store_ind,0x661097F6,Pop i32(use low 16); store i16 via double-deref: ptr=[EBP+sext(op)] -0,0x85,3,IStI4,%a,1,0,0,0,0,4,store_ind,0x66109814,Pop i32; store via double-deref: ptr=[EBP+sext(op)]; *ptr=val -0,0x86,3,IStR8,%a,2,0,0,0,0,8,store_ind,0x66109830,Pop 2 slots (8B); store R8 via double-deref -0,0x87,3,IStFPR4,%a,0,0,1,0,0,4,store_ind,0x66109856,Pop FPU ST0; store f32 via double-deref (fstp dword) -0,0x88,3,IStFPR8,%a,0,0,1,0,0,8,store_ind,0x6610986C,Pop FPU ST0; store f64 via double-deref (fstp qword) -0,0x89,3,MemLdI2,%2,1,1,0,0,2,0,load_mem,0x66109884,Pop obj ptr; read i16 at obj+offset; push i32 (zext) -0,0x8A,3,MemLdStr,%2,1,1,0,0,4,0,load_mem,0x661098B2,Pop obj ptr; read BSTR ptr at obj+offset; push 4B -0,0x8B,3,MemLdR8,%2,1,2,0,0,8,0,load_mem,0x661098DA,Pop obj ptr; read R8 at obj+offset; push 2 slots -0,0x8C,3,MemLdFPR4,%2,1,0,0,1,4,0,load_mem,0x6610990A,Pop obj ptr; load f32 from obj+offset → FPU ST0 -0,0x8D,3,MemLdFPR8,%2,1,0,0,1,8,0,load_mem,0x66109924,Pop obj ptr; load f64 from obj+offset → FPU ST0 -0,0x8E,3,MemStI2,%2,2,0,0,0,0,2,store_mem,0x6610990E,Pop val + obj ptr; store i16 at obj+offset -0,0x8F,3,MemStI4,%2,2,0,0,0,0,4,store_mem,0x66109928,Pop val + obj ptr; store i32 at obj+offset -0,0x90,3,MemStR8,%2,3,0,0,0,0,8,store_mem,0x66109944,Pop 2 val + 1 obj ptr; store R8 at obj+offset -0,0x91,3,MemStFPR4,%2,1,0,1,0,0,4,store_mem,0x6610996C,Pop obj ptr; pop FPU ST0; store f32 at obj+offset -0,0x92,3,MemStFPR8,%2,1,0,1,0,0,8,store_mem,0x66109988,Pop obj ptr; pop FPU ST0; store f64 at obj+offset -0,0x93,5,FMemLdI2,%a %2,0,1,0,0,2,0,load_mem,0x66109972,Load i16 from [this+offset]; this from frame; push i32 (zext) -0,0x94,5,FMemLdR4,%a %2,0,1,0,0,4,0,load_mem,0x6610999C,Load R4 from [this+offset]; push 4B -0,0x95,5,FMemLdCy,%a %2,0,2,0,0,8,0,load_mem,0x661099C0,Load 8B Cy from [this+offset]; push 2 slots -0,0x96,5,FMemLdFPR4,%a %2,0,0,0,1,4,0,load_mem,0x661099E8,Load f32 from [this+offset] → FPU ST0 (fast member) -0,0x97,5,FMemLdFPR8,%a %2,0,0,0,1,8,0,load_mem,0x661099FC,Load f64 from [this+offset] → FPU ST0 (fast member) -0,0x98,5,FMemStI2,%a %2,1,0,0,0,0,2,store_mem,0x661099F0,Pop i32 (use low 16); store i16 to [this+offset] -0,0x99,5,FMemStI4,%a %2,1,0,0,0,0,4,store_mem,0x66109A10,Pop i32; store to [this+offset] -0,0x9A,5,FMemStR8,%a %2,2,0,0,0,0,8,store_mem,0x66109A30,Pop 2 val slots; store R8 to [this+offset] -0,0x9B,5,FMemStFPR4,%a %2,0,0,1,0,0,4,store_mem,0x66109A4A,Pop FPU ST0; store f32 to [this+offset] -0,0x9C,5,FMemStFPR8,%a %2,0,0,1,0,0,8,store_mem,0x66109A60,Pop FPU ST0; store f64 to [this+offset] -0,0x9D,1,Ary1LdI2,,2,1,0,0,2,0,load_ind,0x6610CF8C,Pop index+array_desc; read i16 from array[index]; zext push -0,0x9E,1,Ary1LdI4,,2,1,0,0,4,0,load_ind,0x6610CFB8,Pop index+array_desc; read i32 from array[index]; push value -0,0x9F,1,Ary1LdCy,,2,2,0,0,8,0,load_ind,0x6610CFE8,Pop index+array_desc; read 8B Cy from array[index]; push 2 slots -0,0xA0,1,Ary1LdFPR4,,2,0,0,1,4,0,load_ind,0x6610D018,Pop index+array_desc; read f32 from array[index]; push FPU -0,0xA1,1,Ary1LdFPR8,,2,0,0,1,8,0,load_ind,0x6610D038,Pop index+array_desc; read f64 from array[index]; push FPU -0,0xA2,1,Ary1StI2,,3,0,0,0,0,2,store_ind,0x6610D058,Pop val+index+array_desc; store i16 to array[index] -0,0xA3,1,Ary1StI4,,3,0,0,0,0,4,store_ind,0x6610D088,Pop val+index+array_desc; store i32 to array[index] -0,0xA4,1,Ary1StCy,,4,0,0,0,0,8,store_ind,0x6610D0B8,Pop 2_val+index+array_desc; store 8B Cy to array[index] -0,0xA5,1,Ary1StFPR4,,2,0,1,0,0,4,store_ind,0x6610D0E8,Pop index+array_desc; pop FPU ST0; store f32 to array[index] -0,0xA6,1,Ary1StFPR8,,2,0,1,0,0,8,store_ind,0x6610D108,Pop index+array_desc; pop FPU ST0; store f64 to array[index] -0,0xA7,3,AryLdPr,%2,2,1,0,0,4,0,load_ind,0x6610D128,Pop index+array (multi-dim); push COM obj ref; AddRef -0,0xA8,3,AryLdRf,%2,2,1,0,0,4,0,load_ind,0x6610D148,Pop index+array (multi-dim); push address (LEA) -0,0xA9,1,AddI2,,2,1,0,0,0,0,arith,0x66109B08,Pop TOS i16; add to new TOS i16 in-place; overflow check; result sign-extended i32 -0,0xAA,1,AddI4,,2,1,0,0,0,0,arith,0x66109B3F,Pop TOS; add to new TOS in-place; overflow check (err 6) -0,0xAB,1,AddR8,,0,0,1,0,0,0,arith,0x66109B55,FPU: faddp st1 st0; pops 2 fpu values pushes 1 result; NO eval stack change -0,0xAC,1,AddCy,,4,2,0,0,0,0,arith,0x6610E424,Pop 2+2 slots (two 8B Cy); __vbaCyAdd; push 2 slots (8B result) -0,0xAD,1,SubI2,,2,1,0,0,0,0,arith,0x66109B23,Pop TOS i16; sub from new TOS i16; overflow check; sign-extend result -0,0xAE,1,SubI4,,2,1,0,0,0,0,arith,0x66109B7A,Pop TOS; subtract from new TOS in-place; overflow check (err 6) -0,0xAF,1,SubR4,,0,0,1,0,0,0,arith,0x66109B98,FPU: fsubp st1 st0; pops 2 fpu pushes 1; R4 subtraction -0,0xB0,1,SubCy,,4,2,0,0,0,0,arith,0x6610E440,Pop 2+2 slots (two 8B Cy); __vbaCySub; push 2 slots -0,0xB1,1,MulI2,,2,1,0,0,0,0,arith,0x66109BA6,Pop TOS i16; mul with new TOS i16; overflow if result > 16-bit -0,0xB2,1,MulI4,,2,1,0,0,0,0,arith,0x66109BC5,Pop TOS; multiply with new TOS; overflow check via imul -0,0xB3,1,MulR8,,0,0,1,0,0,0,arith,0x66109B93,FPU: fmulp st1 st0; pops 2 fpu pushes 1; float multiplication -0,0xB4,1,MulCy,,4,2,0,0,0,0,arith,0x6610E45C,Pop 2+2 slots (two 8B Cy); __vbaCyMul; push 2 slots -0,0xB5,1,MulCyI2,,3,2,0,0,0,0,arith,0x6610E478,Pop 1 i16 + 2 Cy slots; multiply; push 2 Cy slots result -0,0xB6,1,DivR8,,0,0,1,0,0,0,arith,0x66109B93,FPU: fdivp st1 st0; pops 2 fpu pushes 1; float division -0,0xB7,1,UMiI2,,1,1,0,0,0,0,unary,0x66109BCC,Negate TOS i16 in-place; overflow check on -32768 -0,0xB8,1,UMiI4,,1,1,0,0,0,0,unary,0x66109BD9,Negate TOS in-place; overflow check on INT_MIN -0,0xB9,1,UMiR8,,0,0,0,0,0,0,unary,0x66109BDA,FPU: fchs ST0; negate TOS on FPU in-place; no stack change -0,0xBA,1,UMiCy,,2,2,0,0,0,0,unary,0x6610E4B4,Negate 2 eval slots (8B Cy) in-place via __vbaCyNeg -0,0xBB,1,FnAbsI2,,1,1,0,0,0,0,unary,0x66109BE0,Abs of TOS i16 in-place; overflow on -32768 -0,0xBC,1,FnAbsI4,,1,1,0,0,0,0,unary,0x66109BE4,Abs of TOS i32 in-place; overflow on INT_MIN -0,0xBD,1,FnAbsR4,,0,0,0,0,0,0,unary,0x66109BEA,FPU: fabs ST0; absolute value of FPU TOS in-place -0,0xBE,1,FnAbsCy,,2,2,0,0,0,0,unary,0x6610E4D0,Absolute value of 2 eval slots (8B Cy) via __vbaCyAbs -0,0xBF,1,IDvI2,,2,1,0,0,0,0,arith,0x66109C1A,Pop TOS (divisor); integer divide new TOS; overflow/div-zero check -0,0xC0,1,IDvI4,,2,1,0,0,0,0,arith,0x66109C1A,Pop TOS (divisor); integer divide new TOS; calls __vbaI4DivI4 -0,0xC1,1,ModI2,,2,1,0,0,0,0,arith,0x66109C4D,Pop TOS (divisor); modulo new TOS; div-zero check -0,0xC2,1,ModI4,,2,1,0,0,0,0,arith,0x66109C4D,Pop TOS (divisor); modulo new TOS; div-by-zero check -0,0xC3,1,NotI4,,1,1,0,0,0,0,unary,0x66109BEC,Bitwise NOT of TOS in-place; no ESP change -0,0xC4,1,AndI4,,2,1,0,0,0,0,arith,0x66109BFB,Pop TOS; AND with new TOS in-place; no overflow check -0,0xC5,1,OrI4,,2,1,0,0,0,0,arith,0x66109C0B,Pop TOS; OR with new TOS in-place (same pattern as AndI4) -0,0xC6,1,EqI2,,2,1,0,0,0,0,compare,0x6610A685,Same as EqI4 but compares i16 (low words); result -1/0 in i32 -0,0xC7,1,EqI4,,2,1,0,0,0,0,compare,0x6610A6A3,Pop TOS; compare with new TOS; result: 0=False -1=True -0,0xC8,1,EqR4,,0,1,2,0,0,0,compare,0x6610A7D1,FPU: pop 2 FPR4; compare; push eval i32 bool -1/0 -0,0xC9,1,EqCy,,4,1,0,0,0,0,compare,0x6610A825,Pop 2+2 slots (two 8B Cy); compare; push 1 (i32 bool -1/0) -0,0xCA,1,EqCyR8,,3,1,1,0,0,0,compare,0x6610A840,Pop 2 Cy slots + pop 1 FPU R8; compare; push eval i32 bool -0,0xCB,1,NeI2,,2,1,0,0,0,0,compare,0x6610A6B3,Pop TOS i16; compare; result -1 if not equal -0,0xCC,1,NeI4,,2,1,0,0,0,0,compare,0x6610A6C1,Pop TOS; compare with new TOS; result: -1 if not equal else 0 -0,0xCD,1,NeR8,,0,1,2,0,0,0,compare,0x6610A7D1,FPU: pop 2 FPR8; compare; push eval i32 bool -1/0 -0,0xCE,1,NeCy,,4,1,0,0,0,0,compare,0x6610A855,Pop 2+2 slots; compare; push 1 -0,0xCF,1,NeCyR8,,3,1,1,0,0,0,compare,0x6610A870,Pop 2 Cy + pop 1 FPU R8; compare; push eval i32 bool -0,0xD0,1,LtI2,,2,1,0,0,0,0,compare,0x6610A6CF,Pop TOS i16; compare with new TOS i16; result -1/0 signed -0,0xD1,1,LtI4,,2,1,0,0,0,0,compare,0x6610A6E1,Pop TOS; compare with new TOS; result: -1 if secondfirst -0,0xDB,1,GtI4,,2,1,0,0,0,0,compare,0x6610A759,Pop TOS; compare with new TOS; result: -1 if second>first else 0 -0,0xDC,1,GtR4,,0,1,2,0,0,0,compare,0x6610A7F2,FPU: pop 2; compare; push eval i32 bool -0,0xDD,1,GtCy,,4,1,0,0,0,0,compare,0x6610A8E0,Pop 2+2 slots; compare; push 1 -0,0xDE,1,GtCyR8,,3,1,1,0,0,0,compare,0x6610A8FB,Pop 2 Cy + pop 1 FPU R8; compare; push eval i32 bool -0,0xDF,1,GeI2,,2,1,0,0,0,0,compare,0x6610A783,Pop TOS i16; compare; result -1 if second>=first -0,0xE0,1,GeI4,,2,1,0,0,0,0,compare,0x6610A795,Pop TOS; compare with new TOS; result: -1 if second>=first else 0 -0,0xE1,1,GeR8,,0,1,2,0,0,0,compare,0x6610A813,FPU: pop 2; compare; push eval i32 bool -0,0xE2,1,GeCy,,4,1,0,0,0,0,compare,0x6610A910,Pop 2+2 slots; compare; push 1 -0,0xE3,1,GeCyR8,,3,1,1,0,0,0,compare,0x6610A92B,Pop 2 Cy + pop 1 FPU R8; compare; push eval i32 bool -0,0xE4,1,CI2I4,,1,1,0,0,0,0,convert,0x6610A9E3,Truncate TOS i32 to i16; overflow check if out of -32768..32767; store sign-extended -0,0xE5,1,CI2R8,,0,0,1,0,0,0,convert,0x6610A9D7,Pop FPU R8; round to i16; push eval (via __vbaFpI2); overflow check -0,0xE6,1,CI2Cy,,2,1,0,0,0,0,convert,0x6610A9EF,Pop 2 slots (8B Cy); divide by 10000; push 1 slot (i16 sext); calls __vbaCyI2 -0,0xE7,1,CI4UI1,,1,1,0,0,0,0,convert,0x6610A9EB,TOS i32 → mask to u8 (0-255); push i32; overflow check -0,0xE8,1,CI4R8,,0,0,1,0,0,0,convert,0x6610A9F3,Pop FPU R8; round to i32; push eval (via __vbaFpI4); overflow check -0,0xE9,1,CI4Cy,,2,1,0,0,0,0,convert,0x6610A9FD,Pop 2 slots (8B Cy); divide by 10000; push 1 slot (i32); calls __vbaCyI4 -0,0xEA,1,CR4R4,,0,0,0,0,0,0,convert,0x66108FE1,FPU: round ST0 to f32 precision (frndint-like); ST0 stays on FPU -0,0xEB,1,CR8I2,,1,0,0,1,0,0,convert,0x66108FFB,Pop i32(zext i16) from eval; fild → push f64 on FPU; convert int→double -0,0xEC,1,CR8I4,,1,0,0,1,0,0,convert,0x66109012,Pop i32 from eval; fild → push f64 on FPU; convert int→double -0,0xED,1,CR8R8,,0,0,0,0,0,0,convert,0x66108FE1,FPU: no-op identity R8→R8; ST0 stays on FPU -0,0xEE,1,CR8Cy,,2,0,0,1,0,0,convert,0x6610A95D,Pop 2 eval slots (8B Cy); convert to R8; push FPU ST0 -0,0xEF,1,CCyI2,,1,2,0,0,0,0,convert,0x6610A9A3,Pop 1 slot (i16 sext); multiply by 10000; push 2 slots (8B Cy) -0,0xF0,1,CCyI4,,1,2,0,0,0,0,convert,0x6610A9BF,Pop 1 slot (i32); multiply by 10000; push 2 slots (8B Cy) -0,0xF1,1,CCyR4,,0,2,1,0,0,0,convert,0x6610A9CF,Pop FPU R4; convert to Cy via __vbaCyR4; push 2 eval slots -0,0xF2,1,CDateR8,,0,0,0,0,0,0,convert,0x66108FE1,FPU: identity R8→Date (same format); ST0 stays on FPU -0,0xF3,3,LitI2,%2,0,1,0,0,0,0,load_lit,0x66109A01,Read i16 from stream; SIGN-extend to i32; push 4B -0,0xF4,2,LitI2_Byte,%1,0,1,0,0,0,0,load_lit,0x66109A16,Read u8 from stream; sign-extend to i32; push 4B (compact LitI2) -0,0xF5,5,LitI4,%4,0,1,0,0,0,0,load_lit,0x66109A26,Read i32 from stream; push 4B -0,0xF6,9,LitCy,%4 %4,0,2,0,0,0,0,load_lit,0x66109A4C,Read i64 (8B) from stream; push as 2x4B stack slots (Currency) -0,0xF7,5,LitCy4,%4,0,2,0,0,0,0,load_lit,0x66109A72,Read i32 from stream; sign-extend to i64; push 2 slots (Currency shorthand) -0,0xF8,3,LitI2FP,%2,0,0,0,1,0,0,load_lit,0x66109ABB,Read i16 from stream; sign-extend; fild → push on FPU (compact float literal) -0,0xF9,5,LitR4FP,%4,0,0,0,1,0,0,load_lit,0x66109AD2,Read f32 from stream; fld → push on FPU (compact R4 literal) -0,0xFA,9,LitDate,%4 %4,0,2,0,0,0,0,load_lit,0x66109A92,Read f64 (8B) from stream; push as 2x4B stack slots (Date) -0,0xFB,1,Lead0,,0,0,0,0,0,0,,, -0,0xFC,1,Lead1,,0,0,0,0,0,0,,, -0,0xFD,1,Lead2,,0,0,0,0,0,0,,, -0,0xFE,1,Lead3,,0,0,0,0,0,0,,, -0,0xFF,1,Lead4,,0,0,0,0,0,0,,, -1,0x00,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x01,1,ImpUI1,,2,1,0,0,0,0,arith,0x6610EEA0,Logical IMP (NOT a OR b) on UI1; pop TOS; NOT+OR with second in-place -1,0x02,1,ImpI4,,2,1,0,0,0,0,arith,0x6610EEB3,Logical IMP (NOT a OR b) on i32; pop TOS; NOT+OR with second in-place -1,0x03,1,ImpI4,,2,1,0,0,0,0,arith,0x6610EEB3,Logical IMP i32 (duplicate slot; same handler as 0x02) -1,0x04,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x05,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x06,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x07,3,ImpVar,%a,4,4,0,0,0,0,arith,0x6610EF8D,Variant Imp via __vbaVarImp; %a=2nd Variant; modify TOS 16B -1,0x08,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x09,1,EqvUI1,,2,1,0,0,0,0,arith,0x6610EE7B,Logical EQV (NOT(a XOR b)) on UI1; pop TOS; modify second -1,0x0A,1,EqvI4,,2,1,0,0,0,0,arith,0x6610EE8E,Logical EQV (NOT(a XOR b)) on i32; pop TOS; modify second -1,0x0B,1,EqvI4,,2,1,0,0,0,0,arith,0x6610EE8E,Logical EQV i32 (duplicate slot; same handler as 0x0A) -1,0x0C,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x0D,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x0E,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x0F,3,EqvVar,%a,4,4,0,0,0,0,arith,0x6610EF82,Variant Eqv via __vbaVarEqv; %a=2nd Variant; modify TOS 16B -1,0x10,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x11,1,XorI4,,2,1,0,0,0,0,arith,0x6610EE6A,Bitwise XOR i32; pop TOS; XOR with second in-place -1,0x12,1,XorI4,,2,1,0,0,0,0,arith,0x6610EE6A,Bitwise XOR i32 (duplicate slot; same handler as 0x11) -1,0x13,1,XorI4,,2,1,0,0,0,0,arith,0x6610EE6A,Bitwise XOR i32 (duplicate slot) -1,0x14,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x15,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x16,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x17,3,XorVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Xor via __vbaVarXor; %a=2nd Variant; modify TOS 16B -1,0x18,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x19,1,OrI2,,2,1,0,0,0,0,arith,0x66109C0B,Bitwise OR i16; same handler as primary OrI4 (truncated to i16 in caller) -1,0x1A,1,OrI2,,2,1,0,0,0,0,arith,0x66109C0B,Bitwise OR i16 (duplicate slot) -1,0x1B,1,OrI2,,2,1,0,0,0,0,arith,0x66109C0B,Bitwise OR i16 (duplicate slot) -1,0x1C,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x1D,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x1E,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x1F,3,OrVar,%a,4,4,0,0,0,0,arith,0x66109CE4,Variant OR via __vbaVarOr; operand %a = 2nd Variant addr; modify TOS 16B -1,0x20,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x21,1,AndUI1,,2,1,0,0,0,0,arith,0x66109BFB,Bitwise AND UI1; same handler as primary AndI4 -1,0x22,1,AndUI1,,2,1,0,0,0,0,arith,0x66109BFB,Bitwise AND UI1 (duplicate slot) -1,0x23,1,AndUI1,,2,1,0,0,0,0,arith,0x66109BFB,Bitwise AND UI1 (duplicate slot) -1,0x24,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x25,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x26,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x27,3,AndVar,%a,4,4,0,0,0,0,arith,0x66109CC6,Variant AND via __vbaVarAnd; operand %a = 2nd Variant addr; modify TOS 16B -1,0x28,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x29,1,EqI2,,2,1,0,0,0,0,compare,0x6610A685,Lead0 EqI2: same as primary table EqI2; pop 1 compare with TOS push bool -1,0x2A,1,EqI2,,2,1,0,0,0,0,compare,0x6610A685,Lead0 EqI2 (duplicate slot) -1,0x2B,1,EqI4,,2,1,0,0,0,0,compare,0x6610A6A3,Lead0 EqI4: same as primary table EqI4; pop 1 compare push bool -1,0x2C,1,EqR8,,0,1,2,0,0,0,compare,0x6610A7D1,Lead0 EqR8: FPU compare; pop 2 FPU push eval i32 bool -1,0x2D,1,EqR8,,0,1,2,0,0,0,compare,0x6610A7D1,Lead0 EqR8 (duplicate slot) -1,0x2E,1,EqCy,,4,1,0,0,0,0,compare,0x6610A825,Lead0 EqCy: Currency compare; pop 2×8B push i32 bool -1,0x2F,3,EqVar,%a,4,4,0,0,0,0,compare,0x6610A85A,Variant equality via __vbaVarTstEq; %a=2nd Variant addr; TOS Variant → result Variant (vbBoolean) -1,0x30,1,EqStr,,2,1,0,0,0,0,compare,0x6610A6C0,String equality via __vbaStrCmp(0=case-sensitive); pop 2 BSTRs push i32 bool -1,0x31,3,EqTextVar,%a,4,4,0,0,0,0,compare,0x661103E7,Variant equality case-insensitive; %a=2nd Variant addr; TOS → result Variant -1,0x32,1,EqTextStr,,2,1,0,0,0,0,compare,0x66110295,String equality case-insensitive via __vbaStrCmp(1); pop 2 BSTRs push i32 bool -1,0x33,1,EqVarBool,,4,1,0,0,0,0,compare,0x6610A887,Variant equality (bool result); pop 4 Variant slots push i32 bool -1/0 -1,0x34,1,EqTextVarBool,,4,1,0,0,0,0,compare,0x6611042C,Variant equality case-insensitive (bool result); pop 4 push i32 -1,0x35,1,EqCyR8,,2,1,1,0,0,0,compare,0x6610A840,Lead0 EqCyR8: Mixed Cy/R8 compare; pop 2 Cy + 1 FPU push i32 bool -1,0x36,1,NeUI1,,2,1,0,0,0,0,compare,0x6610A6B3,Ne UI1 compare; pop 1 compare TOS; result -1 if not equal -1,0x37,1,NeUI1,,2,1,0,0,0,0,compare,0x6610A6B3,Ne UI1 (duplicate slot) -1,0x38,1,NeI4,,2,1,0,0,0,0,compare,0x6610A6C1,Ne I4 compare; pop 1 compare TOS; result -1 if not equal -1,0x39,1,NeR4,,0,1,2,0,0,0,compare,0x6610A7E2,FPU R4 Ne compare; pop 2 FPU push eval i32 bool -1,0x3A,1,NeR4,,0,1,2,0,0,0,compare,0x6610A7E2,FPU R4 Ne (duplicate) -1,0x3B,1,NeCy,,4,1,0,0,0,0,compare,0x6610A855,Currency Ne; pop 2×8B push i32 bool -1,0x3C,3,NeVar,%a,4,4,0,0,0,0,compare,0x6610A825,Variant Ne via __vbaVarTstNe; TOS Variant → result Variant -1,0x3D,1,NeStr,,2,1,0,0,0,0,compare,0x6610A715,String Ne case-sensitive; pop 2 BSTRs push i32 bool -1,0x3E,3,NeTextVar,%a,4,4,0,0,0,0,compare,0x661103E0,Variant Ne case-insensitive; TOS Variant → result Variant -1,0x3F,1,NeTextStr,,2,1,0,0,0,0,compare,0x661102B0,String Ne case-insensitive; pop 2 BSTRs push i32 bool -1,0x40,1,NeVarBool,,4,1,0,0,0,0,compare,0x6610A86C,Variant Ne (bool result); pop 4 Var slots push i32 bool -1,0x41,1,NeTextVarBool,,4,1,0,0,0,0,compare,0x66110425,Variant Ne case-insensitive (bool); pop 4 push i32 -1,0x42,1,NeCyR8,,2,1,1,0,0,0,compare,0x6610A870,Mixed Cy/R8 Ne; pop 2 Cy eval + 1 FPU push i32 bool -1,0x43,1,LeUI1,,2,1,0,0,0,0,compare,0x6610A70B,Le UI1 compare; pop 1 compare TOS; result -1 if second<=first -1,0x44,1,LeI2,,2,1,0,0,0,0,compare,0x6610A70B,Le I2 compare; pop 1 compare TOS -1,0x45,1,LeI4,,2,1,0,0,0,0,compare,0x6610A71D,Le I4 compare; pop 1 compare TOS -1,0x46,1,LeR4,,0,1,2,0,0,0,compare,0x6610A7F2,FPU R4 Le compare; pop 2 FPU push eval i32 bool -1,0x47,1,LeR4,,0,1,2,0,0,0,compare,0x6610A7F2,FPU R4 Le (duplicate) -1,0x48,1,LeCy,,4,1,0,0,0,0,compare,0x6610A8B0,Currency Le; pop 2×8B push i32 bool -1,0x49,3,LeVar,%a,4,4,0,0,0,0,compare,0x6610A880,Variant Le via __vbaVarTstLe; TOS Variant → result Variant -1,0x4A,1,LeStr,,2,1,0,0,0,0,compare,0x661102D8,String Le case-sensitive; pop 2 BSTRs push i32 bool -1,0x4B,3,LeTextVar,%a,4,4,0,0,0,0,compare,0x661103EE,Variant Le case-insensitive -1,0x4C,1,LeTextStr,,2,1,0,0,0,0,compare,0x66110305,String Le case-insensitive; pop 2 BSTRs push i32 bool -1,0x4D,1,LeVarBool,,4,1,0,0,0,0,compare,0x6610A8A6,Variant Le (bool result); pop 4 push i32 -1,0x4E,1,LeTextVarBool,,4,1,0,0,0,0,compare,0x66110433,Variant Le case-insensitive (bool); pop 4 push i32 -1,0x4F,1,LeCyR8,,2,1,1,0,0,0,compare,0x6610A8CB,Mixed Cy/R8 Le; pop 2 Cy eval + 1 FPU push i32 bool -1,0x50,1,GeUI1,,2,1,0,0,0,0,compare,0x6610A783,Ge UI1 compare; pop 1 compare TOS -1,0x51,1,GeI2,,2,1,0,0,0,0,compare,0x6610A783,Ge I2 compare; pop 1 compare TOS -1,0x52,1,GeI4,,2,1,0,0,0,0,compare,0x6610A795,Ge I4 compare; pop 1 compare TOS -1,0x53,1,GeR4,,0,1,2,0,0,0,compare,0x6610A813,FPU R4 Ge compare; pop 2 FPU push eval i32 bool -1,0x54,1,GeR4,,0,1,2,0,0,0,compare,0x6610A813,FPU R4 Ge (duplicate) -1,0x55,1,GeCy,,4,1,0,0,0,0,compare,0x6610A910,Currency Ge; pop 2×8B push i32 bool -1,0x56,3,GeVar,%a,4,4,0,0,0,0,compare,0x6610A8E0,Variant Ge via __vbaVarTstGe; TOS Variant → result Variant -1,0x57,1,GeStr,,2,1,0,0,0,0,compare,0x66110319,String Ge case-sensitive; pop 2 BSTRs push i32 bool -1,0x58,3,GeTextVar,%a,4,4,0,0,0,0,compare,0x661103F5,Variant Ge case-insensitive -1,0x59,1,GeTextStr,,2,1,0,0,0,0,compare,0x66110332,String Ge case-insensitive; pop 2 BSTRs push i32 bool -1,0x5A,1,GeVarBool,,4,1,0,0,0,0,compare,0x6610A906,Variant Ge (bool result); pop 4 push i32 -1,0x5B,1,GeTextVarBool,,4,1,0,0,0,0,compare,0x6611043A,Variant Ge case-insensitive (bool); pop 4 push i32 -1,0x5C,1,GeCyR8,,2,1,1,0,0,0,compare,0x6610A92B,Mixed Cy/R8 Ge; pop 2 Cy eval + 1 FPU push i32 bool -1,0x5D,1,LtUI1,,2,1,0,0,0,0,compare,0x6610A6CF,Lt UI1 compare; pop 1 compare TOS -1,0x5E,1,LtI2,,2,1,0,0,0,0,compare,0x6610A6CF,Lt I2 compare; pop 1 compare TOS -1,0x5F,1,LtI4,,2,1,0,0,0,0,compare,0x6610A6E1,Lt I4 compare; pop 1 compare TOS -1,0x60,1,LtR4,,0,1,2,0,0,0,compare,0x6610A802,FPU R4 Lt compare; pop 2 FPU push eval i32 bool -1,0x61,1,LtR4,,0,1,2,0,0,0,compare,0x6610A802,FPU R4 Lt (duplicate) -1,0x62,1,LtCy,,4,1,0,0,0,0,compare,0x6610A880,Currency Lt; pop 2×8B push i32 bool -1,0x63,3,LtVar,%a,4,4,0,0,0,0,compare,0x6610A850,Variant Lt via __vbaVarTstLt; TOS Variant → result Variant -1,0x64,1,LtStr,,2,1,0,0,0,0,compare,0x661102EC,String Lt case-sensitive via __vbaStrCmp; eax s<0 → True -1,0x65,3,LtTextVar,%a,4,4,0,0,0,0,compare,0x661103E7,Variant Lt case-insensitive -1,0x66,1,LtTextStr,,2,1,0,0,0,0,compare,0x66110300,String Lt case-insensitive -1,0x67,1,LtVarBool,,4,1,0,0,0,0,compare,0x6610A876,Variant Lt (bool result); pop 4 push i32 -1,0x68,1,LtTextVarBool,,4,1,0,0,0,0,compare,0x6611042C,Variant Lt case-insensitive (bool); pop 4 push i32 -1,0x69,1,LtCyR8,,2,1,1,0,0,0,compare,0x6610A89B,Mixed Cy/R8 Lt; pop 2 Cy eval + 1 FPU push i32 bool -1,0x6A,1,GtUI1,,2,1,0,0,0,0,compare,0x6610A747,Gt UI1 compare; pop 1 compare TOS -1,0x6B,1,GtI2,,2,1,0,0,0,0,compare,0x6610A747,Gt I2 compare; pop 1 compare TOS -1,0x6C,1,GtI4,,2,1,0,0,0,0,compare,0x6610A759,Gt I4 compare; pop 1 compare TOS -1,0x6D,1,GtR4,,0,1,2,0,0,0,compare,0x6610A7F2,FPU R4 Gt compare; pop 2 FPU push eval i32 bool -1,0x6E,1,GtR4,,0,1,2,0,0,0,compare,0x6610A7F2,FPU R4 Gt (duplicate) -1,0x6F,1,GtCy,,4,1,0,0,0,0,compare,0x6610A8E0,Currency Gt; pop 2×8B push i32 bool -1,0x70,3,GtVar,%a,4,4,0,0,0,0,compare,0x6610A8B0,Variant Gt via __vbaVarTstGt; TOS Variant → result Variant -1,0x71,1,GtStr,,2,1,0,0,0,0,compare,0x6611030E,String Gt case-sensitive; pop 2 BSTRs push i32 bool -1,0x72,3,GtTextVar,%a,4,4,0,0,0,0,compare,0x661103EE,Variant Gt case-insensitive -1,0x73,1,GtTextStr,,2,1,0,0,0,0,compare,0x66110327,String Gt case-insensitive -1,0x74,1,GtVarBool,,4,1,0,0,0,0,compare,0x6610A8D6,Variant Gt (bool result); pop 4 push i32 -1,0x75,1,GtTextVarBool,,4,1,0,0,0,0,compare,0x66110433,Variant Gt case-insensitive (bool); pop 4 push i32 -1,0x76,1,GtCyR8,,2,1,1,0,0,0,compare,0x6610A8FB,Mixed Cy/R8 Gt; pop 2 Cy eval + 1 FPU push i32 bool -1,0x77,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x78,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x79,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x7A,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x7B,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x7C,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x7D,3,LikeVar,%a,4,4,0,0,0,0,compare,0x66110525,Variant Like pattern match via __vbaVarLike; TOS Variant → result Variant -1,0x7E,1,LikeStr,,2,1,0,0,0,0,compare,0x66110504,String Like case-sensitive via __vbaStrLike(0); pop 2 BSTRs push i32 bool -1,0x7F,3,LikeTextVar,%a,4,4,0,0,0,0,compare,0x66110508,Variant Like case-insensitive via __vbaVarLike; TOS → result -1,0x80,1,LikeTextStr,,2,1,0,0,0,0,compare,0x661104F0,String Like case-insensitive via __vbaStrLike(1); pop 2 push i32 -1,0x81,1,LikeVarBool,,4,1,0,0,0,0,compare,0x6611053B,Variant Like (bool result); pop 4 Var slots push i32 bool -1,0x82,1,LikeTextVarBool,,4,1,0,0,0,0,compare,0x66110529,Variant Like case-insensitive (bool); pop 4 push i32 -1,0x83,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x84,1,BetweenUI1,,3,1,0,0,0,0,compare,0x6610F0B0,Between UI1; pop val+low+high; push i32 bool -1,0x85,1,BetweenI2,,3,1,0,0,0,0,compare,0x6610F0C0,Between I2; pop val+low+high; push i32 bool -1,0x86,1,BetweenI4,,3,1,0,0,0,0,compare,0x6610F0D0,Between I4; pop val+low+high; push i32 bool -1,0x87,1,BetweenR4,,0,1,3,0,0,0,compare,0x6610F0E0,FPU Between R4; pop 3 FPU vals; push eval i32 bool -1,0x88,1,BetweenR4,,0,1,3,0,0,0,compare,0x6610F0E0,FPU Between R4 (duplicate) -1,0x89,1,BetweenCy,,6,1,0,0,0,0,compare,0x6610F0F0,Currency Between; pop 3×8B; push i32 bool -1,0x8A,1,BetweenVar,,12,1,0,0,0,0,compare,0x6610F100,Variant Between; pop 3×16B; push i32 bool -1,0x8B,1,BetweenStr,,3,1,0,0,0,0,compare,0x6610F110,String Between; pop 3 BSTRs; push i32 bool -1,0x8C,1,BetweenTextVar,,12,1,0,0,0,0,compare,0x6610F120,Variant Between case-insensitive; pop 3×16B; push i32 -1,0x8D,1,BetweenTextStr,,3,1,0,0,0,0,compare,0x6610F130,String Between case-insensitive; pop 3 BSTRs; push i32 -1,0x8E,1,AddUI1,,2,1,0,0,0,0,arith,0x6610EC0C,UI1 unsigned add; pop TOS byte; add to second; unsigned overflow check (err 6) -1,0x8F,1,AddI2,,2,1,0,0,0,0,arith,0x66109B08,Lead0 AddI2: shares primary table handler; i16 add with overflow -1,0x90,1,AddI4,,2,1,0,0,0,0,arith,0x66109B3F,Lead0 AddI4: shares primary table handler; i32 add with overflow -1,0x91,1,AddR4,,0,0,1,0,0,0,arith,0x66109B55,Lead0 AddR4: shares primary table FPU handler; faddp -1,0x92,1,AddR4,,0,0,1,0,0,0,arith,0x66109B55,Lead0 AddR4 (duplicate) -1,0x93,1,AddCy,,4,2,0,0,0,0,arith,0x6610E424,Lead0 AddCy: shares primary table handler; __vbaCyAdd -1,0x94,3,AddVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Add via __vbaVarAdd; %a=2nd Variant addr; modify TOS 16B -1,0x95,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x96,1,SubUI1,,2,1,0,0,0,0,arith,0x6610EC2D,UI1 unsigned sub; pop TOS byte; sub from second; unsigned overflow -1,0x97,1,SubI2,,2,1,0,0,0,0,arith,0x66109B23,Lead0 SubI2: shares primary table handler -1,0x98,1,SubI4,,2,1,0,0,0,0,arith,0x66109B7A,Lead0 SubI4: shares primary table handler -1,0x99,1,SubR4,,0,0,1,0,0,0,arith,0x66109B98,Lead0 SubR4: FPU fsubp -1,0x9A,1,SubR4,,0,0,1,0,0,0,arith,0x66109B98,Lead0 SubR4 (duplicate) -1,0x9B,1,SubCy,,4,2,0,0,0,0,arith,0x6610E440,Lead0 SubCy: __vbaCySub -1,0x9C,3,SubVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Sub via __vbaVarSub; %a=2nd Variant -1,0x9D,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0x9E,1,ModUI1,,2,1,0,0,0,0,arith,0x6610EC9E,UI1 unsigned mod -1,0x9F,1,ModI2,,2,1,0,0,0,0,arith,0x66109C4D,Lead0 ModI2: shares primary handler -1,0xA0,1,ModI4,,2,1,0,0,0,0,arith,0x66109C4D,Lead0 ModI4: shares primary handler -1,0xA1,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xA2,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xA3,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xA4,3,ModVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Mod via __vbaVarMod; %a=2nd Variant -1,0xA5,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xA6,1,IDvUI1,,2,1,0,0,0,0,arith,0x6610EC82,UI1 integer division -1,0xA7,1,IDvI2,,2,1,0,0,0,0,arith,0x66109C1A,Lead0 IDvI2: shares primary handler -1,0xA8,1,IDvI4,,2,1,0,0,0,0,arith,0x66109C1A,Lead0 IDvI4: shares primary handler -1,0xA9,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xAA,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xAB,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xAC,3,IDvVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant IDv via __vbaVarIDv; %a=2nd Variant -1,0xAD,1,Unknown,,0,0,0,0,0,0,,, -1,0xAE,1,MulUI1,,2,1,0,0,0,0,arith,0x6610EC4E,UI1 unsigned mul; unsigned overflow check -1,0xAF,1,MulI2,,2,1,0,0,0,0,arith,0x66109BA6,Lead0 MulI2: shares primary handler -1,0xB0,1,MulI4,,2,1,0,0,0,0,arith,0x66109BC5,Lead0 MulI4: shares primary handler -1,0xB1,1,MulR4,,0,0,1,0,0,0,arith,0x66109B93,Lead0 MulR4: FPU fmulp -1,0xB2,1,MulR4,,0,0,1,0,0,0,arith,0x66109B93,Lead0 MulR4 (duplicate) -1,0xB3,1,MulCy,,4,2,0,0,0,0,arith,0x6610E45C,Lead0 MulCy: __vbaCyMul -1,0xB4,3,MulVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Mul via __vbaVarMul; %a=2nd Variant -1,0xB5,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xB6,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xB7,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xB8,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xB9,1,DivR8,,0,0,1,0,0,0,arith,0x66109B93,Lead0 DivR8: FPU fdivp -1,0xBA,1,DivR8,,0,0,1,0,0,0,arith,0x66109B93,Lead0 DivR8 (duplicate) -1,0xBB,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xBC,3,DivVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Div via __vbaVarDiv; %a=2nd Variant -1,0xBD,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xBE,1,NotUI1,,1,1,0,0,0,0,unary,0x6610EECE,UI1 bitwise NOT; modify TOS low byte in-place -1,0xBF,1,NotI4,,1,1,0,0,0,0,unary,0x66109BEC,Lead0 NotI4: shares primary handler -1,0xC0,1,NotI4,,1,1,0,0,0,0,unary,0x66109BEC,Lead0 NotI4 (duplicate) -1,0xC1,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xC2,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xC3,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xC4,3,NotVar,%a,4,4,0,0,0,0,unary,0x66109CBE,Variant Not via __vbaVarNot; %a=Variant addr; modify in-place -1,0xC5,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xC6,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xC7,1,UMiI2,,1,1,0,0,0,0,unary,0x66109BCC,Lead0 UMiI2: shares primary handler; negate i16 in TOS -1,0xC8,1,UMiI2,,1,1,0,0,0,0,unary,0x66109BCC,Lead0 UMiI2 (duplicate) -1,0xC9,1,UMiR4,,0,0,0,0,0,0,unary,0x66109BDA,Lead0 UMiR4: FPU fchs ST0 -1,0xCA,1,UMiR4,,0,0,0,0,0,0,unary,0x66109BDA,Lead0 UMiR4 (duplicate) -1,0xCB,1,UMiCy,,2,2,0,0,0,0,unary,0x6610E4B4,Lead0 UMiCy: __vbaCyNeg -1,0xCC,3,UMiVar,%a,4,4,0,0,0,0,unary,0x66109CBE,Variant UMi via __vbaVarNeg; modify in-place -1,0xCD,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xCE,3,PwrVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant Power via __vbaVarPwr; %a=2nd Variant -1,0xCF,1,PwrR8R8,,0,0,1,0,0,0,arith,0x6610EF18,FPU R8 power; calls __vbaPowerR8; pops 2 FPU pushes 1 -1,0xD0,1,PwrR8I2,,1,0,0,0,0,0,arith,0x6610EF24,R8^I2 power; pop i32 from eval + FPU R8; result on FPU -1,0xD1,1,MulCyI2,,3,2,0,0,0,0,arith,0x6610E478,Lead0 MulCyI2: shares primary handler; pop i16+2Cy push 2Cy -1,0xD2,1,ObjIs,,2,1,0,0,0,0,compare,0x6610EF56,COM Is operator; pop 2 obj ptrs; compare identity; push i32 bool -1,0xD3,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xD4,1,FnAbsI2,,1,1,0,0,0,0,unary,0x66109BE0,Lead0 FnAbsI2: shares primary handler -1,0xD5,1,FnAbsI4,,1,1,0,0,0,0,unary,0x66109BE4,Lead0 FnAbsI4: shares primary handler -1,0xD6,1,FnAbsR4,,0,0,0,0,0,0,unary,0x66109BEA,Lead0 FnAbsR4: FPU fabs ST0 -1,0xD7,1,FnAbsR4,,0,0,0,0,0,0,unary,0x66109BEA,Lead0 FnAbsR4 (duplicate) -1,0xD8,1,FnAbsCy,,2,2,0,0,0,0,unary,0x6610E4D0,Lead0 FnAbsCy: __vbaCyAbs -1,0xD9,3,FnAbsVar,%a,4,4,0,0,0,0,unary,0x66109CBE,Variant Abs via __vbaVarAbs; modify in-place -1,0xDA,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xDB,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xDC,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xDD,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xDE,1,FnFixR8,,0,0,0,0,0,0,unary,0x6610EF90,FPU Fix; truncate ST0 toward zero -1,0xDF,1,FnFixR8,,0,0,0,0,0,0,unary,0x6610EF90,FPU Fix (duplicate) -1,0xE0,1,FnFixCy,,2,2,0,0,0,0,unary,0x6610EFA0,Currency Fix via __vbaCyFix -1,0xE1,3,FnFixVar,%a,4,4,0,0,0,0,unary,0x66109CBE,Variant Fix via __vbaVarFix; modify in-place -1,0xE2,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xE3,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xE4,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xE5,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xE6,1,FnIntR8,,0,0,0,0,0,0,unary,0x6610EFB0,FPU Int; floor ST0 -1,0xE7,1,FnIntR8,,0,0,0,0,0,0,unary,0x6610EFB0,FPU Int (duplicate) -1,0xE8,1,FnIntCy,,2,2,0,0,0,0,unary,0x6610EFC0,Currency Int via __vbaCyInt -1,0xE9,3,FnIntVar,%a,4,4,0,0,0,0,unary,0x66109CBE,Variant Int via __vbaVarInt; modify in-place -1,0xEA,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xEB,3,FnLenVar,%a,4,1,0,0,0,0,stack,0x6610EFD0,Variant Len; pop 16B Variant push i32 length via __vbaLenVar -1,0xEC,1,FnLenStr,,1,1,0,0,0,0,stack,0x6610A110,Lead0 FnLenStr: shares primary handler; SysStringLen -1,0xED,3,FnLenBVar,%a,4,1,0,0,0,0,stack,0x6610EFE0,Variant LenB; pop 16B Variant push i32 byte length -1,0xEE,1,FnLenBStr,,1,1,0,0,0,0,stack,0x6610EFF0,String LenB; pop BSTR push byte length (SysStringByteLen) -1,0xEF,3,ConcatVar,%a,4,4,0,0,0,0,arith,0x66109CBE,Variant concatenation via __vbaVarCat; %a=2nd Variant -1,0xF0,1,ConcatStr,,2,1,0,0,0,0,arith,0x66108F1D,Lead0 ConcatStr: shares primary handler; __vbaStrCat -1,0xF1,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xF2,1,FnSgnUI1,,1,1,0,0,0,0,unary,0x6610F000,UI1 Sgn; TOS → 0 or 1 (always positive for unsigned) -1,0xF3,1,FnSgnUI1,,1,1,0,0,0,0,unary,0x6610F000,FnSgnUI1 (duplicate) -1,0xF4,1,FnSgnI4,,1,1,0,0,0,0,unary,0x6610F010,I4 Sgn; TOS → -1/0/1 -1,0xF5,1,FnSgnR8,,0,0,0,0,0,0,unary,0x6610F020,FPU Sgn R8; ST0 → -1.0/0.0/1.0 -1,0xF6,1,FnSgnR4,,0,0,0,0,0,0,unary,0x6610F020,FPU Sgn R4; ST0 → -1.0/0.0/1.0 -1,0xF7,1,FnSgnCy,,2,2,0,0,0,0,unary,0x6610F030,Currency Sgn; 2 Cy slots → 2 Cy slots (-10000/0/10000) -1,0xF8,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xF9,1,InvalidExcode,,0,0,0,0,0,0,,, -1,0xFA,1,SeekFile,,2,0,0,0,0,0,call,0x6610F050,VB Seek statement; pop filenum + position -1,0xFB,1,NameFile,,2,0,0,0,0,0,call,0x6610F060,VB Name statement; pop 2 BSTRs (old new); rename file -1,0xFC,1,CStrI2,,1,1,0,0,0,0,convert,0x6610F070,Convert I2 to BSTR via __vbaCStrI2; pop i32 push BSTR ptr -1,0xFD,1,CStrUI1,,1,1,0,0,0,0,convert,0x6610F080,Convert UI1 to BSTR via __vbaCStrUI1; pop i32 push BSTR ptr -1,0xFE,1,CStrI4,,1,1,0,0,0,0,convert,0x6610F090,Convert I4 to BSTR via __vbaCStrI4; pop i32 push BSTR ptr -1,0xFF,1,CStrR4,,0,1,1,0,0,0,convert,0x6610F0A0,Convert FPU R4 to BSTR; pop FPU ST0 push BSTR ptr -2,0x00,1,CStrR8,,0,1,1,0,0,0,convert,0x6610D765,R8(FPU)→Str via __vbaStrR8; pop FPU ST0; push BSTR ptr -2,0x01,1,CStrCy,,2,1,0,0,0,0,convert,0x6610D7A9,Cy(2 slots)→Str via __vbaStrCy; pop 8B; push BSTR ptr -2,0x02,1,CStrVar,,4,1,0,0,0,0,convert,0x661090B7,Var(4 slots)→Str via __vbaStrVarCopy; pop 16B; push BSTR ptr -2,0x03,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x04,1,CCyI2,,1,2,0,0,0,0,convert,0x6610A9A3,I2→Cy; pop 1 slot; multiply by 10000; push 2 slots (8B Cy) -2,0x05,1,CCyI2,,1,2,0,0,0,0,convert,0x6610A9A3,I2→Cy (duplicate slot); same handler as 0x04 -2,0x06,1,CCyI4,,1,2,0,0,0,0,convert,0x6610A9BF,I4→Cy; pop 1 slot; multiply by 10000; push 2 slots (8B Cy) -2,0x07,1,CCyR4,,0,2,1,0,0,0,convert,0x6610A9CF,R4(FPU)→Cy via __vbaCyR4; pop FPU; push 2 eval slots -2,0x08,1,CCyR4,,0,2,1,0,0,0,convert,0x6610A9CF,R4(FPU)→Cy (duplicate slot); same handler as 0x07 -2,0x09,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x0A,1,CCyVar,,4,2,0,0,0,0,convert,0x6610D6F5,Var(4 slots)→Cy via __vbaCyVar; pop 16B; push 2 slots -2,0x0B,1,CCyStr,,1,2,0,0,0,0,convert,0x6610D81D,Str→Cy; pop BSTR; convert to Cy; push 2 eval slots -2,0x0C,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x0D,1,CUI1I2,,1,1,0,0,0,0,convert,0x6610D581,I2→UI1; in-place range check (byte must be 0); overflow error if >255 -2,0x0E,1,CUI1I4,,1,1,0,0,0,0,convert,0x6610D598,I4→UI1; in-place range check (upper 3 bytes must be 0) -2,0x0F,1,CUI1R4,,0,1,1,0,0,0,convert,0x6610D5BD,R4(FPU)→UI1; round FPU to int; range check 0-255; push eval -2,0x10,1,CUI1R4,,0,1,1,0,0,0,convert,0x6610D5BD,R4(FPU)→UI1 (duplicate slot); same handler as 0x0F -2,0x11,1,CUI1Cy,,2,1,0,0,0,0,convert,0x6610D5B1,Cy→UI1; pop 2 Cy slots; divide by 10000; range check; push UI1 -2,0x12,1,CUI1Var,,4,1,0,0,0,0,convert,0x6610D5FC,Var→UI1; pop 16B Variant; convert via runtime; push UI1 -2,0x13,1,CUI1Str,,1,1,0,0,0,0,convert,0x6610D7C8,Str→UI1; pop BSTR; convert to byte; push UI1 -2,0x14,1,CI2UI1,,1,1,0,0,0,0,convert,0x66108F81,UI1→I2; trivial widening; byte value already valid i16 -2,0x15,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x16,1,CI2I4,,1,1,0,0,0,0,convert,0x6610A9E3,I4→I2; truncate with overflow check (-32768..32767) -2,0x17,1,CI2R8,,0,1,1,0,0,0,convert,0x6610A9E9,R8(FPU)→I2; pop FPU; round to i16; overflow check; push eval -2,0x18,1,CI2R8,,0,1,1,0,0,0,convert,0x6610A9E9,R8(FPU)→I2 (duplicate slot); same handler as 0x17 -2,0x19,1,CI2Cy,,2,1,0,0,0,0,convert,0x6610A9EF,Cy→I2; pop 2 slots; divide by 10000; push i16 as i32 -2,0x1A,1,CI2Var,,4,1,0,0,0,0,convert,0x6610A95A,Var→I2; pop 16B Variant; convert to i16; push as i32 -2,0x1B,1,CI2Str,,1,1,0,0,0,0,convert,0x66109159,Str→I2; pop BSTR; convert to i16; push as i32 -2,0x1C,1,CI4UI1,,1,1,0,0,0,0,convert,0x6610A9EB,UI1→I4; in-place zero-extend byte to i32 -2,0x1D,1,CI4UI1,,1,1,0,0,0,0,convert,0x6610A9EB,UI1→I4 (duplicate slot); same handler as 0x1C -2,0x1E,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x1F,1,CI4R8,,0,1,1,0,0,0,convert,0x6610A9F3,R8(FPU)→I4; pop FPU; round to i32 via __vbaFpI4; overflow check -2,0x20,1,CI4R8,,0,1,1,0,0,0,convert,0x6610A9F3,R8(FPU)→I4 (duplicate slot); same handler as 0x1F -2,0x21,1,CI4Cy,,2,1,0,0,0,0,convert,0x6610A9FD,Cy→I4; pop 2 slots (8B); divide by 10000; push i32 -2,0x22,1,CI4Var,,4,1,0,0,0,0,convert,0x66108FF0,Var→I4; pop 16B Variant; convert to i32; push -2,0x23,1,CI4Str,,1,1,0,0,0,0,convert,0x6610A988,Str→I4; pop BSTR; convert via __vbaI4Str; push i32 -2,0x24,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→R8(FPU); pop eval i16; fild push FPU double -2,0x25,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→R8(FPU) (duplicate slot); same handler -2,0x26,1,CR4I4,,1,0,0,1,0,0,convert,0x6610A011,I4→R8(FPU); pop eval i32; fild push FPU double -2,0x27,1,CR4R8,,0,0,0,0,0,0,convert,0x66108FE1,R8(FPU)→R4; frndint/precision; FPU identity; ST0 stays -2,0x28,1,CR4R8,,0,0,0,0,0,0,convert,0x66108FE1,R8(FPU)→R4 (duplicate slot); same handler -2,0x29,1,CR8Cy,,2,0,0,1,0,0,convert,0x6610A95D,Cy→R8(FPU); pop 2 eval slots; convert to double; push FPU -2,0x2A,1,CR8Var,,4,0,0,1,0,0,convert,0x6610A940,Var→R8(FPU); pop 16B Variant; convert to double; push FPU -2,0x2B,1,CR4Str,,1,0,0,1,0,0,convert,0x66109175,Str→R4(FPU); pop BSTR; convert via __vbaR4Str; push FPU -2,0x2C,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→FPU (duplicate slot); same handler as 0x24 -2,0x2D,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→FPU (duplicate slot); same handler as 0x24 -2,0x2E,1,CR4I4,,1,0,0,1,0,0,convert,0x6610A011,I4→FPU (duplicate slot); same handler as 0x26 -2,0x2F,1,CR8R4,,0,0,0,0,0,0,convert,0x66108FE1,R4(FPU)→R8; FPU identity; ST0 stays; no-op -2,0x30,1,CR8R4,,0,0,0,0,0,0,convert,0x66108FE1,R4(FPU)→R8 (duplicate slot); same handler -2,0x31,1,CR8Cy,,2,0,0,1,0,0,convert,0x6610A95D,Cy→R8(FPU) (duplicate slot); same handler as 0x29 -2,0x32,1,CR8Var,,4,0,0,1,0,0,convert,0x6610A940,Var→R8(FPU) (duplicate slot); same handler as 0x2A -2,0x33,1,CR8Str,,1,0,0,1,0,0,convert,0x6610D7FB,Str→R8(FPU); pop BSTR; convert via __vbaR8Str; push FPU -2,0x34,1,CAdVar,,4,1,0,0,0,0,convert,0x661092AF,Var→Ad; pop 16B Variant; extract IUnknown ptr; push -2,0x35,1,CRefVarAry,,4,1,0,0,0,0,convert,0x661092E9,Var array ref conversion; pop Variant; push array ref -2,0x36,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x37,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x38,1,CUI1Bool,,1,1,0,0,0,0,convert,0x6610D5EB,Bool→UI1; pop i32 bool; mask to byte; push UI1 -2,0x39,1,FnCDblCy,,2,0,0,1,0,0,convert,0x6610D684,Cy→Double(FPU); pop 2 Cy slots; convert; push FPU -2,0x3A,1,FnCDblR8,,0,0,0,0,0,0,convert,0x6610D690,R8(FPU)→Double; FPU identity; no-op -2,0x3B,1,FnCDblR8,,0,0,0,0,0,0,convert,0x6610D690,R8→Double (duplicate slot); same handler as 0x3A -2,0x3C,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→FPU (duplicate slot); same handler as 0x24 -2,0x3D,1,FnCSngI2,,1,0,0,1,0,0,convert,0x66108FFB,I2→FPU (duplicate slot); same handler as 0x24 -2,0x3E,1,FnCSngI4,,1,0,0,1,0,0,convert,0x6610D648,I4→Single(FPU); pop eval i32; push FPU float -2,0x3F,1,CSng,,0,0,0,0,0,0,convert,0x6610D64C,R4(FPU)→Single; FPU round to f32 precision; ST0 stays -2,0x40,1,CSng,,0,0,0,0,0,0,convert,0x6610D64C,R4→Single (duplicate slot); same handler as 0x3F -2,0x41,1,FnCSngCy,,2,0,0,1,0,0,convert,0x6610D665,Cy→Single(FPU); pop 2 Cy slots; convert; push FPU -2,0x42,1,FnCSngVar,,4,0,0,1,0,0,convert,0x6610D65E,Var→Single(FPU); pop 16B Variant; convert; push FPU -2,0x43,1,FnCSngStr,,1,0,0,1,0,0,convert,0x66109175,Str→Single(FPU); pop BSTR; convert; push FPU (same as CR4Str) -2,0x44,1,FnCByteVar,,4,1,0,0,0,0,convert,0x6610D86D,Var→Byte; pop 16B Variant; convert to UI1; push -2,0x45,1,FnCIntVar,,4,1,0,0,0,0,convert,0x6610917F,Var→Int(I2); pop 16B Variant; convert to i16; push as i32 -2,0x46,1,FnCLngVar,,4,1,0,0,0,0,convert,0x66109191,Var→Long(I4); pop 16B Variant; convert to i32; push -2,0x47,1,CDateR8,,0,0,0,0,0,0,convert,0x66108FE1,R8(FPU)→Date; FPU identity (Date=R8); ST0 stays -2,0x48,1,FnCDblVar,,4,0,0,1,0,0,convert,0x6610D673,Var→Double(FPU); pop 16B Variant; convert to R8; push FPU -2,0x49,1,FnCCurVar,,4,2,0,0,0,0,convert,0x6610D87F,Var→Currency; pop 16B Variant; convert to Cy; push 2 slots -2,0x4A,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x4B,1,FnCStrVar,,4,1,0,0,0,0,convert,0x6610D892,Var→String; pop 16B Variant; convert to BSTR; push ptr -2,0x4C,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x4D,1,FnCBoolVar,,4,1,0,0,0,0,convert,0x6610D8A4,Var→Bool; pop 16B Variant; convert to VB bool; push i32 -2,0x4E,1,FnCDateVar,,4,0,0,1,0,0,convert,0x6610D85C,Var→Date(FPU); pop 16B Variant; convert to R8 date; push FPU -2,0x4F,1,FnCDateVar,,4,0,0,1,0,0,convert,0x6610D85C,Var→Date (duplicate slot); same handler as 0x4E -2,0x50,1,CBoolUI1,,1,1,0,0,0,0,convert,0x66109075,UI1→Bool; pop byte; convert to VB bool (-1/0); push i32 -2,0x51,1,CBoolUI1,,1,1,0,0,0,0,convert,0x66109075,UI1→Bool (duplicate slot); same handler as 0x50 -2,0x52,1,CBoolI4,,1,1,0,0,0,0,convert,0x6610906F,I4→Bool; pop i32; convert to VB bool (-1/0); push -2,0x53,1,CBoolR4,,0,1,1,0,0,0,convert,0x6610D711,R4(FPU)→Bool; pop FPU; compare to 0; push VB bool -2,0x54,1,CBoolR4,,0,1,1,0,0,0,convert,0x6610D711,R4(FPU)→Bool (duplicate slot); same handler as 0x53 -2,0x55,1,CBoolCy,,2,1,0,0,0,0,convert,0x6610A96A,Cy→Bool; pop 2 Cy slots; convert to VB bool; push i32 -2,0x56,1,CBoolVar,,4,1,0,0,0,0,convert,0x66109093,Var→Bool; pop 16B Variant; convert to VB bool; push i32 -2,0x57,1,CBoolStr,,1,1,0,0,0,0,convert,0x6610914F,Str→Bool; pop BSTR; convert to VB bool; push i32 -2,0x58,1,CStr2Uni,,1,1,0,0,0,0,convert,0x6610DABF,Convert ANSI string to Unicode; pop BSTR; push new BSTR -2,0x59,1,CStrAry2Uni,,1,1,0,0,0,0,convert,0x6610DAD0,Convert ANSI string array to Unicode; pop array ref; push -2,0x5A,1,CStr2Ansi,,1,1,0,0,0,0,convert,0x6610A0B0,Convert Unicode to ANSI string; pop BSTR; push ANSI BSTR -2,0x5B,1,CStrAry2Ansi,,1,1,0,0,0,0,convert,0x6610DAE1,Convert Unicode string array to ANSI; pop array ref; push -2,0x5C,1,PopAdLd4,,1,1,0,0,4,0,stack,0x66108F9B,Pop address; load i32 from that address; push value (deref) -2,0x5D,3,CRecAnsi2Uni,%s,0,0,0,0,0,0,convert,0x6610E2C0,Convert UDT record fields ANSI→Unicode in-place; no stack change -2,0x5E,3,CRecUni2Ansi,%s,0,0,0,0,0,0,convert,0x6610E2C0,Convert UDT record fields Unicode→ANSI in-place; no stack change -2,0x5F,3,CStr2Vec,%a,0,0,0,0,0,0,convert,0x6610DA6D,Convert BSTR to fixed-length string vector at %a frame slot -2,0x60,3,CVar2Vec,%a,0,0,0,0,0,0,convert,0x66109310,Convert Variant to vector at %a frame slot -2,0x61,5,CVec2Var,%a %a,0,0,0,0,0,0,convert,0x6610DA87,Convert vector from %a to Variant at %a; frame-to-frame -2,0x62,1,SetLastError,,0,1,0,0,0,0,stack,0x6610A118,Push Win32 GetLastError() result as i32; same handler as primary -2,0x63,1,LitNothing,,0,1,0,0,0,0,load_lit,0x66109A36,Push Nothing (null COM pointer) as i32 onto eval stack -2,0x64,2,LitVar_Null,%a,0,0,0,0,0,16,store_frame,0x6610EBC4,Write Null Variant (VT_NULL) to frame slot [EBP+op] -2,0x65,3,LitVar_TRUE,%a,0,0,0,0,0,16,store_frame,0x66109A90,Write True Variant (VT_BOOL=-1) to frame slot [EBP+op] -2,0x66,3,LitVar_FALSE,%a,0,0,0,0,0,16,store_frame,0x66109A90,Write False Variant (VT_BOOL=0) to frame slot [EBP+op] -2,0x67,3,LitVar_Empty,%a,0,0,0,0,0,16,store_frame,0x6610EBB3,Write Empty Variant (VT_EMPTY) to frame slot [EBP+op] -2,0x68,3,LitVar_Missing,%a,0,4,0,0,0,0,load_lit,0x6610A174,Push 16B Missing Variant (vbError) onto eval stack; 4 slots -2,0x69,5,VCallHresult,%v,-1,0,0,0,0,0,call,0x6610A43B,COM vtable call; %v=vtable_offset+argsize; pops args+this; HRESULT checked -2,0x6A,5,ThisVCallHresult,%2 %c,-1,0,0,0,0,0,call,0x6610A4A0,COM vtable call on Me; %c=import %2=vtable_offset; HRESULT checked -2,0x6B,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x6C,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x6D,1,ExitProcHresult,,0,0,0,0,0,0,return,0x6610A51D,Return HRESULT from function; cleanup + frame restore -2,0x6E,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x6F,3,CheckTypeVar,%c,4,1,0,0,0,0,compare,0x6610F1CC,TypeOf..Is check on Variant; pop 16B Var; push i32 bool -2,0x70,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x71,1,CUnkVar,,4,1,0,0,0,0,convert,0x661092C9,Var→IUnknown; pop 16B Variant; extract IUnknown ptr; push -2,0x72,3,CVarUnk,%a,1,4,0,0,0,0,convert,0x6610D8E8,IUnknown→Var; pop ptr; wrap in Variant(VT_UNKNOWN); push 4 slots -2,0x73,1,LdPrUnkVar,,0,1,0,0,4,0,load_frame,0x6610DF66,Load IUnknown from Variant at [EBP+op]; push ptr -2,0x74,9,FLdLateIdUnkVar,%a %4 %a,0,1,0,0,4,0,load_frame,0x6610E947,Late-bound load of IUnknown from Variant; push ptr -2,0x75,1,GetRec3,,3,0,0,0,0,0,io,0x6610DD3C,Get record from file (3-arg); pop filenum+recnum+buffer -2,0x76,1,GetRec4,,4,0,0,0,0,0,io,0x6610DD5E,Get record from file (4-arg); pop filenum+recnum+buffer+len -2,0x77,1,PutRec3,,3,0,0,0,0,0,io,0x6610DD4D,Put record to file (3-arg); pop filenum+recnum+buffer -2,0x78,1,PutRec4,,4,0,0,0,0,0,io,0x6610DD6F,Put record to file (4-arg); pop filenum+recnum+buffer+len -2,0x79,-1,GetRecOwner3,,-1,0,0,0,0,0,io,0x6610DD80,Get record with owner (3-arg); variable-length -2,0x7A,-1,GetRecOwner4,,-1,0,0,0,0,0,io,0x6610DDA5,Get record with owner (4-arg); variable-length -2,0x7B,-1,PutRecOwner3,,-1,0,0,0,0,0,io,0x6610DD9D,Put record with owner (3-arg); variable-length -2,0x7C,-1,PutRecOwner4,,-1,0,0,0,0,0,io,0x6610DDC2,Put record with owner (4-arg); variable-length -2,0x7D,1,Input,,2,0,0,0,0,0,io,0x6610DBC2,Input# statement; pop filenum+prompt; begin input sequence -2,0x7E,1,InputDone,,0,0,0,0,0,0,io,0x6610DBD3,End Input# sequence; finalize parsing -2,0x7F,1,InputItemUI1,,1,0,0,0,0,1,io,0x6610DBE4,Input# read UI1 item; pop dest addr; store byte -2,0x80,1,InputItemI2,,1,0,0,0,0,2,io,0x6610DC28,Input# read I2 item; pop dest addr; store i16 -2,0x81,1,InputItemI4,,1,0,0,0,0,4,io,0x6610DC79,Input# read I4 item; pop dest addr; store i32 -2,0x82,1,InputItemR4,,1,0,0,0,0,4,io,0x6610DC58,Input# read R4 item; pop dest addr; store float -2,0x83,1,InputItemR8,,1,0,0,0,0,8,io,0x6610DCA4,Input# read R8 item; pop dest addr; store double -2,0x84,1,InputItemCy,,1,0,0,0,0,8,io,0x6610DCAA,Input# read Cy item; pop dest addr; store 8B currency -2,0x85,1,InputItemVar,,1,0,0,0,0,16,io,0x6610DCB0,Input# read Variant item; pop dest addr; store 16B Variant -2,0x86,1,InputItemStr,,1,0,0,0,0,4,io,0x6610DC2E,Input# read String item; pop dest BSTR ptr addr; store -2,0x87,1,InputItemBool,,1,0,0,0,0,2,io,0x6610DC04,Input# read Bool item; pop dest addr; store VB bool -2,0x88,1,InputItemDate,,1,0,0,0,0,8,io,0x6610DC7F,Input# read Date item; pop dest addr; store R8 date -2,0x89,1,PopFPR4,,0,1,1,0,0,0,stack,0x66108FA4,Pop x87 ST0; store as f32 on eval stack (1 slot); fpu_pop=1 -2,0x8A,1,PopFPR8,,0,2,1,0,0,0,stack,0x66108FB8,Pop x87 ST0; store as f64 on eval stack (2 slots); fpu_pop=1 -2,0x8B,1,PopAd,,1,0,0,0,0,4,stack,0x6610A5D9,Pop address from eval stack; store i32 to that address -2,0x8C,1,PopAdLdVar,,1,1,0,0,16,0,stack,0x66108F32,Pop addr; load 16B Variant from *addr; push as 4 slots -2,0x8D,3,AryLdPr,%2,2,1,0,0,4,0,load_ind,0x6610D128,Pop index+array (multi-dim %2); push COM obj ref; AddRef -2,0x8E,3,AryLdRf,%2,2,1,0,0,4,0,load_ind,0x6610D148,Pop index+array (multi-dim %2); push address (LEA) -2,0x8F,5,ParmAry1St,%a %a,0,0,0,0,0,0,stack,0x66108EBE,Setup 1-D array parameter; reads %a %a operands -2,0x90,1,Ary1LdUI1,,2,1,0,0,1,0,load_ind,0x6610CF8B,Pop index+array; read u8 from array[index]; zext push i32 -2,0x91,1,Ary1LdI2,,2,1,0,0,2,0,load_ind,0x6610CF8C,Pop index+array; read i16 from array[index]; zext push i32 -2,0x92,1,Ary1LdI4,,2,1,0,0,4,0,load_ind,0x6610CFB8,Pop index+array; read i32 from array[index]; push -2,0x93,1,Ary1LdI4,,2,1,0,0,4,0,load_ind,0x6610CFB8,Pop index+array; read i32 (duplicate slot); same handler -2,0x94,1,Ary1LdR8,,2,2,0,0,8,0,load_ind,0x6610CFE8,Pop index+array; read 8B R8/Cy from array[index]; push 2 slots -2,0x95,1,Ary1LdR8,,2,2,0,0,8,0,load_ind,0x6610CFE8,Pop index+array; read 8B (duplicate slot); same handler -2,0x96,1,Ary1LdRfVar,,2,1,0,0,4,0,load_ind,0x6610D00C,Pop index+array; push address of Variant at array[index] (LEA) -2,0x97,1,Ary1LdI4,,2,1,0,0,4,0,load_ind,0x6610CFB8,Pop index+array; read i32 (duplicate slot); same handler -2,0x98,1,Ary1LdI4,,2,1,0,0,4,0,load_ind,0x6610CFB8,Pop index+array; read i32 (duplicate slot); same handler -2,0x99,1,Ary1LdFPR4,,2,0,0,1,4,0,load_ind,0x6610D018,Pop index+array; read f32 from array[index]; push FPU -2,0x9A,1,Ary1LdFPR8,,2,0,0,1,8,0,load_ind,0x6610D038,Pop index+array; read f64 from array[index]; push FPU -2,0x9B,1,Ary1LdPr,,2,1,0,0,4,0,load_ind,0x6610CF78,Pop index+array; push COM obj from array[index]; AddRef -2,0x9C,1,Ary1LdRf,,2,1,0,0,4,0,load_ind,0x6610CF5C,Pop index+array; push address of array[index] (LEA) -2,0x9D,1,Ary1LdVar,,2,4,0,0,16,0,load_ind,0x6610F2D4,Pop index+array; read 16B Variant from array[index]; push 4 slots -2,0x9E,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0x9F,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xA0,1,Ary1StUI1,,3,0,0,0,0,1,store_ind,0x6610D03E,Pop val+index+array; store u8 to array[index] -2,0xA1,1,Ary1StI2,,3,0,0,0,0,2,store_ind,0x6610D058,Pop val+index+array; store i16 to array[index] -2,0xA2,1,Ary1StR4,,3,0,0,0,0,4,store_ind,0x6610D088,Pop val+index+array; store i32/R4 to array[index] -2,0xA3,1,Ary1StR4,,3,0,0,0,0,4,store_ind,0x6610D088,Pop val+index+array; store i32/R4 (duplicate slot) -2,0xA4,1,Ary1StCy,,4,0,0,0,0,8,store_ind,0x6610D0B8,Pop 2_val+index+array; store 8B Cy to array[index] -2,0xA5,1,Ary1StCy,,4,0,0,0,0,8,store_ind,0x6610D0B8,Pop 2_val+index+array; store 8B Cy (duplicate slot) -2,0xA6,1,Ary1StVar,,6,0,0,0,0,16,store_ind,0x6610D168,Pop 4 Var slots+index+array; store 16B Variant to array[index] -2,0xA7,1,Ary1StStr,,3,0,0,0,0,4,store_ind,0x6610F45D,Pop BSTR+index+array; store BSTR to array[index]; SysFreeString old -2,0xA8,1,Ary1StAd,,3,0,0,0,0,4,store_ind,0x6610F549,Pop ptr+index+array; store COM ptr to array[index]; Release old -2,0xA9,1,Ary1StFPR4,,2,0,1,0,0,4,store_ind,0x6610D0E8,Pop index+array; pop FPU ST0; store f32 to array[index] -2,0xAA,1,Ary1StFPR8,,2,0,1,0,0,8,store_ind,0x6610D108,Pop index+array; pop FPU ST0; store f64 to array[index] -2,0xAB,1,Ary1StVarAd,,3,0,0,0,0,4,store_ind,0x6610A1A9,Pop ptr+index+array; store COM ptr to array; Set semantics -2,0xAC,1,Ary1StVarAdFunc,,3,0,0,0,0,4,store_ind,0x6610F627,Pop ptr+index+array; store COM ptr to array; func return Set -2,0xAD,1,Ary1StVarUnk,,3,0,0,0,0,4,store_ind,0x6610F6BE,Pop IUnknown+index+array; store to Variant array; QI -2,0xAE,1,Ary1StVarUnkFunc,,3,0,0,0,0,4,store_ind,0x6610F6A2,Pop IUnknown+index+array; store to Variant array; func return -2,0xAF,1,Ary1StAdFunc,,3,0,0,0,0,4,store_ind,0x6610F533,Pop ptr+index+array; store COM ptr; func return -2,0xB0,1,Ary1StVarCopy,,6,0,0,0,0,16,store_ind,0x6610F81E,Pop Variant(4)+index+array; copy 16B Variant to array[index] -2,0xB1,1,Ary1StStrCopy,,3,0,0,0,0,4,store_ind,0x6610D1A0,Pop BSTR+index+array; __vbaStrCopy to array[index] -2,0xB2,3,Ary1LdRfVarg,%2,2,1,0,0,4,0,load_ind,0x6610F33C,Pop index+array; push addr of Variant element (Varg LEA); %2=dims -2,0xB3,1,Ary1LdVarg,,2,4,0,0,16,0,load_ind,0x6610F2E3,Pop index+array; load Variant from Varg array; push 4 slots -2,0xB4,1,Ary1LdRfVargParam,,2,1,0,0,4,0,load_ind,0x6610F35D,Pop index+array; push addr of Varg Variant (param array) -2,0xB5,1,Ary1StVarg,,6,0,0,0,0,16,store_ind,0x6610F8E4,Pop Variant(4)+index+array; store 16B to Varg array -2,0xB6,1,Ary1StVargCopy,,6,0,0,0,0,16,store_ind,0x6610F8C2,Pop Variant(4)+index+array; copy 16B to Varg array -2,0xB7,1,Ary1StVargAd,,3,0,0,0,0,4,store_ind,0x6610F649,Pop ptr+index+array; store COM ptr to Varg array; Set -2,0xB8,1,Ary1StVargAdFunc,,3,0,0,0,0,4,store_ind,0x6610F631,Pop ptr+index+array; store COM ptr to Varg; func return Set -2,0xB9,1,Ary1StVargUnk,,3,0,0,0,0,4,store_ind,0x6610F74D,Pop IUnknown+index+array; store to Varg Variant; QI -2,0xBA,1,Ary1StVargUnkFunc,,3,0,0,0,0,4,store_ind,0x6610F738,Pop IUnknown+index+array; store to Varg Variant; func return -2,0xBB,1,MidVar,,3,1,0,0,0,0,stack,0x6611049E,Mid$ on Variant; pop str+start+len; push result Variant -2,0xBC,3,MidBStr,%2,3,1,0,0,0,0,stack,0x6610A278,Mid$ string; pop str+start+len; push BSTR result (%2 operand) -2,0xBD,1,MidBVar,,3,1,0,0,0,0,stack,0x661104AF,MidB$ on Variant; byte-oriented Mid; pop+push -2,0xBE,3,MidBStrB,%2,3,1,0,0,0,0,stack,0x66110486,MidB$ string; byte-oriented Mid; pop str+start+len; push BSTR (%2 operand) -2,0xBF,1,LineInputVar,,1,1,0,0,0,0,io,0x6610DD0E,Line Input# to Variant; pop filenum; push Variant with line -2,0xC0,1,LineInputStr,,1,1,0,0,0,0,io,0x6610DD1A,Line Input# to String; pop filenum; push BSTR with line -2,0xC1,1,Error,,1,0,0,0,0,0,stack,0x6610A140,Raise VB runtime error; pop error number; Err.Raise -2,0xC2,1,Stop,,0,0,0,0,0,0,stack,0x6610CF3E,Stop statement; break into debugger -2,0xC3,1,Erase,,-1,0,0,0,0,0,stack,0x6610A2E0,Erase array; reads frame offset; calls __vbaErase -2,0xC4,2,LargeBos,%1,0,0,0,0,0,0,bos,0x66108E87,Beginning-of-statement marker; %1=byte distance to next BOS (0=last statement) -2,0xC5,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xC6,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xC7,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xC8,1,End,,0,0,0,0,0,0,stack,0x66108D4B,End statement; terminate program execution -2,0xC9,1,Return,,0,0,0,0,0,0,branch,0x66108F18,GoSub Return; pop return address from internal stack; jump back -2,0xCA,1,FnLBound,,1,1,0,0,0,0,stack,0x6610A130,Pop array SafeArray ptr; push LBound as i32 -2,0xCB,1,FnUBound,,1,1,0,0,0,0,stack,0x66108E04,Pop array SafeArray ptr; push UBound as i32 -2,0xCC,1,ExitProcUI1,,0,0,0,0,0,0,return,0x661100C9,Return from Function As Byte; return value in eval TOS -2,0xCD,1,ExitProcI2,,0,0,0,0,0,0,return,0x6610A535,Return from Function As Integer; return value in eval TOS -2,0xCE,1,ExitProcStr,,0,0,0,0,0,0,return,0x6610A529,Return from Function As String; cleanup + frame restore -2,0xCF,1,ExitProcR4,,0,0,0,0,0,0,return,0x6610A541,Return from Function As Single; return value on x87 ST0 -2,0xD0,1,ExitProcR8,,0,0,0,0,0,0,return,0x6610A54D,Return from Function As Double; return value on x87 ST0 -2,0xD1,1,ExitProcCy,,0,0,0,0,0,0,return,0x6610A559,Return from Function As Currency; return value in EDX:EAX -2,0xD2,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xD3,1,ExitProcStr,,0,0,0,0,0,0,return,0x6610A529,Return from Function As String (duplicate); same handler as 0xCE -2,0xD4,1,ExitProcStr,,0,0,0,0,0,0,return,0x6610A529,Return from Function As String (duplicate); same handler as 0xCE -2,0xD5,1,ExitProcStr,,0,0,0,0,0,0,return,0x6610A529,Return from Function As String (duplicate); same handler as 0xCE -2,0xD6,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xD7,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xD8,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xD9,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDA,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDB,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDC,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDD,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDE,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xDF,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xE0,3,FLdUI1,%a,0,1,0,0,1,0,load_frame,0x6610DEBC,Load u8 from [EBP+sext(op)]; zero-extend to i32; push 1 slot -2,0xE1,3,FLdI2,%a,0,1,0,0,2,0,load_frame,0x66109372,Load i16 from [EBP+sext(op)]; zero-extend to i32; push 1 slot -2,0xE2,3,FLdR4,%a,0,1,0,0,4,0,load_frame,0x66108E9F,Load i32/R4 from [EBP+sext(op)]; push 1 slot (ILdRf handler) -2,0xE3,3,FLdR4,%a,0,1,0,0,4,0,load_frame,0x66108E9F,Load i32/R4 (duplicate slot); same handler -2,0xE4,3,FLdR8,%a,0,2,0,0,8,0,load_frame,0x6610DEF5,Load 8B R8 from [EBP+sext(op)]; push 2 eval slots -2,0xE5,3,FLdR8,%a,0,2,0,0,8,0,load_frame,0x6610DEF5,Load 8B R8 (duplicate slot); same handler -2,0xE6,3,FLdRfVar,%a,0,1,0,0,4,0,load_frame,0x66108E95,Push addr of Variant at [EBP+sext(op)] (LEA not LOAD) -2,0xE7,3,FLdR4,%a,0,1,0,0,4,0,load_frame,0x66108E9F,Load i32/R4 (duplicate slot); ILdRf handler -2,0xE8,3,FLdR4,%a,0,1,0,0,4,0,load_frame,0x66108E9F,Load i32/R4 (duplicate slot); ILdRf handler -2,0xE9,3,FLdFPR4,%a,0,0,0,1,4,0,load_frame,0x661093BA,Load f32 from [EBP+sext(op)] onto FPU; fld dword -2,0xEA,3,FLdFPR8,%a,0,0,0,1,8,0,load_frame,0x661093CD,Load f64 from [EBP+sext(op)] onto FPU; fld qword -2,0xEB,3,FLdPr,%a,0,1,0,0,4,0,load_frame,0x66108EC5,Load COM obj ref from [EBP+sext(op)]; push ptr -2,0xEC,3,FLdRfVar,%a,0,1,0,0,4,0,load_frame,0x66108E95,Push addr of Variant (duplicate slot); LEA -2,0xED,3,FLdVar,%a,0,4,0,0,16,0,load_frame,0x66109FA1,Load 16B Variant from [EBP+sext(op)]; push 4 eval slots -2,0xEE,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xEF,1,InvalidExcode,,0,0,0,0,0,0,,, -2,0xF0,3,FStUI1,%a,1,0,0,0,0,1,store_frame,0x6610DF0E,Pop i32 (use low byte); store u8 to [EBP+sext(op)] -2,0xF1,3,FStI2,%a,1,0,0,0,0,2,store_frame,0x6610940B,Pop i32 (use low 16); store i16 to [EBP+sext(op)] -2,0xF2,3,FStR4,%a,1,0,0,0,0,4,store_frame,0x6610DF1A,Pop 1 slot; store i32/R4 to [EBP+sext(op)] -2,0xF3,3,FStR4,%a,1,0,0,0,0,4,store_frame,0x6610DF1A,Pop 1 slot; store R4 (duplicate slot); same handler -2,0xF4,3,FStR8,%a,2,0,0,0,0,8,store_frame,0x6610DF31,Pop 2 slots; store 8B R8 to [EBP+sext(op)] -2,0xF5,3,FStR8,%a,2,0,0,0,0,8,store_frame,0x6610DF31,Pop 2 slots; store R8 (duplicate slot); same handler -2,0xF6,3,FStVar,%a,4,0,0,0,0,16,store_frame,0x6610A24F,Pop 4 Variant slots; store 16B to [EBP+sext(op)]; VarCopy -2,0xF7,3,FStStr,%a,1,0,0,0,0,4,store_frame,0x6610A05D,Pop BSTR; swap with frame slot; SysFreeString old -2,0xF8,3,FStAd,%a,1,0,0,0,0,4,store_frame,0x6610A15C,Pop COM ptr; store to [EBP+sext(op)]; Release old -2,0xF9,3,FStFPR4,%a,0,0,1,0,0,4,store_frame,0x6610940D,Pop FPU ST0; store f32 to [EBP+sext(op)]; fstp dword -2,0xFA,3,FStFPR8,%a,0,0,1,0,0,8,store_frame,0x66109420,Pop FPU ST0; store f64 to [EBP+sext(op)]; fstp qword -2,0xFB,3,FStVarAd,%a,1,0,0,0,0,4,store_frame,0x6610F54D,Pop COM ptr; Set to Variant at [EBP+sext(op)]; Set semantics -2,0xFC,3,FStVarAdFunc,%a,1,0,0,0,0,4,store_frame,0x6610A173,Pop COM ptr (func return); Set to Variant; Set + func return -2,0xFD,3,FStVarUnk,%a,1,0,0,0,0,4,store_frame,0x6610F663,Pop IUnknown; store to Variant at [EBP+sext(op)]; QI -2,0xFE,3,FStVarUnkFunc,%a,1,0,0,0,0,4,store_frame,0x6610F64D,Pop IUnknown (func return); store to Variant; QI + func return -2,0xFF,3,FStAdFunc,%a,1,0,0,0,0,4,store_frame,0x66108F00,Pop COM ptr; store to func return value slot -3,0x00,3,FStVarCopy,%a,4,0,0,0,0,16,store_frame,0x6610A1F5,Pop 4 Variant slots; copy 16B to [EBP+sext(op)]; VarCopy -3,0x01,3,FStStrCopy,%a,1,0,0,0,0,4,store_frame,0x6610A0A0,Pop BSTR; __vbaStrCopy to [EBP+sext(op)]; copy semantics -3,0x02,1,HardType,,1,1,0,0,0,0,convert,0x6610A2B0,Pop ptr; verify/cast COM type; push validated ptr -3,0x03,3,Branch,%l,0,0,0,0,0,0,branch,0x66108F38,Unconditional branch; target = pcode_base + zx(u16 operand) -3,0x04,3,BranchF,%l,1,0,0,0,0,0,branch,0x66108F5C,Pop TOS; if False (==0) take branch to %l target -3,0x05,3,BranchFVar,%l,4,0,0,0,0,0,branch,0x6610A208,Pop 16B Variant (4 slots); test for False; branch if false -3,0x06,3,BranchFVarFree,%l,4,0,0,0,0,0,branch,0x6610D395,Pop 16B Variant; test for False; branch if false; VarClear after -3,0x07,3,BranchT,%l,1,0,0,0,0,0,branch,0x66108F76,Pop TOS; if True (!=0) take branch to %l target -3,0x08,3,BranchTVar,%l,4,0,0,0,0,0,branch,0x6610D388,Pop 16B Variant (4 slots); test for True; branch if true -3,0x09,3,BranchTVarFree,%l,4,0,0,0,0,0,branch,0x6610D3B7,Pop 16B Variant; test for True; branch if true; VarClear after -3,0x0A,3,Gosub,%l,0,0,0,0,0,0,branch,0x66108EEE,GoSub; push return addr to internal stack; branch to %l -3,0x0B,3,OnErrorGoto,%l,0,0,0,0,0,0,branch,0x66109F58,Set error handler target in frame; %l=handler addr; no stack effect -3,0x0C,3,Resume,%l,0,0,0,0,0,0,branch,0x6610F212,Resume [Next|label]; jump to resume target; clear error state -3,0x0D,3,AryLock,%a,1,0,0,0,0,0,stack,0x6610E2F0,Pop SafeArray ptr; SafeArrayLock; %a=frame slot -3,0x0E,3,AryUnlock,%a,1,0,0,0,0,0,stack,0x6610E2E0,Pop SafeArray ptr; SafeArrayUnlock; %a=frame slot -3,0x0F,3,AryDescTemp,%a,0,1,0,0,0,0,stack,0x6610A168,Push addr of temp SafeArray descriptor; %a=frame slot -3,0x10,3,ILdUI1,%a,0,1,0,0,1,0,load_ind,0x6610E4B3,Double-deref: ptr=[EBP+sext(op)]; read u8 from *ptr; zext push i32 -3,0x11,3,ILdI2,%a,0,1,0,0,2,0,load_ind,0x66109774,Double-deref: ptr=[EBP+sext(op)]; read i16 from *ptr; zext push i32 -3,0x12,3,ILdAd,%a,0,1,0,0,4,0,load_ind,0x66109798,Double-deref: ptr=[EBP+sext(op)]; read i32 from *ptr; push -3,0x13,3,ILdAd,%a,0,1,0,0,4,0,load_ind,0x66109798,Double-deref i32 (duplicate slot); same handler -3,0x14,3,ILdR8,%a,0,2,0,0,8,0,load_ind,0x661097BC,Double-deref: ptr=[EBP+sext(op)]; read R8; push 2 slots -3,0x15,3,ILdR8,%a,0,2,0,0,8,0,load_ind,0x661097BC,Double-deref R8 (duplicate slot); same handler -3,0x16,5,ILdRfDarg,%a,0,1,0,0,4,0,load_ind,0x66109FC0,Double-deref: load ref to Variant (DARG); %a %2 operands; push addr -3,0x17,3,ILdAd,%a,0,1,0,0,4,0,load_ind,0x66109798,Double-deref i32 (duplicate slot); same handler -3,0x18,3,ILdAd,%a,0,1,0,0,4,0,load_ind,0x66109798,Double-deref i32 (duplicate slot); same handler -3,0x19,3,ILdFPR4,%a,0,0,0,1,4,0,load_ind,0x661097E6,Double-deref: ptr=[EBP+sext(op)]; fld dword *ptr → FPU -3,0x1A,3,ILdFPR8,%a,0,0,0,1,8,0,load_ind,0x661097FA,Double-deref: ptr=[EBP+sext(op)]; fld qword *ptr → FPU -3,0x1B,3,ILdPr,%a,0,1,0,0,4,0,load_ind,0x661097B2,Double-deref: load COM ptr from *[EBP+sext(op)]; AddRef; push -3,0x1C,3,FLdR4,%a,0,1,0,0,4,0,load_ind,0x66108E9F,Double-deref: load i32/R4 from *[EBP+sext(op)]; push (ILdRf handler) -3,0x1D,3,ILdDarg,%a,0,4,0,0,16,0,load_ind,0x6610F330,Double-deref: load 16B Variant(DARG) from *[EBP+sext(op)]; push 4 slots -3,0x1E,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x1F,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x20,3,IStUI1,%a,1,0,0,0,0,1,store_ind,0x6610E500,Pop i32(use low byte); store u8 via double-deref *[EBP+sext(op)] -3,0x21,3,IStI2,%a,1,0,0,0,0,2,store_ind,0x661097F6,Pop i32(use low 16); store i16 via double-deref *[EBP+sext(op)] -3,0x22,3,IStI4,%a,1,0,0,0,0,4,store_ind,0x66109814,Pop i32; store via double-deref *[EBP+sext(op)] -3,0x23,3,IStI4,%a,1,0,0,0,0,4,store_ind,0x66109814,Store i32 (duplicate slot); same handler -3,0x24,3,IStR8,%a,2,0,0,0,0,8,store_ind,0x66109830,Pop 2 slots (8B); store R8 via double-deref -3,0x25,3,IStR8,%a,2,0,0,0,0,8,store_ind,0x66109830,Store R8 (duplicate slot); same handler -3,0x26,3,IStDarg,%a,1,0,0,0,0,4,store_ind,0x6610A298,Pop value; store to dispatch arg (DARG) slot; %a=frame offset -3,0x27,3,IStStr,%a,1,0,0,0,0,4,store_ind,0x6610A096,Pop BSTR; store via double-deref; SysFreeString old; ownership transfer -3,0x28,3,IStAd,%a,1,0,0,0,0,4,store_ind,0x6610F4EB,Pop COM ptr; store via double-deref; Release old -3,0x29,3,IStFPR4,%a,0,0,1,0,0,4,store_ind,0x66109856,Pop FPU ST0; store f32 via double-deref (fstp dword) -3,0x2A,3,IStFPR8,%a,0,0,1,0,0,8,store_ind,0x6610986C,Pop FPU ST0; store f64 via double-deref (fstp qword) -3,0x2B,3,IStDargAd,%a,1,0,0,0,0,4,store_ind,0x6610F59E,Pop COM ptr; store to DARG Variant; Set semantics -3,0x2C,3,IStDargAdFunc,%a,1,0,0,0,0,4,store_ind,0x6610F554,Pop COM ptr (func return); store to DARG Variant; Set -3,0x2D,3,IStDargUnk,%a,1,0,0,0,0,4,store_ind,0x6610F734,Pop IUnknown; store to DARG Variant; QI -3,0x2E,3,IStDargUnkFunc,%a,1,0,0,0,0,4,store_ind,0x6610F6C2,Pop IUnknown (func return); store to DARG Variant; QI -3,0x2F,3,IStAdFunc,%a,1,0,0,0,0,4,store_ind,0x6610A0F2,Pop COM ptr (func return); store via double-deref; Release old -3,0x30,3,IStDargCopy,%a,4,0,0,0,0,16,store_ind,0x6610F8EB,Pop 4 Variant slots; VarCopy to DARG at *[EBP+sext(op)] -3,0x31,3,IStStrCopy,%a,1,0,0,0,0,4,store_ind,0x6610A0A3,Pop BSTR; __vbaStrCopy via double-deref; copy semantics -3,0x32,1,PrintChan,,1,0,0,0,0,0,io,0x6610DBA0,Pop file number; set print channel for subsequent Print ops -3,0x33,1,WriteChan,,1,0,0,0,0,0,io,0x6610DBB1,Pop file number; set write channel for Write# statement -3,0x34,1,PrintComma,,0,0,0,0,0,0,io,0x6610FA01,Print comma separator (advance to next print zone) -3,0x35,1,PrintEos,,0,0,0,0,0,0,io,0x6610F9CE,Print end-of-statement; finalize current Print# line -3,0x36,1,PrintNL,,0,0,0,0,0,0,io,0x6610FA1E,Print newline; output CR+LF -3,0x37,1,PrintItemComma,,1,0,0,0,0,0,io,0x6610F99B,Pop value; print it; followed by comma separator -3,0x38,1,PrintItemSemi,,1,0,0,0,0,0,io,0x6610F9BD,Pop value; print it; followed by semicolon (no separator) -3,0x39,1,PrintItemNL,,1,0,0,0,0,0,io,0x6610F9AC,Pop value; print it; followed by newline -3,0x3A,3,PrintObj,%a,1,0,0,0,0,0,io,0x6610FA26,Pop object; print via Debug.Print or Print# on object; %a operand -3,0x3B,1,PrintSpc,,1,0,0,0,0,0,io,0x6610F9DF,Pop count; output Spc(n) spaces -3,0x3C,1,PrintTab,,1,0,0,0,0,0,io,0x6610F9F0,Pop column; Tab(n) to column position -3,0x3D,1,Close,,1,0,0,0,0,0,io,0x66109353,Pop file number; Close file -3,0x3E,1,CloseAll,,0,0,0,0,0,0,io,0x6610DB8C,Close all open files; no stack effect -3,0x3F,3,FLdZeroAd,%a,0,1,0,0,0,0,load_lit,0x66108F97,Push i32 zero (0x00000000) onto eval stack; %a operand -3,0x40,3,IWMemLdUI1,%2,1,1,0,0,1,0,load_mem,0x6610E590,Pop With-obj; read u8 at obj+%2 offset; zext push i32 -3,0x41,3,IWMemLdI2,%2,1,1,0,0,2,0,load_mem,0x6610E5AB,Pop With-obj; read i16 at obj+%2 offset; zext push i32 -3,0x42,3,IWMemLdI4,%2,1,1,0,0,4,0,load_mem,0x6610E5C6,Pop With-obj; read i32 at obj+%2 offset; push -3,0x43,3,IWMemLdI4,%2,1,1,0,0,4,0,load_mem,0x6610E5C6,Pop With-obj; read i32 (duplicate slot); same handler -3,0x44,3,IWMemLdCy,%2,1,2,0,0,8,0,load_mem,0x6610E5DF,Pop With-obj; read 8B Cy at obj+%2; push 2 slots -3,0x45,3,IWMemLdCy,%2,1,2,0,0,8,0,load_mem,0x6610E5DF,Pop With-obj; read 8B Cy (duplicate slot); same handler -3,0x46,5,IWMemLdRfDarg,%a %2,0,1,0,0,4,0,load_mem,0x6610F34D,Load ref to DARG via With-obj member; %a %2 operands; push addr -3,0x47,3,IWMemLdI4,%2,1,1,0,0,4,0,load_mem,0x6610E5C6,Pop With-obj; read i32 (duplicate slot); same handler -3,0x48,3,IWMemLdI4,%2,1,1,0,0,4,0,load_mem,0x6610E5C6,Pop With-obj; read i32 (duplicate slot); same handler -3,0x49,3,IWMemLdFPR4,%2,1,0,0,1,4,0,load_mem,0x6610E5FB,Pop With-obj; load f32 from obj+%2 → FPU -3,0x4A,3,IWMemLdFPR8,%2,1,0,0,1,8,0,load_mem,0x6610E614,Pop With-obj; load f64 from obj+%2 → FPU -3,0x4B,3,IWMemLdPr,%2,1,1,0,0,4,0,load_mem,0x6610F380,Pop With-obj; load COM ptr from obj+%2; AddRef; push -3,0x4C,3,IWMemLdRf,%2,1,1,0,0,4,0,load_mem,0x6610E62D,Pop With-obj; push addr of obj+%2 (LEA) -3,0x4D,3,IWMemLdDarg,%2,1,4,0,0,16,0,load_mem,0x6610F315,Pop With-obj; load 16B Variant from obj+%2; push 4 slots -3,0x4E,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x4F,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x50,3,IWMemStUI1,%2,2,0,0,0,0,1,store_mem,0x6610E645,Pop val + With-obj; store u8 at obj+%2 -3,0x51,3,IWMemStI2,%2,2,0,0,0,0,2,store_mem,0x6610E65F,Pop val + With-obj; store i16 at obj+%2 -3,0x52,3,IWMemStR4,%2,2,0,0,0,0,4,store_mem,0x6610E67A,Pop val + With-obj; store R4/i32 at obj+%2 -3,0x53,3,IWMemStR4,%2,2,0,0,0,0,4,store_mem,0x6610E67A,Store R4 (duplicate slot); same handler -3,0x54,3,IWMemStCy,%2,3,0,0,0,0,8,store_mem,0x6610E693,Pop 2 val + With-obj; store 8B Cy at obj+%2 -3,0x55,3,IWMemStCy,%2,3,0,0,0,0,8,store_mem,0x6610E693,Store Cy (duplicate slot); same handler -3,0x56,3,IWMemStDarg,%2,5,0,0,0,0,16,store_mem,0x6610F925,Pop 4 Variant + With-obj; store 16B DARG at obj+%2 -3,0x57,3,IWMemStStr,%2,2,0,0,0,0,4,store_mem,0x6610F3E8,Pop BSTR + With-obj; store BSTR at obj+%2; SysFreeString old -3,0x58,3,IWMemStAd,%2,2,0,0,0,0,4,store_mem,0x6610F507,Pop COM ptr + With-obj; store at obj+%2; Release old -3,0x59,3,IWMemStFPR4,%2,1,0,1,0,0,4,store_mem,0x6610E6AF,Pop With-obj; pop FPU ST0; store f32 at obj+%2 -3,0x5A,3,IWMemStFPR8,%2,1,0,1,0,0,8,store_mem,0x6610E6D2,Pop With-obj; pop FPU ST0; store f64 at obj+%2 -3,0x5B,3,IWMemStDargAd,%2,2,0,0,0,0,4,store_mem,0x6610F5B4,Pop COM ptr + With-obj; Set DARG Variant at obj+%2 -3,0x5C,3,IWMemStDargAdFunc,%2,2,0,0,0,0,4,store_mem,0x6610F5A2,Pop COM ptr(func) + With-obj; Set DARG at obj+%2 -3,0x5D,3,IWMemStDargUnk,%2,2,0,0,0,0,4,store_mem,0x6610F766,Pop IUnknown + With-obj; store to DARG at obj+%2; QI -3,0x5E,3,IWMemStDargUnkFunc,%2,2,0,0,0,0,4,store_mem,0x6610F751,Pop IUnknown(func) + With-obj; store DARG; QI -3,0x5F,3,IWMemStAdFunc,%2,2,0,0,0,0,4,store_mem,0x6610F4F2,Pop COM ptr(func) + With-obj; store at obj+%2; Release old -3,0x60,3,IWMemStDargCopy,%2,5,0,0,0,0,16,store_mem,0x6610F902,Pop 4 Variant + With-obj; VarCopy to DARG at obj+%2 -3,0x61,3,IWMemStStrCopy,%2,2,0,0,0,0,4,store_mem,0x6610F408,Pop BSTR + With-obj; __vbaStrCopy to obj+%2 -3,0x62,3,FLdZeroAd,%a,0,1,0,0,0,0,load_lit,0x66108F97,Push i32 zero (duplicate slot); same handler as 0x3F -3,0x63,3,FStVarNoPop,%a,0,0,0,0,0,16,store_frame,0x6610F84C,Copy TOS 4 Variant slots to [EBP+sext(op)]; NO pop -3,0x64,3,FStStrNoPop,%a,0,0,0,0,0,4,store_frame,0x6610A098,Copy TOS BSTR to [EBP+sext(op)]; NO pop; TOS stays -3,0x65,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x66,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x67,3,CVarUI1,%a,1,0,0,0,0,16,convert,0x6610D8B6,Pop UI1; write as Variant(vbByte) to [EBP+sext(op)]; no eval push -3,0x68,3,CVarI2,%a,1,4,0,0,0,0,convert,0x6610A1A0,Pop i32 (i16 val); push as 16B Variant(vbInteger); 4 slots -3,0x69,3,CVarI4,%a,1,0,0,0,0,16,convert,0x661091F8,Pop i32; write as Variant(vbLong) to [EBP+sext(op)]; no eval push -3,0x6A,3,CVarR4,%a,0,0,1,0,0,16,convert,0x661091FE,Pop FPU ST0; write as Variant(vbSingle) to [EBP+sext(op)] -3,0x6B,3,CVarR8,%a,0,0,1,0,0,16,convert,0x66109225,Pop FPU ST0; write as Variant(vbDouble) to [EBP+sext(op)] -3,0x6C,3,CVarCy,%a,2,4,0,0,0,0,convert,0x6610A1F0,Pop 2 Cy slots; push as 16B Variant(vbCurrency); 4 eval slots -3,0x6D,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x6E,3,CVarStr,%a,1,4,0,0,0,0,convert,0x6610A1CC,Pop BSTR ptr; push as 16B Variant(vbString); 4 eval slots -3,0x6F,3,CVarAd,%a,1,0,0,0,0,16,convert,0x661091D2,Pop COM ptr; write as Variant(vbObject) to [EBP+sext(op)] -3,0x70,3,MemLdUI1,%2,1,1,0,0,1,0,load_mem,0x6610EF98,Pop obj ptr; read u8 at obj+%2 offset; zext push i32 -3,0x71,3,MemLdI2,%2,1,1,0,0,2,0,load_mem,0x66109884,Pop obj ptr; read i16 at obj+%2; push i32 (zext) -3,0x72,3,MemLdR4,%2,1,1,0,0,4,0,load_mem,0x661098B2,Pop obj ptr; read i32/R4 at obj+%2; push (MemLdStr handler) -3,0x73,3,MemLdR4,%2,1,1,0,0,4,0,load_mem,0x661098B2,Pop obj ptr; read R4 (duplicate slot); same handler -3,0x74,3,MemLdR8,%2,1,2,0,0,8,0,load_mem,0x661098DA,Pop obj ptr; read R8 at obj+%2; push 2 slots -3,0x75,3,MemLdR8,%2,1,2,0,0,8,0,load_mem,0x661098DA,Pop obj ptr; read R8 (duplicate slot); same handler -3,0x76,3,MemLdRfVar,%2,1,1,0,0,4,0,load_mem,0x66108EB3,Pop obj ptr; push addr of Variant at obj+%2 (LEA) -3,0x77,3,MemLdR4,%2,1,1,0,0,4,0,load_mem,0x661098B2,Pop obj ptr; read R4 (duplicate slot); same handler -3,0x78,3,MemLdR4,%2,1,1,0,0,4,0,load_mem,0x661098B2,Pop obj ptr; read R4 (duplicate slot); same handler -3,0x79,3,MemLdFPR4,%2,1,0,0,1,4,0,load_mem,0x6610990A,Pop obj ptr; load f32 from obj+%2 → FPU -3,0x7A,3,MemLdFPR8,%2,1,0,0,1,8,0,load_mem,0x66109924,Pop obj ptr; load f64 from obj+%2 → FPU -3,0x7B,3,MemLdPr,%2,1,1,0,0,4,0,load_mem,0x661098F2,Pop obj ptr; load COM ptr from obj+%2; AddRef; push -3,0x7C,3,MemLdRfVar,%2,1,1,0,0,4,0,load_mem,0x66108EB3,Pop obj ptr; push addr of Variant (duplicate slot); LEA -3,0x7D,3,MemLdVar,%2,1,4,0,0,16,0,load_mem,0x6610F299,Pop obj ptr; read 16B Variant from obj+%2; push 4 slots -3,0x7E,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x7F,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x80,3,MemStUI1,%2,2,0,0,0,0,1,store_mem,0x6610EFFE,Pop val + obj ptr; store u8 at obj+%2 -3,0x81,3,MemStI2,%2,2,0,0,0,0,2,store_mem,0x6610990E,Pop val + obj ptr; store i16 at obj+%2 -3,0x82,3,MemStR4,%2,2,0,0,0,0,4,store_mem,0x66109928,Pop val + obj ptr; store R4/i32 at obj+%2 -3,0x83,3,MemStR4,%2,2,0,0,0,0,4,store_mem,0x66109928,Pop val + obj ptr; store R4 (duplicate slot); same handler -3,0x84,3,MemStCy,%2,3,0,0,0,0,8,store_mem,0x66109944,Pop 2 val + obj ptr; store 8B Cy at obj+%2 -3,0x85,3,MemStCy,%2,3,0,0,0,0,8,store_mem,0x66109944,Pop Cy (duplicate slot); same handler -3,0x86,3,MemStVar,%2,5,0,0,0,0,16,store_mem,0x6610F8B4,Pop 4 Variant + obj ptr; store 16B Variant at obj+%2 -3,0x87,3,MemStStr,%2,2,0,0,0,0,4,store_mem,0x6610F428,Pop BSTR + obj ptr; store BSTR at obj+%2; SysFreeString old -3,0x88,3,MemStAd,%2,2,0,0,0,0,4,store_mem,0x6610A103,Pop COM ptr + obj ptr; store at obj+%2; Release old -3,0x89,3,MemStFPR4,%2,1,0,1,0,0,4,store_mem,0x6610996C,Pop obj ptr; pop FPU ST0; store f32 at obj+%2 -3,0x8A,3,MemStFPR8,%2,1,0,1,0,0,8,store_mem,0x66109988,Pop obj ptr; pop FPU ST0; store f64 at obj+%2 -3,0x8B,3,MemStVarAd,%2,2,0,0,0,0,4,store_mem,0x6610F5E4,Pop COM ptr + obj ptr; Set Variant at obj+%2; Set semantics -3,0x8C,3,MemStVarAdFunc,%2,2,0,0,0,0,4,store_mem,0x6610F5CF,Pop COM ptr(func) + obj ptr; Set Variant at obj+%2 -3,0x8D,3,MemStVarUnk,%2,2,0,0,0,0,4,store_mem,0x6610F680,Pop IUnknown + obj ptr; store to Variant at obj+%2; QI -3,0x8E,3,MemStVarUnkFunc,%2,2,0,0,0,0,4,store_mem,0x6610F667,Pop IUnknown(func) + obj; store Variant at obj+%2; QI -3,0x8F,3,MemStAdFunc,%2,2,0,0,0,0,4,store_mem,0x6610F522,Pop COM ptr(func) + obj ptr; store at obj+%2; Release old -3,0x90,3,MemStVarCopy,%2,5,0,0,0,0,16,store_mem,0x6610F83E,Pop 4 Variant + obj ptr; VarCopy to obj+%2 -3,0x91,3,MemStStrCopy,%2,2,0,0,0,0,4,store_mem,0x6610A0B0,Pop BSTR + obj ptr; __vbaStrCopy to obj+%2 -3,0x92,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x93,3,CDargRef,%a,0,4,0,0,0,0,convert,0x66109291,Push 16B Variant ByRef to DARG at [EBP+sext(op)]; 4 slots -3,0x94,5,CVarRef,%a,0,4,0,0,0,0,convert,0x6610A218,Push 16B Variant ByRef pointing to [EBP+sext(op)]; 4 slots -3,0x95,3,ExitProcCb,%a,0,0,0,0,0,0,return,0x6611009C,Return from callback procedure; %a=stack cleanup size -3,0x96,3,ExitProcCbStack,%a,0,0,0,0,0,0,return,0x6611001D,Return from callback with stack return; %a=cleanup size -3,0x97,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x98,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0x99,3,FFree1Var,%a,0,0,0,0,0,0,stack,0x6610A0D8,Clear Variant at [EBP+sext(op)]; __vbaVarClear -3,0x9A,3,FFree1Str,%a,0,0,0,0,0,0,stack,0x6610A0C8,Free BSTR at [EBP+sext(op)]; SysFreeString + set NULL -3,0x9B,3,FFree1Ad,%a,0,0,0,0,0,0,stack,0x66108F04,Free COM obj at [EBP+sext(op)]; Release + set NULL -3,0x9C,3,FStAdNoPop,%a,0,0,0,0,0,4,store_frame,0x6610A158,Store TOS COM ptr to [EBP+sext(op)]; NO pop; Release old -3,0x9D,3,FStAdFuncNoPop,%a,0,0,0,0,0,4,store_frame,0x6610A0D0,Store TOS to func return slot; NO pop; value stays on stack -3,0x9E,1,FLdPrThis,,0,1,0,0,4,0,load_frame,0x66108F07,Push this pointer from frame slot [EBP-0x30] -3,0x9F,1,LdPrVar,,0,1,0,0,4,0,load_frame,0x6610948F,Load COM ptr from Variant at frame; push; AddRef -3,0xA0,3,ImpAdLdUI1,%c,0,1,0,0,1,0,load_ind,0x6610E840,Load u8 via import address table; %c=import index; push i32 -3,0xA1,3,ImpAdLdI2,%c,0,1,0,0,2,0,load_ind,0x661096D4,Load i16 via import address; %c=import; push i32 -3,0xA2,3,ImpAdLdStr,%c,0,1,0,0,4,0,load_ind,0x661096F4,Load i32/Str via import address; push 4B -3,0xA3,3,ImpAdLdStr,%c,0,1,0,0,4,0,load_ind,0x661096F4,Load i32/Str (duplicate slot); same handler -3,0xA4,3,ImpAdLdCy,%c,0,2,0,0,8,0,load_ind,0x66109714,Load 8B Cy via import address; push 2 slots -3,0xA5,3,ImpAdLdCy,%c,0,2,0,0,8,0,load_ind,0x66109714,Load Cy (duplicate slot); same handler -3,0xA6,3,ImpAdLdRf,%c,0,1,0,0,4,0,load_ind,0x66108EA3,Load addr via import address (LEA); push ptr -3,0xA7,3,ImpAdLdStr,%c,0,1,0,0,4,0,load_ind,0x661096F4,Load i32/Str (duplicate slot); same handler -3,0xA8,3,ImpAdLdStr,%c,0,1,0,0,4,0,load_ind,0x661096F4,Load i32/Str (duplicate slot); same handler -3,0xA9,3,ImpAdLdFPR4,%c,0,0,0,1,4,0,load_ind,0x6610973C,Load f32 via import address → FPU -3,0xAA,3,ImpAdLdFPR8,%c,0,0,0,1,8,0,load_ind,0x66109754,Load f64 via import address → FPU -3,0xAB,3,ImpAdLdPr,%c,0,1,0,0,4,0,load_ind,0x661096CE,Load COM ptr via import address; AddRef; push -3,0xAC,3,ImpAdLdRf,%c,0,1,0,0,4,0,load_ind,0x66108EA3,Load addr via import (LEA) (duplicate); same handler -3,0xAD,3,ImpAdLdVar,%c,0,4,0,0,16,0,load_ind,0x6610F2C3,Load 16B Variant via import address; push 4 slots -3,0xAE,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0xAF,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0xB0,3,ImpAdStUI1,%c,1,0,0,0,0,1,store_ind,0x6610E8AD,Pop i32(low byte); store u8 via import address -3,0xB1,3,ImpAdStI2,%c,1,0,0,0,0,2,store_ind,0x66109714,Pop val; store i16 via import address -3,0xB2,3,ImpAdStR4,%c,1,0,0,0,0,4,store_ind,0x66109730,Pop val; store R4/i32 via import address -3,0xB3,3,ImpAdStR4,%c,1,0,0,0,0,4,store_ind,0x66109730,Store R4 (duplicate slot); same handler -3,0xB4,3,ImpAdStR8,%c,2,0,0,0,0,8,store_ind,0x6610974C,Pop 2 slots; store R8 via import address -3,0xB5,3,ImpAdStR8,%c,2,0,0,0,0,8,store_ind,0x6610974C,Store R8 (duplicate slot); same handler -3,0xB6,3,ImpAdStVar,%c,4,0,0,0,0,16,store_ind,0x6610F887,Pop 4 Variant slots; store 16B via import address; VarCopy -3,0xB7,3,ImpAdStStr,%c,1,0,0,0,0,4,store_ind,0x6610F439,Pop BSTR; store via import address; SysFreeString old -3,0xB8,3,ImpAdStAd,%c,1,0,0,0,0,4,store_ind,0x6610F52C,Pop COM ptr; store via import address; Release old -3,0xB9,3,ImpAdStFPR4,%c,0,0,1,0,0,4,store_ind,0x6610976C,Pop FPU ST0; store f32 via import address -3,0xBA,3,ImpAdStFPR8,%c,0,0,1,0,0,8,store_ind,0x66109784,Pop FPU ST0; store f64 via import address -3,0xBB,3,ImpAdStVarAd,%c,1,0,0,0,0,4,store_ind,0x6610F623,Pop COM ptr; Set Variant via import address -3,0xBC,3,ImpAdStVarAdFunc,%c,1,0,0,0,0,4,store_ind,0x6610F60D,Pop COM ptr(func return); Set Variant via import -3,0xBD,3,ImpAdStVarUnk,%c,1,0,0,0,0,4,store_ind,0x6610F69E,Pop IUnknown; store to Variant via import; QI -3,0xBE,3,ImpAdStVarUnkFunc,%c,1,0,0,0,0,4,store_ind,0x6610F684,Pop IUnknown(func); store Variant via import; QI -3,0xBF,3,ImpAdStAdFunc,%c,1,0,0,0,0,4,store_ind,0x6610A160,Pop COM ptr(func return); store via import; Release old -3,0xC0,3,ImpAdStVarCopy,%c,4,0,0,0,0,16,store_ind,0x6610F82D,Pop 4 Variant slots; VarCopy to import address target -3,0xC1,3,ImpAdStStrCopy,%c,1,0,0,0,0,4,store_ind,0x6610F44B,Pop BSTR; __vbaStrCopy via import address -3,0xC2,3,PopTmpLdAd1,%a,0,1,0,0,0,0,stack,0x66110152,Push addr of temp 1-byte slot in frame housekeeping; %a -3,0xC3,3,PopTmpLdAd2,%a,0,1,0,0,0,0,stack,0x66108F22,Push addr of temp 2-byte slot in frame housekeeping; %a -3,0xC4,3,PopTmpLdAdStr,%a,0,1,0,0,0,0,stack,0x66108F2E,Push addr of temp BSTR slot in frame housekeeping; %a -3,0xC5,3,PopTmpLdAd8,%a,0,1,0,0,0,0,stack,0x66108F2A,Push addr of temp 8-byte slot in frame housekeeping; %a -3,0xC6,3,PopTmpLdAdVar,%a,0,1,0,0,0,0,stack,0x66110184,Push addr of temp 16B Variant slot in frame; %a -3,0xC7,3,PopTmpLdAdStr,%a,0,1,0,0,0,0,stack,0x66108F2E,Push addr of temp BSTR slot (duplicate); same handler as 0xC4 -3,0xC8,3,PopTmpLdAdFPR4,%a,0,1,0,0,0,0,stack,0x661101A4,Push addr of temp f32 slot in frame; %a -3,0xC9,3,PopTmpLdAdFPR8,%a,0,1,0,0,0,0,stack,0x661101C5,Push addr of temp f64 slot in frame; %a -3,0xCA,3,CopyBytes,%2,-1,0,0,0,0,0,stack,0x6610A148,Variable-length memcpy; %2=byte count -3,0xCB,5,ExitForCollObj,%a %l,0,0,0,0,0,0,branch,0x6610E45D,Exit For Each (collection/object); cleanup iterator; branch %l -3,0xCC,5,ExitForCollObj,%a %l,0,0,0,0,0,0,branch,0x6610E45D,Exit For Each (duplicate slot); same handler -3,0xCD,5,ExitForCollObj,%a %l,0,0,0,0,0,0,branch,0x6610E45D,Exit For Each (duplicate slot); same handler -3,0xCE,5,ExitForAryVar,%a %l,0,0,0,0,0,0,branch,0x6610E49D,Exit For Each (array Variant); cleanup; branch %l; %a=frame -3,0xCF,5,ExitForVar,%a %l,0,0,0,0,0,0,branch,0x6610E48D,Exit For (Variant counter); cleanup; branch %l; %a=frame -3,0xD0,5,FMemLdUI1,%a %2,0,1,0,0,1,0,load_mem,0x6610F077,Load u8 from [this+%2]; this from [EBP+%a]; push i32 -3,0xD1,5,FMemLdI2,%a %2,0,1,0,0,2,0,load_mem,0x66109972,Load i16 from [this+%2]; this from frame; push i32 -3,0xD2,5,FMemLdR4,%a %2,0,1,0,0,4,0,load_mem,0x6610999C,Load R4 from [this+%2]; this from frame; push 4B -3,0xD3,5,FMemLdR4,%a %2,0,1,0,0,4,0,load_mem,0x6610999C,Load R4 (duplicate slot); same handler -3,0xD4,5,FMemLdR8,%a %2,0,2,0,0,8,0,load_mem,0x661099C0,Load R8 from [this+%2]; this from frame; push 2 slots -3,0xD5,5,FMemLdR8,%a %2,0,2,0,0,8,0,load_mem,0x661099C0,Load R8 (duplicate slot); same handler -3,0xD6,5,FMemLdRf,%a %2,0,1,0,0,4,0,load_mem,0x66108EC5,Push addr of [this+%2]; this from frame (LEA) -3,0xD7,5,FMemLdR4,%a %2,0,1,0,0,4,0,load_mem,0x6610999C,Load R4 (duplicate slot); same handler -3,0xD8,5,FMemLdR4,%a %2,0,1,0,0,4,0,load_mem,0x6610999C,Load R4 (duplicate slot); same handler -3,0xD9,5,FMemLdFPR4,%a %2,0,0,0,1,4,0,load_mem,0x661099E8,Load f32 from [this+%2] → FPU -3,0xDA,5,FMemLdFPR8,%a %2,0,0,0,1,8,0,load_mem,0x661099FC,Load f64 from [this+%2] → FPU -3,0xDB,5,FMemLdPr,%a %2,0,1,0,0,4,0,load_mem,0x661099D0,Load COM ptr from [this+%2]; AddRef; push -3,0xDC,5,FMemLdRf,%a %2,0,1,0,0,4,0,load_mem,0x66108EC5,Push addr (LEA) (duplicate slot); same handler -3,0xDD,5,FMemLdVar,%a %2,0,4,0,0,16,0,load_mem,0x6610F2A7,Load 16B Variant from [this+%2]; push 4 slots -3,0xDE,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0xDF,1,InvalidExcode,,0,0,0,0,0,0,,, -3,0xE0,5,FMemStUI1,%a %2,1,0,0,0,0,1,store_mem,0x6610F109,Pop i32(low byte); store u8 to [this+%2] -3,0xE1,5,FMemStI2,%a %2,1,0,0,0,0,2,store_mem,0x661099F0,Pop i32(low 16); store i16 to [this+%2] -3,0xE2,5,FMemStR4,%a %2,1,0,0,0,0,4,store_mem,0x66109A10,Pop i32; store R4/i32 to [this+%2] -3,0xE3,5,FMemStR4,%a %2,1,0,0,0,0,4,store_mem,0x66109A10,Store R4 (duplicate slot); same handler -3,0xE4,5,FMemStR8,%a %2,2,0,0,0,0,8,store_mem,0x66109A30,Pop 2 slots; store R8 to [this+%2] -3,0xE5,5,FMemStR8,%a %2,2,0,0,0,0,8,store_mem,0x66109A30,Store R8 (duplicate slot); same handler -3,0xE6,5,FMemStVar,%a %2,4,0,0,0,0,16,store_mem,0x6610F898,Pop 4 Variant; store 16B to [this+%2]; VarCopy -3,0xE7,5,FMemStStr,%a %2,1,0,0,0,0,4,store_mem,0x6610A0BE,Pop BSTR; store to [this+%2]; SysFreeString old -3,0xE8,5,FMemStAd,%a %2,1,0,0,0,0,4,store_mem,0x6610A117,Pop COM ptr; store to [this+%2]; Release old -3,0xE9,5,FMemStFPR4,%a %2,0,0,1,0,0,4,store_mem,0x6610940D,Pop FPU ST0; store f32 to [this+%2] -3,0xEA,5,FMemStFPR8,%a %2,0,0,1,0,0,8,store_mem,0x66109420,Pop FPU ST0; store f64 to [this+%2] -3,0xEB,5,FMemStVarAd,%a %2,1,0,0,0,0,4,store_mem,0x6610F609,Pop COM ptr; Set Variant at [this+%2] -3,0xEC,5,FMemStVarAdFunc,%a %2,1,0,0,0,0,4,store_mem,0x6610F5E8,Pop COM ptr(func); Set Variant at [this+%2] -3,0xED,5,FMemStVarUnk,%a %2,1,0,0,0,0,4,store_mem,0x6610F7AA,Pop IUnknown; store to Variant at [this+%2]; QI -3,0xEE,5,FMemStVarUnkFunc,%a %2,1,0,0,0,0,4,store_mem,0x6610F785,Pop IUnknown(func); store Variant at [this+%2]; QI -3,0xEF,5,FMemStAdFunc,%a %2,1,0,0,0,0,4,store_mem,0x6610A110,Pop COM ptr(func); store to [this+%2]; Release old -3,0xF0,5,FMemStVarCopy,%a %2,4,0,0,0,0,16,store_mem,0x6610A1DC,Pop 4 Variant; VarCopy to [this+%2] -3,0xF1,5,FMemStStrCopy,%a %2,1,0,0,0,0,4,store_mem,0x6610A0A0,Pop BSTR; __vbaStrCopy to [this+%2] -3,0xF2,3,CastAd,%c,1,1,0,0,0,0,convert,0x6610A128,Pop ptr; cast/validate COM interface; push validated ptr; %c=import -3,0xF3,3,CastAdVar,%c,4,1,0,0,0,0,convert,0x66109E8B,Pop 16B Variant; extract+cast COM interface; push ptr -3,0xF4,3,New,%c,0,1,0,0,0,0,stack,0x66109E25,Create new COM object; %c=class import; push ptr -3,0xF5,3,NewIfNullRf,%c,1,1,0,0,0,0,stack,0x6610F1A8,Pop ref; if null create new instance; push (non-null) ref -3,0xF6,3,NewIfNullAd,%c,1,1,0,0,0,0,stack,0x6610A160,Pop ptr; if null create new; push (non-null) ptr -3,0xF7,3,NewIfNullPr,%c,1,1,0,0,0,0,stack,0x6610A158,Pop COM ptr; if null create new; push (non-null) ptr -3,0xF8,3,CVarBoolI2,%a,1,0,0,0,0,16,convert,0x661091A3,Pop i32(bool as i16); write Variant(vbBoolean) to [EBP+sext(op)] -3,0xF9,3,CVarDateVar,%a,4,0,0,0,0,16,convert,0x6610D8FB,Pop 4 Variant slots; extract Date; write Variant(vbDate) to frame -3,0xFA,3,CVarErrI4,%a,1,0,0,0,0,16,convert,0x6610D8BF,Pop i32 error code; write Variant(vbError) to [EBP+sext(op)] -3,0xFB,3,CVarDate,%a,0,0,1,0,0,16,convert,0x6610D8F1,Pop FPU R8 Date; write Variant(vbDate) to [EBP+sext(op)] -3,0xFC,3,CVarAryVarg,%a,1,0,0,0,0,16,convert,0x6610DA49,Pop array ptr; write Variant(vbArray) to [EBP+sext(op)] -3,0xFD,1,CStrVarTmp,,4,1,0,0,0,0,convert,0x6610A2C8,Pop 16B Variant; convert to BSTR; push ptr; free Variant -3,0xFE,3,CStrVarVal,%s,4,1,0,0,0,0,convert,0x661090E8,Pop 16B Variant; convert to BSTR via val semantics; push ptr -3,0xFF,5,DestructOFrame,%a %2,-1,0,0,0,0,0,stack,0x66110206,Destruct object frame; cleanup With/For refs; %a %2 operands -4,0x00,3,ThisVCallUI1,%2,-1,1,0,0,0,0,call,0x6610FEA3,This vtable call returning UI1; pops args; push u8 as i32 -4,0x01,3,ThisVCallI2,%2,-1,1,0,0,0,0,call,0x6610A4D0,This vtable call returning I2/Ad; pops args; push i32 (ThisVCallAd handler) -4,0x02,3,ThisVCallI2,%2,-1,1,0,0,0,0,call,0x6610A4D0,This vtable call (duplicate); same handler -4,0x03,3,ThisVCallR4,%2,-1,1,0,0,0,0,call,0x6610FDB9,This vtable call returning R4; pops args; push R4 -4,0x04,3,ThisVCallR8,%2,-1,2,0,0,0,0,call,0x6610FE0C,This vtable call returning R8; pops args; push 2 slots -4,0x05,3,ThisVCallCy,%2,-1,2,0,0,0,0,call,0x6610FD74,This vtable call returning Cy; pops args; push 2 slots -4,0x06,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x07,3,ThisVCallI2,%2,-1,1,0,0,0,0,call,0x6610A4D0,This vtable call (duplicate); same handler -4,0x08,3,ThisVCallI2,%2,-1,1,0,0,0,0,call,0x6610A4D0,This vtable call (duplicate); same handler -4,0x09,3,ThisVCallHidden,%2,-1,0,0,0,0,0,call,0x6610A4B0,This vtable call; hidden/void return; pops args (ThisVCall handler) -4,0x0A,3,ThisVCallHidden,%2,-1,0,0,0,0,0,call,0x6610A4B0,This vtable call hidden (duplicate); same handler -4,0x0B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x0C,3,ThisVCallHidden,%2,-1,0,0,0,0,0,call,0x6610A4B0,This vtable call hidden (duplicate); same handler -4,0x0D,5,ThisVCallCbFrame,%a %2,-1,0,0,0,0,0,call,0x6610FD35,This vtable call with callback frame; %a %2 operands -4,0x0E,3,StLsetFixStr,%c,1,0,0,0,0,4,store_frame,0x6610A278,LSet fixed-length string; pop BSTR; store to %c import -4,0x0F,3,StFixedStrFree,%c,1,0,0,0,0,4,store_frame,0x6610F4BB,Store fixed-length string and free old; pop BSTR; %c import -4,0x10,3,VCallUI1,%2,-1,1,0,0,0,0,call,0x6610FFAD,Vtable call returning UI1; pops this+args; push u8 as i32 -4,0x11,3,VCallStr,%2,-1,1,0,0,0,0,call,0x6610A44C,Vtable call returning Str/Ad; pops this+args; push 4B (VCallAd handler) -4,0x12,3,VCallStr,%2,-1,1,0,0,0,0,call,0x6610A44C,Vtable call (duplicate); same handler -4,0x13,3,VCallR4,%2,-1,1,0,0,0,0,call,0x6610FF9D,Vtable call returning R4; pops this+args; push R4 -4,0x14,3,VCallR8,%2,-1,2,0,0,0,0,call,0x6610FFA5,Vtable call returning R8; pops this+args; push 2 slots -4,0x15,3,VCallCy,%2,-1,2,0,0,0,0,call,0x6610FF95,Vtable call returning Cy; pops this+args; push 2 slots -4,0x16,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x17,3,VCallStr,%2,-1,1,0,0,0,0,call,0x6610A44C,Vtable call (duplicate); same handler -4,0x18,3,VCallStr,%2,-1,1,0,0,0,0,call,0x6610A44C,Vtable call (duplicate); same handler -4,0x19,3,VCallFPR8,%2,-1,0,0,1,0,0,call,0x6610A460,Vtable call returning R8 on FPU; pops this+args; push FPU -4,0x1A,3,VCallFPR8,%2,-1,0,0,1,0,0,call,0x6610A460,Vtable call FPR8 (duplicate); same handler -4,0x1B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x1C,3,VCallFPR8,%2,-1,0,0,1,0,0,call,0x6610A460,Vtable call FPR8 (duplicate); same handler -4,0x1D,5,VCallCbFrame,%2 %2,-1,0,0,0,0,0,call,0x6610FF8D,Vtable call with callback frame; %2 %2 operands -4,0x1E,3,StFixedStrR,%c,1,0,0,0,0,4,store_frame,0x6610F4A3,Store R-value fixed-length string; pop BSTR; %c import -4,0x1F,3,StFixedStrRFree,%c,1,0,0,0,0,4,store_frame,0x6610F48B,Store R-value fixed str and free old; pop BSTR; %c import -4,0x20,5,ImpAdCallUI1,%c %c,-1,1,0,0,0,0,call,0x6610FCDC,Import address call returning UI1; %c %c; push u8 as i32 -4,0x21,5,ImpAdCallI4,%c %c,-1,1,0,0,0,0,call,0x6610A47C,Import address call returning I4/Ad; %c %c; push i32 -4,0x22,5,ImpAdCallI4,%c %c,-1,1,0,0,0,0,call,0x6610A47C,Import addr call (duplicate); same handler -4,0x23,5,ImpAdCallR4,%c %c,-1,1,0,0,0,0,call,0x6610FB93,Import address call returning R4; %c %c; push R4 -4,0x24,5,ImpAdCallR8,%c %c,-1,2,0,0,0,0,call,0x6610FBF5,Import address call returning R8; %c %c; push 2 slots -4,0x25,5,ImpAdCallCy,%c %c,-1,2,0,0,0,0,call,0x6610A48C,Import address call returning Cy; %c %c; push 2 slots -4,0x26,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x27,5,ImpAdCallI4,%c %c,-1,1,0,0,0,0,call,0x6610A47C,Import addr call (duplicate); same handler -4,0x28,5,ImpAdCallI4,%c %c,-1,1,0,0,0,0,call,0x6610A47C,Import addr call (duplicate); same handler -4,0x29,5,ImpAdCallFPR4,%c %c,-1,0,0,1,0,0,call,0x6610A490,Import address call returning FPR4; %c %c; push FPU -4,0x2A,5,ImpAdCallFPR4,%c %c,-1,0,0,1,0,0,call,0x6610A490,Import addr call FPR4 (duplicate); same handler -4,0x2B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x2C,5,ImpAdCallFPR4,%c %c,-1,0,0,1,0,0,call,0x6610A490,Import addr call FPR4 (duplicate); same handler -4,0x2D,9,ImpAdCallCbFrame,%a %4 %2,-1,0,0,0,0,0,call,0x6610FADF,Import addr call with callback frame; %a %4 %2 operands -4,0x2E,3,LdStkRf,%2,0,1,0,0,4,0,stack,0x6611010C,Load stack reference; push addr of stack slot at %2 offset -4,0x2F,3,LdFrameRf,%a,0,1,0,0,4,0,load_frame,0x66110121,Load frame reference; push addr of [EBP+sext(op)]; %a=frame offset -4,0x30,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x31,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x32,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x33,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x34,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x35,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x36,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x37,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x38,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x39,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x3A,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x3B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x3C,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x3D,5,LitVarUI1,%a %2,0,0,0,0,0,16,load_lit,0x6610EBD5,Write UI1 literal as Variant(vbByte) to [EBP+%a]; %2=value -4,0x3E,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x3F,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x40,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x41,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x42,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x43,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x44,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x45,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x46,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x47,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x48,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x49,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x4A,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x4B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x4C,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x4D,1,SetVarVar,,4,0,0,0,0,16,store_ind,0x6610F7C1,Pop 4 Variant slots; Set obj ref in target Variant -4,0x4E,1,SetVarVarFunc,,4,0,0,0,0,16,store_ind,0x6610F7AE,Pop 4 Variant (func return); Set obj ref in target Variant -4,0x4F,5,ImpAdCallHresult,%c %c,-1,0,0,0,0,0,call,0x6610A47C,Import address call returning HRESULT; %c %c; checked; no push -4,0x50,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x51,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x52,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x53,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x54,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x55,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x56,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x57,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x58,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x59,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x5A,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x5B,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x5C,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x5D,3,OpenFile,%2,-1,0,0,0,0,0,io,0x6610933B,Open file; %2=mode+access; pops path+filenum+reclen from stack -4,0x5E,3,LockFile,%2,-1,0,0,0,0,0,io,0x6610DE82,Lock/Unlock file region; %2=lock/unlock flag; pops filenum+start+len -4,0x5F,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x60,3,EraseDestruct,%s,1,0,0,0,0,0,stack,0x6610D253,Erase array with destructor; %s=type desc; pop array ref -4,0x61,3,LdFixedStr,%c,0,1,0,0,4,0,load_frame,0x6610A118,Load fixed-length string address from frame; push ptr; %c=import -4,0x62,5,ForUI1,%a %2,2,0,0,0,0,1,branch,0x6610DF82,For counter=start To end (UI1); pop start+end; init loop; %a %2 -4,0x63,5,ForI2,%a %2,2,0,0,0,0,2,branch,0x661094CA,For counter=start To end (I2); pop start+end; init loop; %a %2 -4,0x64,5,ForI4,%a %2,2,0,0,0,0,4,branch,0x6610959D,For counter=start To end (I4); pop start+end; init loop; %a %2 -4,0x65,5,ForR4,%a %2,0,0,2,0,0,4,branch,0x6610E01D,For (R4); pop FPU start+end; init loop; %a %2 -4,0x66,5,ForR8,%a %2,0,0,2,0,0,8,branch,0x6610E08B,For (R8); pop FPU start+end; init loop; %a %2 -4,0x67,5,ForCy,%a %2,4,0,0,0,0,8,branch,0x6610E0CB,For (Cy); pop start+end (4 slots); init loop; %a %2 -4,0x68,5,ForVar,%a %2,8,0,0,0,0,16,branch,0x66109605,For (Variant); pop start+end (8 slots); init loop; %a %2 -4,0x69,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x6A,5,ForStepUI1,%a %2,3,0,0,0,0,1,branch,0x6610DF86,For..Step (UI1); pop start+end+step; init loop; %a %2 -4,0x6B,5,ForStepI2,%a %2,3,0,0,0,0,2,branch,0x66109528,For..Step (I2); pop start+end+step; init loop; %a %2 -4,0x6C,5,ForStepI4,%a %2,3,0,0,0,0,4,branch,0x661095A1,For..Step (I4); pop start+end+step; init loop; %a %2 -4,0x6D,5,ForStepR4,%a %2,0,0,3,0,0,4,branch,0x6610E021,For..Step (R4); pop 3 FPU vals; init loop; %a %2 -4,0x6E,5,ForStepR8,%a %2,0,0,3,0,0,8,branch,0x6610E08F,For..Step (R8); pop 3 FPU vals; init loop; %a %2 -4,0x6F,5,ForStepCy,%a %2,6,0,0,0,0,8,branch,0x6610E0D3,For..Step (Cy); pop start+end+step (6 slots); init loop; %a %2 -4,0x70,5,ForStepVar,%a %2,12,0,0,0,0,16,branch,0x66109615,For..Step (Variant); pop start+end+step (12 slots); init loop -4,0x71,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x72,5,ForEachCollVar,%a %2,1,0,0,0,0,16,branch,0x6610E3E9,For Each var In collection (Variant); pop coll; init iterator -4,0x73,5,NextEachCollVar,%a %2,0,0,0,0,0,0,branch,0x6610E409,Next (For Each collection Variant); advance iterator or exit -4,0x74,5,ForEachCollAd,%a %2,1,0,0,0,0,4,branch,0x66109713,For Each obj In collection (Ad); pop coll; init iterator -4,0x75,5,NextEachCollAd,%a %2,0,0,0,0,0,0,branch,0x6610E410,Next (For Each collection Ad); advance iterator or exit -4,0x76,7,ForEachAryVar,%a %s %l,1,0,0,0,0,16,branch,0x6610E427,For Each var In array (Variant); pop array; init; %a %s %l -4,0x77,7,NextEachAryVar,%a %s %l,0,0,0,0,0,0,branch,0x6610E441,Next (For Each array Variant); advance or exit; %a %s %l -4,0x78,5,NextUI1,%a %2,0,0,0,0,0,0,branch,0x6610DFB2,Next (For UI1); increment counter; compare; branch or fall through -4,0x79,5,NextI2,%a %2,0,0,0,0,0,0,branch,0x661094CA,Next (For I2); increment+compare; branch or fall through -4,0x7A,5,NextI4,%a %2,0,0,0,0,0,0,branch,0x6610959D,Next (For I4); increment+compare; branch or fall through -4,0x7B,5,NextStepR4,%a %2,0,0,0,0,0,0,branch,0x6610E01D,Next Step (For R4); add step+compare; branch or fall through -4,0x7C,5,NextR8,%a %2,0,0,0,0,0,0,branch,0x6610E08B,Next (For R8); add step+compare; branch or fall through -4,0x7D,5,NextStepCy,%a %2,0,0,0,0,0,0,branch,0x6610E0CB,Next Step (For Cy); add step+compare; branch or fall through -4,0x7E,5,NextStepVar,%a %2,0,0,0,0,0,0,branch,0x66109644,Next Step (For Variant); add step+compare; branch or fall through -4,0x7F,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x80,5,NextStepUI1,%a %2,0,0,0,0,0,0,branch,0x6610DFB2,Next Step (For UI1); same handler as NextUI1 -4,0x81,5,NextStepI2,%a %2,0,0,0,0,0,0,branch,0x66109528,Next Step (For I2); add step+compare; branch or fall through -4,0x82,5,NextStepI4,%a %2,0,0,0,0,0,0,branch,0x661095A1,Next Step (For I4); add step+compare; branch or fall through -4,0x83,5,NextStepR4,%a %2,0,0,0,0,0,0,branch,0x6610E021,Next Step (For R4); same handler as 0x7B -4,0x84,5,NextR8,%a %2,0,0,0,0,0,0,branch,0x6610E08F,Next Step (For R8); same handler as 0x7C -4,0x85,5,NextStepCy,%a %2,0,0,0,0,0,0,branch,0x6610E0D3,Next Step (For Cy); same handler as 0x7D -4,0x86,5,NextStepVar,%a %2,0,0,0,0,0,0,branch,0x66109644,Next Step (For Variant); same handler as 0x7E -4,0x87,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x88,7,ForEachCollObj,%a %s %l,1,0,0,0,0,4,branch,0x66109725,For Each obj In collection (Object); pop coll; init; %a %s %l -4,0x89,5,ForEachVar,%a %2,1,0,0,0,0,0,branch,0x6610E3E2,For Each (generic Variant); pop source; init iterator -4,0x8A,5,ForEachVarFree,%a %2,1,0,0,0,0,0,branch,0x6610E3CB,For Each (generic Variant); pop source; init; free after -4,0x8B,7,NextEachCollObj,%a %s %l,0,0,0,0,0,0,branch,0x66109741,Next (For Each collection Object); advance or exit; %a %s %l -4,0x8C,9,NextEachVar,%a %4 %2,-1,0,0,0,0,0,branch,0x6610E3F0,Next (For Each generic); advance or exit; %a %4 %2 -4,0x8D,3,CheckType,%c,1,1,0,0,0,0,compare,0x66109ED1,TypeOf..Is check; pop obj ptr; check against %c type; push i32 bool -4,0x8E,9,Redim,%a %4 %2,-1,0,0,0,0,0,stack,0x66108E7E,ReDim array; %a %4 %2 operands; pops dimensions from stack -4,0x8F,9,RedimPreserve,%a %4 %2,-1,0,0,0,0,0,stack,0x6610D279,ReDim Preserve; %a %4 %2; pops dimensions; preserves data -4,0x90,5,RedimVar,%a %2,-1,0,0,0,0,0,stack,0x6610D2D3,ReDim Variant array; %a %2; pops dimensions -4,0x91,5,RedimPreserveVar,%a %2,-1,0,0,0,0,0,stack,0x6610D2A2,ReDim Preserve Variant array; %a %2; preserves data -4,0x92,5,FDupVar,%a %2,0,4,0,0,16,0,load_frame,0x6610A1BB,Duplicate Variant from [EBP+%a] + %2; push copy as 4 slots -4,0x93,5,FDupStr,%a %2,0,1,0,0,4,0,load_frame,0x6610F3D4,Duplicate String from [EBP+%a] + %2; SysAllocString; push BSTR -4,0x94,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0x95,7,OnGosub,%a %4,1,0,0,0,0,0,branch,0x6610D315,On..GoSub; pop index; branch to table[index]; push return addr -4,0x96,7,OnGoto,%a %4,1,0,0,0,0,0,branch,0x6610D348,On..GoTo; pop index; branch to table[index] -4,0x97,1,AddRef,,1,1,0,0,0,0,stack,0x6610F982,Pop COM ptr; AddRef; push same ptr back (increment ref count) -4,0x98,5,LateMemCall,%c %c,-1,0,0,0,0,0,call,0x661098FC,Late-bound member call via IDispatch::Invoke; %c %c -4,0x99,5,LateMemLdVar,%a %2,-1,4,0,0,0,0,call,0x66109926,Late-bound member load; returns Variant; push 4 slots; %a %2 -4,0x9A,7,LateMemCallLdVar,%a %4,-1,4,0,0,0,0,call,0x6610990F,Late-bound member call+load; returns Variant; %a %4 -4,0x9B,3,LateMemSt,%c,-1,0,0,0,0,0,call,0x66109926,Late-bound member store via IDispatch; pops value+args; %c -4,0x9C,5,LateMemCallSt,%c %c,-1,0,0,0,0,0,call,0x66109974,Late-bound member call+store; pops value+args; %c %c -4,0x9D,5,LateMemStAd,%c %c,-1,0,0,0,0,0,call,0x66109963,Late-bound member Set store (obj ref); %c %c -4,0x9E,5,ExitProcFrameCb,%a %2,0,0,0,0,0,0,return,0x66110055,Exit proc with frame callback cleanup; %a %2 -4,0x9F,5,ExitProcFrameCbStack,%a %2,0,0,0,0,0,0,return,0x6610FFD0,Exit proc with frame callback + stack cleanup; %a %2 -4,0xA0,7,LateIdCall,%a %4,-1,0,0,0,0,0,call,0x6610985A,Late-bound call by DispID; IDispatch::Invoke; %a %4 -4,0xA1,7,LateIdLdVar,%a %4,-1,4,0,0,0,0,call,0x66109893,Late-bound load by DispID; returns Variant; push 4 slots; %a %4 -4,0xA2,9,LateIdCallLdVar,%a %4 %2,-1,4,0,0,0,0,call,0x6610986C,Late-bound call+load by DispID; returns Variant; %a %4 %2 -4,0xA3,5,LateIdSt,%4,-1,0,0,0,0,0,call,0x66109893,Late-bound store by DispID; pops value; %4 -4,0xA4,7,LateIdCallSt,%a %4,-1,0,0,0,0,0,call,0x661098A6,Late-bound call+store by DispID; %a %4 -4,0xA5,7,LateIdStAd,%a %4,-1,0,0,0,0,0,call,0x66109893,Late-bound Set store by DispID (obj ref); %a %4 -4,0xA6,7,LateMemNamedCall,%a %4,-1,0,0,0,0,0,call,0x6610EAAD,Late-bound named-arg member call; %a %4 -4,0xA7,9,LateMemNamedCallLdVar,%a %4 %2,-1,4,0,0,0,0,call,0x6610EAE7,Late-bound named call+load; Variant return; %a %4 %2 -4,0xA8,7,LateMemNamedCallSt,%a %4,-1,0,0,0,0,0,call,0x6610EB05,Late-bound named call+store; %a %4 -4,0xA9,7,LateMemNamedStAd,%a %4,-1,0,0,0,0,0,call,0x6610EB33,Late-bound named Set store; %a %4 -4,0xAA,9,LateIdNamedCall,%a %4 %2,-1,0,0,0,0,0,call,0x6610E9AD,Late-bound named call by DispID; %a %4 %2 -4,0xAB,1,LateIdNamedCallLdVar,,-1,4,0,0,0,0,call,0x6610E9E5,Late-bound named call+load by DispID; Variant; push 4 slots -4,0xAC,9,LateIdNamedCallSt,%a %4 %2,-1,0,0,0,0,0,call,0x6610EA02,Late-bound named call+store by DispID; %a %4 %2 -4,0xAD,9,LateIdNamedStAd,%a %4 %2,-1,0,0,0,0,0,call,0x6610EA2E,Late-bound named Set store by DispID; %a %4 %2 -4,0xAE,5,VarIndexLdVar,%a %2,-1,4,0,0,16,0,load_ind,0x66108DB5,Variant index load; pop index+Variant; push Variant result; %a %2 -4,0xAF,5,VarIndexLdRfVar,%a %2,-1,1,0,0,4,0,load_ind,0x6610D189,Variant index load ref; pop index+Variant; push addr; %a %2 -4,0xB0,3,VarIndexSt,%a,-1,0,0,0,0,16,store_ind,0x6610D196,Variant index store; pop value+index+Variant; %a -4,0xB1,3,VarIndexStAd,%a,-1,0,0,0,0,4,store_ind,0x6610D1C1,Variant index Set store; pop obj+index+Variant; %a -4,0xB2,-1,FFreeVar,,-1,0,0,0,0,0,stack,0x66108FA4,Free multiple Variants; variable-length; reads frame offsets -4,0xB3,-1,FFreeStr,,-1,0,0,0,0,0,stack,0x66108FB8,Free multiple BSTRs; variable-length; reads frame offsets -4,0xB4,-1,FFreeAd,,-1,0,0,0,0,0,stack,0x6610A118,Free multiple COM ptrs; variable-length; reads frame offsets -4,0xB5,3,LitI2,%2,0,1,0,0,0,0,load_lit,0x66108FFB,Push i16 literal (sign-extended to i32); %2=value -4,0xB6,3,LitI2FP,%2,0,0,0,1,0,0,load_lit,0x6610A011,Push i16 literal onto FPU as float; %2=value; fild -4,0xB7,5,LitCy4,%4,0,2,0,0,0,0,load_lit,0x6610A011,Push 4B Currency literal (sign-extend to 8B); %4; push 2 slots -4,0xB8,5,LitI4,%4,0,1,0,0,0,0,load_lit,0x66108F38,Push i32 literal; %4=value -4,0xB9,5,LitI4,%4,0,1,0,0,0,0,load_lit,0x66108F38,Push i32 literal (duplicate); same handler -4,0xBA,5,LitR4FP,%4,0,0,0,1,0,0,load_lit,0x6610A168,Push R4 literal onto FPU; %4=f32 bits; fld dword -4,0xBB,9,LitR8,%4 %4,0,2,0,0,0,0,load_lit,0x6610A174,Push R8 literal (8 bytes); %4 %4; push 2 eval slots -4,0xBC,9,LitR8,%4 %4,0,2,0,0,0,0,load_lit,0x6610A174,Push R8 literal (duplicate); same handler -4,0xBD,9,LitR8FP,%4 %4,0,0,0,1,0,0,load_lit,0x66108F97,Push R8 literal onto FPU; %4 %4=f64 bits; fld qword -4,0xBE,9,LitR8FP,%4 %4,0,0,0,1,0,0,load_lit,0x66108F97,Push R8 FPU literal (duplicate); same handler -4,0xBF,3,LitStr,%s,0,1,0,0,0,0,load_lit,0x66108F07,Push BSTR from constant pool; %s=pool index -4,0xC0,5,LitVarI2,%a %2,0,0,0,0,0,16,load_lit,0x6610A098,Write I2 literal as Variant(vbInteger) to [EBP+%a]; %2=value -4,0xC1,7,LitVarI4,%a %4,0,0,0,0,0,16,load_lit,0x66109AEB,Write I4 literal as Variant(vbLong) to [EBP+%a]; %4=value -4,0xC2,7,LitVarR4,%a %4,0,0,0,0,0,16,load_lit,0x6610EBEE,Write R4 literal as Variant(vbSingle) to [EBP+%a]; %4=bits -4,0xC3,1,LitVarCy,,0,0,0,0,0,16,load_lit,0x6610EBF8,Write Cy literal as Variant(vbCurrency) to frame; 8B inline -4,0xC4,11,LitVarR8,%a %4 %4,0,0,0,0,0,16,load_lit,0x66109B06,Write R8 literal as Variant(vbDouble) to [EBP+%a]; %4 %4 -4,0xC5,1,LitVarDate,,0,0,0,0,0,16,load_lit,0x6610EC02,Write Date literal as Variant(vbDate) to frame; 8B inline -4,0xC6,5,LitVarStr,%a %2,0,0,0,0,0,16,load_lit,0x66108F22,Write String literal as Variant(vbString) to [EBP+%a]; %2=pool -4,0xC7,1,CStrBool,,1,1,0,0,0,0,convert,0x6610D753,Bool→Str; pop VB bool; convert to "True"/"False" BSTR; push -4,0xC8,1,CStrDate,,0,1,1,0,0,0,convert,0x6610D787,Date(FPU)→Str; pop FPU R8 date; convert to BSTR; push -4,0xC9,1,CDateStr,,1,0,0,1,0,0,convert,0x6610D80C,Str→Date(FPU); pop BSTR; parse date; push FPU R8 -4,0xCA,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xCB,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xCC,1,FreeStrNoPop,,0,0,0,0,0,0,stack,0x6610F92C,Free BSTR on TOS without popping; TOS still valid after -4,0xCD,1,FreeVarNoPop,,0,0,0,0,0,0,stack,0x6610F96E,Free Variant on TOS without popping; TOS cleared to Empty -4,0xCE,1,FreeAdNoPop,,0,0,0,0,0,0,stack,0x6610F94D,Free COM ptr on TOS without popping; Release; TOS set to NULL -4,0xCF,1,EraseNoPop,,0,0,0,0,0,0,stack,0x6610D215,Erase array TOS without popping; array descriptor cleared -4,0xD0,3,WMemLdUI1,%2,0,1,0,0,1,0,load_mem,0x6610E6F5,With-block: load u8 from [With_obj+%2]; push i32 -4,0xD1,3,WMemLdI2,%2,0,1,0,0,2,0,load_mem,0x6610E70E,With-block: load i16 from [With_obj+%2]; push i32 -4,0xD2,3,WMemLdStr,%2,0,1,0,0,4,0,load_mem,0x6610E727,With-block: load i32/Str from [With_obj+%2]; push 4B -4,0xD3,3,WMemLdStr,%2,0,1,0,0,4,0,load_mem,0x6610E727,With-block: load Str (duplicate slot); same handler -4,0xD4,3,WMemLdCy,%2,0,2,0,0,8,0,load_mem,0x6610E73E,With-block: load 8B Cy from [With_obj+%2]; push 2 slots -4,0xD5,3,WMemLdCy,%2,0,2,0,0,8,0,load_mem,0x6610E73E,With-block: load Cy (duplicate slot); same handler -4,0xD6,3,WMemLdRfVar,%2,0,1,0,0,4,0,load_mem,0x6610E786,With-block: push addr of Variant at [With_obj+%2] (LEA) -4,0xD7,3,WMemLdStr,%2,0,1,0,0,4,0,load_mem,0x6610E727,With-block: load Str (duplicate slot); same handler -4,0xD8,3,WMemLdStr,%2,0,1,0,0,4,0,load_mem,0x6610E727,With-block: load Str (duplicate slot); same handler -4,0xD9,3,WMemLdFPR4,%2,0,0,0,1,4,0,load_mem,0x6610E758,With-block: load f32 from [With_obj+%2] → FPU -4,0xDA,3,WMemLdFPR8,%2,0,0,0,1,8,0,load_mem,0x6610E76F,With-block: load f64 from [With_obj+%2] → FPU -4,0xDB,3,IWMemLdPr,%2,0,1,0,0,4,0,load_mem,0x6610F380,With-block: load COM ptr from [With_obj+%2]; AddRef; push -4,0xDC,3,WMemLdRfVar,%2,0,1,0,0,4,0,load_mem,0x6610E786,With-block: push addr of Variant (duplicate); LEA -4,0xDD,3,WMemLdVar,%2,0,4,0,0,16,0,load_mem,0x6610F322,With-block: load 16B Variant from [With_obj+%2]; push 4 slots -4,0xDE,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xDF,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xE0,3,WMemStUI1,%2,1,0,0,0,0,1,store_mem,0x6610E79C,With-block: pop val; store u8 to [With_obj+%2] -4,0xE1,3,WMemStI2,%2,1,0,0,0,0,2,store_mem,0x6610E7B4,With-block: pop val; store i16 to [With_obj+%2] -4,0xE2,3,WMemStR4,%2,1,0,0,0,0,4,store_mem,0x6610E7CD,With-block: pop val; store R4/i32 to [With_obj+%2] -4,0xE3,3,WMemStR4,%2,1,0,0,0,0,4,store_mem,0x6610E7CD,With-block: store R4 (duplicate slot); same handler -4,0xE4,3,WMemStR8,%2,2,0,0,0,0,8,store_mem,0x6610E7E4,With-block: pop 2 slots; store R8 to [With_obj+%2] -4,0xE5,3,WMemStR8,%2,2,0,0,0,0,8,store_mem,0x6610E7E4,With-block: store R8 (duplicate slot); same handler -4,0xE6,3,WMemStVar,%2,4,0,0,0,0,16,store_mem,0x6610F879,With-block: pop 4 Variant; store 16B to [With_obj+%2] -4,0xE7,3,WMemStStr,%2,1,0,0,0,0,4,store_mem,0x6610F3F9,With-block: pop BSTR; store to [With_obj+%2]; SysFreeString old -4,0xE8,3,WMemStAd,%a,1,0,0,0,0,4,store_mem,0x6610F51E,With-block: pop COM ptr; store to [With_obj+%a]; Release old -4,0xE9,3,WMemStFPR4,%2,0,0,1,0,0,4,store_mem,0x6610E7FE,With-block: pop FPU ST0; store f32 to [With_obj+%2] -4,0xEA,3,WMemStFPR8,%2,0,0,1,0,0,8,store_mem,0x6610E81F,With-block: pop FPU ST0; store f64 to [With_obj+%2] -4,0xEB,3,WMemStVarAd,%a,1,0,0,0,0,4,store_mem,0x6610F5CB,With-block: pop COM ptr; Set Variant at [With_obj+%a] -4,0xEC,3,WMemStVarAdFunc,%a,1,0,0,0,0,4,store_mem,0x6610F5B8,With-block: pop COM ptr(func); Set Variant at [With_obj+%a] -4,0xED,3,WMemStVarUnk,%a,1,0,0,0,0,4,store_mem,0x6610F781,With-block: pop IUnknown; store to Variant at [With_obj+%a]; QI -4,0xEE,3,WMemStVarUnkFunc,%a,1,0,0,0,0,4,store_mem,0x6610F76A,With-block: pop IUnknown(func); store Variant; QI -4,0xEF,3,WMemStAdFunc,%a,1,0,0,0,0,4,store_mem,0x6610F50B,With-block: pop COM ptr(func); store to [With_obj+%a]; Release -4,0xF0,3,WMemStVarCopy,%2,4,0,0,0,0,16,store_mem,0x6610F810,With-block: pop 4 Variant; VarCopy to [With_obj+%2] -4,0xF1,3,WMemStStrCopy,%2,1,0,0,0,0,4,store_mem,0x6610F419,With-block: pop BSTR; __vbaStrCopy to [With_obj+%2] -4,0xF2,7,VarIndexLdRfVarLock,%a %4,-1,1,0,0,4,0,load_ind,0x6610D162,Variant index load ref+lock; push addr; %a %4 -4,0xF3,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xF4,1,InvalidExcode,,0,0,0,0,0,0,,, -4,0xF5,3,AssignRecord,%s,2,0,0,0,0,0,stack,0x6611024E,Assign UDT record; pop src+dst ptrs; memcpy; %s=type desc -4,0xF6,5,DestructAnsiOFrame,%a %2,-1,0,0,0,0,0,stack,0x6611022A,Destruct ANSI object frame; cleanup With/For; %a %2 -4,0xF7,3,FStVarZero,%a,0,0,0,0,0,16,store_frame,0x6610F7D4,Clear Variant at [EBP+sext(op)] to zero/Empty -4,0xF8,3,FStVarCopyObj,%a,4,0,0,0,0,16,store_frame,0x6610A218,Pop 4 Variant (obj); copy with Set semantics to [EBP+%a] -4,0xF9,1,VerifyVarObj,,4,4,0,0,0,0,stack,0x66109472,Verify Variant contains Object; pop 16B; validate; push back -4,0xFA,1,VerifyPVarObj,,1,1,0,0,0,0,stack,0x6610DF3D,Verify ptr-to-Variant contains Object; pop addr; validate; push -4,0xFB,1,FnInStrB4,,4,1,0,0,0,0,stack,0x6611054D,InStrB (4-arg byte); pop start+str1+str2+compare; push i32 pos -4,0xFC,3,FnInStrB4Var,%a,4,0,0,0,0,16,stack,0x6611055F,InStrB (4-arg byte) → Variant; pop args; write Variant to %a -4,0xFD,1,FnInStr4,,4,1,0,0,0,0,stack,0x6610A902,InStr (4-arg); pop start+str1+str2+compare; push i32 position -4,0xFE,3,FnInStr4Var,%a,4,0,0,0,0,16,stack,0x6611057A,InStr (4-arg) → Variant; pop args; write Variant to %a frame -4,0xFF,1,FnStrComp3,,3,1,0,0,0,0,stack,0x66110595,StrComp (3-arg); pop str1+str2+compare; push i32 result -5,0x00,3,FnStrComp3Var,%a,3,0,0,0,0,16,stack,0x661105A7,StrComp (3-arg) → Variant; pop str1+str2+compare; write Variant to %a -5,0x01,1,StAryMove,,2,0,0,0,0,0,store_ind,0x66108DE1,Move array; pop src+dst array refs; transfer ownership -5,0x02,1,StAryCopy,,2,0,0,0,0,0,store_ind,0x6610D1C8,Copy array; pop src+dst array refs; deep copy -5,0x03,3,StAryRecMove,%s,2,0,0,0,0,0,store_ind,0x6610D1F7,Move record array; pop src+dst; %s=type desc; transfer -5,0x04,3,StAryRecCopy,%s,2,0,0,0,0,0,store_ind,0x6610D1D9,Copy record array; pop src+dst; %s=type desc; deep copy -5,0x05,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x06,5,AryInRecLdPr,%a %2,2,1,0,0,4,0,load_ind,0x6610D12C,Load COM ptr from array in UDT; %a %2; AddRef; push -5,0x07,5,AryInRecLdRf,%a %2,2,1,0,0,4,0,load_ind,0x6610D0FD,Load addr from array in UDT; %a %2; push (LEA) -5,0x08,1,CExtInstUnk,,1,1,0,0,0,0,convert,0x6610F1EC,Convert external instance to IUnknown; pop ptr; QI; push -5,0x09,3,IStVarCopyObj,%a,4,0,0,0,0,16,store_ind,0x6610F855,Pop 4 Variant; copy with obj ref semantics to *[EBP+%a] -5,0x0A,1,ArrayRebase1Var,,1,0,0,0,0,0,stack,0x6610D303,Rebase 1-D array to base 1; pop array ref; modify lBound -5,0x0B,1,Assert,,1,0,0,0,0,0,stack,0x6610CF32,Debug.Assert; pop bool; break if False; no-op in release -5,0x0C,7,RaiseEvent,%a %4,-1,0,0,0,0,0,call,0x6610E990,RaiseEvent; %a %4; pop args; invoke event sink handlers -5,0x0D,5,PrintObject,%c %2,-1,0,0,0,0,0,io,0x6610A347,Print to object (Debug.Print); %c %2; pop value+channel -5,0x0E,5,PrintFile,%c %2,-1,0,0,0,0,0,io,0x6610A36B,Print# to file; %c %2; pop value+filenum -5,0x0F,5,WriteFile,%c %2,-1,0,0,0,0,0,io,0x6610FA43,Write# to file; %c %2; pop value+filenum -5,0x10,5,InputFile,%c %2,-1,0,0,0,0,0,io,0x6610DCF6,Input# from file; %c %2; pop filenum; read values -5,0x11,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x12,1,GetRecFxStr3,,3,0,0,0,0,0,io,0x6610DDCA,Get with fixed string (3-arg); pop filenum+recnum+buffer -5,0x13,1,GetRecFxStr4,,4,0,0,0,0,0,io,0x6610DDEC,Get with fixed string (4-arg); pop filenum+recnum+buffer+len -5,0x14,1,PutRecFxStr3,,3,0,0,0,0,0,io,0x6610DDDB,Put with fixed string (3-arg); pop filenum+recnum+buffer -5,0x15,1,PutRecFxStr4,,4,0,0,0,0,0,io,0x6610DDFD,Put with fixed string (4-arg); pop filenum+recnum+buffer+len -5,0x16,3,GetRecOwn3,%s,3,0,0,0,0,0,io,0x6610DE0E,Get with owner record (3-arg); %s=type desc -5,0x17,3,GetRecOwn4,%s,4,0,0,0,0,0,io,0x6610DE2B,Get with owner record (4-arg); %s=type desc -5,0x18,3,PutRecOwn3,%s,3,0,0,0,0,0,io,0x6610DE48,Put with owner record (3-arg); %s=type desc -5,0x19,3,PutRecOwn4,%s,4,0,0,0,0,0,io,0x6610DE65,Put with owner record (4-arg); %s=type desc -5,0x1A,2,LitI2_Byte,%1,0,1,0,0,0,0,load_lit,0x66108FFB,Push u8 literal zero-extended to i32; %1=byte value -5,0x1B,1,CBoolVarNull,,4,1,0,0,0,0,convert,0x661090A5,Var→Bool (null-aware); pop 16B Variant; convert; push i32 bool -5,0x1C,2,LargeBos,%1,0,0,0,0,0,0,bos,0x66108E87,Beginning-of-statement marker; %1=byte distance to next BOS (0=last statement) -5,0x1D,0,InvalidExcode,,0,0,0,0,0,0,,, -5,0x1E,5,ImpAdCallNonVirt,%a %2,-1,0,0,0,0,0,call,0x6610FA67,Import addr non-virtual call; %a %2; direct function call -5,0x1F,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x20,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x21,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x22,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x23,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x24,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x25,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x26,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x27,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x28,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x29,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x2A,3,DestructRecord,%a,0,0,0,0,0,0,stack,0x661101E6,Destruct UDT record at [EBP+%a]; cleanup fields -5,0x2B,3,VCallFPR8,%2,-1,0,0,1,0,0,call,0x6610A460,Vtable call returning R8 on FPU; pops this+args; push FPU -5,0x2C,3,ThisVCallHidden,%2,-1,0,0,0,0,0,call,0x6610A4B0,This vtable call; hidden/void; pops args (ThisVCall handler) -5,0x2D,1,ZeroRetVal,,0,0,0,0,0,4,store_frame,0x6610A675,Zero the function return value slot; no stack change -5,0x2E,1,ZeroRetValVar,,0,0,0,0,0,16,store_frame,0x6611026B,Zero the Variant return value slot; no stack change -5,0x2F,5,ExitProcCbHresult,%},0,0,0,0,0,0,return,0x6610A4F1,Exit proc callback with HRESULT; cleanup + return -5,0x30,7,ExitProcFrameCbHresult,%a %4,0,0,0,0,0,0,return,0x66110076,Exit proc frame callback with HRESULT; %a %4 cleanup -5,0x31,3,EraseDestrKeepData,%s,1,0,0,0,0,0,stack,0x6610D236,Erase array but keep data; destructor variant; %s=type desc -5,0x32,5,CDargRefUdt,%a %2,0,4,0,0,0,0,convert,0x6610D9D2,Push Variant ByRef to UDT DARG; %a %2; 4 slots -5,0x33,5,CVarRefUdt,%a %2,0,4,0,0,0,0,convert,0x6610D9A4,Push Variant ByRef to UDT; %a %2; 4 slots -5,0x34,5,CVarUdt,%a %2,0,0,0,0,0,16,convert,0x6610D936,Convert UDT to Variant; write Variant(vbUserDefinedType) to frame; %a %2 -5,0x35,3,StUdtVar,%s,4,0,0,0,0,0,store_ind,0x6610D9FF,Pop 4 Variant (UDT); store to destination; %s=type desc -5,0x36,3,StAryVar,%c,1,0,0,0,0,0,store_ind,0x6610DA1F,Store array to Variant; pop array ref; %c=type -5,0x37,3,CopyBytesZero,%2,-1,0,0,0,0,0,stack,0x6610DB52,CopyBytes + zero source; %2=byte count -5,0x38,5,FLdZeroAry,%a %2,0,1,0,0,0,0,load_lit,0x6610DED3,Push zero/empty array descriptor; %a %2 -5,0x39,3,FStVarZero,%a,0,0,0,0,0,16,store_frame,0x6610F7D4,Clear Variant at [EBP+sext(op)] to zero/Empty (Lead3 handler) -5,0x3A,7,CVarAryUdt,%a %4,1,0,0,0,0,16,convert,0x6610D964,Pop UDT array ptr; write Variant(vbArray|vbUDT) to frame; %a %4 -5,0x3B,7,RedimVarUdt,%a %4,-1,0,0,0,0,0,stack,0x6610D2DA,ReDim Variant UDT array; %a %4; pops dimensions -5,0x3C,7,RedimPreserveVarUdt,%a %4,-1,0,0,0,0,0,stack,0x6610D2FC,ReDim Preserve Variant UDT array; %a %4; pops dims -5,0x3D,5,VarLateMemLdRfVar,%a %2,-1,1,0,0,4,0,call,0x6610999B,Late-bound member load ref from Variant; push addr; %a %2 -5,0x3E,7,VarLateMemCallLdRfVar,%a %4,-1,1,0,0,4,0,call,0x6610EA60,Late-bound member call+load ref from Variant; push addr; %a %4 -5,0x3F,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x40,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x41,5,VarLateMemLdVar,%a %2,-1,4,0,0,16,0,call,0x661099A2,Late-bound member load from Variant; push 4 Variant slots; %a %2 -5,0x42,7,VarLateMemCallLdVar,%a %4,-1,4,0,0,16,0,call,0x6610EA7A,Late-bound member call+load from Variant; push 4 slots; %a %4 -5,0x43,3,VarLateMemSt,%c,-1,0,0,0,0,0,call,0x661099ED,Late-bound member store to Variant; pops value; %c -5,0x44,5,VarLateMemCallSt,%c %c,-1,0,0,0,0,0,call,0x6610EA97,Late-bound member call+store to Variant; pops value; %c %c -5,0x45,5,VarLateMemStAd,%c %c,-1,0,0,0,0,0,call,0x6610EA81,Late-bound member Set store to Variant; pops obj ref; %c %c -5,0x46,1,InvalidExcode,,0,0,0,0,0,0,,, -5,0x47,0,Unknown,,0,0,0,0,0,0,,, -5,0x48,0,Unknown,,0,0,0,0,0,0,,, -5,0x49,0,Unknown,,0,0,0,0,0,0,,, -5,0x4A,0,Unknown,,0,0,0,0,0,0,,, -5,0x4B,0,Unknown,,0,0,0,0,0,0,,, -5,0x4C,0,Unknown,,0,0,0,0,0,0,,, -5,0x4D,0,Unknown,,0,0,0,0,0,0,,, -5,0x4E,0,Unknown,,0,0,0,0,0,0,,, -5,0x4F,0,Unknown,,0,0,0,0,0,0,,, -5,0x50,0,Unknown,,0,0,0,0,0,0,,, -5,0x51,0,Unknown,,0,0,0,0,0,0,,, -5,0x52,0,Unknown,,0,0,0,0,0,0,,, -5,0x53,0,Unknown,,0,0,0,0,0,0,,, -5,0x54,0,Unknown,,0,0,0,0,0,0,,, -5,0x55,0,Unknown,,0,0,0,0,0,0,,, -5,0x56,0,Unknown,,0,0,0,0,0,0,,, -5,0x57,0,Unknown,,0,0,0,0,0,0,,, -5,0x58,0,Unknown,,0,0,0,0,0,0,,, -5,0x59,0,Unknown,,0,0,0,0,0,0,,, -5,0x5A,0,Unknown,,0,0,0,0,0,0,,, -5,0x5B,0,Unknown,,0,0,0,0,0,0,,, -5,0x5C,0,Unknown,,0,0,0,0,0,0,,, -5,0x5D,0,Unknown,,0,0,0,0,0,0,,, -5,0x5E,0,Unknown,,0,0,0,0,0,0,,, -5,0x5F,0,Unknown,,0,0,0,0,0,0,,, -5,0x60,0,Unknown,,0,0,0,0,0,0,,, -5,0x61,0,Unknown,,0,0,0,0,0,0,,, -5,0x62,0,Unknown,,0,0,0,0,0,0,,, -5,0x63,0,Unknown,,0,0,0,0,0,0,,, -5,0x64,0,Unknown,,0,0,0,0,0,0,,, -5,0x65,0,Unknown,,0,0,0,0,0,0,,, -5,0x66,0,Unknown,,0,0,0,0,0,0,,, -5,0x67,0,Unknown,,0,0,0,0,0,0,,, -5,0x68,0,Unknown,,0,0,0,0,0,0,,, -5,0x69,0,Unknown,,0,0,0,0,0,0,,, -5,0x6A,0,Unknown,,0,0,0,0,0,0,,, -5,0x6B,0,Unknown,,0,0,0,0,0,0,,, -5,0x6C,0,Unknown,,0,0,0,0,0,0,,, -5,0x6D,0,Unknown,,0,0,0,0,0,0,,, -5,0x6E,0,Unknown,,0,0,0,0,0,0,,, -5,0x6F,0,Unknown,,0,0,0,0,0,0,,, -5,0x70,0,Unknown,,0,0,0,0,0,0,,, -5,0x71,0,Unknown,,0,0,0,0,0,0,,, -5,0x72,0,Unknown,,0,0,0,0,0,0,,, -5,0x73,0,Unknown,,0,0,0,0,0,0,,, -5,0x74,0,Unknown,,0,0,0,0,0,0,,, -5,0x75,0,Unknown,,0,0,0,0,0,0,,, -5,0x76,0,Unknown,,0,0,0,0,0,0,,, -5,0x77,0,Unknown,,0,0,0,0,0,0,,, -5,0x78,0,Unknown,,0,0,0,0,0,0,,, -5,0x79,0,Unknown,,0,0,0,0,0,0,,, -5,0x7A,0,Unknown,,0,0,0,0,0,0,,, -5,0x7B,0,Unknown,,0,0,0,0,0,0,,, -5,0x7C,0,Unknown,,0,0,0,0,0,0,,, -5,0x7D,0,Unknown,,0,0,0,0,0,0,,, -5,0x7E,0,Unknown,,0,0,0,0,0,0,,, -5,0x7F,0,Unknown,,0,0,0,0,0,0,,, -5,0x80,0,Unknown,,0,0,0,0,0,0,,, -5,0x81,0,Unknown,,0,0,0,0,0,0,,, -5,0x82,0,Unknown,,0,0,0,0,0,0,,, -5,0x83,0,Unknown,,0,0,0,0,0,0,,, -5,0x84,0,Unknown,,0,0,0,0,0,0,,, -5,0x85,0,Unknown,,0,0,0,0,0,0,,, -5,0x86,0,Unknown,,0,0,0,0,0,0,,, -5,0x87,0,Unknown,,0,0,0,0,0,0,,, -5,0x88,0,Unknown,,0,0,0,0,0,0,,, -5,0x89,0,Unknown,,0,0,0,0,0,0,,, -5,0x8A,0,Unknown,,0,0,0,0,0,0,,, -5,0x8B,0,Unknown,,0,0,0,0,0,0,,, -5,0x8C,0,Unknown,,0,0,0,0,0,0,,, -5,0x8D,0,Unknown,,0,0,0,0,0,0,,, -5,0x8E,0,Unknown,,0,0,0,0,0,0,,, -5,0x8F,0,Unknown,,0,0,0,0,0,0,,, -5,0x90,0,Unknown,,0,0,0,0,0,0,,, -5,0x91,0,Unknown,,0,0,0,0,0,0,,, -5,0x92,0,Unknown,,0,0,0,0,0,0,,, -5,0x93,0,Unknown,,0,0,0,0,0,0,,, -5,0x94,0,Unknown,,0,0,0,0,0,0,,, -5,0x95,0,Unknown,,0,0,0,0,0,0,,, -5,0x96,0,Unknown,,0,0,0,0,0,0,,, -5,0x97,0,Unknown,,0,0,0,0,0,0,,, -5,0x98,0,Unknown,,0,0,0,0,0,0,,, -5,0x99,0,Unknown,,0,0,0,0,0,0,,, -5,0x9A,0,Unknown,,0,0,0,0,0,0,,, -5,0x9B,0,Unknown,,0,0,0,0,0,0,,, -5,0x9C,0,Unknown,,0,0,0,0,0,0,,, -5,0x9D,0,Unknown,,0,0,0,0,0,0,,, -5,0x9E,0,Unknown,,0,0,0,0,0,0,,, -5,0x9F,0,Unknown,,0,0,0,0,0,0,,, -5,0xA0,0,Unknown,,0,0,0,0,0,0,,, -5,0xA1,0,Unknown,,0,0,0,0,0,0,,, -5,0xA2,0,Unknown,,0,0,0,0,0,0,,, -5,0xA3,0,Unknown,,0,0,0,0,0,0,,, -5,0xA4,0,Unknown,,0,0,0,0,0,0,,, -5,0xA5,0,Unknown,,0,0,0,0,0,0,,, -5,0xA6,0,Unknown,,0,0,0,0,0,0,,, -5,0xA7,0,Unknown,,0,0,0,0,0,0,,, -5,0xA8,0,Unknown,,0,0,0,0,0,0,,, -5,0xA9,0,Unknown,,0,0,0,0,0,0,,, -5,0xAA,0,Unknown,,0,0,0,0,0,0,,, -5,0xAB,0,Unknown,,0,0,0,0,0,0,,, -5,0xAC,0,Unknown,,0,0,0,0,0,0,,, -5,0xAD,0,Unknown,,0,0,0,0,0,0,,, -5,0xAE,0,Unknown,,0,0,0,0,0,0,,, -5,0xAF,0,Unknown,,0,0,0,0,0,0,,, -5,0xB0,0,Unknown,,0,0,0,0,0,0,,, -5,0xB1,0,Unknown,,0,0,0,0,0,0,,, -5,0xB2,0,Unknown,,0,0,0,0,0,0,,, -5,0xB3,0,Unknown,,0,0,0,0,0,0,,, -5,0xB4,0,Unknown,,0,0,0,0,0,0,,, -5,0xB5,0,Unknown,,0,0,0,0,0,0,,, -5,0xB6,0,Unknown,,0,0,0,0,0,0,,, -5,0xB7,0,Unknown,,0,0,0,0,0,0,,, -5,0xB8,0,Unknown,,0,0,0,0,0,0,,, -5,0xB9,0,Unknown,,0,0,0,0,0,0,,, -5,0xBA,0,Unknown,,0,0,0,0,0,0,,, -5,0xBB,0,Unknown,,0,0,0,0,0,0,,, -5,0xBC,0,Unknown,,0,0,0,0,0,0,,, -5,0xBD,0,Unknown,,0,0,0,0,0,0,,, -5,0xBE,0,Unknown,,0,0,0,0,0,0,,, -5,0xBF,0,Unknown,,0,0,0,0,0,0,,, -5,0xC0,0,Unknown,,0,0,0,0,0,0,,, -5,0xC1,0,Unknown,,0,0,0,0,0,0,,, -5,0xC2,0,Unknown,,0,0,0,0,0,0,,, -5,0xC3,0,Unknown,,0,0,0,0,0,0,,, -5,0xC4,0,Unknown,,0,0,0,0,0,0,,, -5,0xC5,0,Unknown,,0,0,0,0,0,0,,, -5,0xC6,0,Unknown,,0,0,0,0,0,0,,, -5,0xC7,0,Unknown,,0,0,0,0,0,0,,, -5,0xC8,0,Unknown,,0,0,0,0,0,0,,, -5,0xC9,0,Unknown,,0,0,0,0,0,0,,, -5,0xCA,0,Unknown,,0,0,0,0,0,0,,, -5,0xCB,0,Unknown,,0,0,0,0,0,0,,, -5,0xCC,0,Unknown,,0,0,0,0,0,0,,, -5,0xCD,0,Unknown,,0,0,0,0,0,0,,, -5,0xCE,0,Unknown,,0,0,0,0,0,0,,, -5,0xCF,0,Unknown,,0,0,0,0,0,0,,, -5,0xD0,0,Unknown,,0,0,0,0,0,0,,, -5,0xD1,0,Unknown,,0,0,0,0,0,0,,, -5,0xD2,0,Unknown,,0,0,0,0,0,0,,, -5,0xD3,0,Unknown,,0,0,0,0,0,0,,, -5,0xD4,0,Unknown,,0,0,0,0,0,0,,, -5,0xD5,0,Unknown,,0,0,0,0,0,0,,, -5,0xD6,0,Unknown,,0,0,0,0,0,0,,, -5,0xD7,0,Unknown,,0,0,0,0,0,0,,, -5,0xD8,0,Unknown,,0,0,0,0,0,0,,, -5,0xD9,0,Unknown,,0,0,0,0,0,0,,, -5,0xDA,0,Unknown,,0,0,0,0,0,0,,, -5,0xDB,0,Unknown,,0,0,0,0,0,0,,, -5,0xDC,0,Unknown,,0,0,0,0,0,0,,, -5,0xDD,0,Unknown,,0,0,0,0,0,0,,, -5,0xDE,0,Unknown,,0,0,0,0,0,0,,, -5,0xDF,0,Unknown,,0,0,0,0,0,0,,, -5,0xE0,0,Unknown,,0,0,0,0,0,0,,, -5,0xE1,0,Unknown,,0,0,0,0,0,0,,, -5,0xE2,0,Unknown,,0,0,0,0,0,0,,, -5,0xE3,0,Unknown,,0,0,0,0,0,0,,, -5,0xE4,0,Unknown,,0,0,0,0,0,0,,, -5,0xE5,0,Unknown,,0,0,0,0,0,0,,, -5,0xE6,0,Unknown,,0,0,0,0,0,0,,, -5,0xE7,0,Unknown,,0,0,0,0,0,0,,, -5,0xE8,0,Unknown,,0,0,0,0,0,0,,, -5,0xE9,0,Unknown,,0,0,0,0,0,0,,, -5,0xEA,0,Unknown,,0,0,0,0,0,0,,, -5,0xEB,0,Unknown,,0,0,0,0,0,0,,, -5,0xEC,0,Unknown,,0,0,0,0,0,0,,, -5,0xED,0,Unknown,,0,0,0,0,0,0,,, -5,0xEE,0,Unknown,,0,0,0,0,0,0,,, -5,0xEF,0,Unknown,,0,0,0,0,0,0,,, -5,0xF0,0,Unknown,,0,0,0,0,0,0,,, -5,0xF1,0,Unknown,,0,0,0,0,0,0,,, -5,0xF2,0,Unknown,,0,0,0,0,0,0,,, -5,0xF3,0,Unknown,,0,0,0,0,0,0,,, -5,0xF4,0,Unknown,,0,0,0,0,0,0,,, -5,0xF5,0,Unknown,,0,0,0,0,0,0,,, -5,0xF6,0,Unknown,,0,0,0,0,0,0,,, -5,0xF7,0,Unknown,,0,0,0,0,0,0,,, -5,0xF8,0,Unknown,,0,0,0,0,0,0,,, -5,0xF9,0,Unknown,,0,0,0,0,0,0,,, -5,0xFA,0,Unknown,,0,0,0,0,0,0,,, -5,0xFB,0,Unknown,,0,0,0,0,0,0,,, -5,0xFC,0,Unknown,,0,0,0,0,0,0,,, -5,0xFD,0,Unknown,,0,0,0,0,0,0,,, -5,0xFE,0,Unknown,,0,0,0,0,0,0,,, -5,0xFF,0,Unknown,,0,0,0,0,0,0,,, +table,opcode,size,mnemonic,operand_format,pops,pushes,fpu_pops,fpu_push,stack,popped,object,movement,category,handler_8176,handler_9848,notes +0,0x00,2,LargeBos,%1,0,0,0,0,,,,,bos,0x66104BFE,0x66108D56,"Starts a statement: stores its address to [ebp-0x14]; %1 is the statement's length in bytes, which Resume Next skips (0 for the last statement)" +0,0x01,1,InvalidExcode,,0,0,0,0,,,,,,,, +0,0x02,2,LargeBos,%1,0,0,0,0,,,,,bos,0x66104BFE,0x66108D56,"Starts a statement: stores its address to [ebp-0x14]; %1 is the statement's length in bytes, which Resume Next skips (0 for the last statement)" +0,0x03,1,InvalidExcode,,0,0,0,0,,,,,,,, +0,0x04,3,FLdRfVar,%a,0,1,0,0,,,,ad:f(%a),load_frame,0x661052BB,0x661093E1,Pushes the address of [ebp+%a] +0,0x05,3,ImpAdLdRf,%c,0,1,0,0,,,,ad:g(%c),load_ind,0x661056EB,0x66109811,Pushes the address of the variable pool entry %c addresses +0,0x06,3,MemLdRfVar,%2,0,1,0,0,,,pr,ad:pr(%2),load_mem,0x66105C0C,0x66109D1E,Pushes the address of [Pr+%2] +0,0x07,5,FMemLdRf,%a %2,0,1,0,0,,,,"ad:m(%a,%2)",load_mem,0x66105CA3,0x66109DB5,Pushes the address of [[ebp+%a]+%2] +0,0x08,3,FLdPr=,%a,0,0,0,0,,,>pr:frame,prn:f(%a),load_frame,0x66105EEA,0x66109FFC,Loads Pr with the object at [ebp+%a]; error 91 when it is Nothing +0,0x09,5,ImpAdCallHresult,%x,0,0,0,0,arg_bytes(0),*,,,call,0x6610B8FE,0x6610FA6F,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); checks the HRESULT +0,0x0A,5,ImpAdCallFPR4,%x,0,0,0,c,arg_bytes(0),*,,,call,0x6610628E,0x6610A38F,"Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes nothing (the mnemonic is no type): ST0 holds the result of a Single, Double or Date callee, nothing of a Sub" +0,0x0B,5,ImpAdCallI2,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +0,0x0C,5,ImpAdCallCy,%x,0,2,0,0,arg_bytes(0),*,,,call,0x6610BAEA,0x6610FC5B,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes edx:eax +0,0x0D,5,VCallHresult,%v,0,0,0,0,callee,*,pr,,call,0x6610633A,0x6610A43B,Calls Pr's vtable method (IID pool index in %v); the callee releases this and its arguments; checks the HRESULT; pushes nothing +0,0x0E,3,VCallFPR8,%2,0,0,0,c,callee,*,pr,,call,0x661063A1,0x6610A4A2,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +0,0x0F,3,VCallAd,%2,0,1,0,0,callee,*,pr,,call,0x661063C8,0x6610A4C9,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +0,0x10,5,ThisVCallHresult,%v,0,0,0,0,callee,*,me,,call,0x6610630B,0x6610A40C,Calls Me's vtable method (IID pool index in %v); the callee releases this and its arguments; checks the HRESULT; pushes nothing +0,0x11,3,ThisVCall,%2,0,0,0,c,callee,*,me,,call,0x6610BD78,0x6610FEE9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +0,0x12,3,ThisVCallAd,%2,0,1,0,0,callee,*,me,,call,0x6610BCEE,0x6610FE5F,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +0,0x13,1,ExitProcHresult,,0,0,0,0,,,,,return,0x6610645F,0x6610A560,Returns eax = 0 (S_OK) +0,0x14,1,ExitProc,,0,0,0,0,,,,,return,0x66106428,0x6610A529,"Returns eax = [ebp-0x88]: a Long, a String or an object result (a Sub leaves it unused)" +0,0x15,1,ExitProcI2,,0,0,0,0,,,,,return,0x66106468,0x6610A569,"Returns eax = the Integer at [ebp-0x86], sign-extended" +0,0x16,1,ExitProcR4,,0,0,0,0,,,,,return,0x6610BF3E,0x661100AF,Returns the Single at [ebp-0x88] in ST0 (fld) +0,0x17,1,ExitProcR8,,0,0,0,0,,,,,return,0x6610BF4B,0x661100BC,Returns the Double or Date at [ebp-0x8C] in ST0 (fld) +0,0x18,1,ExitProcCy,,0,0,0,0,,,,,return,0x6610BEC5,0x66110036,Returns the Currency at [ebp-0x8C] in edx:eax +0,0x19,3,FStAdFunc,%a,1,0,0,0,,1,,x:set_obj_owned:f(%a),store_frame,0x66106024,0x6610A136,"Pops an object reference and stores it at frame %a without AddRef (the reference moves), Releasing the old one" +0,0x1A,3,FFree1Ad,%a,0,0,0,0,,,,,stack,0x6610620E,0x6610A30F,Free COM object at [EBP+sext(op)]; Release + set to NULL; no stack change +0,0x1B,3,LitStr,%s,0,1,0,0,,,,pool:%s,load_lit,0x6610592F,0x66109A55,Pushes the constant pool entry %s itself (a BSTR literal; nothing copied) +0,0x1C,3,BranchF,%l,1,0,0,0,,1,,,branch_cond,0x66104E04,0x66108F5C,Pops a Boolean and jumps to %l when its low 16 bits are 0 +0,0x1D,3,BranchT,%l,1,0,0,0,,1,,,branch_cond,0x66104DEF,0x66108F47,Pops a Boolean and jumps to %l when its low 16 bits are not 0 +0,0x1E,3,Branch,%l,0,0,0,0,,,,,branch,0x66104DDD,0x66108F35,Unconditional branch; target = pcode_base + zx(u16 operand) +0,0x1F,3,CRec2Ansi,%s,2,0,0,0,,1 1,,,convert,0x661099A9,0x6610DAF2,Converts the record (descriptor in pool %s) to ANSI: pops source and destination +0,0x20,3,CRec2Uni,%s,2,0,0,0,,1 1,,,convert,0x661099C6,0x6610DB0F,Converts the record (descriptor in pool %s) to Unicode: pops source and destination +0,0x21,1,FLdPrThis,,0,0,0,0,,,me >pr:me,pr:f(8),load_frame,0x661052D0,0x661093F6,Loads Pr with the object at [ebp+8] +0,0x22,3,ImpAdLdPr,%c,0,0,0,0,,,>pr:pool,prad:g(%c),load_ind,0x6610B234,0x6610F390,Loads Pr with the address of the variable pool entry %c addresses +0,0x23,3,FStStrNoPop,%a,0,0,0,0,,,,x:bstr_move_keep:f(%a),store_frame,0x66105F41,0x6610A053,"Stores the popped String at [ebp+%a], freeing the old one (the string moves); the value stays on the stack" +0,0x24,3,NewIfNullPr,%c,1,0,0,0,,1,>pr:new,,stack,0x66105D33,0x66109E45,Pops the address of an object variable; creates the class in pool %c when it is Nothing; loads the object into Pr +0,0x25,1,PopAdLdVar,,1,4,0,0,,1,,ld:pop:16,stack,0x6610652E,0x6610A613,Pops a Variant's address; pushes the Variant by value (four slots) +0,0x26,3,AryDescTemp,%a,1,1,0,0,,1,,,stack,0x6610903A,0x6610D14A,Pops the data pointer into the array descriptor at frame %a; pushes the descriptor's address +0,0x27,3,LitVar_Missing,%a,0,1,0,0,,,,var:10=0x80020004:f(%a),load_lit,0x66105947,0x66109A6D,Builds a Variant (vt 10 and the value 0x80020004) at [ebp+%a] and pushes its address (the old contents not freed) +0,0x28,5,LitVarI2,%a %2,0,1,0,0,,,,var:2=lit:f(%a),load_lit,0x661059AE,0x66109AD4,Builds a Variant (vt 2 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +0,0x29,-1,FFreeAd,%F,0,0,0,0,,,,,stack,0x6610623C,0x6610A33D,Frees the frame slots listed in the payload (i16 offsets); no stack effect +0,0x2A,1,ConcatStr,,2,1,0,0,,1 1,,,arith,0x661067D9,0x6610A8A8,Pop 2 BSTR ptrs; concatenate via __vbaStrCat; push result BSTR ptr +0,0x2B,3,PopTmpLdAd2,%a,1,1,0,0,,1,,st:f(%a):2+ad:f(%a),stack,0x66106546,0x6610A62B,Pops the value into the frame temp %a (2) and pushes the temp's address +0,0x2C,5,LateIdSt,%4,4,0,0,0,,4,pr,,call,0x6610575C,0x66109882,Late-bound IDispatch call on Pr by DISPID %4; pops the value Variant (by value) +0,0x2D,3,AryUnlock,%a,0,0,0,0,,,,,stack,0x66104D00,0x66108E58,Unlocks the SAFEARRAY recorded at frame %a and clears the slot +0,0x2E,3,AryLock,%a,1,1,0,0,,1,,,stack,0x66104CD2,0x66108E2A,Locks the SAFEARRAY on top of the stack (left there) and records it at frame %a +0,0x2F,3,FFree1Str,%a,0,0,0,0,,,,,stack,0x661061AF,0x6610A2B0,Free BSTR at [EBP+sext(op)]; SysFreeString + set to NULL +0,0x30,3,PopTmpLdAd8,%a,2,1,0,0,,1 1,,st:f(%a):8+ad:f(%a),stack,0x6610BFDD,0x6611016A,Pops the value into the frame temp %a (8) and pushes the temp's address +0,0x31,3,FStStr,%a,1,0,0,0,,1,,x:bstr_move:f(%a),store_frame,0x66105F45,0x6610A057,"Stores the popped String at [ebp+%a], freeing the old one (the string moves)" +0,0x32,-1,FFreeStr,%F,0,0,0,0,,,,,stack,0x661061D8,0x6610A2D9,Frees the frame slots listed in the payload (i16 offsets); no stack effect +0,0x33,3,LdFixedStr,%2,1,1,0,0,,1,,x:bstr_from_fixed:pop,stack,0x6610B24F,0x6610F3AB,Pops a fixed-length string's address; pushes it as a String (descriptor in pool %c) +0,0x34,1,CStr2Ansi,,2,0,0,0,,1 1,,,convert,0x66105204,0x6610932A,Pops the destination's address and a String; stores its ANSI copy (Declare argument) +0,0x35,3,FFree1Var,%a,0,0,0,0,,,,,stack,0x661061E2,0x6610A2E3,Clear Variant at [EBP+sext(op)]; __vbaVarClear; no stack change +0,0x36,-1,FFreeVar,%F,0,0,0,0,,,,,stack,0x66106204,0x6610A305,Frees the frame slots listed in the payload (i16 offsets); no stack effect +0,0x37,1,PopFPR4,,0,1,1,0,,f,,,stack,0x661064E7,0x6610A5E8,Pop x87 ST0 → store as f32 on eval stack; ESP-=4; fpu_pop=1 push=1 +0,0x38,3,CopyBytes,%2,2,0,0,0,,1 1,,,stack,0x661099E3,0x6610DB2C,Pops destination then source; copies %2 bytes +0,0x39,1,PopFPR8,,0,2,1,0,,f,,,stack,0x66106503,0x66110136,Pop x87 ST0 → store as f64 on eval stack (2 slots); ESP-=8; fpu_pop=1 push=2 +0,0x3A,5,LitVarStr,%a %s,0,1,0,0,,,,var:8=pool:f(%a),load_lit,0x66105987,0x66109AAD,Builds a Variant (vt 8 and pool entry %s (shared)) at [ebp+%a] and pushes its address (the old contents not freed) +0,0x3B,1,Ary1StStrCopy,,3,0,0,0,,1 1 1,,x:bstr_copy:a1,store_ind,0x6610B313,0x6610F46F,"Stores a copy of the String at the element of a popped array at a popped index, freeing the old one" +0,0x3C,1,GetLastError,,0,0,0,0,,,,,stack,0x66106576,0x6610A65B,Stores kernel32 GetLastError() to Err.LastDllError (runtime context + 0x9C); follows every Declare call; no stack effect +0,0x3D,3,CastAd,%c,1,1,0,0,,1,,,convert,0x66105D8D,0x66109E9F,Pop ptr; cast/validate COM interface; push validated ptr +0,0x3E,3,FLdZeroAd,%a,0,1,0,0,,,,x:zero_source:f(%a),load_lit,0x66105275,0x6610939B,Pushes the 4 bytes at [ebp+%a] and zeroes them (the reference moves to the stack) +0,0x3F,3,CVarCy,%a,2,1,0,0,,2,,,convert,0x661097E7,0x6610D916,Cy to Variant: pops the value (two slots); builds the Variant in the frame temp %a and pushes its address +0,0x40,1,Ary1LdRf,,2,1,0,0,,1 1,,ad:a1,load_ind,0x66104C44,0x66108D9C,Pushes the address of the element of a popped array at a popped index +0,0x41,1,Ary1LdPr,,2,0,0,0,,1 1,>pr:array,prad:a1,load_ind,0x66108F13,0x6610D023,Loads Pr with the address of the element of a popped array at a popped index +0,0x42,1,CR4Var,,1,0,0,1,,1,,,convert,0x66104F06,0x6610905E,Variant to Single: pops the Variant's address; result in ST0 +0,0x43,3,FStStrCopy,%a,1,0,0,0,,1,,x:bstr_copy:f(%a),store_frame,0x66105F63,0x6610A075,"Stores a copy of the String at [ebp+%a], freeing the old one" +0,0x44,3,CVarI2,%a,1,1,0,0,,1,,,convert,0x66105071,0x661091B1,I2 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +0,0x45,1,Error,,1,0,0,0,,1,,,raise,0x6610B123,0x6610F27F,Pops the error number and raises it (0 or a number above 0xFFFF raises error 5); never falls through +0,0x46,3,CVarStr,%a,1,1,0,0,,1,,,convert,0x661050B2,0x661091D8,Str to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +0,0x47,3,StFixedStr,%2,2,0,0,0,,1 1,,x:fixstr_lset:pop,store_frame,0x6610B377,0x6610F4D3,LSet of the popped String into the popped fixed-length string +0,0x48,3,ILdPr,%a,0,0,0,0,,,>pr:indirect,prn:fi(%a),load_ind,0x66105F33,0x6610A045,Loads Pr with the object at where the pointer at [ebp+%a] points; error 91 when it is Nothing +0,0x49,1,PopAdLd4,,1,1,0,0,,1,,ld:pop:4,stack,0x6610651F,0x6610A604,Pop address; load i32 from that address; push value (deref) +0,0x4A,1,FnLenStr,,1,1,0,0,,1,,,stack,0x66106806,0x6610A8D5,Pop BSTR ptr; push SysStringLen result as i32 +0,0x4B,3,OnErrorGoto,%l,0,0,0,0,,,,,on_error,0x66105E46,0x66109F58,Sets the error handler to %l; falls through +0,0x4C,1,FnLBound,,2,1,0,0,,1 1,,,stack,0x66104C9A,0x66108DF2,LBound: pops the dimension and the SAFEARRAY; pushes an i32 +0,0x4D,5,CVarRef,%a %2,1,1,0,0,,1,,,convert,0x66105123,0x66109263,Pops an address; builds a by-reference Variant (vartype %2) in frame temp %a; pushes its address +0,0x4E,3,FStVarCopyObj,%a,1,0,0,0,,1,,x:var_dup:f(%a),store_frame,0x66106110,0x6610A222,Duplicates the Variant into [ebp+%a] (__vbaVarDup) +0,0x4F,3,MidStr,%2,4,0,0,0,,1 1 1 1,,,stack,0x6610C2CB,0x6611046E,"Mid statement: pops the destination's address, start, length and the String" +0,0x50,1,CI4Str,,1,1,0,0,,1,,,convert,0x66105012,0x66109163,Pop BSTR; convert to i32 via __vbaI4Str; push +0,0x51,3,FLdZeroAd,%a,0,1,0,0,,,,x:zero_source:f(%a),load_lit,0x66105275,0x6610939B,Pushes the 4 bytes at [ebp+%a] and zeroes them (the reference moves to the stack) +0,0x52,1,Ary1StVar,,3,0,0,0,,1 1 1,,x:var_let:a1,store_ind,0x661061A3,0x6610A2A4,Let of the popped Variant into the element of a popped array at a popped index (the source moves; an object source gives its default value) +0,0x53,1,CBoolCy,,2,1,0,0,,2,,,convert,0x661095F8,0x6610D708,Pop 2 Cy slots; convert to VB Bool (i16 -1/0); push as i32 +0,0x54,5,FMemStStrCopy,%a %2,1,0,0,0,,1,,"x:bstr_copy:m(%a,%2)",store_mem,0x66105FC6,0x6610A0D8,"Stores a copy of the String at [[ebp+%a]+%2], freeing the old one" +0,0x55,1,CI2Var,,1,1,0,0,,1,,,convert,0x66104E56,0x66108FAE,Variant to Integer: pops the Variant's address; result in one slot +0,0x56,3,NewIfNullAd,%c,1,1,0,0,,1,,,stack,0x66105D41,0x66109E53,Pop addr ptr; if null allocate; push (non-null) ptr +0,0x57,5,LateMemLdVar,%a %s,0,1,0,0,,,pr,,call,0x6610578E,0x661098B4,"Late-bound IDispatch call on Pr by name (pool %s); result Variant in frame %a, whose address it pushes" +0,0x58,3,MemLdPr,%2,0,0,0,0,,,pr >pr:member,prn:pr(%2),load_mem,0x66105F0A,0x6610A01C,Loads Pr with the object at [Pr+%2]; error 91 when it is Nothing +0,0x59,3,PopTmpLdAdStr,%a,1,1,0,0,,1,,st:f(%a):4+ad:f(%a),stack,0x6610655F,0x6610A644,Pops the value into the frame temp %a (String) and pushes the temp's address +0,0x5A,1,Erase,,1,0,0,0,,1,,,stack,0x66104CBE,0x66108E16,Erase: pops the array's address +0,0x5B,3,FStAdFuncNoPop,%a,0,0,0,0,,,,x:set_obj_owned_keep:f(%a),store_frame,0x66106020,0x6610A132,"Stores the popped object at [ebp+%a] without AddRef, Releasing the old one; the value stays on the stack" +0,0x5C,3,BranchFVar,%l,1,0,0,0,,1,,,branch_cond,0x6610925D,0x6610D36D,Pops a Variant's address; jumps to %l when it is False +0,0x5D,1,HardType,,1,1,0,0,,1,,,convert,0x6610510F,0x6610924F,Pop ptr; verify/cast COM type; push validated ptr +0,0x5E,5,ImpAdCallI4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +0,0x5F,5,FMemLdPr,%a %2,0,0,0,0,,,>pr:frame_member,"prn:m(%a,%2)",load_mem,0x66105F18,0x6610A02A,Loads Pr with the object at [[ebp+%a]+%2]; error 91 when it is Nothing +0,0x60,1,CStrVarTmp,,1,1,0,0,,1,,,convert,0x66104F71,0x661090C9,Variant to String: pops the Variant's address; result in one slot +0,0x61,7,LateIdLdVar,%a %4,0,1,0,0,,,pr,,call,0x66105720,0x66109846,"Late-bound IDispatch call on Pr by DISPID %4; result Variant in frame %a, whose address it pushes" +0,0x62,3,IStDarg,%a,1,0,0,0,,1,,x:varg_let:fi(%a),store_ind,0x6610B78A,0x6610F8FB,"Stores the popped Variant through the by-reference argument at where the pointer at [ebp+%a] points, freeing the source" +0,0x63,3,LitVar_TRUE,%a,0,1,0,0,,,,var:11=-1:f(%a),load_lit,0x66105970,0x66109A96,Builds a Variant (vt 11 and the value -1) at [ebp+%a] and pushes its address (the old contents not freed) +0,0x64,5,NextI2,%a %l,1,0,0,0,,1,,,branch_cond,0x661053D3,0x661094F9,"Next (Integer): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x65,5,NextStepI2,%a %l,1,0,0,0,,1,,,branch_cond,0x66105421,0x66109547,"Next (Integer): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x66,5,NextI4,%a %l,1,0,0,0,,1,,,branch_cond,0x661054B7,0x661095DD,"Next (Long): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x67,5,NextStepI4,%a %l,1,0,0,0,,1,,,branch_cond,0x66109EA1,0x6610DFEA,"Next (Long): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x68,5,NextStepR4,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F1C,0x6610E065,"Next (Single): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x69,5,NextStepR8,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F6A,0x6610E0B3,"Next (Double): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x6A,5,NextStepCy,%a %l,1,0,0,0,,1,,,branch_cond,0x66109FDA,0x6610E123,"Next (Currency): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +0,0x6B,3,FLdI2,%a,0,1,0,0,,,,ld:f(%a):2u,load_frame,0x66105249,0x6610936F,Pushes the 2 bytes at [ebp+%a] (the rest of the slot undefined) +0,0x6C,3,ILdRf,%a,0,1,0,0,,,,ld:f(%a):4,load_ind,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +0,0x6D,3,FLdR8,%a,0,2,0,0,,,,ld:f(%a):8,load_frame,0x66109DAC,0x6610DEF5,Pushes the 8 bytes at [ebp+%a] +0,0x6E,3,FLdFPR4,%a,0,0,0,1,,,,ldfp:f(%a):4,load_frame,0x66105291,0x661093B7,Loads the 4-byte float at [ebp+%a] onto the x87 stack +0,0x6F,3,FLdFPR8,%a,0,0,0,1,,,,ldfp:f(%a):8,load_frame,0x661052A6,0x661093CC,Loads the 8-byte float at [ebp+%a] onto the x87 stack +0,0x70,3,FStI2,%a,1,0,0,0,,1,,st:f(%a):2,store_frame,0x661052E2,0x66109408,Pops and stores 2 bytes at [ebp+%a] (the old value not freed) +0,0x71,3,FStR4,%a,1,0,0,0,,1,,st:f(%a):4,store_frame,0x661052F9,0x6610941F,Pops and stores 4 bytes at [ebp+%a] (the old value not freed) +0,0x72,3,FStR8,%a,2,0,0,0,,2,,st:f(%a):8,store_frame,0x66109DDB,0x6610DF24,Pops and stores 8 bytes at [ebp+%a] (the old value not freed) +0,0x73,3,FStFPR4,%a,0,0,1,0,,f,,stfp:f(%a):4,store_frame,0x6610530E,0x66109434,Stores ST0 as an 4-byte float at [ebp+%a] +0,0x74,3,FStFPR8,%a,0,0,1,0,,f,,stfp:f(%a):8,store_frame,0x6610532D,0x66109453,Stores ST0 as an 8-byte float at [ebp+%a] +0,0x75,3,ImpAdLdI2,%c,0,1,0,0,,,,ld:g(%c):2u,load_ind,0x661056B5,0x661097DB,Pushes the 2 bytes at the variable pool entry %c addresses (the rest of the slot undefined) +0,0x76,3,ImpAdLdI4,%c,0,1,0,0,,,,ld:g(%c):4,load_ind,0x661056D1,0x661097F7,Pushes the 4 bytes at the variable pool entry %c addresses +0,0x77,3,ImpAdLdCy,%c,0,2,0,0,,,,ld:g(%c):8,load_ind,0x6610A713,0x6610E85C,Pushes the 8 bytes at the variable pool entry %c addresses +0,0x78,3,ImpAdLdFPR4,%c,0,0,0,1,,,,ldfp:g(%c):4,load_ind,0x6610A730,0x6610E879,Loads the 4-byte float at the variable pool entry %c addresses onto the x87 stack +0,0x79,3,ImpAdLdFPR8,%c,0,0,0,1,,,,ldfp:g(%c):8,load_ind,0x6610A74A,0x6610E893,Loads the 8-byte float at the variable pool entry %c addresses onto the x87 stack +0,0x7A,3,ImpAdStI2,%c,1,0,0,0,,1,,st:g(%c):2,store_ind,0x66105704,0x6610982A,Pops and stores 2 bytes at the variable pool entry %c addresses (the old value not freed) +0,0x7B,3,ImpAdStR4,%c,1,0,0,0,,1,,st:g(%c):4,store_ind,0x6610A77F,0x6610E8C8,Pops and stores 4 bytes at the variable pool entry %c addresses (the old value not freed) +0,0x7C,3,ImpAdStCy,%c,2,0,0,0,,2,,st:g(%c):8,store_ind,0x6610A799,0x6610E8E2,Pops and stores 8 bytes at the variable pool entry %c addresses (the old value not freed) +0,0x7D,3,ImpAdStFPR4,%c,0,0,1,0,,f,,stfp:g(%c):4,store_ind,0x6610A7B6,0x6610E8FF,Stores ST0 as an 4-byte float at the variable pool entry %c addresses +0,0x7E,3,ImpAdStFPR8,%c,0,0,1,0,,f,,stfp:g(%c):8,store_ind,0x6610A7DA,0x6610E923,Stores ST0 as an 8-byte float at the variable pool entry %c addresses +0,0x7F,3,ILdI2,%a,0,1,0,0,,,,ld:fi(%a):2u,load_ind,0x66105651,0x66109777,Pushes the 2 bytes at where the pointer at [ebp+%a] points (the rest of the slot undefined) +0,0x80,3,ILdI4,%a,0,1,0,0,,,,ld:fi(%a):4,load_ind,0x6610566B,0x66109791,Pushes the 4 bytes at where the pointer at [ebp+%a] points +0,0x81,3,ILdR8,%a,0,2,0,0,,,,ld:fi(%a):8,load_ind,0x6610A384,0x6610E4CD,Pushes the 8 bytes at where the pointer at [ebp+%a] points +0,0x82,3,ILdFPR4,%a,0,0,0,1,,,,ldfp:fi(%a):4,load_ind,0x66105683,0x661097A9,Loads the 4-byte float at where the pointer at [ebp+%a] points onto the x87 stack +0,0x83,3,ILdFPR8,%a,0,0,0,1,,,,ldfp:fi(%a):8,load_ind,0x6610A39F,0x6610E4E8,Loads the 8-byte float at where the pointer at [ebp+%a] points onto the x87 stack +0,0x84,3,IStI2,%a,1,0,0,0,,1,,st:fi(%a):2,store_ind,0x6610569B,0x661097C1,Pops and stores 2 bytes at where the pointer at [ebp+%a] points (the old value not freed) +0,0x85,3,IStI4,%a,1,0,0,0,,1,,st:fi(%a):4,store_ind,0x6610A3D0,0x6610E519,Pops and stores 4 bytes at where the pointer at [ebp+%a] points (the old value not freed) +0,0x86,3,IStR8,%a,2,0,0,0,,2,,st:fi(%a):8,store_ind,0x6610A3E8,0x6610E531,Pops and stores 8 bytes at where the pointer at [ebp+%a] points (the old value not freed) +0,0x87,3,IStFPR4,%a,0,0,1,0,,f,,stfp:fi(%a):4,store_ind,0x6610A403,0x6610E54C,Stores ST0 as an 4-byte float at where the pointer at [ebp+%a] points +0,0x88,3,IStFPR8,%a,0,0,1,0,,f,,stfp:fi(%a):8,store_ind,0x6610A425,0x6610E56E,Stores ST0 as an 8-byte float at where the pointer at [ebp+%a] points +0,0x89,3,MemLdI2,%2,0,1,0,0,,,pr,ld:pr(%2):2z,load_mem,0x66105BDA,0x66109CEC,"Pushes the 2 bytes at [Pr+%2], zero-extended" +0,0x8A,3,MemLdStr,%2,0,1,0,0,,,pr,ld:pr(%2):4,load_mem,0x66105BF4,0x66109D06,Pushes the 4 bytes at [Pr+%2] +0,0x8B,3,MemLdR8,%2,0,2,0,0,,,pr,ld:pr(%2):8,load_mem,0x6610AE56,0x6610EFB2,Pushes the 8 bytes at [Pr+%2] +0,0x8C,3,MemLdFPR4,%2,0,0,0,1,,,pr,ldfp:pr(%2):4,load_mem,0x6610AE72,0x6610EFCE,Loads the 4-byte float at [Pr+%2] onto the x87 stack +0,0x8D,3,MemLdFPR8,%2,0,0,0,1,,,pr,ldfp:pr(%2):8,load_mem,0x6610AE8A,0x6610EFE6,Loads the 8-byte float at [Pr+%2] onto the x87 stack +0,0x8E,3,MemStI2,%2,1,0,0,0,,1,pr,st:pr(%2):2,store_mem,0x66105C24,0x66109D36,Pops and stores 2 bytes at [Pr+%2] (the old value not freed) +0,0x8F,3,MemStI4,%2,1,0,0,0,,1,pr,st:pr(%2):4,store_mem,0x66105C3E,0x66109D50,Pops and stores 4 bytes at [Pr+%2] (the old value not freed) +0,0x90,3,MemStR8,%2,2,0,0,0,,2,pr,st:pr(%2):8,store_mem,0x6610AEBB,0x6610F017,Pops and stores 8 bytes at [Pr+%2] (the old value not freed) +0,0x91,3,MemStFPR4,%2,0,0,1,0,,f,pr,stfp:pr(%2):4,store_mem,0x6610AED7,0x6610F033,Stores ST0 as an 4-byte float at [Pr+%2] +0,0x92,3,MemStFPR8,%2,0,0,1,0,,f,pr,stfp:pr(%2):8,store_mem,0x6610AEF9,0x6610F055,Stores ST0 as an 8-byte float at [Pr+%2] +0,0x93,5,FMemLdI2,%a %2,0,1,0,0,,,,"ld:m(%a,%2):2u",load_mem,0x66105C57,0x66109D69,Pushes the 2 bytes at [[ebp+%a]+%2] (the rest of the slot undefined) +0,0x94,5,FMemLdR4,%a %2,0,1,0,0,,,,"ld:m(%a,%2):4",load_mem,0x66105C7E,0x66109D90,Pushes the 4 bytes at [[ebp+%a]+%2] +0,0x95,5,FMemLdCy,%a %2,0,2,0,0,,,,"ld:m(%a,%2):8",load_mem,0x6610AF3D,0x6610F099,Pushes the 8 bytes at [[ebp+%a]+%2] +0,0x96,5,FMemLdFPR4,%a %2,0,0,0,1,,,,"ldfp:m(%a,%2):4",load_mem,0x6610AF61,0x6610F0BD,Loads the 4-byte float at [[ebp+%a]+%2] onto the x87 stack +0,0x97,5,FMemLdFPR8,%a %2,0,0,0,1,,,,"ldfp:m(%a,%2):8",load_mem,0x6610AF82,0x6610F0DE,Loads the 8-byte float at [[ebp+%a]+%2] onto the x87 stack +0,0x98,5,FMemStI2,%a %2,1,0,0,0,,1,,"st:m(%a,%2):2",store_mem,0x66105CC7,0x66109DD9,Pops and stores 2 bytes at [[ebp+%a]+%2] (the old value not freed) +0,0x99,5,FMemStI4,%a %2,1,0,0,0,,1,,"st:m(%a,%2):4",store_mem,0x66105CEE,0x66109E00,Pops and stores 4 bytes at [[ebp+%a]+%2] (the old value not freed) +0,0x9A,5,FMemStR8,%a %2,2,0,0,0,,2,,"st:m(%a,%2):8",store_mem,0x6610AFCE,0x6610F12A,Pops and stores 8 bytes at [[ebp+%a]+%2] (the old value not freed) +0,0x9B,5,FMemStFPR4,%a %2,0,0,1,0,,f,,"stfp:m(%a,%2):4",store_mem,0x6610AFF2,0x6610F14E,Stores ST0 as an 4-byte float at [[ebp+%a]+%2] +0,0x9C,5,FMemStFPR8,%a %2,0,0,1,0,,f,,"stfp:m(%a,%2):8",store_mem,0x6610B01D,0x6610F179,Stores ST0 as an 8-byte float at [[ebp+%a]+%2] +0,0x9D,1,Ary1LdI2,,2,1,0,0,,1 1,,ld:a1:2u,load_ind,0x66108E92,0x6610CFA2,Pushes the 2 bytes at the element of a popped array at a popped index (the rest of the slot undefined) +0,0x9E,1,Ary1LdI4,,2,1,0,0,,1 1,,ld:a1:4,load_ind,0x66108EA8,0x6610CFB8,Pushes the 4 bytes at the element of a popped array at a popped index +0,0x9F,1,Ary1LdCy,,2,2,0,0,,1 1,,ld:a1:8,load_ind,0x66108EBC,0x6610CFCC,Pushes the 8 bytes at the element of a popped array at a popped index +0,0xA0,1,Ary1LdFPR4,,2,0,0,1,,1 1,,ldfp:a1:4,load_ind,0x66108ED4,0x6610CFE4,Loads the 4-byte float at the element of a popped array at a popped index onto the x87 stack +0,0xA1,1,Ary1LdFPR8,,2,0,0,1,,1 1,,ldfp:a1:8,load_ind,0x66108EE8,0x6610CFF8,Loads the 8-byte float at the element of a popped array at a popped index onto the x87 stack +0,0xA2,1,Ary1StI2,,3,0,0,0,,1 1 1,,st:a1:2,store_ind,0x66108F43,0x6610D053,Pops and stores 2 bytes at the element of a popped array at a popped index (the old value not freed) +0,0xA3,1,Ary1StI4,,3,0,0,0,,1 1 1,,st:a1:4,store_ind,0x66108F59,0x6610D069,Pops and stores 4 bytes at the element of a popped array at a popped index (the old value not freed) +0,0xA4,1,Ary1StCy,,4,0,0,0,,1 1 2,,st:a1:8,store_ind,0x66108F6D,0x6610D07D,Pops and stores 8 bytes at the element of a popped array at a popped index (the old value not freed) +0,0xA5,1,Ary1StFPR4,,2,0,1,0,,1 1 f,,stfp:a1:4,store_ind,0x66108F85,0x6610D095,Stores ST0 as an 4-byte float at the element of a popped array at a popped index +0,0xA6,1,Ary1StFPR8,,2,0,1,0,,1 1 f,,stfp:a1:8,store_ind,0x66108FA3,0x6610D0B3,Stores ST0 as an 8-byte float at the element of a popped array at a popped index +0,0xA7,3,AryLdPr,%2,1,0,0,0,count(0),* 1,>pr:array,prad:an(%2),load_ind,0x66108FC1,0x6610D0D1,Loads Pr with the address of the element of a popped %2-dimensional array +0,0xA8,3,AryLdRf,%2,1,1,0,0,count(0),* 1,,ad:an(%2),load_ind,0x66108FD8,0x6610D0E8,Pushes the address of the element of a popped %2-dimensional array +0,0xA9,1,AddI2,,2,1,0,0,,1 1,,,arith,0x66105A02,0x66109B28,Pop TOS i16; add to new TOS i16 in-place; overflow check; result sign-extended i32 +0,0xAA,1,AddI4,,2,1,0,0,,1 1,,,arith,0x66105A19,0x66109B3F,Pop TOS; add to new TOS in-place; overflow check (err 6) +0,0xAB,1,AddR8,,0,0,2,1,,f f,,,arith,0x66105A2F,0x66109B55,"x87: ST1 + ST0; consumes both, leaves the result in ST0" +0,0xAC,1,AddCy,,4,2,0,0,,2 2,,,arith,0x6610AAD9,0x6610EC22,Pop 2+2 slots (two 8B Cy); __vbaCyAdd; push 2 slots (8B result) +0,0xAD,1,SubI2,,2,1,0,0,,1 1,,,arith,0x66105A3D,0x66109B63,Pop TOS i16; sub from new TOS i16; overflow check; sign-extend result +0,0xAE,1,SubI4,,2,1,0,0,,1 1,,,arith,0x66105A54,0x66109B7A,Pop TOS; subtract from new TOS in-place; overflow check (err 6) +0,0xAF,1,SubR4,,0,0,2,1,,f f,,,arith,0x66105A6A,0x66109B90,"x87: ST1 - ST0; consumes both, leaves the result in ST0" +0,0xB0,1,SubCy,,4,2,0,0,,2 2,,,arith,0x6610AB0A,0x6610EC53,Pop 2+2 slots (two 8B Cy); __vbaCySub; push 2 slots +0,0xB1,1,MulI2,,2,1,0,0,,1 1,,,arith,0x66105A78,0x66109B9E,Pop TOS i16; mul with new TOS i16; overflow if result > 16-bit +0,0xB2,1,MulI4,,2,1,0,0,,1 1,,,arith,0x6610AB3C,0x6610EC85,Pop TOS; multiply with new TOS; overflow check via imul +0,0xB3,1,MulR8,,0,0,2,1,,f f,,,arith,0x66105A90,0x66109BB6,"x87: ST1 * ST0; consumes both, leaves the result in ST0" +0,0xB4,1,MulCy,,4,2,0,0,,2 2,,,arith,0x6610AB53,0x6610EC9C,Pop 2+2 slots (two 8B Cy); __vbaCyMul; push 2 slots +0,0xB5,1,MulCyI2,,3,2,0,0,,1 2,,,arith,0x6610AB84,0x6610ECCD,Pop 1 i16 + 2 Cy slots; multiply; push 2 Cy slots result +0,0xB6,1,DivR8,,0,0,2,1,,f f,,,arith,0x66105AC6,0x66109BD8,"x87: ST1 / ST0; consumes both, leaves the result in ST0" +0,0xB7,1,UMiI2,,1,1,0,0,,1,,,unary,0x6610AC4F,0x6610EDAB,Negate TOS i16 in-place; overflow check on -32768 +0,0xB8,1,UMiI4,,1,1,0,0,,1,,,unary,0x6610AC65,0x6610EDC1,Negate TOS in-place; overflow check on INT_MIN +0,0xB9,1,UMiR8,,0,0,1,1,,f,,,unary,0x6610AC7A,0x6610EDD6,x87: negation of ST0 in place +0,0xBA,1,UMiCy,,2,2,0,0,,2,,,unary,0x6610AC88,0x6610EDE4,Negate 2 eval slots (8B Cy) in-place via __vbaCyNeg +0,0xBB,1,FnAbsI2,,1,1,0,0,,1,,,unary,0x6610ACA5,0x6610EE01,Abs of TOS i16 in-place; overflow on -32768 +0,0xBC,1,FnAbsI4,,1,1,0,0,,1,,,unary,0x6610ACC2,0x6610EE1E,Abs of TOS i32 in-place; overflow on INT_MIN +0,0xBD,1,FnAbsR4,,0,0,1,1,,f,,,unary,0x6610ACF1,0x6610EE4D,x87: Abs of ST0 in place +0,0xBE,1,FnAbsCy,,2,2,0,0,,2,,,unary,0x6610ACDD,0x6610EE39,Absolute value of 2 eval slots (8B Cy) via __vbaCyAbs +0,0xBF,1,IDvI2,,2,1,0,0,,1 1,,,arith,0x66105A9E,0x66109BC4,Pop TOS (divisor); integer divide new TOS; overflow/div-zero check +0,0xC0,1,IDvI4,,2,1,0,0,,1 1,,,arith,0x6610ABBF,0x6610ED1C,Pop TOS (divisor); integer divide new TOS; calls __vbaI4DivI4 +0,0xC1,1,ModI2,,2,1,0,0,,1 1,,,arith,0x66105AB2,0x6610ED08,Pop TOS (divisor); modulo new TOS; div-zero check +0,0xC2,1,ModI4,,2,1,0,0,,1 1,,,arith,0x6610ABD1,0x6610ED2E,Pop TOS (divisor); modulo new TOS; div-by-zero check +0,0xC3,1,NotI4,,1,1,0,0,,1,,,unary,0x66105ADA,0x66109BEC,Bitwise NOT of TOS in-place; no ESP change +0,0xC4,1,AndI4,,2,1,0,0,,1 1,,,arith,0x66105AE9,0x66109BFB,Pop TOS; AND with new TOS in-place; no overflow check +0,0xC5,1,OrI4,,2,1,0,0,,1 1,,,arith,0x66105AF9,0x66109C0B,Pop TOS; OR with new TOS in-place (same pattern as AndI4) +0,0xC6,1,EqI2,,2,1,0,0,,1 1,,,compare,0x661065BC,0x6610A68B,Same as EqI4 but compares i16 (low words); result -1/0 in i32 +0,0xC7,1,EqI4,,2,1,0,0,,1 1,,,compare,0x661065D4,0x6610A6A3,Pop TOS; compare with new TOS; result: 0=False -1=True +0,0xC8,1,EqR4,,0,1,2,0,,f f,,,compare,0x661065EA,0x6610A6B9,FPU: pop 2 FPR4; compare; push eval i32 bool -1/0 +0,0xC9,1,EqCy,,4,1,0,0,,2 2,,,compare,0x6610C0DE,0x66110281,Pop 2+2 slots (two 8B Cy); compare; push 1 (i32 bool -1/0) +0,0xCA,1,EqCyR8,,2,1,1,0,,f 2,,,compare,0x6610C0E8,0x6611028B,"Currency = Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +0,0xCB,1,NeI2,,2,1,0,0,,1 1,,,compare,0x66106611,0x6610A6E0,Pop TOS i16; compare; result -1 if not equal +0,0xCC,1,NeI4,,2,1,0,0,,1 1,,,compare,0x66106629,0x6610A6F8,Pop TOS; compare with new TOS; result: -1 if not equal else 0 +0,0xCD,1,NeR8,,0,1,2,0,,f f,,,compare,0x6610663F,0x6610A70E,FPU: pop 2 FPR8; compare; push eval i32 bool -1/0 +0,0xCE,1,NeCy,,4,1,0,0,,2 2,,,compare,0x6610C0F9,0x6611029C,Pop 2+2 slots; compare; push 1 +0,0xCF,1,NeCyR8,,2,1,1,0,,f 2,,,compare,0x6610C103,0x661102A6,"Currency <> Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +0,0xD0,1,LtI2,,2,1,0,0,,1 1,,,compare,0x66106666,0x6610A735,Pop TOS i16; compare with new TOS i16; result -1/0 signed +0,0xD1,1,LtI4,,2,1,0,0,,1 1,,,compare,0x6610666D,0x6610A73C,Pop TOS; compare with new TOS; result: -1 if secondfirst +0,0xDB,1,GtI4,,2,1,0,0,,1 1,,,compare,0x661066F0,0x6610A7BF,Pop TOS; compare with new TOS; result: -1 if second>first else 0 +0,0xDC,1,GtR4,,0,1,2,0,,f f,,,compare,0x661066F6,0x6610A7C5,FPU: pop 2; compare; push eval i32 bool +0,0xDD,1,GtCy,,4,1,0,0,,2 2,,,compare,0x6610C1A5,0x66110348,Pop 2+2 slots; compare; push 1 +0,0xDE,1,GtCyR8,,2,1,1,0,,f 2,,,compare,0x6610C1AF,0x66110352,"Currency > Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +0,0xDF,1,GeI2,,2,1,0,0,,1 1,,,compare,0x66106712,0x6610A7E1,Pop TOS i16; compare; result -1 if second>=first +0,0xE0,1,GeI4,,2,1,0,0,,1 1,,,compare,0x6610C1E0,0x66110383,Pop TOS; compare with new TOS; result: -1 if second>=first else 0 +0,0xE1,1,GeR8,,0,1,2,0,,f f,,,compare,0x6610672E,0x6610A7FD,FPU: pop 2; compare; push eval i32 bool +0,0xE2,1,GeCy,,4,1,0,0,,2 2,,,compare,0x6610C1E9,0x6611038C,Pop 2+2 slots; compare; push 1 +0,0xE3,1,GeCyR8,,2,1,1,0,,f 2,,,compare,0x6610C1F3,0x66110396,"Currency >= Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +0,0xE4,1,CI2I4,,1,1,0,0,,1,,,convert,0x66104E19,0x66108F71,Truncate TOS i32 to i16; overflow check if out of -32768..32767; store sign-extended +0,0xE5,1,CI2R8,,0,1,1,0,,f,,,convert,0x66104E35,0x66108F8D,Rounds ST0 (consumed) to an integer; pushes it; overflow raises error 6 +0,0xE6,1,CI2Cy,,2,1,0,0,,2,,,convert,0x661094FE,0x6610D60E,Pop 2 slots (8B Cy); divide by 10000; push 1 slot (i16 sext); calls __vbaCyI2 +0,0xE7,1,CI4UI1,,1,1,0,0,,1,,,convert,0x66104E68,0x66108FC0,TOS i32 → mask to u8 (0-255); push i32; overflow check +0,0xE8,1,CI4R8,,0,1,1,0,,f,,,convert,0x66104E77,0x66108FCF,Rounds ST0 (consumed) to an integer; pushes it; overflow raises error 6 +0,0xE9,1,CI4Cy,,2,1,0,0,,2,,,convert,0x6610950F,0x6610D61F,Pop 2 slots (8B Cy); divide by 10000; push 1 slot (i32); calls __vbaCyI4 +0,0xEA,1,CR4R4,,0,0,1,1,,f,,,convert,0x66104ECA,0x66109022,x87 conversion of ST0 in place (rounding to the target precision) +0,0xEB,1,CR8I2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,Pop i32(zext i16) from eval; fild → push f64 on FPU; convert int→double +0,0xEC,1,CR8I4,,1,0,0,1,,1,,,convert,0x66104EBA,0x66109012,Pop i32 from eval; fild → push f64 on FPU; convert int→double +0,0xED,1,CR8R8,,0,0,1,1,,f,,,convert,0x66104EE8,0x66109040,x87 conversion of ST0 in place (rounding to the target precision) +0,0xEE,1,CR8Cy,,2,0,0,1,,2,,,convert,0x66109520,0x6610D630,Pop 2 eval slots (8B Cy); convert to R8; push FPU ST0 +0,0xEF,1,CCyI2,,1,2,0,0,,1,,,convert,0x66109592,0x6610D6A2,Pop 1 slot (i16 sext); multiply by 10000; push 2 slots (8B Cy) +0,0xF0,1,CCyI4,,1,2,0,0,,1,,,convert,0x661095A8,0x6610D6B8,Pop 1 slot (i32); multiply by 10000; push 2 slots (8B Cy) +0,0xF1,1,CCyR4,,0,2,1,0,,f,,,convert,0x661095BD,0x6610D6CD,Pop FPU R4; convert to Cy via __vbaCyR4; push 2 eval slots +0,0xF2,1,CDateR8,,0,0,1,1,,f,,,convert,0x66109701,0x6610D830,x87 conversion of ST0 in place (rounding to the target precision) +0,0xF3,3,LitI2,%2,0,1,0,0,,,,lit:2s,load_lit,0x661058D8,0x661099FE,"Pushes the 2-byte literal operand, sign-extended to a slot" +0,0xF4,2,LitI2_Byte,%1,0,1,0,0,,,,lit:1s,load_lit,0x661058EB,0x66109A11,"Pushes the 1-byte literal operand, sign-extended to a slot" +0,0xF5,5,LitI4,%4,0,1,0,0,,,,lit:4,load_lit,0x661058FE,0x66109A24,Pushes the 4-byte literal operand +0,0xF6,9,LitCy,%4 %4,0,2,0,0,,,,lit:8,load_lit,0x6610AA32,0x6610EB7B,Pushes the 8-byte literal operand +0,0xF7,5,LitCy4,%4,0,2,0,0,,,,lit:4s8,load_lit,0x6610AA1E,0x6610EB67,"Pushes the 4-byte literal operand, sign-extended to 8 bytes (two slots)" +0,0xF8,3,LitI2FP,%2,0,0,0,1,,,,litfp:2i,load_lit,0x6610AA48,0x6610EB91,"Loads the 2-byte float literal onto the x87 stack (an integer, fild)" +0,0xF9,5,LitR4FP,%4,0,0,0,1,,,,litfp:4,load_lit,0x6610AA59,0x6610EBA2,Loads the 4-byte float literal onto the x87 stack +0,0xFA,9,LitDate,%4 %4,0,0,0,1,,,,litfp:8,load_lit,0x6610591E,0x66109A44,Loads the 8-byte float literal onto the x87 stack +0,0xFB,1,Lead0,,0,0,0,0,,,,,,0x66106845,0x6610A914, +0,0xFC,1,Lead1,,0,0,0,0,,,,,,0x66106851,0x6610A920, +0,0xFD,1,Lead2,,0,0,0,0,,,,,,0x6610685D,0x6610A92C, +0,0xFE,1,Lead3,,0,0,0,0,,,,,,0x66106869,0x6610A938, +0,0xFF,1,Lead4,,0,0,0,0,,,,,,0x66106875,0x6610A944, +1,0x00,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x01,1,ImpUI1,,2,1,0,0,,1 1,,,arith,0x6610AD44,0x6610EEA0,Logical IMP (NOT a OR b) on UI1; pop TOS; NOT+OR with second in-place +1,0x02,1,ImpI4,,2,1,0,0,,1 1,,,arith,0x6610AD57,0x6610EEB3,Logical IMP (NOT a OR b) on i32; pop TOS; NOT+OR with second in-place +1,0x03,1,ImpI4,,2,1,0,0,,1 1,,,arith,0x6610AD57,0x6610EEB3,Logical IMP i32 (duplicate slot; same handler as 0x02) +1,0x04,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x05,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x06,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x07,3,ImpVar,%a,2,1,0,0,,1 1,,,arith,0x6610AE31,0x6610EF8D,"Variant Imp: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x08,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x09,1,EqvUI1,,2,1,0,0,,1 1,,,arith,0x6610AD1E,0x6610EE7A,Logical EQV (NOT(a XOR b)) on UI1; pop TOS; modify second +1,0x0A,1,EqvI4,,2,1,0,0,,1 1,,,arith,0x6610AD31,0x6610EE8D,Logical EQV (NOT(a XOR b)) on i32; pop TOS; modify second +1,0x0B,1,EqvI4,,2,1,0,0,,1 1,,,arith,0x6610AD31,0x6610EE8D,Logical EQV i32 (duplicate slot; same handler as 0x0A) +1,0x0C,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x0D,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x0E,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x0F,3,EqvVar,%a,2,1,0,0,,1 1,,,arith,0x6610AE26,0x6610EF82,"Variant Eqv: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x10,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x11,1,XorI4,,2,1,0,0,,1 1,,,arith,0x6610AD0E,0x6610EE6A,Bitwise XOR i32; pop TOS; XOR with second in-place +1,0x12,1,XorI4,,2,1,0,0,,1 1,,,arith,0x6610AD0E,0x6610EE6A,Bitwise XOR i32 (duplicate slot; same handler as 0x11) +1,0x13,1,XorI4,,2,1,0,0,,1 1,,,arith,0x6610AD0E,0x6610EE6A,Bitwise XOR i32 (duplicate slot) +1,0x14,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x15,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x16,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x17,3,XorVar,%a,2,1,0,0,,1 1,,,arith,0x6610AE1B,0x6610EF77,"Variant Xor: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x18,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x19,1,OrI2,,2,1,0,0,,1 1,,,arith,0x66105AF9,0x66109C0B,Bitwise OR i16; same handler as primary OrI4 (truncated to i16 in caller) +1,0x1A,1,OrI2,,2,1,0,0,,1 1,,,arith,0x66105AF9,0x66109C0B,Bitwise OR i16 (duplicate slot) +1,0x1B,1,OrI2,,2,1,0,0,,1 1,,,arith,0x66105AF9,0x66109C0B,Bitwise OR i16 (duplicate slot) +1,0x1C,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x1D,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x1E,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x1F,3,OrVar,%a,2,1,0,0,,1 1,,,arith,0x66105BD2,0x66109CE4,"Variant Or: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x20,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x21,1,AndUI1,,2,1,0,0,,1 1,,,arith,0x66105AE9,0x66109BFB,Bitwise AND UI1; same handler as primary AndI4 +1,0x22,1,AndUI1,,2,1,0,0,,1 1,,,arith,0x66105AE9,0x66109BFB,Bitwise AND UI1 (duplicate slot) +1,0x23,1,AndUI1,,2,1,0,0,,1 1,,,arith,0x66105AE9,0x66109BFB,Bitwise AND UI1 (duplicate slot) +1,0x24,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x25,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x26,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x27,3,AndVar,%a,2,1,0,0,,1 1,,,arith,0x66105BB4,0x66109CC6,"Variant And: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x28,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x29,1,EqI2,,2,1,0,0,,1 1,,,compare,0x661065BC,0x6610A68B,Lead0 EqI2: same as primary table EqI2; pop 1 compare with TOS push bool +1,0x2A,1,EqI2,,2,1,0,0,,1 1,,,compare,0x661065BC,0x6610A68B,Lead0 EqI2 (duplicate slot) +1,0x2B,1,EqI4,,2,1,0,0,,1 1,,,compare,0x661065D4,0x6610A6A3,Lead0 EqI4: same as primary table EqI4; pop 1 compare push bool +1,0x2C,1,EqR8,,0,1,2,0,,f f,,,compare,0x661065EA,0x6610A6B9,Lead0 EqR8: FPU compare; pop 2 FPU push eval i32 bool +1,0x2D,1,EqR8,,0,1,2,0,,f f,,,compare,0x661065EA,0x6610A6B9,Lead0 EqR8 (duplicate slot) +1,0x2E,1,EqCy,,4,1,0,0,,2 2,,,compare,0x6610C0DE,0x66110281,Lead0 EqCy: Currency compare; pop 2×8B push i32 bool +1,0x2F,3,EqVar,%a,2,1,0,0,,1 1,,,compare,0x6610678B,0x6610A85A,"Variant =: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x30,1,EqStr,,2,1,0,0,,1 1,,,compare,0x661065F1,0x6610A6C0,String equality via __vbaStrCmp(0=case-sensitive); pop 2 BSTRs push i32 bool +1,0x31,3,EqTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C244,0x661103E7,"Variant = (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x32,1,EqTextStr,,2,1,0,0,,1 1,,,compare,0x6610C0F2,0x66110295,String equality case-insensitive via __vbaStrCmp(1); pop 2 BSTRs push i32 bool +1,0x33,1,EqVarBool,,2,1,0,0,,1 1,,,compare,0x661067B8,0x6610A887,Variant =: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x34,1,EqTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C289,0x6611042C,Variant = (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x35,1,EqCyR8,,2,1,1,0,,f 2,,,compare,0x6610C0E8,0x6611028B,"Currency = Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x36,1,NeUI1,,2,1,0,0,,1 1,,,compare,0x66106611,0x6610A6E0,Ne UI1 compare; pop 1 compare TOS; result -1 if not equal +1,0x37,1,NeUI1,,2,1,0,0,,1 1,,,compare,0x66106611,0x6610A6E0,Ne UI1 (duplicate slot) +1,0x38,1,NeI4,,2,1,0,0,,1 1,,,compare,0x66106629,0x6610A6F8,Ne I4 compare; pop 1 compare TOS; result -1 if not equal +1,0x39,1,NeR4,,0,1,2,0,,f f,,,compare,0x6610663F,0x6610A70E,FPU R4 Ne compare; pop 2 FPU push eval i32 bool +1,0x3A,1,NeR4,,0,1,2,0,,f f,,,compare,0x6610663F,0x6610A70E,FPU R4 Ne (duplicate) +1,0x3B,1,NeCy,,4,1,0,0,,2 2,,,compare,0x6610C0F9,0x6611029C,Currency Ne; pop 2×8B push i32 bool +1,0x3C,3,NeVar,%a,2,1,0,0,,1 1,,,compare,0x66106756,0x6610A825,"Variant <>: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x3D,1,NeStr,,2,1,0,0,,1 1,,,compare,0x66106646,0x6610A715,String Ne case-sensitive; pop 2 BSTRs push i32 bool +1,0x3E,3,NeTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C23D,0x661103E0,"Variant <> (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x3F,1,NeTextStr,,2,1,0,0,,1 1,,,compare,0x6610C10D,0x661102B0,String Ne case-insensitive; pop 2 BSTRs push i32 bool +1,0x40,1,NeVarBool,,2,1,0,0,,1 1,,,compare,0x6610679D,0x6610A86C,Variant <>: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x41,1,NeTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C282,0x66110425,Variant <> (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x42,1,NeCyR8,,2,1,1,0,,f 2,,,compare,0x6610C103,0x661102A6,"Currency <> Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x43,1,LeUI1,,2,1,0,0,,1 1,,,compare,0x6610C14D,0x661102F0,Le UI1 compare; pop 1 compare TOS; result -1 if second<=first +1,0x44,1,LeI2,,2,1,0,0,,1 1,,,compare,0x6610669C,0x6610A76B,Le I2 compare; pop 1 compare TOS +1,0x45,1,LeI4,,2,1,0,0,,1 1,,,compare,0x6610C163,0x66110306,Le I4 compare; pop 1 compare TOS +1,0x46,1,LeR4,,0,1,2,0,,f f,,,compare,0x661066B8,0x6610A787,FPU R4 Le compare; pop 2 FPU push eval i32 bool +1,0x47,1,LeR4,,0,1,2,0,,f f,,,compare,0x661066B8,0x6610A787,FPU R4 Le (duplicate) +1,0x48,1,LeCy,,4,1,0,0,,2 2,,,compare,0x6610C16C,0x6611030F,Currency Le; pop 2×8B push i32 bool +1,0x49,3,LeVar,%a,2,1,0,0,,1 1,,,compare,0x6610C21B,0x661103BE,"Variant <=: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x4A,1,LeStr,,2,1,0,0,,1 1,,,compare,0x6610C18E,0x66110331,String Le case-sensitive; pop 2 BSTRs push i32 bool +1,0x4B,3,LeTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C20F,0x661103B2,"Variant <= (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x4C,1,LeTextStr,,2,1,0,0,,1 1,,,compare,0x6610C180,0x66110323,String Le case-insensitive; pop 2 BSTRs push i32 bool +1,0x4D,1,LeVarBool,,2,1,0,0,,1 1,,,compare,0x66106794,0x6610A863,Variant <=: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x4E,1,LeTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C24B,0x661103EE,Variant <= (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x4F,1,LeCyR8,,2,1,1,0,,f 2,,,compare,0x6610C176,0x66110319,"Currency <= Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x50,1,GeUI1,,2,1,0,0,,1 1,,,compare,0x6610C1CB,0x6611036E,Ge UI1 compare; pop 1 compare TOS +1,0x51,1,GeI2,,2,1,0,0,,1 1,,,compare,0x66106712,0x6610A7E1,Ge I2 compare; pop 1 compare TOS +1,0x52,1,GeI4,,2,1,0,0,,1 1,,,compare,0x6610C1E0,0x66110383,Ge I4 compare; pop 1 compare TOS +1,0x53,1,GeR4,,0,1,2,0,,f f,,,compare,0x6610672E,0x6610A7FD,FPU R4 Ge compare; pop 2 FPU push eval i32 bool +1,0x54,1,GeR4,,0,1,2,0,,f f,,,compare,0x6610672E,0x6610A7FD,FPU R4 Ge (duplicate) +1,0x55,1,GeCy,,4,1,0,0,,2 2,,,compare,0x6610C1E9,0x6611038C,Currency Ge; pop 2×8B push i32 bool +1,0x56,3,GeVar,%a,2,1,0,0,,1 1,,,compare,0x6610C232,0x661103D5,"Variant >=: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x57,1,GeStr,,2,1,0,0,,1 1,,,compare,0x6610C20B,0x661103AE,String Ge case-sensitive; pop 2 BSTRs push i32 bool +1,0x58,3,GeTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C226,0x661103C9,"Variant >= (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x59,1,GeTextStr,,2,1,0,0,,1 1,,,compare,0x6610C1FD,0x661103A0,String Ge case-insensitive; pop 2 BSTRs push i32 bool +1,0x5A,1,GeVarBool,,2,1,0,0,,1 1,,,compare,0x6610C26E,0x66110411,Variant >=: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x5B,1,GeTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C262,0x66110405,Variant >= (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x5C,1,GeCyR8,,2,1,1,0,,f 2,,,compare,0x6610C1F3,0x66110396,"Currency >= Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x5D,1,LtUI1,,2,1,0,0,,1 1,,,compare,0x6610C114,0x661102B7,Lt UI1 compare; pop 1 compare TOS +1,0x5E,1,LtI2,,2,1,0,0,,1 1,,,compare,0x66106666,0x6610A735,Lt I2 compare; pop 1 compare TOS +1,0x5F,1,LtI4,,2,1,0,0,,1 1,,,compare,0x6610666D,0x6610A73C,Lt I4 compare; pop 1 compare TOS +1,0x60,1,LtR4,,0,1,2,0,,f f,,,compare,0x66106688,0x6610A757,FPU R4 Lt compare; pop 2 FPU push eval i32 bool +1,0x61,1,LtR4,,0,1,2,0,,f f,,,compare,0x66106688,0x6610A757,FPU R4 Lt (duplicate) +1,0x62,1,LtCy,,4,1,0,0,,2 2,,,compare,0x6610C127,0x661102CA,Currency Lt; pop 2×8B push i32 bool +1,0x63,3,LtVar,%a,2,1,0,0,,1 1,,,compare,0x66106744,0x6610A813,"Variant <: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x64,1,LtStr,,2,1,0,0,,1 1,,,compare,0x6610C149,0x661102EC,String Lt case-sensitive via __vbaStrCmp; eax s<0 → True +1,0x65,3,LtTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C21F,0x661103C2,"Variant < (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x66,1,LtTextStr,,2,1,0,0,,1 1,,,compare,0x6610C13B,0x661102DE,String Lt case-insensitive +1,0x67,1,LtVarBool,,2,1,0,0,,1 1,,,compare,0x6610C25E,0x66110401,Variant <: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x68,1,LtTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C252,0x661103F5,Variant < (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x69,1,LtCyR8,,2,1,1,0,,f 2,,,compare,0x6610C131,0x661102D4,"Currency < Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x6A,1,GtUI1,,2,1,0,0,,1 1,,,compare,0x6610C192,0x66110335,Gt UI1 compare; pop 1 compare TOS +1,0x6B,1,GtI2,,2,1,0,0,,1 1,,,compare,0x661066D4,0x6610A7A3,Gt I2 compare; pop 1 compare TOS +1,0x6C,1,GtI4,,2,1,0,0,,1 1,,,compare,0x661066F0,0x6610A7BF,Gt I4 compare; pop 1 compare TOS +1,0x6D,1,GtR4,,0,1,2,0,,f f,,,compare,0x661066F6,0x6610A7C5,FPU R4 Gt compare; pop 2 FPU push eval i32 bool +1,0x6E,1,GtR4,,0,1,2,0,,f f,,,compare,0x661066F6,0x6610A7C5,FPU R4 Gt (duplicate) +1,0x6F,1,GtCy,,4,1,0,0,,2 2,,,compare,0x6610C1A5,0x66110348,Currency Gt; pop 2×8B push i32 bool +1,0x70,3,GtVar,%a,2,1,0,0,,1 1,,,compare,0x6610674D,0x6610A81C,"Variant >: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x71,1,GtStr,,2,1,0,0,,1 1,,,compare,0x6610C1C7,0x6611036A,String Gt case-sensitive; pop 2 BSTRs push i32 bool +1,0x72,3,GtTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C236,0x661103D9,"Variant > (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x73,1,GtTextStr,,2,1,0,0,,1 1,,,compare,0x6610C1B9,0x6611035C,String Gt case-insensitive +1,0x74,1,GtVarBool,,2,1,0,0,,1 1,,,compare,0x6610C27E,0x66110421,Variant >: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x75,1,GtTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C272,0x66110415,Variant > (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x76,1,GtCyR8,,2,1,1,0,,f 2,,,compare,0x6610C1AF,0x66110352,"Currency > Double: pops the Double (ST0, the right operand) and the Currency (two slots, the left); compares them scaled by 10000; pushes an i32 Boolean" +1,0x77,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x78,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x79,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x7A,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x7B,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x7C,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x7D,3,LikeVar,%a,2,1,0,0,,1 1,,,compare,0x6610C382,0x66110525,"Variant Like: pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x7E,1,LikeStr,,2,1,0,0,,1 1,,,compare,0x6610C361,0x66110504,String Like case-sensitive via __vbaStrLike(0); pop 2 BSTRs push i32 bool +1,0x7F,3,LikeTextVar,%a,2,1,0,0,,1 1,,,compare,0x6610C365,0x66110508,"Variant Like (Option Compare Text): pops two Variant addresses; result Variant in the frame temp %a, whose address it pushes" +1,0x80,1,LikeTextStr,,2,1,0,0,,1 1,,,compare,0x6610C34D,0x661104F0,String Like case-insensitive via __vbaStrLike(1); pop 2 push i32 +1,0x81,1,LikeVarBool,,2,1,0,0,,1 1,,,compare,0x6610C398,0x6611053B,Variant Like: pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x82,1,LikeTextVarBool,,2,1,0,0,,1 1,,,compare,0x6610C386,0x66110529,Variant Like (Option Compare Text): pops two Variant addresses; pushes the Boolean as i32 (-1/0) +1,0x83,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x84,1,BetweenUI1,,3,1,0,0,,1 1 1,,,compare,0x66109365,0x6610D475,Between UI1; pop val+low+high; push i32 bool +1,0x85,1,BetweenI2,,3,1,0,0,,1 1 1,,,compare,0x66109383,0x6610D493,Between I2; pop val+low+high; push i32 bool +1,0x86,1,BetweenI4,,3,1,0,0,,1 1 1,,,compare,0x661093A5,0x6610D4B5,Between I4; pop val+low+high; push i32 bool +1,0x87,1,BetweenR4,,0,1,3,0,,f f f,,,compare,0x661093B0,0x6610D4C0,FPU Between R4; pop 3 FPU vals; push eval i32 bool +1,0x88,1,BetweenR4,,0,1,3,0,,f f f,,,compare,0x661093B0,0x6610D4C0,FPU Between R4 (duplicate) +1,0x89,1,BetweenCy,,6,1,0,0,,2 2 2,,,compare,0x661093DE,0x6610D4EE,Currency Between; pop 3×8B; push i32 bool +1,0x8A,1,BetweenVar,,3,1,0,0,,1 1 1,,,compare,0x6610946A,0x6610D57A,Variant Between (Select Case range): pops three Variant addresses; pushes i32 Boolean +1,0x8B,1,BetweenStr,,3,1,0,0,,1 1 1,,,compare,0x66109429,0x6610D539,String Between; pop 3 BSTRs; push i32 bool +1,0x8C,1,BetweenTextVar,,3,1,0,0,,1 1 1,,,compare,0x66109430,0x6610D540,Variant Between (Select Case range): pops three Variant addresses; pushes i32 Boolean +1,0x8D,1,BetweenTextStr,,3,1,0,0,,1 1 1,,,compare,0x661093FF,0x6610D50F,String Between case-insensitive; pop 3 BSTRs; push i32 +1,0x8E,1,AddUI1,,2,1,0,0,,1 1,,,arith,0x6610AAC3,0x6610EC0C,UI1 unsigned add; pop TOS byte; add to second; unsigned overflow check (err 6) +1,0x8F,1,AddI2,,2,1,0,0,,1 1,,,arith,0x66105A02,0x66109B28,Lead0 AddI2: shares primary table handler; i16 add with overflow +1,0x90,1,AddI4,,2,1,0,0,,1 1,,,arith,0x66105A19,0x66109B3F,Lead0 AddI4: shares primary table handler; i32 add with overflow +1,0x91,1,AddR4,,0,0,2,1,,f f,,,arith,0x66105A2F,0x66109B55,"x87: ST1 + ST0; consumes both, leaves the result in ST0" +1,0x92,1,AddR4,,0,0,2,1,,f f,,,arith,0x66105A2F,0x66109B55,"x87: ST1 + ST0; consumes both, leaves the result in ST0" +1,0x93,1,AddCy,,4,2,0,0,,2 2,,,arith,0x6610AAD9,0x6610EC22,Lead0 AddCy: shares primary table handler; __vbaCyAdd +1,0x94,3,AddVar,%a,2,1,0,0,,1 1,,,arith,0x66105BAC,0x66109CBE,"Variant +: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x95,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x96,1,SubUI1,,2,1,0,0,,1 1,,,arith,0x6610AAF4,0x6610EC3D,UI1 unsigned sub; pop TOS byte; sub from second; unsigned overflow +1,0x97,1,SubI2,,2,1,0,0,,1 1,,,arith,0x66105A3D,0x66109B63,Lead0 SubI2: shares primary table handler +1,0x98,1,SubI4,,2,1,0,0,,1 1,,,arith,0x66105A54,0x66109B7A,Lead0 SubI4: shares primary table handler +1,0x99,1,SubR4,,0,0,2,1,,f f,,,arith,0x66105A6A,0x66109B90,"x87: ST1 - ST0; consumes both, leaves the result in ST0" +1,0x9A,1,SubR4,,0,0,2,1,,f f,,,arith,0x66105A6A,0x66109B90,"x87: ST1 - ST0; consumes both, leaves the result in ST0" +1,0x9B,1,SubCy,,4,2,0,0,,2 2,,,arith,0x6610AB0A,0x6610EC53,Lead0 SubCy: __vbaCySub +1,0x9C,3,SubVar,%a,2,1,0,0,,1 1,,,arith,0x66105B8C,0x66109C9E,"Variant -: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0x9D,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0x9E,1,ModUI1,,2,1,0,0,,1 1,,,arith,0x6610ABAA,0x6610ECF3,UI1 unsigned mod +1,0x9F,1,ModI2,,2,1,0,0,,1 1,,,arith,0x66105AB2,0x6610ED08,Lead0 ModI2: shares primary handler +1,0xA0,1,ModI4,,2,1,0,0,,1 1,,,arith,0x6610ABD1,0x6610ED2E,Lead0 ModI4: shares primary handler +1,0xA1,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xA2,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xA3,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xA4,3,ModVar,%a,2,1,0,0,,1 1,,,arith,0x6610AE10,0x6610EF6C,"Variant Mod: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xA5,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xA6,1,IDvUI1,,2,1,0,0,,1 1,,,arith,0x6610AB97,0x6610ECE0,UI1 integer division +1,0xA7,1,IDvI2,,2,1,0,0,,1 1,,,arith,0x66105A9E,0x66109BC4,Lead0 IDvI2: shares primary handler +1,0xA8,1,IDvI4,,2,1,0,0,,1 1,,,arith,0x6610ABBF,0x6610ED1C,Lead0 IDvI4: shares primary handler +1,0xA9,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xAA,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xAB,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xAC,3,IDvVar,%a,2,1,0,0,,1 1,,,arith,0x66105BA4,0x66109CB6,"Variant \: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xAD,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xAE,1,MulUI1,,2,1,0,0,,1 1,,,arith,0x6610AB25,0x6610EC6E,UI1 unsigned mul; unsigned overflow check +1,0xAF,1,MulI2,,2,1,0,0,,1 1,,,arith,0x66105A78,0x66109B9E,Lead0 MulI2: shares primary handler +1,0xB0,1,MulI4,,2,1,0,0,,1 1,,,arith,0x6610AB3C,0x6610EC85,Lead0 MulI4: shares primary handler +1,0xB1,1,MulR4,,0,0,2,1,,f f,,,arith,0x66105A90,0x66109BB6,"x87: ST1 * ST0; consumes both, leaves the result in ST0" +1,0xB2,1,MulR4,,0,0,2,1,,f f,,,arith,0x66105A90,0x66109BB6,"x87: ST1 * ST0; consumes both, leaves the result in ST0" +1,0xB3,1,MulCy,,4,2,0,0,,2 2,,,arith,0x6610AB53,0x6610EC9C,Lead0 MulCy: __vbaCyMul +1,0xB4,3,MulVar,%a,2,1,0,0,,1 1,,,arith,0x66105B94,0x66109CA6,"Variant *: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xB5,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xB6,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xB7,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xB8,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xB9,1,DivR8,,0,0,2,1,,f f,,,arith,0x66105AC6,0x66109BD8,"x87: ST1 / ST0; consumes both, leaves the result in ST0" +1,0xBA,1,DivR8,,0,0,2,1,,f f,,,arith,0x66105AC6,0x66109BD8,"x87: ST1 / ST0; consumes both, leaves the result in ST0" +1,0xBB,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xBC,3,DivVar,%a,2,1,0,0,,1 1,,,arith,0x66105B9C,0x66109CAE,"Variant /: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xBD,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xBE,1,NotUI1,,1,1,0,0,,1,,,unary,0x6610ACFF,0x6610EE5B,UI1 bitwise NOT; modify TOS low byte in-place +1,0xBF,1,NotI4,,1,1,0,0,,1,,,unary,0x66105ADA,0x66109BEC,Lead0 NotI4: shares primary handler +1,0xC0,1,NotI4,,1,1,0,0,,1,,,unary,0x66105ADA,0x66109BEC,Lead0 NotI4 (duplicate) +1,0xC1,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xC2,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xC3,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xC4,3,NotVar,%a,1,1,0,0,,1,,,unary,0x66105B6E,0x66109C80,"Variant Not: pops the operand's address; result in the frame temp %a, whose address it pushes" +1,0xC5,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xC6,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xC7,1,UMiI2,,1,1,0,0,,1,,,unary,0x6610AC4F,0x6610EDAB,Lead0 UMiI2: shares primary handler; negate i16 in TOS +1,0xC8,1,UMiI2,,1,1,0,0,,1,,,unary,0x6610AC65,0x6610EDC1,Lead0 UMiI2 (duplicate) +1,0xC9,1,UMiR4,,0,0,1,1,,f,,,unary,0x6610AC7A,0x6610EDD6,x87: negation of ST0 in place +1,0xCA,1,UMiR4,,0,0,1,1,,f,,,unary,0x6610AC7A,0x6610EDD6,x87: negation of ST0 in place +1,0xCB,1,UMiCy,,2,2,0,0,,2,,,unary,0x6610AC88,0x6610EDE4,Lead0 UMiCy: __vbaCyNeg +1,0xCC,3,UMiVar,%a,1,1,0,0,,1,,,unary,0x66105B66,0x66109C78,"Variant negation: pops the operand's address; result in the frame temp %a, whose address it pushes" +1,0xCD,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xCE,3,PwrVar,%a,2,1,0,0,,1 1,,,arith,0x6610AE05,0x6610EF61,"Variant ^: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xCF,1,PwrR8R8,,0,0,2,1,,f f,,,arith,0x66105B41,0x66109C53,"x87 power: stores ST1 and ST0, the helper returns the result in ST0" +1,0xD0,1,PwrR8I2,,1,0,1,1,,1 f,,,arith,0x6610ADD7,0x6610EF33,x87 power with an Integer exponent: pops the exponent (fild); result in ST0 +1,0xD1,1,MulCyI2,,3,2,0,0,,1 2,,,arith,0x6610AB84,0x6610ECCD,Lead0 MulCyI2: shares primary handler; pop i16+2Cy push 2Cy +1,0xD2,1,ObjIs,,2,1,0,0,,1 1,,,compare,0x66105DAD,0x66109EBF,COM Is operator; pop 2 obj ptrs; compare identity; push i32 bool +1,0xD3,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xD4,1,FnAbsI2,,1,1,0,0,,1,,,unary,0x6610ACA5,0x6610EE01,Lead0 FnAbsI2: shares primary handler +1,0xD5,1,FnAbsI4,,1,1,0,0,,1,,,unary,0x6610ACC2,0x6610EE1E,Lead0 FnAbsI4: shares primary handler +1,0xD6,1,FnAbsR4,,0,0,1,1,,f,,,unary,0x6610ACF1,0x6610EE4D,x87: Abs of ST0 in place +1,0xD7,1,FnAbsR4,,0,0,1,1,,f,,,unary,0x6610ACF1,0x6610EE4D,x87: Abs of ST0 in place +1,0xD8,1,FnAbsCy,,2,2,0,0,,2,,,unary,0x6610ACDD,0x6610EE39,Lead0 FnAbsCy: __vbaCyAbs +1,0xD9,3,FnAbsVar,%a,1,1,0,0,,1,,,unary,0x6610ADE4,0x6610EF40,"Variant Abs: pops the operand's address; result in the frame temp %a, whose address it pushes" +1,0xDA,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xDB,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xDC,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xDD,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xDE,1,FnFixR8,,0,0,1,1,,f,,,unary,0x66105B09,0x66109C1B,x87: Fix of ST0 in place +1,0xDF,1,FnFixR8,,0,0,1,1,,f,,,unary,0x66105B09,0x66109C1B,x87: Fix of ST0 in place +1,0xE0,1,FnFixCy,,2,2,0,0,,2,,,unary,0x6610ADB1,0x6610EF0D,Currency Fix via __vbaCyFix +1,0xE1,3,FnFixVar,%a,1,1,0,0,,1,,,unary,0x6610ADEF,0x6610EF4B,"Variant Fix: pops the operand's address; result in the frame temp %a, whose address it pushes" +1,0xE2,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xE3,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xE4,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xE5,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xE6,1,FnIntR8,,0,0,1,1,,f,,,unary,0x66105B25,0x66109C37,x87: Int of ST0 in place +1,0xE7,1,FnIntR8,,0,0,1,1,,f,,,unary,0x66105B25,0x66109C37,x87: Int of ST0 in place +1,0xE8,1,FnIntCy,,2,2,0,0,,2,,,unary,0x6610ADC4,0x6610EF20,Currency Int via __vbaCyInt +1,0xE9,3,FnIntVar,%a,1,1,0,0,,1,,,unary,0x6610ADFA,0x6610EF56,"Variant Int: pops the operand's address; result in the frame temp %a, whose address it pushes" +1,0xEA,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xEB,3,FnLenVar,%a,1,1,0,0,,1,,,stack,0x66106818,0x6610A8E7,"Len/LenB of a Variant: pops its address; result Variant in the frame temp %a, whose address it pushes" +1,0xEC,1,FnLenStr,,1,1,0,0,,1,,,stack,0x66106806,0x6610A8D5,Lead0 FnLenStr: shares primary handler; SysStringLen +1,0xED,3,FnLenBVar,%a,1,1,0,0,,1,,,stack,0x6610C332,0x661104D5,"Len/LenB of a Variant: pops its address; result Variant in the frame temp %a, whose address it pushes" +1,0xEE,1,FnLenBStr,,1,1,0,0,,1,,,stack,0x6610C31D,0x661104C0,String LenB; pop BSTR push byte length (SysStringByteLen) +1,0xEF,3,ConcatVar,%a,2,1,0,0,,1 1,,,arith,0x661067EB,0x6610A8BA,"Variant &: pops the right then the left operand's address; result in the frame temp %a, whose address it pushes" +1,0xF0,1,ConcatStr,,2,1,0,0,,1 1,,,arith,0x661067D9,0x6610A8A8,Lead0 ConcatStr: shares primary handler; __vbaStrCat +1,0xF1,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xF2,1,FnSgnUI1,,1,1,0,0,,1,,,unary,0x6610AD6A,0x6610EEC6,UI1 Sgn; TOS → 0 or 1 (always positive for unsigned) +1,0xF3,1,FnSgnUI1,,1,1,0,0,,1,,,unary,0x6610AD6A,0x6610EEC6,FnSgnUI1 (duplicate) +1,0xF4,1,FnSgnI4,,1,1,0,0,,1,,,unary,0x6610AD7E,0x6610EEDA,I4 Sgn; TOS → -1/0/1 +1,0xF5,1,FnSgnR8,,0,1,1,0,,f,,,unary,0x6610AD8A,0x6610EEE6,"Sgn of ST0 (consumed); pushes -1, 0 or 1 as i32" +1,0xF6,1,FnSgnR4,,0,1,1,0,,f,,,unary,0x6610AD8A,0x6610EEE6,"Sgn of ST0 (consumed); pushes -1, 0 or 1 as i32" +1,0xF7,1,FnSgnCy,,2,1,0,0,,2,,,unary,0x6610AD81,0x6610EEDD,"Sgn of a Currency (two slots); pushes -1, 0 or 1 as i32" +1,0xF8,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xF9,1,InvalidExcode,,0,0,0,0,,,,,,,, +1,0xFA,1,SeekFile,,2,0,0,0,,1 1,,,call,0x66109D51,0x6610DE9A,VB Seek statement; pop filenum + position +1,0xFB,1,NameFile,,2,0,0,0,,1 1,,,call,0x66109D62,0x6610DEAB,VB Name statement; pop 2 BSTRs (old new); rename file +1,0xFC,1,CStrI2,,1,1,0,0,,1,,,convert,0x66104FB8,0x66109109,Convert I2 to BSTR via __vbaCStrI2; pop i32 push BSTR ptr +1,0xFD,1,CStrUI1,,1,1,0,0,,1,,,convert,0x66104FB8,0x66109109,Convert UI1 to BSTR via __vbaCStrUI1; pop i32 push BSTR ptr +1,0xFE,1,CStrI4,,1,1,0,0,,1,,,convert,0x66104FCA,0x6610911B,Convert I4 to BSTR via __vbaCStrI4; pop i32 push BSTR ptr +1,0xFF,1,CStrR4,,0,1,1,0,,f,,,convert,0x66104FDC,0x6610912D,Convert FPU R4 to BSTR; pop FPU ST0 push BSTR ptr +2,0x00,1,CStrR8,,0,1,1,0,,f,,,convert,0x66109647,0x6610D765,R8(FPU)→Str via __vbaStrR8; pop FPU ST0; push BSTR ptr +2,0x01,1,CStrCy,,2,1,0,0,,2,,,convert,0x6610968B,0x6610D7A9,Cy(2 slots)→Str via __vbaStrCy; pop 8B; push BSTR ptr +2,0x02,1,CStrVar,,1,1,0,0,,1,,,convert,0x66104F5F,0x661090B7,Variant to String: pops the Variant's address; result in one slot +2,0x03,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x04,1,CCyI2,,1,2,0,0,,1,,,convert,0x66109592,0x6610D6A2,I2→Cy; pop 1 slot; multiply by 10000; push 2 slots (8B Cy) +2,0x05,1,CCyI2,,1,2,0,0,,1,,,convert,0x66109592,0x6610D6A2,I2→Cy (duplicate slot); same handler as 0x04 +2,0x06,1,CCyI4,,1,2,0,0,,1,,,convert,0x661095A8,0x6610D6B8,I4→Cy; pop 1 slot; multiply by 10000; push 2 slots (8B Cy) +2,0x07,1,CCyR4,,0,2,1,0,,f,,,convert,0x661095BD,0x6610D6CD,R4(FPU)→Cy via __vbaCyR4; pop FPU; push 2 eval slots +2,0x08,1,CCyR4,,0,2,1,0,,f,,,convert,0x661095BD,0x6610D6CD,R4(FPU)→Cy (duplicate slot); same handler as 0x07 +2,0x09,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x0A,1,CCyVar,,1,2,0,0,,1,,,convert,0x661095E5,0x6610D6F5,Variant to Currency: pops the Variant's address; result in two slots +2,0x0B,1,CCyStr,,1,2,0,0,,1,,,convert,0x661096EE,0x6610D81D,Str→Cy; pop BSTR; convert to Cy; push 2 eval slots +2,0x0C,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x0D,1,CUI1I2,,1,1,0,0,,1,,,convert,0x66109471,0x6610D581,I2→UI1; in-place range check (byte must be 0); overflow error if >255 +2,0x0E,1,CUI1I4,,1,1,0,0,,1,,,convert,0x66109488,0x6610D598,I4→UI1; in-place range check (upper 3 bytes must be 0) +2,0x0F,1,CUI1R4,,0,1,1,0,,f,,,convert,0x661094AD,0x6610D5BD,R4(FPU)→UI1; round FPU to int; range check 0-255; push eval +2,0x10,1,CUI1R4,,0,1,1,0,,f,,,convert,0x661094AD,0x6610D5BD,R4(FPU)→UI1 (duplicate slot); same handler as 0x0F +2,0x11,1,CUI1Cy,,2,1,0,0,,2,,,convert,0x661094A1,0x6610D5B1,Cy→UI1; pop 2 Cy slots; divide by 10000; range check; push UI1 +2,0x12,1,CUI1Var,,1,1,0,0,,1,,,convert,0x661094EC,0x6610D5FC,Variant to Byte: pops the Variant's address; result in one slot +2,0x13,1,CUI1Str,,1,1,0,0,,1,,,convert,0x661096AA,0x6610D7C8,Str→UI1; pop BSTR; convert to byte; push UI1 +2,0x14,1,CI2UI1,,1,1,0,0,,1,,,convert,0x66104E29,0x66108F81,UI1→I2; trivial widening; byte value already valid i16 +2,0x15,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x16,1,CI2I4,,1,1,0,0,,1,,,convert,0x66104E19,0x66108F71,I4→I2; truncate with overflow check (-32768..32767) +2,0x17,1,CI2R8,,0,1,1,0,,f,,,convert,0x66104E35,0x66108F8D,R8(FPU)→I2; pop FPU; round to i16; overflow check; push eval +2,0x18,1,CI2R8,,0,1,1,0,,f,,,convert,0x66104E35,0x66108F8D,R8(FPU)→I2 (duplicate slot); same handler as 0x17 +2,0x19,1,CI2Cy,,2,1,0,0,,2,,,convert,0x661094FE,0x6610D60E,Cy→I2; pop 2 slots; divide by 10000; push i16 as i32 +2,0x1A,1,CI2Var,,1,1,0,0,,1,,,convert,0x66104E56,0x66108FAE,Variant to Integer: pops the Variant's address; result in one slot +2,0x1B,1,CI2Str,,1,1,0,0,,1,,,convert,0x66105008,0x66109159,Str→I2; pop BSTR; convert to i16; push as i32 +2,0x1C,1,CI4UI1,,1,1,0,0,,1,,,convert,0x66104E68,0x66108FC0,UI1→I4; in-place zero-extend byte to i32 +2,0x1D,1,CI4UI1,,1,1,0,0,,1,,,convert,0x66104E68,0x66108FC0,UI1→I4 (duplicate slot); same handler as 0x1C +2,0x1E,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x1F,1,CI4R8,,0,1,1,0,,f,,,convert,0x66104E77,0x66108FCF,R8(FPU)→I4; pop FPU; round to i32 via __vbaFpI4; overflow check +2,0x20,1,CI4R8,,0,1,1,0,,f,,,convert,0x66104E77,0x66108FCF,R8(FPU)→I4 (duplicate slot); same handler as 0x1F +2,0x21,1,CI4Cy,,2,1,0,0,,2,,,convert,0x6610950F,0x6610D61F,Cy→I4; pop 2 slots (8B); divide by 10000; push i32 +2,0x22,1,CI4Var,,1,1,0,0,,1,,,convert,0x66104E98,0x66108FF0,Variant to Long: pops the Variant's address; result in one slot +2,0x23,1,CI4Str,,1,1,0,0,,1,,,convert,0x66105012,0x66109163,Str→I4; pop BSTR; convert via __vbaI4Str; push i32 +2,0x24,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→R8(FPU); pop eval i16; fild push FPU double +2,0x25,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→R8(FPU) (duplicate slot); same handler +2,0x26,1,CR4I4,,1,0,0,1,,1,,,convert,0x66104EBA,0x66109012,I4→R8(FPU); pop eval i32; fild push FPU double +2,0x27,1,CR4R8,,0,0,1,1,,f,,,convert,0x66104ECA,0x66109022,x87 conversion of ST0 in place (rounding to the target precision) +2,0x28,1,CR4R8,,0,0,1,1,,f,,,convert,0x66104ECA,0x66109022,x87 conversion of ST0 in place (rounding to the target precision) +2,0x29,1,CR8Cy,,2,0,0,1,,2,,,convert,0x66109520,0x6610D630,Cy→R8(FPU); pop 2 eval slots; convert to double; push FPU +2,0x2A,1,CR8Var,,1,0,0,1,,1,,,convert,0x66104F06,0x6610905E,Variant to Double: pops the Variant's address; result in ST0 +2,0x2B,1,CR4Str,,1,0,0,1,,1,,,convert,0x66105024,0x66109175,Str→R4(FPU); pop BSTR; convert via __vbaR4Str; push FPU +2,0x2C,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→FPU (duplicate slot); same handler as 0x24 +2,0x2D,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→FPU (duplicate slot); same handler as 0x24 +2,0x2E,1,CR4I4,,1,0,0,1,,1,,,convert,0x66104EBA,0x66109012,I4→FPU (duplicate slot); same handler as 0x26 +2,0x2F,1,CR8R4,,0,0,1,1,,f,,,convert,0x66104EE8,0x66109040,x87 conversion of ST0 in place (rounding to the target precision) +2,0x30,1,CR8R4,,0,0,1,1,,f,,,convert,0x66104EE8,0x66109040,x87 conversion of ST0 in place (rounding to the target precision) +2,0x31,1,CR8Cy,,2,0,0,1,,2,,,convert,0x66109520,0x6610D630,Cy→R8(FPU) (duplicate slot); same handler as 0x29 +2,0x32,1,CR8Var,,1,0,0,1,,1,,,convert,0x66104F06,0x6610905E,Variant to Double: pops the Variant's address; result in ST0 +2,0x33,1,CR8Str,,1,0,0,1,,1,,,convert,0x661096DD,0x6610D7FB,Str→R8(FPU); pop BSTR; convert via __vbaR8Str; push FPU +2,0x34,1,CAdVar,,1,1,0,0,,1,,,convert,0x6610516F,0x661092AF,Variant to object: pops the Variant's address; result in one slot +2,0x35,1,CRefVarAry,,1,1,0,0,,1,,,convert,0x661051A9,0x661092E9,Pops a Variant's address; pushes the array it holds +2,0x36,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x37,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x38,1,CUI1Bool,,1,1,0,0,,1,,,convert,0x661094DB,0x6610D5EB,Bool→UI1; pop i32 bool; mask to byte; push UI1 +2,0x39,1,FnCDblCy,,2,0,0,1,,2,,,convert,0x66109574,0x6610D684,Cy→Double(FPU); pop 2 Cy slots; convert; push FPU +2,0x3A,1,FnCDblR8,,0,0,1,1,,f,,,convert,0x66109580,0x6610D690,x87 conversion of ST0 in place (rounding to the target precision) +2,0x3B,1,FnCDblR8,,0,0,1,1,,f,,,convert,0x66109580,0x6610D690,x87 conversion of ST0 in place (rounding to the target precision) +2,0x3C,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→FPU (duplicate slot); same handler as 0x24 +2,0x3D,1,FnCSngI2,,1,0,0,1,,1,,,convert,0x66104EAA,0x66109002,I2→FPU (duplicate slot); same handler as 0x24 +2,0x3E,1,FnCSngI4,,1,0,0,1,,1,,,convert,0x66109538,0x6610D648,I4→Single(FPU); pop eval i32; push FPU float +2,0x3F,1,CSng,,0,0,1,1,,f,,,convert,0x6610953C,0x6610D64C,x87 conversion of ST0 in place (rounding to the target precision) +2,0x40,1,CSng,,0,0,1,1,,f,,,convert,0x6610953C,0x6610D64C,x87 conversion of ST0 in place (rounding to the target precision) +2,0x41,1,FnCSngCy,,2,0,0,1,,2,,,convert,0x66109555,0x6610D665,Cy→Single(FPU); pop 2 Cy slots; convert; push FPU +2,0x42,1,FnCSngVar,,1,0,0,1,,1,,,convert,0x6610954E,0x6610D65E,Variant to Single: pops the Variant's address; result in ST0 +2,0x43,1,FnCSngStr,,1,0,0,1,,1,,,convert,0x66105024,0x66109175,Str→Single(FPU); pop BSTR; convert; push FPU (same as CR4Str) +2,0x44,1,FnCByteVar,,1,1,0,0,,1,,,convert,0x6610973E,0x6610D86D,Variant to Byte: pops the Variant's address; result in one slot +2,0x45,1,FnCIntVar,,1,1,0,0,,1,,,convert,0x6610503F,0x6610917F,Variant to Integer: pops the Variant's address; result in one slot +2,0x46,1,FnCLngVar,,1,1,0,0,,1,,,convert,0x66105051,0x66109191,Variant to Long: pops the Variant's address; result in one slot +2,0x47,1,CDateR8,,0,0,1,1,,f,,,convert,0x66109701,0x6610D830,x87 conversion of ST0 in place (rounding to the target precision) +2,0x48,1,FnCDblVar,,1,0,0,1,,1,,,convert,0x66109563,0x6610D673,Variant to Double: pops the Variant's address; result in ST0 +2,0x49,1,FnCCurVar,,1,2,0,0,,1,,,convert,0x66109750,0x6610D87F,Variant to Currency: pops the Variant's address; result in two slots +2,0x4A,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x4B,1,FnCStrVar,,1,1,0,0,,1,,,convert,0x66109763,0x6610D892,Variant to String: pops the Variant's address; result in one slot +2,0x4C,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x4D,1,FnCBoolVar,,1,1,0,0,,1,,,convert,0x66109775,0x6610D8A4,Variant to Boolean: pops the Variant's address; result in one slot +2,0x4E,1,FnCDateVar,,1,0,0,1,,1,,,convert,0x6610972D,0x6610D85C,Variant to Date: pops the Variant's address; result in ST0 +2,0x4F,1,FnCDateVar,,1,0,0,1,,1,,,convert,0x6610972D,0x6610D85C,Variant to Date: pops the Variant's address; result in ST0 +2,0x50,1,CBoolUI1,,1,1,0,0,,1,,,convert,0x66104F1D,0x66109075,UI1→Bool; pop byte; convert to VB bool (-1/0); push i32 +2,0x51,1,CBoolUI1,,1,1,0,0,,1,,,convert,0x66104F1D,0x66109075,UI1→Bool (duplicate slot); same handler as 0x50 +2,0x52,1,CBoolI4,,1,1,0,0,,1,,,convert,0x66104F17,0x6610906F,I4→Bool; pop i32; convert to VB bool (-1/0); push +2,0x53,1,CBoolR4,,0,1,1,0,,f,,,convert,0x66109601,0x6610D711,R4(FPU)→Bool; pop FPU; compare to 0; push VB bool +2,0x54,1,CBoolR4,,0,1,1,0,,f,,,convert,0x66109601,0x6610D711,R4(FPU)→Bool (duplicate slot); same handler as 0x53 +2,0x55,1,CBoolCy,,2,1,0,0,,2,,,convert,0x661095F8,0x6610D708,Cy→Bool; pop 2 Cy slots; convert to VB bool; push i32 +2,0x56,1,CBoolVar,,1,1,0,0,,1,,,convert,0x66104F3B,0x66109093,Variant to Boolean: pops the Variant's address; result in one slot +2,0x57,1,CBoolStr,,1,1,0,0,,1,,,convert,0x66104FFE,0x6610914F,Str→Bool; pop BSTR; convert to VB bool; push i32 +2,0x58,1,CStr2Uni,,2,0,0,0,,1 1,,,convert,0x66109976,0x6610DABF,Pops the destination's address and an ANSI string; stores the Unicode copy +2,0x59,1,CStrAry2Uni,,2,0,0,0,,1 1,,,convert,0x66109987,0x6610DAD0,Pops the destination's address and an ANSI array; stores the Unicode copy +2,0x5A,1,CStr2Ansi,,2,0,0,0,,1 1,,,convert,0x66105204,0x6610932A,Pops the destination's address and a String; stores its ANSI copy (Declare argument) +2,0x5B,1,CStrAry2Ansi,,2,0,0,0,,1 1,,,convert,0x66109998,0x6610DAE1,Pops the destination's address and a String array; stores its ANSI copy +2,0x5C,1,PopAdLd4,,1,1,0,0,,1,,ld:pop:4,stack,0x6610651F,0x6610A604,Pop address; load i32 from that address; push value (deref) +2,0x5D,3,CRecAnsi2Uni,%s,2,0,0,0,,1 1,,,convert,0x661099C6,0x6610DB0F,Converts the record (descriptor in pool %s) ANSI to Unicode: pops source and destination +2,0x5E,3,CRecUni2Ansi,%s,2,0,0,0,,1 1,,,convert,0x661099A9,0x6610DAF2,Converts the record (descriptor in pool %s) Unicode to ANSI: pops source and destination +2,0x5F,3,CStr2Vec,%a,1,0,0,0,,1,,,convert,0x661051D0,0x6610DA6D,Pops a String; converts it to a Byte array at frame %a +2,0x60,3,CVar2Vec,%a,1,0,0,0,,1,,,convert,0x661051EA,0x66109310,Pops a Variant's address; converts it to a Byte array at frame %a +2,0x61,5,CVec2Var,%a %a,0,0,0,0,,,,,convert,0x6610993E,0x6610DA87,"Moves the Byte array at frame %a (the second) into the Variant at frame %a (the first) as VT_ARRAY | VT_UI1, freeing its old value and zeroing the source" +2,0x62,1,SetLastError,,0,0,0,0,,,,,stack,0x66106576,0x6610A65B,Stores kernel32 GetLastError() to Err.LastDllError (runtime context + 0x9C); follows every Declare call; no stack effect +2,0x63,1,LitNothing,,0,1,0,0,,,,const:0,load_lit,0x66105910,0x66109A36,Pushes 0 +2,0x64,3,LitVar_Null,%a,0,1,0,0,,,,var:1:f(%a),load_lit,0x6610AA7B,0x6610EBC4,Builds a Variant (vt 1) at [ebp+%a] and pushes its address (the old contents not freed) +2,0x65,3,LitVar_TRUE,%a,0,1,0,0,,,,var:11=-1:f(%a),load_lit,0x66105970,0x66109A96,Builds a Variant (vt 11 and the value -1) at [ebp+%a] and pushes its address (the old contents not freed) +2,0x66,3,LitVar_FALSE,%a,0,1,0,0,,,,var:11=0:f(%a),load_lit,0x6610596A,0x66109A90,Builds a Variant (vt 11 and the value 0) at [ebp+%a] and pushes its address (the old contents not freed) +2,0x67,3,LitVar_Empty,%a,0,1,0,0,,,,var:0:f(%a),load_lit,0x6610AA6A,0x6610EBB3,Builds a Variant (vt 0) at [ebp+%a] and pushes its address (the old contents not freed) +2,0x68,3,LitVar_Missing,%a,0,1,0,0,,,,var:10=0x80020004:f(%a),load_lit,0x66105947,0x66109A6D,Builds a Variant (vt 10 and the value 0x80020004) at [ebp+%a] and pushes its address (the old contents not freed) +2,0x69,5,VCallHresult,%v,0,0,0,0,callee,*,pr,,call,0x6610633A,0x6610A43B,Calls Pr's vtable method (IID pool index in %v); the callee releases this and its arguments; checks the HRESULT; pushes nothing +2,0x6A,5,ThisVCallHresult,%v,0,0,0,0,callee,*,me,,call,0x6610630B,0x6610A40C,Calls Me's vtable method (IID pool index in %v); the callee releases this and its arguments; checks the HRESULT; pushes nothing +2,0x6B,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x6C,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x6D,1,ExitProcHresult,,0,0,0,0,,,,,return,0x6610645F,0x6610A560,Returns eax = 0 (S_OK) +2,0x6E,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x6F,3,CheckTypeVar,%c,1,1,0,0,,1,,,compare,0x6610B070,0x6610F1CC,TypeOf on a Variant (class in pool %c): pops its address; pushes an i32 Boolean +2,0x70,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x71,1,CUnkVar,,1,1,0,0,,1,,,convert,0x66105189,0x661092C9,Variant to IUnknown: pops the Variant's address; result in one slot +2,0x72,3,CVarUnk,%a,1,1,0,0,,1,,,convert,0x661097B9,0x6610D8E8,Unk to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +2,0x73,1,LdPrUnkVar,,1,0,0,0,,1,>pr:variant,prn:vobj(pop),load_frame,0x66109E1D,0x6610DF66,Loads Pr with the object at the popped Variant's object; error 91 when it is Nothing +2,0x74,9,FLdLateIdUnkVar,%a %4 %a,0,0,0,0,,,>pr:late,x:late_get_pr:f(%a#2):f(%a),load_frame,0x6610A7FE,0x6610E947,Late-bound get of DISPID %4 into a frame temp; Pr := its object +2,0x75,1,GetRec3,,3,0,0,0,,1 1 1,,,io,0x66109BF3,0x6610DD3C,Get record from file (3-arg); pop filenum+recnum+buffer +2,0x76,1,GetRec4,,4,0,0,0,,1 1 1 1,,,io,0x66109C15,0x6610DD5E,Get record from file (4-arg); pop filenum+recnum+buffer+len +2,0x77,1,PutRec3,,3,0,0,0,,1 1 1,,,io,0x66109C04,0x6610DD4D,Put record to file (3-arg); pop filenum+recnum+buffer +2,0x78,1,PutRec4,,4,0,0,0,,1 1 1 1,,,io,0x66109C26,0x6610DD6F,Put record to file (4-arg); pop filenum+recnum+buffer+len +2,0x79,-1,GetRecOwner3,,2,0,0,0,,1 1,,,io,0x66109C37,0x6610DD80,Get # of a record described by the inline payload (its address is passed to the runtime helper); pops file number and destination +2,0x7A,-1,GetRecOwner4,,3,0,0,0,,1 1 1,,,io,0x66109C5C,0x6610DDA5,"Get # of a record described by the inline payload, with a record number: pops file number, record number and destination" +2,0x7B,-1,PutRecOwner3,,2,0,0,0,,1 1,,,io,0x66109C54,0x6610DD9D,Put # of a record described by the inline payload (its address is passed to the runtime helper); pops file number and source +2,0x7C,-1,PutRecOwner4,,3,0,0,0,,1 1 1,,,io,0x66109C79,0x6610DDC2,"Put # of a record described by the inline payload, with a record number: pops file number, record number and source" +2,0x7D,1,Input,,1,0,0,0,,1,,,io,0x66109A79,0x6610DBC2,Input #: pops the file number; starts reading +2,0x7E,1,InputDone,,0,0,0,0,,,,,io,0x66109A8A,0x6610DBD3,End Input# sequence; finalize parsing +2,0x7F,1,InputItemUI1,,1,0,0,0,,1,,,io,0x66109A9B,0x6610DBE4,Input# read UI1 item; pop dest addr; store byte +2,0x80,1,InputItemI2,,1,0,0,0,,1,,,io,0x66109ADF,0x6610DC28,Input# read I2 item; pop dest addr; store i16 +2,0x81,1,InputItemI4,,1,0,0,0,,1,,,io,0x66109B30,0x6610DC79,Input# read I4 item; pop dest addr; store i32 +2,0x82,1,InputItemR4,,1,0,0,0,,1,,,io,0x66109B0F,0x6610DC58,Input# read R4 item; pop dest addr; store float +2,0x83,1,InputItemR8,,1,0,0,0,,1,,,io,0x66109B5B,0x6610DCA4,Input# read R8 item; pop dest addr; store double +2,0x84,1,InputItemCy,,1,0,0,0,,1,,,io,0x66109B61,0x6610DCAA,Input# read Cy item; pop dest addr; store 8B currency +2,0x85,1,InputItemVar,,1,0,0,0,,1,,,io,0x66109B67,0x6610DCB0,Input# read Variant item; pop dest addr; store 16B Variant +2,0x86,1,InputItemStr,,1,0,0,0,,1,,,io,0x66109AE5,0x6610DC2E,Input# read String item; pop dest BSTR ptr addr; store +2,0x87,1,InputItemBool,,1,0,0,0,,1,,,io,0x66109ABB,0x6610DC04,Input# read Bool item; pop dest addr; store VB bool +2,0x88,1,InputItemDate,,1,0,0,0,,1,,,io,0x66109B36,0x6610DC7F,Input# read Date item; pop dest addr; store R8 date +2,0x89,1,PopFPR4,,0,1,1,0,,f,,,stack,0x661064E7,0x6610A5E8,Pop x87 ST0; store as f32 on eval stack (1 slot); fpu_pop=1 +2,0x8A,1,PopFPR8,,0,2,1,0,,f,,,stack,0x66106503,0x66110136,Pop x87 ST0; store as f64 on eval stack (2 slots); fpu_pop=1 +2,0x8B,1,PopAd,,1,0,0,0,,1,,,stack,0x661064D8,0x6610A5D9,"Discards the top slot (add esp, 4)" +2,0x8C,1,PopAdLdVar,,1,4,0,0,,1,,ld:pop:16,stack,0x6610652E,0x6610A613,Pops a Variant's address; pushes the Variant by value (four slots) +2,0x8D,3,AryLdPr,%2,1,0,0,0,count(0),* 1,>pr:array,prad:an(%2),load_ind,0x66108FC1,0x6610D0D1,Loads Pr with the address of the element of a popped %2-dimensional array +2,0x8E,3,AryLdRf,%2,1,1,0,0,count(0),* 1,,ad:an(%2),load_ind,0x66108FD8,0x6610D0E8,Pushes the address of the element of a popped %2-dimensional array +2,0x8F,5,ParmAry1St,%a %2,1,0,0,0,,1,,,stack,0x66104D66,0x66108EBE,Stores the popped Variant into element %2 of the ParamArray at frame %a +2,0x90,1,Ary1LdUI1,,2,1,0,0,,1 1,,ld:a1:1z,load_ind,0x66108E7B,0x6610CF8B,"Pushes the 1 bytes at the element of a popped array at a popped index, zero-extended" +2,0x91,1,Ary1LdI2,,2,1,0,0,,1 1,,ld:a1:2u,load_ind,0x66108E92,0x6610CFA2,Pushes the 2 bytes at the element of a popped array at a popped index (the rest of the slot undefined) +2,0x92,1,Ary1LdI4,,2,1,0,0,,1 1,,ld:a1:4,load_ind,0x66108EA8,0x6610CFB8,Pushes the 4 bytes at the element of a popped array at a popped index +2,0x93,1,Ary1LdI4,,2,1,0,0,,1 1,,ld:a1:4,load_ind,0x66108EA8,0x6610CFB8,Pushes the 4 bytes at the element of a popped array at a popped index +2,0x94,1,Ary1LdR8,,2,2,0,0,,1 1,,ld:a1:8,load_ind,0x66108EBC,0x6610CFCC,Pushes the 8 bytes at the element of a popped array at a popped index +2,0x95,1,Ary1LdR8,,2,2,0,0,,1 1,,ld:a1:8,load_ind,0x66108EBC,0x6610CFCC,Pushes the 8 bytes at the element of a popped array at a popped index +2,0x96,1,Ary1LdRfVar,,2,1,0,0,,1 1,,ad:a1,load_ind,0x66108EFC,0x6610D00C,Pushes the address of the element of a popped array at a popped index +2,0x97,1,Ary1LdI4,,2,1,0,0,,1 1,,ld:a1:4,load_ind,0x66108EA8,0x6610CFB8,Pushes the 4 bytes at the element of a popped array at a popped index +2,0x98,1,Ary1LdI4,,2,1,0,0,,1 1,,ld:a1:4,load_ind,0x66108EA8,0x6610CFB8,Pushes the 4 bytes at the element of a popped array at a popped index +2,0x99,1,Ary1LdFPR4,,2,0,0,1,,1 1,,ldfp:a1:4,load_ind,0x66108ED4,0x6610CFE4,Loads the 4-byte float at the element of a popped array at a popped index onto the x87 stack +2,0x9A,1,Ary1LdFPR8,,2,0,0,1,,1 1,,ldfp:a1:8,load_ind,0x66108EE8,0x6610CFF8,Loads the 8-byte float at the element of a popped array at a popped index onto the x87 stack +2,0x9B,1,Ary1LdPr,,2,0,0,0,,1 1,>pr:array,prad:a1,load_ind,0x66108F13,0x6610D023,Loads Pr with the address of the element of a popped array at a popped index +2,0x9C,1,Ary1LdRf,,2,1,0,0,,1 1,,ad:a1,load_ind,0x66104C44,0x66108D9C,Pushes the address of the element of a popped array at a popped index +2,0x9D,1,Ary1LdVar,,2,4,0,0,,1 1,,ld:a1:16,load_ind,0x6610B178,0x6610F2D4,Pushes the 16 bytes at the element of a popped array at a popped index +2,0x9E,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0x9F,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xA0,1,Ary1StUI1,,3,0,0,0,,1 1 1,,st:a1:1,store_ind,0x66108F2E,0x6610D03E,Pops and stores 1 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA1,1,Ary1StI2,,3,0,0,0,,1 1 1,,st:a1:2,store_ind,0x66108F43,0x6610D053,Pops and stores 2 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA2,1,Ary1StR4,,3,0,0,0,,1 1 1,,st:a1:4,store_ind,0x66108F59,0x6610D069,Pops and stores 4 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA3,1,Ary1StR4,,3,0,0,0,,1 1 1,,st:a1:4,store_ind,0x66108F59,0x6610D069,Pops and stores 4 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA4,1,Ary1StCy,,4,0,0,0,,1 1 2,,st:a1:8,store_ind,0x66108F6D,0x6610D07D,Pops and stores 8 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA5,1,Ary1StCy,,4,0,0,0,,1 1 2,,st:a1:8,store_ind,0x66108F6D,0x6610D07D,Pops and stores 8 bytes at the element of a popped array at a popped index (the old value not freed) +2,0xA6,1,Ary1StVar,,3,0,0,0,,1 1 1,,x:var_let:a1,store_ind,0x661061A3,0x6610A2A4,Let of the popped Variant into the element of a popped array at a popped index (the source moves; an object source gives its default value) +2,0xA7,1,Ary1StStr,,3,0,0,0,,1 1 1,,x:bstr_move:a1,store_ind,0x6610B301,0x6610F45D,"Stores the popped String at the element of a popped array at a popped index, freeing the old one (the string moves)" +2,0xA8,1,Ary1StAd,,3,0,0,0,,1 1 1,,x:set_obj:a1,store_ind,0x6610B3ED,0x6610F549,"Stores the popped object at the element of a popped array at a popped index, AddRef'd, Releasing the old one" +2,0xA9,1,Ary1StFPR4,,2,0,1,0,,1 1 f,,stfp:a1:4,store_ind,0x66108F85,0x6610D095,Stores ST0 as an 4-byte float at the element of a popped array at a popped index +2,0xAA,1,Ary1StFPR8,,2,0,1,0,,1 1 f,,stfp:a1:8,store_ind,0x66108FA3,0x6610D0B3,Stores ST0 as an 8-byte float at the element of a popped array at a popped index +2,0xAB,1,Ary1StVarAd,,3,0,0,0,,1 1 1,,x:set_var9:a1,store_ind,0x66106097,0x6610A1A9,"Sets the Variant at the element of a popped array at a popped index to the popped object (VT_DISPATCH, AddRef'd)" +2,0xAC,1,Ary1StVarAdFunc,,3,0,0,0,,1 1 1,,x:set_var9_owned:a1,store_ind,0x6610B4CB,0x6610F627,"Sets the Variant at the element of a popped array at a popped index to the popped object (VT_DISPATCH, not AddRef'd)" +2,0xAD,1,Ary1StVarUnk,,3,0,0,0,,1 1 1,,x:set_var13:a1,store_ind,0x6610B562,0x6610F6BE,Sets the Variant at the element of a popped array at a popped index to the popped IUnknown (AddRef'd) +2,0xAE,1,Ary1StVarUnkFunc,,3,0,0,0,,1 1 1,,x:set_var13_owned:a1,store_ind,0x6610B546,0x6610F6A2,Sets the Variant at the element of a popped array at a popped index to the popped IUnknown (not AddRef'd) +2,0xAF,1,Ary1StAdFunc,,3,0,0,0,,1 1 1,,x:set_obj_owned:a1,store_ind,0x6610B3D7,0x6610F533,"Stores the popped object at the element of a popped array at a popped index without AddRef, Releasing the old one" +2,0xB0,1,Ary1StVarCopy,,3,0,0,0,,1 1 1,,x:var_copy:a1,store_ind,0x6610B6C2,0x6610F81E,"Copies the popped Variant into the element of a popped array at a popped index (strings, objects and arrays duplicated)" +2,0xB1,1,Ary1StStrCopy,,3,0,0,0,,1 1 1,,x:bstr_copy:a1,store_ind,0x6610B313,0x6610F46F,"Stores a copy of the String at the element of a popped array at a popped index, freeing the old one" +2,0xB2,3,Ary1LdRfVarg,%a,2,1,0,0,,1 1,,x:ad_varg:a1:f(%a),load_ind,0x6610B1E0,0x6610F33C,Pushes the address of the Variant at the element of a popped array at a popped index (or of the one it references) +2,0xB3,1,Ary1LdVarg,,2,4,0,0,,1 1,,x:ld_varg:a1,load_ind,0x6610B187,0x6610F2E3,"Pushes the Variant at the element of a popped array at a popped index by value, as a reference when it is not one" +2,0xB4,1,Ary1LdRfVargParam,,2,1,0,0,,1 1,,x:ad_unref:a1,load_ind,0x6610B201,0x6610F35D,Pushes the address of the Variant at the element of a popped array at a popped index (or of the one it references) +2,0xB5,1,Ary1StVarg,,3,0,0,0,,1 1 1,,x:varg_let:a1,store_ind,0x6610B773,0x6610F8E4,"Stores the popped Variant through the by-reference argument at the element of a popped array at a popped index, freeing the source" +2,0xB6,1,Ary1StVargCopy,,3,0,0,0,,1 1 1,,x:varg_copy:a1,store_ind,0x6610B751,0x6610F8C2,Stores a copy of the popped Variant through the by-reference argument at the element of a popped array at a popped index +2,0xB7,1,Ary1StVargAd,,3,0,0,0,,1 1 1,,x:set_varg9:a1,store_ind,0x6610B4ED,0x6610F649,Sets the by-reference Variant at the element of a popped array at a popped index to the popped object (AddRef'd) +2,0xB8,1,Ary1StVargAdFunc,,3,0,0,0,,1 1 1,,x:set_varg9_owned:a1,store_ind,0x6610B4D5,0x6610F631,Sets the by-reference Variant at the element of a popped array at a popped index to the popped object +2,0xB9,1,Ary1StVargUnk,,3,0,0,0,,1 1 1,,x:set_varg13:a1,store_ind,0x6610B5F1,0x6610F74D,Sets the by-reference Variant at the element of a popped array at a popped index to the popped IUnknown (AddRef'd) +2,0xBA,1,Ary1StVargUnkFunc,,3,0,0,0,,1 1 1,,x:set_varg13_owned:a1,store_ind,0x6610B5DC,0x6610F738,Sets the by-reference Variant at the element of a popped array at a popped index to the popped IUnknown +2,0xBB,1,MidVar,,4,0,0,0,,1 1 1 1,,,stack,0x6610C2FB,0x6611049E,"Mid statement on a Variant: pops destination, start, length and the value" +2,0xBC,3,MidBStr,%2,4,0,0,0,,1 1 1 1,,,stack,0x6610C2CB,0x6611046E,"MidB statement: pops the destination's address, start, length and the String" +2,0xBD,1,MidBVar,,4,0,0,0,,1 1 1 1,,,stack,0x6610C30C,0x661104AF,"MidB statement on a Variant: pops destination, start, length and the value" +2,0xBE,3,MidBStrB,%2,4,0,0,0,,1 1 1 1,,,stack,0x6610C2E3,0x66110486,"MidB statement (byte form): pops destination, start, length and the String" +2,0xBF,1,LineInputVar,,2,0,0,0,,1 1,,,io,0x66109BE2,0x6610DD2B,Line Input #: pops the file number and the destination Variant's address +2,0xC0,1,LineInputStr,,2,0,0,0,,1 1,,,io,0x66109BD1,0x6610DD1A,Line Input #: pops the file number and the destination String's address +2,0xC1,1,Error,,1,0,0,0,,1,,,raise,0x6610B123,0x6610F27F,Pops the error number and raises it (0 or a number above 0xFFFF raises error 5); never falls through +2,0xC2,1,Stop,,0,0,0,0,,,,,end,0x66108E2E,0x6610CF3E,"Stop: jumps to __vbaStopExe, which ends the program; never falls through" +2,0xC3,1,Erase,,1,0,0,0,,1,,,stack,0x66104CBE,0x66108E16,Erase: pops the array's address +2,0xC4,2,LargeBos,%1,0,0,0,0,,,,,bos,0x66104BFE,0x66108D56,"Starts a statement: stores its address to [ebp-0x14]; %1 is the statement's length in bytes, which Resume Next skips (0 for the last statement)" +2,0xC5,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xC6,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xC7,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xC8,1,End,,0,0,0,0,,,,,end,0x66104BF3,0x66108D4B,"End: raises the runtime's internal end code 0x9C68, ending the program; never falls through" +2,0xC9,1,Return,,1,0,0,0,,1,,,return_gosub,0x66104DC0,0x66108F18,Return from GoSub: pops the return position and continues there +2,0xCA,1,FnLBound,,2,1,0,0,,1 1,,,stack,0x66104C9A,0x66108DF2,LBound: pops the dimension and the SAFEARRAY; pushes an i32 +2,0xCB,1,FnUBound,,2,1,0,0,,1 1,,,stack,0x66104CAC,0x66108E04,UBound: pops the dimension and the SAFEARRAY; pushes an i32 +2,0xCC,1,ExitProcUI1,,0,0,0,0,,,,,return,0x6610BF58,0x661100C9,"Returns eax = the Byte at [ebp-0x86], zero-extended" +2,0xCD,1,ExitProcI2,,0,0,0,0,,,,,return,0x66106468,0x6610A569,"Returns eax = the Integer at [ebp-0x86], sign-extended" +2,0xCE,1,ExitProcStr,,0,0,0,0,,,,,return,0x66106428,0x6610A529,"Returns eax = [ebp-0x88]: a Long, a String or an object result (a Sub leaves it unused)" +2,0xCF,1,ExitProcR4,,0,0,0,0,,,,,return,0x6610BF3E,0x661100AF,Returns the Single at [ebp-0x88] in ST0 (fld) +2,0xD0,1,ExitProcR8,,0,0,0,0,,,,,return,0x6610BF4B,0x661100BC,Returns the Double or Date at [ebp-0x8C] in ST0 (fld) +2,0xD1,1,ExitProcCy,,0,0,0,0,,,,,return,0x6610BEC5,0x66110036,Returns the Currency at [ebp-0x8C] in edx:eax +2,0xD2,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xD3,1,ExitProcStr,,0,0,0,0,,,,,return,0x66106428,0x6610A529,"Returns eax = [ebp-0x88]: a Long, a String or an object result (a Sub leaves it unused)" +2,0xD4,1,ExitProcStr,,0,0,0,0,,,,,return,0x66106428,0x6610A529,"Returns eax = [ebp-0x88]: a Long, a String or an object result (a Sub leaves it unused)" +2,0xD5,1,ExitProcStr,,0,0,0,0,,,,,return,0x66106428,0x6610A529,"Returns eax = [ebp-0x88]: a Long, a String or an object result (a Sub leaves it unused)" +2,0xD6,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xD7,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xD8,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xD9,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDA,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDB,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDC,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDD,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDE,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xDF,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xE0,3,FLdUI1,%a,0,1,0,0,,,,ld:f(%a):1z,load_frame,0x66109D73,0x6610DEBC,"Pushes the 1 bytes at [ebp+%a], zero-extended" +2,0xE1,3,FLdI2,%a,0,1,0,0,,,,ld:f(%a):2u,load_frame,0x66105249,0x6610936F,Pushes the 2 bytes at [ebp+%a] (the rest of the slot undefined) +2,0xE2,3,FLdR4,%a,0,1,0,0,,,,ld:f(%a):4,load_frame,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +2,0xE3,3,FLdR4,%a,0,1,0,0,,,,ld:f(%a):4,load_frame,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +2,0xE4,3,FLdR8,%a,0,2,0,0,,,,ld:f(%a):8,load_frame,0x66109DAC,0x6610DEF5,Pushes the 8 bytes at [ebp+%a] +2,0xE5,3,FLdR8,%a,0,2,0,0,,,,ld:f(%a):8,load_frame,0x66109DAC,0x6610DEF5,Pushes the 8 bytes at [ebp+%a] +2,0xE6,3,FLdRfVar,%a,0,1,0,0,,,,ad:f(%a),load_frame,0x661052BB,0x661093E1,Pushes the address of [ebp+%a] +2,0xE7,3,FLdR4,%a,0,1,0,0,,,,ld:f(%a):4,load_frame,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +2,0xE8,3,FLdR4,%a,0,1,0,0,,,,ld:f(%a):4,load_frame,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +2,0xE9,3,FLdFPR4,%a,0,0,0,1,,,,ldfp:f(%a):4,load_frame,0x66105291,0x661093B7,Loads the 4-byte float at [ebp+%a] onto the x87 stack +2,0xEA,3,FLdFPR8,%a,0,0,0,1,,,,ldfp:f(%a):8,load_frame,0x661052A6,0x661093CC,Loads the 8-byte float at [ebp+%a] onto the x87 stack +2,0xEB,3,FLdPr,%a,0,0,0,0,,,>pr:frame,prn:f(%a),load_frame,0x66105EEA,0x66109FFC,Loads Pr with the object at [ebp+%a]; error 91 when it is Nothing +2,0xEC,3,FLdRfVar,%a,0,1,0,0,,,,ad:f(%a),load_frame,0x661052BB,0x661093E1,Pushes the address of [ebp+%a] +2,0xED,3,FLdVar,%a,0,4,0,0,,,,ld:f(%a):16,load_frame,0x66105E8F,0x66109FA1,Pushes the 16 bytes at [ebp+%a] +2,0xEE,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xEF,1,InvalidExcode,,0,0,0,0,,,,,,,, +2,0xF0,3,FStUI1,%a,1,0,0,0,,1,,st:f(%a):1,store_frame,0x66109DC5,0x6610DF0E,Pops and stores 1 bytes at [ebp+%a] (the old value not freed) +2,0xF1,3,FStI2,%a,1,0,0,0,,1,,st:f(%a):2,store_frame,0x661052E2,0x66109408,Pops and stores 2 bytes at [ebp+%a] (the old value not freed) +2,0xF2,3,FStR4,%a,1,0,0,0,,1,,st:f(%a):4,store_frame,0x661052F9,0x6610941F,Pops and stores 4 bytes at [ebp+%a] (the old value not freed) +2,0xF3,3,FStR4,%a,1,0,0,0,,1,,st:f(%a):4,store_frame,0x661052F9,0x6610941F,Pops and stores 4 bytes at [ebp+%a] (the old value not freed) +2,0xF4,3,FStR8,%a,2,0,0,0,,2,,st:f(%a):8,store_frame,0x66109DDB,0x6610DF24,Pops and stores 8 bytes at [ebp+%a] (the old value not freed) +2,0xF5,3,FStR8,%a,2,0,0,0,,2,,st:f(%a):8,store_frame,0x66109DDB,0x6610DF24,Pops and stores 8 bytes at [ebp+%a] (the old value not freed) +2,0xF6,3,FStVar,%a,1,0,0,0,,1,,x:var_let:f(%a),store_frame,0x6610613D,0x6610A24F,Let of the popped Variant into [ebp+%a] (the source moves; an object source gives its default value) +2,0xF7,3,FStStr,%a,1,0,0,0,,1,,x:bstr_move:f(%a),store_frame,0x66105F45,0x6610A057,"Stores the popped String at [ebp+%a], freeing the old one (the string moves)" +2,0xF8,3,FStAd,%a,1,0,0,0,,1,,x:set_obj:f(%a),store_frame,0x6610604A,0x6610A15C,"Stores the popped object at [ebp+%a], AddRef'd, Releasing the old one" +2,0xF9,3,FStFPR4,%a,0,0,1,0,,f,,stfp:f(%a):4,store_frame,0x6610530E,0x66109434,Stores ST0 as an 4-byte float at [ebp+%a] +2,0xFA,3,FStFPR8,%a,0,0,1,0,,f,,stfp:f(%a):8,store_frame,0x6610532D,0x66109453,Stores ST0 as an 8-byte float at [ebp+%a] +2,0xFB,3,FStVarAd,%a,1,0,0,0,,1,,x:set_var9:f(%a),store_frame,0x6610B3F1,0x6610F54D,"Sets the Variant at [ebp+%a] to the popped object (VT_DISPATCH, AddRef'd)" +2,0xFC,3,FStVarAdFunc,%a,1,0,0,0,,1,,x:set_var9_owned:f(%a),store_frame,0x66106061,0x6610A173,"Sets the Variant at [ebp+%a] to the popped object (VT_DISPATCH, not AddRef'd)" +2,0xFD,3,FStVarUnk,%a,1,0,0,0,,1,,x:set_var13:f(%a),store_frame,0x6610B507,0x6610F663,Sets the Variant at [ebp+%a] to the popped IUnknown (AddRef'd) +2,0xFE,3,FStVarUnkFunc,%a,1,0,0,0,,1,,x:set_var13_owned:f(%a),store_frame,0x6610B4F1,0x6610F64D,Sets the Variant at [ebp+%a] to the popped IUnknown (not AddRef'd) +2,0xFF,3,FStAdFunc,%a,1,0,0,0,,1,,x:set_obj_owned:f(%a),store_frame,0x66106024,0x6610A136,"Stores the popped object at [ebp+%a] without AddRef, Releasing the old one" +3,0x00,3,FStVarCopy,%a,1,0,0,0,,1,,x:var_copy:f(%a),store_frame,0x661060E3,0x6610A1F5,"Copies the popped Variant into [ebp+%a] (strings, objects and arrays duplicated)" +3,0x01,3,FStStrCopy,%a,1,0,0,0,,1,,x:bstr_copy:f(%a),store_frame,0x66105F63,0x6610A075,"Stores a copy of the String at [ebp+%a], freeing the old one" +3,0x02,1,HardType,,1,1,0,0,,1,,,convert,0x6610510F,0x6610924F,Pop ptr; verify/cast COM type; push validated ptr +3,0x03,3,Branch,%l,0,0,0,0,,,,,branch,0x66104DDD,0x66108F35,Unconditional branch; target = pcode_base + zx(u16 operand) +3,0x04,3,BranchF,%l,1,0,0,0,,1,,,branch_cond,0x66104E04,0x66108F5C,Pops a Boolean and jumps to %l when its low 16 bits are 0 +3,0x05,3,BranchFVar,%l,1,0,0,0,,1,,,branch_cond,0x6610925D,0x6610D36D,Pops a Variant's address; jumps to %l when it is False +3,0x06,3,BranchFVarFree,%l,1,0,0,0,,1,,,branch_cond,0x66109285,0x6610D395,Pops a Variant's address; clears it; jumps to %l when it was False +3,0x07,3,BranchT,%l,1,0,0,0,,1,,,branch_cond,0x66104DEF,0x66108F47,Pops a Boolean and jumps to %l when its low 16 bits are not 0 +3,0x08,3,BranchTVar,%l,1,0,0,0,,1,,,branch_cond,0x66109278,0x6610D388,Pops a Variant's address; jumps to %l when it is True +3,0x09,3,BranchTVarFree,%l,1,0,0,0,,1,,,branch_cond,0x661092A7,0x6610D3B7,Pops a Variant's address; clears it; jumps to %l when it was True +3,0x0A,3,Gosub,%l,0,1,0,0,,,,,gosub,0x66104D96,0x66108EEE,GoSub: pushes the return position on the evaluation stack; jumps to %l +3,0x0B,3,OnErrorGoto,%l,0,0,0,0,,,,,on_error,0x66105E46,0x66109F58,Sets the error handler to %l; falls through +3,0x0C,3,Resume,%l,0,0,0,0,,,,,resume,0x6610B0B6,0x6610F212,"Resume label (%l), or the sentinels 0xFFFF (Resume Next) and 0xFFFE (Resume)" +3,0x0D,3,AryLock,%a,1,1,0,0,,1,,,stack,0x66104CD2,0x66108E2A,Locks the SAFEARRAY on top of the stack (left there) and records it at frame %a +3,0x0E,3,AryUnlock,%a,0,0,0,0,,,,,stack,0x66104D00,0x66108E58,Unlocks the SAFEARRAY recorded at frame %a and clears the slot +3,0x0F,3,AryDescTemp,%a,1,1,0,0,,1,,,stack,0x6610903A,0x6610D14A,Pops the data pointer into the array descriptor at frame %a; pushes the descriptor's address +3,0x10,3,ILdUI1,%a,0,1,0,0,,,,ld:fi(%a):1z,load_ind,0x6610A36A,0x6610E4B3,"Pushes the 1 bytes at where the pointer at [ebp+%a] points, zero-extended" +3,0x11,3,ILdI2,%a,0,1,0,0,,,,ld:fi(%a):2u,load_ind,0x66105651,0x66109777,Pushes the 2 bytes at where the pointer at [ebp+%a] points (the rest of the slot undefined) +3,0x12,3,ILdAd,%a,0,1,0,0,,,,ld:fi(%a):4,load_ind,0x6610566B,0x66109791,Pushes the 4 bytes at where the pointer at [ebp+%a] points +3,0x13,3,ILdAd,%a,0,1,0,0,,,,ld:fi(%a):4,load_ind,0x6610566B,0x66109791,Pushes the 4 bytes at where the pointer at [ebp+%a] points +3,0x14,3,ILdR8,%a,0,2,0,0,,,,ld:fi(%a):8,load_ind,0x6610A384,0x6610E4CD,Pushes the 8 bytes at where the pointer at [ebp+%a] points +3,0x15,3,ILdR8,%a,0,2,0,0,,,,ld:fi(%a):8,load_ind,0x6610A384,0x6610E4CD,Pushes the 8 bytes at where the pointer at [ebp+%a] points +3,0x16,5,ILdRfDarg,%a %a,0,1,0,0,,,,x:ad_varg:fi(%a):f(%a#2),load_ind,0x66105EAE,0x66109FC0,Pushes the address of the Variant at where the pointer at [ebp+%a] points (or of the one it references) +3,0x17,3,ILdAd,%a,0,1,0,0,,,,ld:fi(%a):4,load_ind,0x6610566B,0x66109791,Pushes the 4 bytes at where the pointer at [ebp+%a] points +3,0x18,3,ILdAd,%a,0,1,0,0,,,,ld:fi(%a):4,load_ind,0x6610566B,0x66109791,Pushes the 4 bytes at where the pointer at [ebp+%a] points +3,0x19,3,ILdFPR4,%a,0,0,0,1,,,,ldfp:fi(%a):4,load_ind,0x66105683,0x661097A9,Loads the 4-byte float at where the pointer at [ebp+%a] points onto the x87 stack +3,0x1A,3,ILdFPR8,%a,0,0,0,1,,,,ldfp:fi(%a):8,load_ind,0x6610A39F,0x6610E4E8,Loads the 8-byte float at where the pointer at [ebp+%a] points onto the x87 stack +3,0x1B,3,ILdPr,%a,0,0,0,0,,,>pr:indirect,prn:fi(%a),load_ind,0x66105F33,0x6610A045,Loads Pr with the object at where the pointer at [ebp+%a] points; error 91 when it is Nothing +3,0x1C,3,FLdR4,%a,0,1,0,0,,,,ld:f(%a):4,load_ind,0x66105260,0x66109386,Pushes the 4 bytes at [ebp+%a] +3,0x1D,3,ILdDarg,%a,0,4,0,0,,,,x:ld_varg:fi(%a),load_ind,0x6610B1D4,0x6610F330,"Pushes the Variant at where the pointer at [ebp+%a] points by value, as a reference when it is not one" +3,0x1E,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x1F,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x20,3,IStUI1,%a,1,0,0,0,,1,,st:fi(%a):1,store_ind,0x6610A3B7,0x6610E500,Pops and stores 1 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x21,3,IStI2,%a,1,0,0,0,,1,,st:fi(%a):2,store_ind,0x6610569B,0x661097C1,Pops and stores 2 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x22,3,IStI4,%a,1,0,0,0,,1,,st:fi(%a):4,store_ind,0x6610A3D0,0x6610E519,Pops and stores 4 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x23,3,IStI4,%a,1,0,0,0,,1,,st:fi(%a):4,store_ind,0x6610A3D0,0x6610E519,Pops and stores 4 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x24,3,IStR8,%a,2,0,0,0,,2,,st:fi(%a):8,store_ind,0x6610A3E8,0x6610E531,Pops and stores 8 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x25,3,IStR8,%a,2,0,0,0,,2,,st:fi(%a):8,store_ind,0x6610A3E8,0x6610E531,Pops and stores 8 bytes at where the pointer at [ebp+%a] points (the old value not freed) +3,0x26,3,IStDarg,%a,1,0,0,0,,1,,x:varg_let:fi(%a),store_ind,0x6610B78A,0x6610F8FB,"Stores the popped Variant through the by-reference argument at where the pointer at [ebp+%a] points, freeing the source" +3,0x27,3,IStStr,%a,1,0,0,0,,1,,x:bstr_move:fi(%a),store_ind,0x66105F84,0x6610A096,"Stores the popped String at where the pointer at [ebp+%a] points, freeing the old one (the string moves)" +3,0x28,3,IStAd,%a,1,0,0,0,,1,,x:set_obj:fi(%a),store_ind,0x6610B38F,0x6610F4EB,"Stores the popped object at where the pointer at [ebp+%a] points, AddRef'd, Releasing the old one" +3,0x29,3,IStFPR4,%a,0,0,1,0,,f,,stfp:fi(%a):4,store_ind,0x6610A403,0x6610E54C,Stores ST0 as an 4-byte float at where the pointer at [ebp+%a] points +3,0x2A,3,IStFPR8,%a,0,0,1,0,,f,,stfp:fi(%a):8,store_ind,0x6610A425,0x6610E56E,Stores ST0 as an 8-byte float at where the pointer at [ebp+%a] points +3,0x2B,3,IStDargAd,%a,1,0,0,0,,1,,x:set_varg9:fi(%a),store_ind,0x6610B442,0x6610F59E,Sets the by-reference Variant at where the pointer at [ebp+%a] points to the popped object (AddRef'd) +3,0x2C,3,IStDargAdFunc,%a,1,0,0,0,,1,,x:set_varg9_owned:fi(%a),store_ind,0x6610B3F8,0x6610F554,Sets the by-reference Variant at where the pointer at [ebp+%a] points to the popped object +3,0x2D,3,IStDargUnk,%a,1,0,0,0,,1,,x:set_varg13:fi(%a),store_ind,0x6610B5D8,0x6610F734,Sets the by-reference Variant at where the pointer at [ebp+%a] points to the popped IUnknown (AddRef'd) +3,0x2E,3,IStDargUnkFunc,%a,1,0,0,0,,1,,x:set_varg13_owned:fi(%a),store_ind,0x6610B566,0x6610F6C2,Sets the by-reference Variant at where the pointer at [ebp+%a] points to the popped IUnknown +3,0x2F,3,IStAdFunc,%a,1,0,0,0,,1,,x:set_obj_owned:fi(%a),store_ind,0x66105FE0,0x6610A0F2,"Stores the popped object at where the pointer at [ebp+%a] points without AddRef, Releasing the old one" +3,0x30,3,IStDargCopy,%a,1,0,0,0,,1,,x:varg_copy:fi(%a),store_ind,0x6610B77A,0x6610F8EB,Stores a copy of the popped Variant through the by-reference argument at where the pointer at [ebp+%a] points +3,0x31,3,IStStrCopy,%a,1,0,0,0,,1,,x:bstr_copy:fi(%a),store_ind,0x66105F91,0x6610A0A3,"Stores a copy of the String at where the pointer at [ebp+%a] points, freeing the old one" +3,0x32,1,PrintChan,,1,0,0,0,,1,,,io,0x66109A57,0x6610DBA0,Pop file number; set print channel for subsequent Print ops +3,0x33,1,WriteChan,,1,0,0,0,,1,,,io,0x66109A68,0x6610DBB1,Pop file number; set write channel for Write# statement +3,0x34,1,PrintComma,,0,0,0,0,,,,,io,0x6610B890,0x6610FA01,Print comma separator (advance to next print zone) +3,0x35,1,PrintEos,,0,0,0,0,,,,,io,0x6610B85D,0x6610F9CE,Print end-of-statement; finalize current Print# line +3,0x36,1,PrintNL,,0,0,0,0,,,,,io,0x6610B8AD,0x6610FA1E,Print newline; output CR+LF +3,0x37,1,PrintItemComma,,1,0,0,0,,1,,,io,0x6610B82A,0x6610F99B,Pop value; print it; followed by comma separator +3,0x38,1,PrintItemSemi,,1,0,0,0,,1,,,io,0x6610B84C,0x6610F9BD,Pop value; print it; followed by semicolon (no separator) +3,0x39,1,PrintItemNL,,1,0,0,0,,1,,,io,0x6610B83B,0x6610F9AC,Pop value; print it; followed by newline +3,0x3A,3,PrintObj,%a,0,0,0,0,,,pr,,io,0x6610B8B5,0x6610FA26,Queries Pr for the interface {000204F0-0000-0000-C000-000000000046} (helper 0x660e7df5 in 8176) and stores it at frame %a +3,0x3B,1,PrintSpc,,1,0,0,0,,1,,,io,0x6610B86E,0x6610F9DF,Pop count; output Spc(n) spaces +3,0x3C,1,PrintTab,,1,0,0,0,,1,,,io,0x6610B87F,0x6610F9F0,Pop column; Tab(n) to column position +3,0x3D,1,Close,,1,0,0,0,,1,,,io,0x6610522D,0x66109353,Pop file number; Close file +3,0x3E,1,CloseAll,,0,0,0,0,,,,,io,0x66109A43,0x6610DB8C,Close all open files; no stack effect +3,0x3F,3,FLdZeroAd,%a,0,1,0,0,,,,x:zero_source:f(%a),load_lit,0x66105275,0x6610939B,Pushes the 4 bytes at [ebp+%a] and zeroes them (the reference moves to the stack) +3,0x40,3,IWMemLdUI1,%2,0,1,0,0,,,,ld:wi(%2):1z,load_mem,0x6610A447,0x6610E590,"Pushes the 1 bytes at where the pointer at [[ebp+0x10]+%2] points, zero-extended" +3,0x41,3,IWMemLdI2,%2,0,1,0,0,,,,ld:wi(%2):2u,load_mem,0x6610A462,0x6610E5AB,Pushes the 2 bytes at where the pointer at [[ebp+0x10]+%2] points (the rest of the slot undefined) +3,0x42,3,IWMemLdI4,%2,0,1,0,0,,,,ld:wi(%2):4,load_mem,0x6610A47D,0x6610E5C6,Pushes the 4 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x43,3,IWMemLdI4,%2,0,1,0,0,,,,ld:wi(%2):4,load_mem,0x6610A47D,0x6610E5C6,Pushes the 4 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x44,3,IWMemLdCy,%2,0,2,0,0,,,,ld:wi(%2):8,load_mem,0x6610A496,0x6610E5DF,Pushes the 8 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x45,3,IWMemLdCy,%2,0,2,0,0,,,,ld:wi(%2):8,load_mem,0x6610A496,0x6610E5DF,Pushes the 8 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x46,5,IWMemLdRfDarg,%2 %a,0,1,0,0,,,,x:ad_varg:wi(%2):f(%a),load_mem,0x6610B1F1,0x6610F34D,Pushes the address of the Variant at where the pointer at [[ebp+0x10]+%2] points (or of the one it references) +3,0x47,3,IWMemLdI4,%2,0,1,0,0,,,,ld:wi(%2):4,load_mem,0x6610A47D,0x6610E5C6,Pushes the 4 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x48,3,IWMemLdI4,%2,0,1,0,0,,,,ld:wi(%2):4,load_mem,0x6610A47D,0x6610E5C6,Pushes the 4 bytes at where the pointer at [[ebp+0x10]+%2] points +3,0x49,3,IWMemLdFPR4,%2,0,0,0,1,,,,ldfp:wi(%2):4,load_mem,0x6610A4B2,0x6610E5FB,Loads the 4-byte float at where the pointer at [[ebp+0x10]+%2] points onto the x87 stack +3,0x4A,3,IWMemLdFPR8,%2,0,0,0,1,,,,ldfp:wi(%2):8,load_mem,0x6610A4CB,0x6610E614,Loads the 8-byte float at where the pointer at [[ebp+0x10]+%2] points onto the x87 stack +3,0x4B,3,IWMemLdPr,%2,0,0,0,0,,,>pr:with,prn:w(%2),load_mem,0x6610B224,0x6610F380,Loads Pr with the object at [[ebp+0x10]+%2]; error 91 when it is Nothing +3,0x4C,3,IWMemLdRf,%2,0,1,0,0,,,,ld:w(%2):4,load_mem,0x6610A4E4,0x6610E62D,Pushes the 4 bytes at [[ebp+0x10]+%2] +3,0x4D,3,IWMemLdDarg,%2,0,4,0,0,,,,x:ld_varg:wi(%2),load_mem,0x6610B1B9,0x6610F315,"Pushes the Variant at where the pointer at [[ebp+0x10]+%2] points by value, as a reference when it is not one" +3,0x4E,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x4F,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x50,3,IWMemStUI1,%2,1,0,0,0,,1,,st:wi(%2):1,store_mem,0x6610A4FC,0x6610E645,Pops and stores 1 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x51,3,IWMemStI2,%2,1,0,0,0,,1,,st:wi(%2):2,store_mem,0x6610A516,0x6610E65F,Pops and stores 2 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x52,3,IWMemStR4,%2,1,0,0,0,,1,,st:wi(%2):4,store_mem,0x6610A531,0x6610E67A,Pops and stores 4 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x53,3,IWMemStR4,%2,1,0,0,0,,1,,st:wi(%2):4,store_mem,0x6610A531,0x6610E67A,Pops and stores 4 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x54,3,IWMemStCy,%2,2,0,0,0,,2,,st:wi(%2):8,store_mem,0x6610A54A,0x6610E693,Pops and stores 8 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x55,3,IWMemStCy,%2,2,0,0,0,,2,,st:wi(%2):8,store_mem,0x6610A54A,0x6610E693,Pops and stores 8 bytes at where the pointer at [[ebp+0x10]+%2] points (the old value not freed) +3,0x56,3,IWMemStDarg,%2,1,0,0,0,,1,,x:varg_let:wi(%2),store_mem,0x6610B7B4,0x6610F925,"Stores the popped Variant through the by-reference argument at where the pointer at [[ebp+0x10]+%2] points, freeing the source" +3,0x57,3,IWMemStStr,%2,1,0,0,0,,1,,x:bstr_move:wi(%2),store_mem,0x6610B28C,0x6610F3E8,"Stores the popped String at where the pointer at [[ebp+0x10]+%2] points, freeing the old one (the string moves)" +3,0x58,3,IWMemStAd,%2,1,0,0,0,,1,,x:set_obj:wi(%2),store_mem,0x6610B3AB,0x6610F507,"Stores the popped object at where the pointer at [[ebp+0x10]+%2] points, AddRef'd, Releasing the old one" +3,0x59,3,IWMemStFPR4,%2,0,0,1,0,,f,,stfp:wi(%2):4,store_mem,0x6610A566,0x6610E6AF,Stores ST0 as an 4-byte float at where the pointer at [[ebp+0x10]+%2] points +3,0x5A,3,IWMemStFPR8,%2,0,0,1,0,,f,,stfp:wi(%2):8,store_mem,0x6610A589,0x6610E6D2,Stores ST0 as an 8-byte float at where the pointer at [[ebp+0x10]+%2] points +3,0x5B,3,IWMemStDargAd,%2,1,0,0,0,,1,,x:set_varg9:wi(%2),store_mem,0x6610B458,0x6610F5B4,Sets the by-reference Variant at where the pointer at [[ebp+0x10]+%2] points to the popped object (AddRef'd) +3,0x5C,3,IWMemStDargAdFunc,%2,1,0,0,0,,1,,x:set_varg9_owned:wi(%2),store_mem,0x6610B446,0x6610F5A2,Sets the by-reference Variant at where the pointer at [[ebp+0x10]+%2] points to the popped object +3,0x5D,3,IWMemStDargUnk,%2,1,0,0,0,,1,,x:set_varg13:wi(%2),store_mem,0x6610B60A,0x6610F766,Sets the by-reference Variant at where the pointer at [[ebp+0x10]+%2] points to the popped IUnknown (AddRef'd) +3,0x5E,3,IWMemStDargUnkFunc,%2,1,0,0,0,,1,,x:set_varg13_owned:wi(%2),store_mem,0x6610B5F5,0x6610F751,Sets the by-reference Variant at where the pointer at [[ebp+0x10]+%2] points to the popped IUnknown +3,0x5F,3,IWMemStAdFunc,%2,1,0,0,0,,1,,x:set_obj_owned:wi(%2),store_mem,0x6610B396,0x6610F4F2,"Stores the popped object at where the pointer at [[ebp+0x10]+%2] points without AddRef, Releasing the old one" +3,0x60,3,IWMemStDargCopy,%2,1,0,0,0,,1,,x:varg_copy:wi(%2),store_mem,0x6610B791,0x6610F902,Stores a copy of the popped Variant through the by-reference argument at where the pointer at [[ebp+0x10]+%2] points +3,0x61,3,IWMemStStrCopy,%2,1,0,0,0,,1,,x:bstr_copy:wi(%2),store_mem,0x6610B2AC,0x6610F408,"Stores a copy of the String at where the pointer at [[ebp+0x10]+%2] points, freeing the old one" +3,0x62,3,FLdZeroAd,%a,0,1,0,0,,,,x:zero_source:f(%a),load_lit,0x66105275,0x6610939B,Pushes the 4 bytes at [ebp+%a] and zeroes them (the reference moves to the stack) +3,0x63,3,FStVarNoPop,%a,0,0,0,0,,,,x:var_copy_keep:f(%a),store_frame,0x6610B6F0,0x6610F84C,"Copies the popped Variant into [ebp+%a] (strings, objects and arrays duplicated); the value stays on the stack" +3,0x64,3,FStStrNoPop,%a,0,0,0,0,,,,x:bstr_move_keep:f(%a),store_frame,0x66105F41,0x6610A053,"Stores the popped String at [ebp+%a], freeing the old one (the string moves); the value stays on the stack" +3,0x65,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x66,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x67,3,CVarUI1,%a,1,1,0,0,,1,,,convert,0x66109787,0x6610D8B6,UI1 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0x68,3,CVarI2,%a,1,1,0,0,,1,,,convert,0x66105071,0x661091B1,I2 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0x69,3,CVarI4,%a,1,1,0,0,,1,,,convert,0x661050B8,0x661091F8,I4 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0x6A,3,CVarR4,%a,0,1,1,0,,f,,,convert,0x661050BE,0x661091FE,R4 to Variant: pops the value (ST0); builds the Variant in the frame temp %a and pushes its address +3,0x6B,3,CVarR8,%a,0,1,1,0,,f,,,convert,0x661050E5,0x66109225,R8 to Variant: pops the value (ST0); builds the Variant in the frame temp %a and pushes its address +3,0x6C,3,CVarCy,%a,2,1,0,0,,2,,,convert,0x661097E7,0x6610D916,Cy to Variant: pops the value (two slots); builds the Variant in the frame temp %a and pushes its address +3,0x6D,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x6E,3,CVarStr,%a,1,1,0,0,,1,,,convert,0x661050B2,0x661091D8,Str to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0x6F,3,CVarAd,%a,1,1,0,0,,1,,,convert,0x66105092,0x661091D2,Ad to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0x70,3,MemLdUI1,%2,0,1,0,0,,,pr,ld:pr(%2):1z,load_mem,0x6610AE3C,0x6610EF98,"Pushes the 1 bytes at [Pr+%2], zero-extended" +3,0x71,3,MemLdI2,%2,0,1,0,0,,,pr,ld:pr(%2):2z,load_mem,0x66105BDA,0x66109CEC,"Pushes the 2 bytes at [Pr+%2], zero-extended" +3,0x72,3,MemLdR4,%2,0,1,0,0,,,pr,ld:pr(%2):4,load_mem,0x66105BF4,0x66109D06,Pushes the 4 bytes at [Pr+%2] +3,0x73,3,MemLdR4,%2,0,1,0,0,,,pr,ld:pr(%2):4,load_mem,0x66105BF4,0x66109D06,Pushes the 4 bytes at [Pr+%2] +3,0x74,3,MemLdR8,%2,0,2,0,0,,,pr,ld:pr(%2):8,load_mem,0x6610AE56,0x6610EFB2,Pushes the 8 bytes at [Pr+%2] +3,0x75,3,MemLdR8,%2,0,2,0,0,,,pr,ld:pr(%2):8,load_mem,0x6610AE56,0x6610EFB2,Pushes the 8 bytes at [Pr+%2] +3,0x76,3,MemLdRfVar,%2,0,1,0,0,,,pr,ad:pr(%2),load_mem,0x66105C0C,0x66109D1E,Pushes the address of [Pr+%2] +3,0x77,3,MemLdR4,%2,0,1,0,0,,,pr,ld:pr(%2):4,load_mem,0x66105BF4,0x66109D06,Pushes the 4 bytes at [Pr+%2] +3,0x78,3,MemLdR4,%2,0,1,0,0,,,pr,ld:pr(%2):4,load_mem,0x66105BF4,0x66109D06,Pushes the 4 bytes at [Pr+%2] +3,0x79,3,MemLdFPR4,%2,0,0,0,1,,,pr,ldfp:pr(%2):4,load_mem,0x6610AE72,0x6610EFCE,Loads the 4-byte float at [Pr+%2] onto the x87 stack +3,0x7A,3,MemLdFPR8,%2,0,0,0,1,,,pr,ldfp:pr(%2):8,load_mem,0x6610AE8A,0x6610EFE6,Loads the 8-byte float at [Pr+%2] onto the x87 stack +3,0x7B,3,MemLdPr,%2,0,0,0,0,,,pr >pr:member,prn:pr(%2),load_mem,0x66105F0A,0x6610A01C,Loads Pr with the object at [Pr+%2]; error 91 when it is Nothing +3,0x7C,3,MemLdRfVar,%2,0,1,0,0,,,pr,ad:pr(%2),load_mem,0x66105C0C,0x66109D1E,Pushes the address of [Pr+%2] +3,0x7D,3,MemLdVar,%2,0,4,0,0,,,pr,ld:pr(%2):16,load_mem,0x6610B13D,0x6610F299,Pushes the 16 bytes at [Pr+%2] +3,0x7E,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x7F,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x80,3,MemStUI1,%2,1,0,0,0,,1,pr,st:pr(%2):1,store_mem,0x6610AEA2,0x6610EFFE,Pops and stores 1 bytes at [Pr+%2] (the old value not freed) +3,0x81,3,MemStI2,%2,1,0,0,0,,1,pr,st:pr(%2):2,store_mem,0x66105C24,0x66109D36,Pops and stores 2 bytes at [Pr+%2] (the old value not freed) +3,0x82,3,MemStR4,%2,1,0,0,0,,1,pr,st:pr(%2):4,store_mem,0x66105C3E,0x66109D50,Pops and stores 4 bytes at [Pr+%2] (the old value not freed) +3,0x83,3,MemStR4,%2,1,0,0,0,,1,pr,st:pr(%2):4,store_mem,0x66105C3E,0x66109D50,Pops and stores 4 bytes at [Pr+%2] (the old value not freed) +3,0x84,3,MemStCy,%2,2,0,0,0,,2,pr,st:pr(%2):8,store_mem,0x6610AEBB,0x6610F017,Pops and stores 8 bytes at [Pr+%2] (the old value not freed) +3,0x85,3,MemStCy,%2,2,0,0,0,,2,pr,st:pr(%2):8,store_mem,0x6610AEBB,0x6610F017,Pops and stores 8 bytes at [Pr+%2] (the old value not freed) +3,0x86,3,MemStVar,%2,1,0,0,0,,1,pr,x:var_let:pr(%2),store_mem,0x6610B743,0x6610F8B4,Let of the popped Variant into [Pr+%2] (the source moves; an object source gives its default value) +3,0x87,3,MemStStr,%2,1,0,0,0,,1,pr,x:bstr_move:pr(%2),store_mem,0x6610B2CC,0x6610F428,"Stores the popped String at [Pr+%2], freeing the old one (the string moves)" +3,0x88,3,MemStAd,%2,1,0,0,0,,1,pr,x:set_obj:pr(%2),store_mem,0x66105FF1,0x6610A103,"Stores the popped object at [Pr+%2], AddRef'd, Releasing the old one" +3,0x89,3,MemStFPR4,%2,0,0,1,0,,f,pr,stfp:pr(%2):4,store_mem,0x6610AED7,0x6610F033,Stores ST0 as an 4-byte float at [Pr+%2] +3,0x8A,3,MemStFPR8,%2,0,0,1,0,,f,pr,stfp:pr(%2):8,store_mem,0x6610AEF9,0x6610F055,Stores ST0 as an 8-byte float at [Pr+%2] +3,0x8B,3,MemStVarAd,%2,1,0,0,0,,1,pr,x:set_var9:pr(%2),store_mem,0x6610B488,0x6610F5E4,"Sets the Variant at [Pr+%2] to the popped object (VT_DISPATCH, AddRef'd)" +3,0x8C,3,MemStVarAdFunc,%2,1,0,0,0,,1,pr,x:set_var9_owned:pr(%2),store_mem,0x6610B473,0x6610F5CF,"Sets the Variant at [Pr+%2] to the popped object (VT_DISPATCH, not AddRef'd)" +3,0x8D,3,MemStVarUnk,%2,1,0,0,0,,1,pr,x:set_var13:pr(%2),store_mem,0x6610B524,0x6610F680,Sets the Variant at [Pr+%2] to the popped IUnknown (AddRef'd) +3,0x8E,3,MemStVarUnkFunc,%2,1,0,0,0,,1,pr,x:set_var13_owned:pr(%2),store_mem,0x6610B50B,0x6610F667,Sets the Variant at [Pr+%2] to the popped IUnknown (not AddRef'd) +3,0x8F,3,MemStAdFunc,%2,1,0,0,0,,1,pr,x:set_obj_owned:pr(%2),store_mem,0x6610B3C6,0x6610F522,"Stores the popped object at [Pr+%2] without AddRef, Releasing the old one" +3,0x90,3,MemStVarCopy,%2,1,0,0,0,,1,pr,x:var_copy:pr(%2),store_mem,0x6610B6E2,0x6610F83E,"Copies the popped Variant into [Pr+%2] (strings, objects and arrays duplicated)" +3,0x91,3,MemStStrCopy,%2,1,0,0,0,,1,pr,x:bstr_copy:pr(%2),store_mem,0x66105F9E,0x6610A0B0,"Stores a copy of the String at [Pr+%2], freeing the old one" +3,0x92,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x93,3,CDargRef,%2,1,4,0,0,,1,,,convert,0x66105151,0x66109291,Pops an address; pushes a by-reference Variant (vartype %2) by value (four slots) +3,0x94,5,CVarRef,%a %2,1,1,0,0,,1,,,convert,0x66105123,0x66109263,Pops an address; builds a by-reference Variant (vartype %2) in frame temp %a; pushes its address +3,0x95,3,ExitProcCb,%2,0,0,0,0,,,,,return,0x6610BF2B,0x6611009C,"Copies %2 bytes of the result (from ebp-0x84-%2, rounded down to even) to the hidden result pointer at [ebp+0xC]; returns that pointer in eax" +3,0x96,3,ExitProcCbStack,%2,0,0,0,0,,,,,return,0x6610BEAC,0x6611001D,"Returns the result at the top of the locals in al, ax, eax or edx:eax by the width code %2 (1, 2, 4, else 8)" +3,0x97,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x98,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0x99,3,FFree1Var,%a,0,0,0,0,,,,,stack,0x661061E2,0x6610A2E3,Clear Variant at [EBP+sext(op)]; __vbaVarClear +3,0x9A,3,FFree1Str,%a,0,0,0,0,,,,,stack,0x661061AF,0x6610A2B0,Free BSTR at [EBP+sext(op)]; SysFreeString + set NULL +3,0x9B,3,FFree1Ad,%a,0,0,0,0,,,,,stack,0x6610620E,0x6610A30F,Free COM obj at [EBP+sext(op)]; Release + set NULL +3,0x9C,3,FStAdNoPop,%a,0,0,0,0,,,,x:set_obj_keep:f(%a),store_frame,0x66106046,0x6610A158,"Stores the popped object at [ebp+%a], AddRef'd, Releasing the old one; the value stays on the stack" +3,0x9D,3,FStAdFuncNoPop,%a,0,0,0,0,,,,x:set_obj_owned_keep:f(%a),store_frame,0x66106020,0x6610A132,"Stores the popped object at [ebp+%a] without AddRef, Releasing the old one; the value stays on the stack" +3,0x9E,1,FLdPrThis,,0,0,0,0,,,me >pr:me,pr:f(8),load_frame,0x661052D0,0x661093F6,Loads Pr with the object at [ebp+8] +3,0x9F,1,LdPrVar,,1,0,0,0,,1,>pr:variant,prn:vdisp(pop),load_frame,0x66105369,0x6610948F,Loads Pr with the object at the popped Variant's object; error 91 when it is Nothing +3,0xA0,3,ImpAdLdUI1,%c,0,1,0,0,,,,ld:g(%c):1z,load_ind,0x6610A6F7,0x6610E840,"Pushes the 1 bytes at the variable pool entry %c addresses, zero-extended" +3,0xA1,3,ImpAdLdI2,%c,0,1,0,0,,,,ld:g(%c):2u,load_ind,0x661056B5,0x661097DB,Pushes the 2 bytes at the variable pool entry %c addresses (the rest of the slot undefined) +3,0xA2,3,ImpAdLdStr,%c,0,1,0,0,,,,ld:g(%c):4,load_ind,0x661056D1,0x661097F7,Pushes the 4 bytes at the variable pool entry %c addresses +3,0xA3,3,ImpAdLdStr,%c,0,1,0,0,,,,ld:g(%c):4,load_ind,0x661056D1,0x661097F7,Pushes the 4 bytes at the variable pool entry %c addresses +3,0xA4,3,ImpAdLdCy,%c,0,2,0,0,,,,ld:g(%c):8,load_ind,0x6610A713,0x6610E85C,Pushes the 8 bytes at the variable pool entry %c addresses +3,0xA5,3,ImpAdLdCy,%c,0,2,0,0,,,,ld:g(%c):8,load_ind,0x6610A713,0x6610E85C,Pushes the 8 bytes at the variable pool entry %c addresses +3,0xA6,3,ImpAdLdRf,%c,0,1,0,0,,,,ad:g(%c),load_ind,0x661056EB,0x66109811,Pushes the address of the variable pool entry %c addresses +3,0xA7,3,ImpAdLdStr,%c,0,1,0,0,,,,ld:g(%c):4,load_ind,0x661056D1,0x661097F7,Pushes the 4 bytes at the variable pool entry %c addresses +3,0xA8,3,ImpAdLdStr,%c,0,1,0,0,,,,ld:g(%c):4,load_ind,0x661056D1,0x661097F7,Pushes the 4 bytes at the variable pool entry %c addresses +3,0xA9,3,ImpAdLdFPR4,%c,0,0,0,1,,,,ldfp:g(%c):4,load_ind,0x6610A730,0x6610E879,Loads the 4-byte float at the variable pool entry %c addresses onto the x87 stack +3,0xAA,3,ImpAdLdFPR8,%c,0,0,0,1,,,,ldfp:g(%c):8,load_ind,0x6610A74A,0x6610E893,Loads the 8-byte float at the variable pool entry %c addresses onto the x87 stack +3,0xAB,3,ImpAdLdPr,%c,0,0,0,0,,,>pr:pool,prad:g(%c),load_ind,0x6610B234,0x6610F390,Loads Pr with the address of the variable pool entry %c addresses +3,0xAC,3,ImpAdLdRf,%c,0,1,0,0,,,,ad:g(%c),load_ind,0x661056EB,0x66109811,Pushes the address of the variable pool entry %c addresses +3,0xAD,3,ImpAdLdVar,%c,0,4,0,0,,,,ld:g(%c):16,load_ind,0x6610B167,0x6610F2C3,Pushes the 16 bytes at the variable pool entry %c addresses +3,0xAE,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0xAF,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0xB0,3,ImpAdStUI1,%c,1,0,0,0,,1,,st:g(%c):1,store_ind,0x6610A764,0x6610E8AD,Pops and stores 1 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB1,3,ImpAdStI2,%c,1,0,0,0,,1,,st:g(%c):2,store_ind,0x66105704,0x6610982A,Pops and stores 2 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB2,3,ImpAdStR4,%c,1,0,0,0,,1,,st:g(%c):4,store_ind,0x6610A77F,0x6610E8C8,Pops and stores 4 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB3,3,ImpAdStR4,%c,1,0,0,0,,1,,st:g(%c):4,store_ind,0x6610A77F,0x6610E8C8,Pops and stores 4 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB4,3,ImpAdStR8,%c,2,0,0,0,,2,,st:g(%c):8,store_ind,0x6610A799,0x6610E8E2,Pops and stores 8 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB5,3,ImpAdStR8,%c,2,0,0,0,,2,,st:g(%c):8,store_ind,0x6610A799,0x6610E8E2,Pops and stores 8 bytes at the variable pool entry %c addresses (the old value not freed) +3,0xB6,3,ImpAdStVar,%c,1,0,0,0,,1,,x:var_let:g(%c),store_ind,0x6610B716,0x6610F887,Let of the popped Variant into the variable pool entry %c addresses (the source moves; an object source gives its default value) +3,0xB7,3,ImpAdStStr,%c,1,0,0,0,,1,,x:bstr_move:g(%c),store_ind,0x6610B2DD,0x6610F439,"Stores the popped String at the variable pool entry %c addresses, freeing the old one (the string moves)" +3,0xB8,3,ImpAdStAd,%c,1,0,0,0,,1,,x:set_obj:g(%c),store_ind,0x6610B3D0,0x6610F52C,"Stores the popped object at the variable pool entry %c addresses, AddRef'd, Releasing the old one" +3,0xB9,3,ImpAdStFPR4,%c,0,0,1,0,,f,,stfp:g(%c):4,store_ind,0x6610A7B6,0x6610E8FF,Stores ST0 as an 4-byte float at the variable pool entry %c addresses +3,0xBA,3,ImpAdStFPR8,%c,0,0,1,0,,f,,stfp:g(%c):8,store_ind,0x6610A7DA,0x6610E923,Stores ST0 as an 8-byte float at the variable pool entry %c addresses +3,0xBB,3,ImpAdStVarAd,%c,1,0,0,0,,1,,x:set_var9:g(%c),store_ind,0x6610B4C7,0x6610F623,"Sets the Variant at the variable pool entry %c addresses to the popped object (VT_DISPATCH, AddRef'd)" +3,0xBC,3,ImpAdStVarAdFunc,%c,1,0,0,0,,1,,x:set_var9_owned:g(%c),store_ind,0x6610B4B1,0x6610F60D,"Sets the Variant at the variable pool entry %c addresses to the popped object (VT_DISPATCH, not AddRef'd)" +3,0xBD,3,ImpAdStVarUnk,%c,1,0,0,0,,1,,x:set_var13:g(%c),store_ind,0x6610B542,0x6610F69E,Sets the Variant at the variable pool entry %c addresses to the popped IUnknown (AddRef'd) +3,0xBE,3,ImpAdStVarUnkFunc,%c,1,0,0,0,,1,,x:set_var13_owned:g(%c),store_ind,0x6610B528,0x6610F684,Sets the Variant at the variable pool entry %c addresses to the popped IUnknown (not AddRef'd) +3,0xBF,3,ImpAdStAdFunc,%c,1,0,0,0,,1,,x:set_obj_owned:g(%c),store_ind,0x6610604E,0x6610A160,"Stores the popped object at the variable pool entry %c addresses without AddRef, Releasing the old one" +3,0xC0,3,ImpAdStVarCopy,%c,1,0,0,0,,1,,x:var_copy:g(%c),store_ind,0x6610B6D1,0x6610F82D,"Copies the popped Variant into the variable pool entry %c addresses (strings, objects and arrays duplicated)" +3,0xC1,3,ImpAdStStrCopy,%c,1,0,0,0,,1,,x:bstr_copy:g(%c),store_ind,0x6610B2EF,0x6610F44B,"Stores a copy of the String at the variable pool entry %c addresses, freeing the old one" +3,0xC2,3,PopTmpLdAd1,%a,1,1,0,0,,1,,st:f(%a):1+ad:f(%a),stack,0x6610BFC5,0x66110152,Pops the value into the frame temp %a (1) and pushes the temp's address +3,0xC3,3,PopTmpLdAd2,%a,1,1,0,0,,1,,st:f(%a):2+ad:f(%a),stack,0x66106546,0x6610A62B,Pops the value into the frame temp %a (2) and pushes the temp's address +3,0xC4,3,PopTmpLdAdStr,%a,1,1,0,0,,1,,st:f(%a):4+ad:f(%a),stack,0x6610655F,0x6610A644,Pops the value into the frame temp %a (String) and pushes the temp's address +3,0xC5,3,PopTmpLdAd8,%a,2,1,0,0,,1 1,,st:f(%a):8+ad:f(%a),stack,0x6610BFDD,0x6611016A,Pops the value into the frame temp %a (8) and pushes the temp's address +3,0xC6,3,PopTmpLdAdVar,%a,4,1,0,0,,4,,st:f(%a):16+ad:f(%a),stack,0x6610BFF7,0x66110184,Pops the value into the frame temp %a (Variant) and pushes the temp's address +3,0xC7,3,PopTmpLdAdStr,%a,1,1,0,0,,1,,st:f(%a):4+ad:f(%a),stack,0x6610655F,0x6610A644,Pops the value into the frame temp %a (String) and pushes the temp's address +3,0xC8,3,PopTmpLdAdFPR4,%a,0,1,1,0,,f,,stfp:f(%a):4+ad:f(%a),stack,0x6610C017,0x661101A4,Pops the value into the frame temp %a (Single (x87)) and pushes the temp's address +3,0xC9,3,PopTmpLdAdFPR8,%a,0,1,1,0,,f,,stfp:f(%a):8+ad:f(%a),stack,0x6610C038,0x661101C5,Pops the value into the frame temp %a (Double (x87)) and pushes the temp's address +3,0xCA,3,CopyBytes,%2,2,0,0,0,,1 1,,,stack,0x661099E3,0x6610DB2C,Pops destination then source; copies %2 bytes +3,0xCB,5,ExitForCollObj,%a %l,0,0,0,0,,,,,branch,0x6610A314,0x6610E45D,Exit For Each (collection/object); cleanup iterator; branch %l +3,0xCC,5,ExitForCollObj,%a %l,0,0,0,0,,,,,branch,0x6610A314,0x6610E45D,Exit For Each (duplicate slot); same handler +3,0xCD,5,ExitForCollObj,%a %l,0,0,0,0,,,,,branch,0x6610A314,0x6610E45D,Exit For Each (duplicate slot); same handler +3,0xCE,5,ExitForAryVar,%a %l,0,0,0,0,,,,,branch,0x6610A354,0x6610E49D,Exit For Each (array Variant); cleanup; branch %l; %a=frame +3,0xCF,5,ExitForVar,%a %l,0,0,0,0,,,,,branch,0x6610A344,0x6610E48D,Exit For (Variant counter); cleanup; branch %l; %a=frame +3,0xD0,5,FMemLdUI1,%a %2,0,1,0,0,,,,"ld:m(%a,%2):1z",load_mem,0x6610AF1B,0x6610F077,"Pushes the 1 bytes at [[ebp+%a]+%2], zero-extended" +3,0xD1,5,FMemLdI2,%a %2,0,1,0,0,,,,"ld:m(%a,%2):2u",load_mem,0x66105C57,0x66109D69,Pushes the 2 bytes at [[ebp+%a]+%2] (the rest of the slot undefined) +3,0xD2,5,FMemLdR4,%a %2,0,1,0,0,,,,"ld:m(%a,%2):4",load_mem,0x66105C7E,0x66109D90,Pushes the 4 bytes at [[ebp+%a]+%2] +3,0xD3,5,FMemLdR4,%a %2,0,1,0,0,,,,"ld:m(%a,%2):4",load_mem,0x66105C7E,0x66109D90,Pushes the 4 bytes at [[ebp+%a]+%2] +3,0xD4,5,FMemLdR8,%a %2,0,2,0,0,,,,"ld:m(%a,%2):8",load_mem,0x6610AF3D,0x6610F099,Pushes the 8 bytes at [[ebp+%a]+%2] +3,0xD5,5,FMemLdR8,%a %2,0,2,0,0,,,,"ld:m(%a,%2):8",load_mem,0x6610AF3D,0x6610F099,Pushes the 8 bytes at [[ebp+%a]+%2] +3,0xD6,5,FMemLdRf,%a %2,0,1,0,0,,,,"ad:m(%a,%2)",load_mem,0x66105CA3,0x66109DB5,Pushes the address of [[ebp+%a]+%2] +3,0xD7,5,FMemLdR4,%a %2,0,1,0,0,,,,"ld:m(%a,%2):4",load_mem,0x66105C7E,0x66109D90,Pushes the 4 bytes at [[ebp+%a]+%2] +3,0xD8,5,FMemLdR4,%a %2,0,1,0,0,,,,"ld:m(%a,%2):4",load_mem,0x66105C7E,0x66109D90,Pushes the 4 bytes at [[ebp+%a]+%2] +3,0xD9,5,FMemLdFPR4,%a %2,0,0,0,1,,,,"ldfp:m(%a,%2):4",load_mem,0x6610AF61,0x6610F0BD,Loads the 4-byte float at [[ebp+%a]+%2] onto the x87 stack +3,0xDA,5,FMemLdFPR8,%a %2,0,0,0,1,,,,"ldfp:m(%a,%2):8",load_mem,0x6610AF82,0x6610F0DE,Loads the 8-byte float at [[ebp+%a]+%2] onto the x87 stack +3,0xDB,5,FMemLdPr,%a %2,0,0,0,0,,,>pr:frame_member,"prn:m(%a,%2)",load_mem,0x66105F18,0x6610A02A,Loads Pr with the object at [[ebp+%a]+%2]; error 91 when it is Nothing +3,0xDC,5,FMemLdRf,%a %2,0,1,0,0,,,,"ad:m(%a,%2)",load_mem,0x66105CA3,0x66109DB5,Pushes the address of [[ebp+%a]+%2] +3,0xDD,5,FMemLdVar,%a %2,0,4,0,0,,,,"ld:m(%a,%2):16",load_mem,0x6610B14B,0x6610F2A7,Pushes the 16 bytes at [[ebp+%a]+%2] +3,0xDE,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0xDF,1,InvalidExcode,,0,0,0,0,,,,,,,, +3,0xE0,5,FMemStUI1,%a %2,1,0,0,0,,1,,"st:m(%a,%2):1",store_mem,0x6610AFAD,0x6610F109,Pops and stores 1 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE1,5,FMemStI2,%a %2,1,0,0,0,,1,,"st:m(%a,%2):2",store_mem,0x66105CC7,0x66109DD9,Pops and stores 2 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE2,5,FMemStR4,%a %2,1,0,0,0,,1,,"st:m(%a,%2):4",store_mem,0x66105CEE,0x66109E00,Pops and stores 4 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE3,5,FMemStR4,%a %2,1,0,0,0,,1,,"st:m(%a,%2):4",store_mem,0x66105CEE,0x66109E00,Pops and stores 4 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE4,5,FMemStR8,%a %2,2,0,0,0,,2,,"st:m(%a,%2):8",store_mem,0x6610AFCE,0x6610F12A,Pops and stores 8 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE5,5,FMemStR8,%a %2,2,0,0,0,,2,,"st:m(%a,%2):8",store_mem,0x6610AFCE,0x6610F12A,Pops and stores 8 bytes at [[ebp+%a]+%2] (the old value not freed) +3,0xE6,5,FMemStVar,%a %2,1,0,0,0,,1,,"x:var_let:m(%a,%2)",store_mem,0x6610B727,0x6610F898,Let of the popped Variant into [[ebp+%a]+%2] (the source moves; an object source gives its default value) +3,0xE7,5,FMemStStr,%a %2,1,0,0,0,,1,,"x:bstr_move:m(%a,%2)",store_mem,0x66105FAC,0x6610A0BE,"Stores the popped String at [[ebp+%a]+%2], freeing the old one (the string moves)" +3,0xE8,5,FMemStAd,%a %2,1,0,0,0,,1,,"x:set_obj:m(%a,%2)",store_mem,0x6610601C,0x6610A117,"Stores the popped object at [[ebp+%a]+%2], AddRef'd, Releasing the old one" +3,0xE9,5,FMemStFPR4,%a %2,0,0,1,0,,f,,"stfp:m(%a,%2):4",store_mem,0x6610AFF2,0x6610F14E,Stores ST0 as an 4-byte float at [[ebp+%a]+%2] +3,0xEA,5,FMemStFPR8,%a %2,0,0,1,0,,f,,"stfp:m(%a,%2):8",store_mem,0x6610B01D,0x6610F179,Stores ST0 as an 8-byte float at [[ebp+%a]+%2] +3,0xEB,5,FMemStVarAd,%a %2,1,0,0,0,,1,,"x:set_var9:m(%a,%2)",store_mem,0x6610B4AD,0x6610F609,"Sets the Variant at [[ebp+%a]+%2] to the popped object (VT_DISPATCH, AddRef'd)" +3,0xEC,5,FMemStVarAdFunc,%a %2,1,0,0,0,,1,,"x:set_var9_owned:m(%a,%2)",store_mem,0x6610B48C,0x6610F5E8,"Sets the Variant at [[ebp+%a]+%2] to the popped object (VT_DISPATCH, not AddRef'd)" +3,0xED,5,FMemStVarUnk,%a %2,1,0,0,0,,1,,"x:set_var13:m(%a,%2)",store_mem,0x6610B64E,0x6610F7AA,Sets the Variant at [[ebp+%a]+%2] to the popped IUnknown (AddRef'd) +3,0xEE,5,FMemStVarUnkFunc,%a %2,1,0,0,0,,1,,"x:set_var13_owned:m(%a,%2)",store_mem,0x6610B629,0x6610F785,Sets the Variant at [[ebp+%a]+%2] to the popped IUnknown (not AddRef'd) +3,0xEF,5,FMemStAdFunc,%a %2,1,0,0,0,,1,,"x:set_obj_owned:m(%a,%2)",store_mem,0x66105FFE,0x6610A110,"Stores the popped object at [[ebp+%a]+%2] without AddRef, Releasing the old one" +3,0xF0,5,FMemStVarCopy,%a %2,1,0,0,0,,1,,"x:var_copy:m(%a,%2)",store_mem,0x661060CA,0x6610A1DC,"Copies the popped Variant into [[ebp+%a]+%2] (strings, objects and arrays duplicated)" +3,0xF1,5,FMemStStrCopy,%a %2,1,0,0,0,,1,,"x:bstr_copy:m(%a,%2)",store_mem,0x66105FC6,0x6610A0D8,"Stores a copy of the String at [[ebp+%a]+%2], freeing the old one" +3,0xF2,3,CastAd,%c,1,1,0,0,,1,,,convert,0x66105D8D,0x66109E9F,Pop ptr; cast/validate COM interface; push validated ptr; %c=import +3,0xF3,3,CastAdVar,%c,1,1,0,0,,1,,,convert,0x66105D79,0x66109E8B,Pops a Variant's address; pushes its object cast to the interface in pool %c +3,0xF4,3,New,%c,0,1,0,0,,,,,stack,0x66105D13,0x66109E25,Create new COM object; %c=class import; push ptr +3,0xF5,3,NewIfNullRf,%c,1,1,0,0,,1,,,stack,0x6610B04C,0x6610F1A8,Pop ref; if null create new instance; push (non-null) ref +3,0xF6,3,NewIfNullAd,%c,1,1,0,0,,1,,,stack,0x66105D41,0x66109E53,Pop ptr; if null create new; push (non-null) ptr +3,0xF7,3,NewIfNullPr,%c,1,0,0,0,,1,>pr:new,,stack,0x66105D33,0x66109E45,Pops the address of an object variable; creates the class in pool %c when it is Nothing; loads the object into Pr +3,0xF8,3,CVarBoolI2,%a,1,1,0,0,,1,,,convert,0x66105063,0x661091A3,BoolI2 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0xF9,3,CVarDateVar,%a,1,1,0,0,,1,,,convert,0x661097CC,0x6610D8FB,DateVar to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0xFA,3,CVarErrI4,%a,1,1,0,0,,1,,,convert,0x66109790,0x6610D8BF,ErrI4 to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0xFB,3,CVarDate,%a,0,1,1,0,,f,,,convert,0x661097C2,0x6610D8F1,Date to Variant: pops the value (ST0); builds the Variant in the frame temp %a and pushes its address +3,0xFC,3,CVarAryVarg,%a,1,1,0,0,,1,,,convert,0x6610991A,0x6610DA49,AryVarg to Variant: pops the value (one slot); builds the Variant in the frame temp %a and pushes its address +3,0xFD,1,CStrVarTmp,,1,1,0,0,,1,,,convert,0x66104F71,0x661090C9,Variant to String: pops the Variant's address; result in one slot +3,0xFE,3,CStrVarVal,%a,1,1,0,0,,1,,,convert,0x66104F97,0x661090E8,"Pops a Variant's address; pushes its String: the BSTR it holds, else a copy converted by __vbaStrVarCopy into the frame temp %a" +3,0xFF,5,DestructOFrame,%a %s,0,0,0,0,,,,,stack,0x6610C079,0x66110206,Destroys the record at frame %a (descriptor in pool %s) +4,0x00,3,ThisVCallUI1,%2,0,1,0,0,callee,*,me,,call,0x6610BD32,0x6610FEA3,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x01,3,ThisVCallI2,%2,0,1,0,0,callee,*,me,,call,0x6610BCEE,0x6610FE5F,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x02,3,ThisVCallI2,%2,0,1,0,0,callee,*,me,,call,0x6610BCEE,0x6610FE5F,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x03,3,ThisVCallR4,%2,0,1,0,0,callee,*,me,,call,0x6610BC48,0x6610FDB9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x04,3,ThisVCallR8,%2,0,2,0,0,callee,*,me,,call,0x6610BC9B,0x6610FE0C,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x05,3,ThisVCallCy,%2,0,2,0,0,callee,*,me,,call,0x6610BC03,0x6610FD74,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x06,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x07,3,ThisVCallI2,%2,0,1,0,0,callee,*,me,,call,0x6610BCEE,0x6610FE5F,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x08,3,ThisVCallI2,%2,0,1,0,0,callee,*,me,,call,0x6610BCEE,0x6610FE5F,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x09,3,ThisVCallHidden,%2,0,0,0,0,callee,*,me,,call,0x6610BD78,0x6610FEE9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing +4,0x0A,3,ThisVCallHidden,%2,0,0,0,0,callee,*,me,,call,0x6610BD78,0x6610FEE9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing +4,0x0B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x0C,3,ThisVCallHidden,%2,0,0,0,0,callee,*,me,,call,0x6610BD78,0x6610FEE9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing +4,0x0D,5,ThisVCallCbFrame,%2 %2,0,0,0,0,callee,*,me,,call,0x6610BBC4,0x6610FD35,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; stores the result (width code %2) to a frame slot +4,0x0E,3,StLsetFixStr,%2,2,0,0,0,,1 1,,x:fixstr_lset:pop,store_frame,0x6610B377,0x6610F4D3,LSet of the popped String into the popped fixed-length string +4,0x0F,3,StFixedStrFree,%2,2,0,0,0,,1 1,,x:fixstr_lset_free:pop,store_frame,0x6610B35F,0x6610F4BB,"LSet of the popped String into the popped fixed-length string, then frees it" +4,0x10,3,VCallUI1,%2,0,1,0,0,callee,*,pr,,call,0x6610BE3C,0x6610FFAD,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x11,3,VCallStr,%2,0,1,0,0,callee,*,pr,,call,0x661063C8,0x6610A4C9,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x12,3,VCallStr,%2,0,1,0,0,callee,*,pr,,call,0x661063C8,0x6610A4C9,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x13,3,VCallR4,%2,0,1,0,0,callee,*,pr,,call,0x6610BE2C,0x6610FF9D,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x14,3,VCallR8,%2,0,2,0,0,callee,*,pr,,call,0x6610BE34,0x6610FFA5,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x15,3,VCallCy,%2,0,2,0,0,callee,*,pr,,call,0x6610BE24,0x6610FF95,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x16,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x17,3,VCallStr,%2,0,1,0,0,callee,*,pr,,call,0x661063C8,0x6610A4C9,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x18,3,VCallStr,%2,0,1,0,0,callee,*,pr,,call,0x661063C8,0x6610A4C9,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes the result +4,0x19,3,VCallFPR8,%2,0,0,0,c,callee,*,pr,,call,0x661063A1,0x6610A4A2,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +4,0x1A,3,VCallFPR8,%2,0,0,0,c,callee,*,pr,,call,0x661063A1,0x6610A4A2,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +4,0x1B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x1C,3,VCallFPR8,%2,0,0,0,c,callee,*,pr,,call,0x661063A1,0x6610A4A2,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +4,0x1D,5,VCallCbFrame,%2 %2,0,0,0,0,callee,*,pr,,call,0x6610BE1C,0x6610FF8D,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; stores the result (width code %2) to a frame slot +4,0x1E,3,StFixedStrR,%2,2,0,0,0,,1 1,,x:fixstr_rset:pop,store_frame,0x6610B347,0x6610F4A3,RSet of the popped String into the popped fixed-length string +4,0x1F,3,StFixedStrRFree,%2,2,0,0,0,,1 1,,x:fixstr_rset_free:pop,store_frame,0x6610B32F,0x6610F48B,"RSet of the popped String into the popped fixed-length string, then frees it" +4,0x20,5,ImpAdCallUI1,%x,0,1,0,0,arg_bytes(0),*,,,call,0x6610BB6B,0x6610FCDC,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +4,0x21,5,ImpAdCallI4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +4,0x22,5,ImpAdCallI4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +4,0x23,5,ImpAdCallR4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x6610BA22,0x6610FB93,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes the ST0 result as a Single +4,0x24,5,ImpAdCallR8,%x,0,2,0,0,arg_bytes(0),*,,,call,0x6610BA84,0x6610FBF5,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes the ST0 result as a Double +4,0x25,5,ImpAdCallCy,%x,0,2,0,0,arg_bytes(0),*,,,call,0x6610BAEA,0x6610FC5B,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes edx:eax +4,0x26,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x27,5,ImpAdCallI4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +4,0x28,5,ImpAdCallI4,%x,0,1,0,0,arg_bytes(0),*,,,call,0x661062CC,0x6610A3CD,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes eax +4,0x29,5,ImpAdCallFPR4,%x,0,0,0,c,arg_bytes(0),*,,,call,0x6610628E,0x6610A38F,"Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes nothing (the mnemonic is no type): ST0 holds the result of a Single, Double or Date callee, nothing of a Sub" +4,0x2A,5,ImpAdCallFPR4,%x,0,0,0,c,arg_bytes(0),*,,,call,0x6610628E,0x6610A38F,"Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes nothing (the mnemonic is no type): ST0 holds the result of a Single, Double or Date callee, nothing of a Sub" +4,0x2B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x2C,5,ImpAdCallFPR4,%x,0,0,0,c,arg_bytes(0),*,,,call,0x6610628E,0x6610A38F,"Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); pushes nothing (the mnemonic is no type): ST0 holds the result of a Single, Double or Date callee, nothing of a Sub" +4,0x2D,9,ImpAdCallCbFrame,%a %x %2,0,0,0,0,arg_bytes(1),*,,,call,0x6610B96E,0x6610FADF,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); stores eax to frame %a (width code) +4,0x2E,3,LdStkRf,%2,0,1,0,0,,,,ad:s(%2),stack,0x6610BF9B,0x6611010C,Load stack reference; push addr of stack slot at %2 offset +4,0x2F,3,LdFrameRf,%a,0,1,0,0,,,,ad:f(%a),load_frame,0x6610BFB0,0x66110121,Pushes the address of [ebp+%a] +4,0x30,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x31,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x32,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x33,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x34,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x35,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x36,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x37,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x38,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x39,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x3A,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x3B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x3C,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x3D,5,LitVarUI1,%a %2,0,1,0,0,,,,var:17=lit:f(%a),load_lit,0x6610AA8C,0x6610EBD5,Builds a Variant (vt 17 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0x3E,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x3F,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x40,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x41,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x42,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x43,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x44,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x45,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x46,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x47,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x48,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x49,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x4A,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x4B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x4C,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x4D,1,SetVarVar,,2,0,0,0,,1 1,,x:set_var_var:pop,store_ind,0x6610B665,0x6610F7C1,Set of the popped Variant to the next popped Variant's object (AddRef'd) +4,0x4E,1,SetVarVarFunc,,2,0,0,0,,1 1,,x:set_var_var_move:pop,store_ind,0x6610B652,0x6610F7AE,"Set of the popped Variant to the next popped Variant's object, emptying it" +4,0x4F,5,ImpAdCallHresult,%x,0,0,0,0,arg_bytes(0),*,,,call,0x6610B8FE,0x6610FA6F,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); checks the HRESULT +4,0x50,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x51,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x52,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x53,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x54,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x55,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x56,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x57,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x58,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x59,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x5A,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x5B,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x5C,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x5D,3,OpenFile,%2,3,0,0,0,,1 1 1,,,io,0x66105215,0x6610933B,"Open: pops the path, file number and record length; %2 holds mode and access" +4,0x5E,3,LockFile,%2,3,0,0,0,,1 1 1,,,io,0x66109D39,0x6610DE82,Lock/Unlock: pops the file number and the record range; %2 selects the form +4,0x5F,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x60,3,EraseDestruct,%s,1,0,0,0,,1,,,stack,0x66109143,0x6610D253,Erase array with destructor; %s=type desc; pop array ref +4,0x61,3,LdFixedStr,%2,1,1,0,0,,1,,x:bstr_from_fixed:pop,load_frame,0x6610B24F,0x6610F3AB,Pops a fixed-length string's address; pushes a new String of %2 characters +4,0x62,5,ForUI1,%a %l,3,0,0,0,,1 1 1,,,branch_cond,0x66109E39,0x6610DF82,For (Byte): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x63,5,ForI2,%a %l,3,0,0,0,,1 1 1,,,branch_cond,0x661053A4,0x661094CA,For (Integer): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x64,5,ForI4,%a %l,3,0,0,0,,1 1 1,,,branch_cond,0x66105477,0x6610959D,For (Long): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x65,5,ForR4,%a %l,1,0,2,0,,f 1 f,,,branch_cond,0x66109ED4,0x6610E01D,For (Single): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x66,5,ForR8,%a %l,1,0,2,0,,f 1 f,,,branch_cond,0x66109F42,0x6610E08B,For (Double): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x67,5,ForCy,%a %l,5,0,0,0,,2 1 2,,,branch_cond,0x66109F82,0x6610E0CB,For (Currency): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x68,5,ForVar,%a %l,3,0,0,0,,1 1 1,,,branch_cond,0x661054DF,0x66109605,For (Variant): pops the counter's address and the start and limit; saves limit and step at frame %a; jumps to %l when the loop does not run +4,0x69,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x6A,5,ForStepUI1,%a %l,4,0,0,0,,1 1 1 1,,,branch_cond,0x66109E3D,0x6610DF86,"For (Byte): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x6B,5,ForStepI2,%a %l,4,0,0,0,,1 1 1 1,,,branch_cond,0x66105402,0x66109528,"For (Integer): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x6C,5,ForStepI4,%a %l,4,0,0,0,,1 1 1 1,,,branch_cond,0x6610547B,0x661095A1,"For (Long): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x6D,5,ForStepR4,%a %l,1,0,3,0,,f f 1 f,,,branch_cond,0x66109ED8,0x6610E021,"For (Single): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x6E,5,ForStepR8,%a %l,1,0,3,0,,f f 1 f,,,branch_cond,0x66109F46,0x6610E08F,"For (Double): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x6F,5,ForStepCy,%a %l,7,0,0,0,,2 2 1 2,,,branch_cond,0x66109F8A,0x6610E0D3,"For (Currency): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x70,5,ForStepVar,%a %l,4,0,0,0,,1 1 1 1,,,branch_cond,0x661054EF,0x66109615,"For (Variant): pops the counter's address and the start, limit and step; saves limit and step at frame %a; jumps to %l when the loop does not run" +4,0x71,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x72,5,ForEachCollVar,%a %l,2,0,0,0,,1 1,,,branch_cond,0x6610A2A0,0x6610E3E9,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x73,5,NextEachCollVar,%a %l,1,0,0,0,,1,,,branch_cond,0x6610A2C0,0x6610E409,Next of For Each: pops the element's destination; advances the enumerator at frame %a; jumps to %l while elements remain +4,0x74,5,ForEachCollAd,%a %l,2,0,0,0,,1 1,,,branch_cond,0x661055ED,0x66109713,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x75,5,NextEachCollAd,%a %l,1,0,0,0,,1,,,branch_cond,0x6610A2C7,0x6610E410,Next of For Each: pops the element's destination; advances the enumerator at frame %a; jumps to %l while elements remain +4,0x76,7,ForEachAryVar,%a %2 %l,2,0,0,0,,1 1,,,branch_cond,0x6610A2DE,0x6610E427,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x77,7,NextEachAryVar,%a %2 %l,1,0,0,0,,1,,,branch_cond,0x6610A2F8,0x6610E441,Next of For Each: pops the element's destination; advances the enumerator at frame %a; jumps to %l while elements remain +4,0x78,5,NextUI1,%a %l,1,0,0,0,,1,,,branch_cond,0x66109E69,0x6610DFB2,"Next (Byte): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x79,5,NextI2,%a %l,1,0,0,0,,1,,,branch_cond,0x661053D3,0x661094F9,"Next (Integer): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7A,5,NextI4,%a %l,1,0,0,0,,1,,,branch_cond,0x661054B7,0x661095DD,"Next (Long): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7B,5,NextStepR4,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F1C,0x6610E065,"Next (Single): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7C,5,NextR8,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F6A,0x6610E0B3,"Next (Double): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7D,5,NextStepCy,%a %l,1,0,0,0,,1,,,branch_cond,0x66109FDA,0x6610E123,"Next (Currency): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7E,5,NextStepVar,%a %l,1,0,0,0,,1,,,branch_cond,0x6610551E,0x66109644,"Next (Variant): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x7F,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x80,5,NextStepUI1,%a %l,1,0,0,0,,1,,,branch_cond,0x66109E69,0x6610DFB2,"Next (Byte): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x81,5,NextStepI2,%a %l,1,0,0,0,,1,,,branch_cond,0x66105421,0x66109547,"Next (Integer): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x82,5,NextStepI4,%a %l,1,0,0,0,,1,,,branch_cond,0x66109EA1,0x6610DFEA,"Next (Long): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x83,5,NextStepR4,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F1C,0x6610E065,"Next (Single): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x84,5,NextR8,%a %l,1,0,0,0,,1,,,branch_cond,0x66109F6A,0x6610E0B3,"Next (Double): pops the counter's address, adds 1, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x85,5,NextStepCy,%a %l,1,0,0,0,,1,,,branch_cond,0x66109FDA,0x6610E123,"Next (Currency): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x86,5,NextStepVar,%a %l,1,0,0,0,,1,,,branch_cond,0x6610551E,0x66109644,"Next (Variant): pops the counter's address, adds its step, compares with the limit saved at frame %a; jumps to %l while the loop runs" +4,0x87,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x88,7,ForEachCollObj,%a %s %l,2,0,0,0,,1 1,,,branch_cond,0x661055FF,0x66109725,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x89,5,ForEachVar,%a %l,2,0,0,0,,1 1,,,branch_cond,0x6610A299,0x6610E3E2,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x8A,5,ForEachVarFree,%a %l,2,0,0,0,,1 1,,,branch_cond,0x6610A282,0x6610E3CB,For Each: pops the collection or array; starts the enumerator at frame %a; jumps to %l when it is empty +4,0x8B,7,NextEachCollObj,%a %s %l,1,0,0,0,,1,,,branch_cond,0x6610561B,0x66109741,Next of For Each: pops the element's destination; advances the enumerator at frame %a; jumps to %l while elements remain +4,0x8C,5,NextEachVar,%a %l,1,0,0,0,,1,,,branch_cond,0x6610A2A7,0x6610E3F0,Next of For Each: pops the element's destination; advances the enumerator at frame %a; jumps to %l while elements remain +4,0x8D,3,CheckType,%c,1,1,0,0,,1,,,compare,0x66105DBF,0x66109ED1,TypeOf..Is check; pop obj ptr; check against %c type; push i32 bool +4,0x8E,9,Redim,%2 %2 %2 %2,1,0,0,0,pairs1(0),* 1,,,stack,0x66104D26,0x66108E7E,"ReDim: %2 dims, vartype or record pool index, element size, features; pops the array's address and 2*max(dims,1) bounds" +4,0x8F,9,RedimPreserve,%2 %2 %2 %2,1,0,0,0,pairs1(0),* 1,,,stack,0x66109169,0x6610D279,"ReDim: %2 dims, vartype or record pool index, element size, features; pops the array's address and 2*max(dims,1) bounds" +4,0x90,5,RedimVar,%2 %2,1,0,0,0,pairs(0),* 1,,,stack,0x661091C3,0x6610D2D3,ReDim of a Variant array: pops the address and 2*dims bounds +4,0x91,5,RedimPreserveVar,%2 %2,1,0,0,0,pairs(0),* 1,,,stack,0x66109192,0x6610D2A2,ReDim of a Variant array: pops the address and 2*dims bounds +4,0x92,5,FDupVar,%a %a,0,0,0,0,,,,x:var_dup:f(%a#2):f(%a),load_frame,0x661060A9,0x6610A1BB,Duplicates the Variant into [ebp+%a] (__vbaVarDup) +4,0x93,5,FDupStr,%a %a,0,0,0,0,,,,x:bstr_copy:f(%a#2):f(%a),load_frame,0x6610B278,0x6610F3D4,"Stores a copy of the String at [ebp+%a], freeing the old one" +4,0x94,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0x95,-1,OnGosub,%L,1,1,0,0,,1,,,gosub,0x66109205,0x6610D315,"On n GoSub: pops n; jumps to the n-th target of the payload, pushing the return position; past the list it falls through" +4,0x96,-1,OnGoto,%L,1,0,0,0,,1,,,branch_cond,0x66109238,0x6610D348,On n GoTo: pops n; jumps to the n-th target of the payload; past the list it falls through +4,0x97,1,AddRef,,1,1,0,0,,1,,,stack,0x6610B811,0x6610F982,Pop COM ptr; AddRef; push same ptr back (increment ref count) +4,0x98,5,LateMemCall,%s %2,0,0,0,0,variants(1),*,pr,,call,0x661057D6,0x661098FC,Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value +4,0x99,5,LateMemLdVar,%a %s,0,1,0,0,,,pr,,call,0x6610578E,0x661098B4,"Late-bound IDispatch call on Pr by name (pool %s); result Variant in frame %a, whose address it pushes" +4,0x9A,7,LateMemCallLdVar,%a %s %2,0,1,0,0,variants(2),*,pr,,call,0x661057E9,0x6610990F,"Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value; result Variant in frame %a, whose address it pushes" +4,0x9B,3,LateMemSt,%s,4,0,0,0,,4,pr,,call,0x66105800,0x66109926,Late-bound IDispatch call on Pr by name (pool %s); pops the value Variant (by value) +4,0x9C,5,LateMemCallSt,%s %2,4,0,0,0,variants(1),4 *,pr,,call,0x6610584E,0x66109974,Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value; pops the value Variant (by value) +4,0x9D,5,LateMemStAd,%s %2,4,0,0,0,variants(1),4 *,pr,,call,0x6610583D,0x66109963,Late-bound IDispatch call on Pr by name (pool %s); pops the value Variant (by value) +4,0x9E,5,ExitProcFrameCb,%a %2,0,0,0,0,,,,,return,0x6610BEE4,0x66110055,Copies %2 bytes from frame %a to the hidden result pointer at [ebp+0xC]; returns that pointer in eax +4,0x9F,5,ExitProcFrameCbStack,%a %2,0,0,0,0,,,,,return,0x6610BE5F,0x6610FFD0,"Returns the value at frame %a in al, ax, eax or edx:eax by the width code %2 (1, 2, 4, else 8)" +4,0xA0,7,LateIdCall,%4 %2,0,0,0,0,variants(1),*,pr,,call,0x66105734,0x6610985A,Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value +4,0xA1,7,LateIdLdVar,%a %4,0,1,0,0,,,pr,,call,0x66105720,0x66109846,"Late-bound IDispatch call on Pr by DISPID %4; result Variant in frame %a, whose address it pushes" +4,0xA2,9,LateIdCallLdVar,%a %4 %2,0,1,0,0,variants(2),*,pr,,call,0x66105746,0x6610986C,"Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value; result Variant in frame %a, whose address it pushes" +4,0xA3,5,LateIdSt,%4,4,0,0,0,,4,pr,,call,0x6610575C,0x66109882,Late-bound IDispatch call on Pr by DISPID %4; pops the value Variant (by value) +4,0xA4,7,LateIdCallSt,%4 %2,4,0,0,0,variants(1),4 *,pr,,call,0x66105780,0x661098A6,Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value; pops the value Variant (by value) +4,0xA5,7,LateIdStAd,%4 %2,4,0,0,0,variants(1),4 *,pr,,call,0x6610576D,0x66109893,Late-bound IDispatch call on Pr by DISPID %4; pops the value Variant (by value) +4,0xA6,-1,LateMemNamedCall,%s %2 %N,0,0,0,0,variants(1),*,pr,,call,0x6610A964,0x6610EAAD,Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value; named arguments follow +4,0xA7,-1,LateMemNamedCallLdVar,%a %s %2 %N,0,1,0,0,variants(2),*,pr,,call,0x6610A99E,0x6610EAE7,"Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value; named arguments follow; result Variant in frame %a, whose address it pushes" +4,0xA8,-1,LateMemNamedCallSt,%s %2 %N,4,0,0,0,variants(1),4 *,pr,,call,0x6610A9BC,0x6610EB05,Late-bound IDispatch call on Pr by name (pool %s); argc Variants by value; named arguments follow; pops the value Variant (by value) +4,0xA9,-1,LateMemNamedStAd,%s %2 %N,4,0,0,0,variants(1),4 *,pr,,call,0x6610A9EA,0x6610EB33,Late-bound IDispatch call on Pr by name (pool %s); named arguments follow; pops the value Variant (by value) +4,0xAA,-1,LateIdNamedCall,%4 %2 %D,0,0,0,0,variants(1),*,pr,,call,0x6610A864,0x6610E9AD,Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value; named arguments follow +4,0xAB,-1,LateIdNamedCallLdVar,%a %4 %2 %D,0,1,0,0,variants(2),*,pr,,call,0x6610A89C,0x6610E9E5,"Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value; named arguments follow; result Variant in frame %a, whose address it pushes" +4,0xAC,-1,LateIdNamedCallSt,%4 %2 %D,4,0,0,0,variants(1),4 *,pr,,call,0x6610A8B9,0x6610EA02,Late-bound IDispatch call on Pr by DISPID %4; argc Variants by value; named arguments follow; pops the value Variant (by value) +4,0xAD,-1,LateIdNamedStAd,%4 %2 %D,4,0,0,0,variants(1),4 *,pr,,call,0x6610A8E5,0x6610EA2E,Late-bound IDispatch call on Pr by DISPID %4; named arguments follow; pops the value Variant (by value) +4,0xAE,5,VarIndexLdVar,%a %2,1,1,0,0,variants(1),1 *,,x:var_index_copy:pop:f(%a),load_ind,0x66104C5D,0x66108DB5,Copies an element of the popped Variant (popped indices) into a frame temp; pushes its address +4,0xAF,5,VarIndexLdRfVar,%a %2,1,1,0,0,variants(1),1 *,,x:var_index_ad:pop:f(%a),load_ind,0x66109079,0x6610D189,Pushes the address of an element of the popped Variant (popped indices) +4,0xB0,3,VarIndexSt,%2,5,0,0,0,variants(0),1 * 4,,x:var_index_let:pop,store_ind,0x66109086,0x6610D196,Let of the popped value into an element of the popped Variant +4,0xB1,3,VarIndexStAd,%2,5,0,0,0,variants(0),1 * 4,,x:var_index_set:pop,store_ind,0x661090B1,0x6610D1C1,Set of the popped value into an element of the popped Variant +4,0xB2,-1,FFreeVar,%F,0,0,0,0,,,,,stack,0x66106204,0x6610A305,Frees the frame slots listed in the payload (i16 offsets); no stack effect +4,0xB3,-1,FFreeStr,%F,0,0,0,0,,,,,stack,0x661061D8,0x6610A2D9,Frees the frame slots listed in the payload (i16 offsets); no stack effect +4,0xB4,-1,FFreeAd,%F,0,0,0,0,,,,,stack,0x6610623C,0x6610A33D,Frees the frame slots listed in the payload (i16 offsets); no stack effect +4,0xB5,3,LitI2,%2,0,1,0,0,,,,lit:2s,load_lit,0x661058D8,0x661099FE,"Pushes the 2-byte literal operand, sign-extended to a slot" +4,0xB6,3,LitI2FP,%2,0,0,0,1,,,,litfp:2i,load_lit,0x6610AA48,0x6610EB91,"Loads the 2-byte float literal onto the x87 stack (an integer, fild)" +4,0xB7,5,LitCy4,%4,0,2,0,0,,,,lit:4s8,load_lit,0x6610AA1E,0x6610EB67,"Pushes the 4-byte literal operand, sign-extended to 8 bytes (two slots)" +4,0xB8,5,LitI4,%4,0,1,0,0,,,,lit:4,load_lit,0x661058FE,0x66109A24,Pushes the 4-byte literal operand +4,0xB9,5,LitI4,%4,0,1,0,0,,,,lit:4,load_lit,0x661058FE,0x66109A24,Pushes the 4-byte literal operand +4,0xBA,5,LitR4FP,%4,0,0,0,1,,,,litfp:4,load_lit,0x6610AA59,0x6610EBA2,Loads the 4-byte float literal onto the x87 stack +4,0xBB,9,LitR8,%4 %4,0,2,0,0,,,,lit:8,load_lit,0x6610AA32,0x6610EB7B,Pushes the 8-byte literal operand +4,0xBC,9,LitR8,%4 %4,0,2,0,0,,,,lit:8,load_lit,0x6610AA32,0x6610EB7B,Pushes the 8-byte literal operand +4,0xBD,9,LitR8FP,%4 %4,0,0,0,1,,,,litfp:8,load_lit,0x6610591E,0x66109A44,Loads the 8-byte float literal onto the x87 stack +4,0xBE,9,LitR8FP,%4 %4,0,0,0,1,,,,litfp:8,load_lit,0x6610591E,0x66109A44,Loads the 8-byte float literal onto the x87 stack +4,0xBF,3,LitStr,%s,0,1,0,0,,,,pool:%s,load_lit,0x6610592F,0x66109A55,Pushes the constant pool entry %s itself (a BSTR literal; nothing copied) +4,0xC0,5,LitVarI2,%a %2,0,1,0,0,,,,var:2=lit:f(%a),load_lit,0x661059AE,0x66109AD4,Builds a Variant (vt 2 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC1,7,LitVarI4,%a %4,0,1,0,0,,,,var:3=lit:f(%a),load_lit,0x661059C5,0x66109AEB,Builds a Variant (vt 3 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC2,7,LitVarR4,%a %4,0,1,0,0,,,,var:4=lit:f(%a),load_lit,0x6610AAA5,0x6610EBEE,Builds a Variant (vt 4 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC3,11,LitVarCy,%a %4 %4,0,1,0,0,,,,var:6=lit:f(%a),load_lit,0x6610AAAF,0x6610EBF8,Builds a Variant (vt 6 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC4,11,LitVarR8,%a %4 %4,0,1,0,0,,,,var:5=lit:f(%a),load_lit,0x661059E0,0x66109B06,Builds a Variant (vt 5 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC5,11,LitVarDate,%a %4 %4,0,1,0,0,,,,var:7=lit:f(%a),load_lit,0x6610AAB9,0x6610EC02,Builds a Variant (vt 7 and the literal operand) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC6,5,LitVarStr,%a %s,0,1,0,0,,,,var:8=pool:f(%a),load_lit,0x66105987,0x66109AAD,Builds a Variant (vt 8 and pool entry %s (shared)) at [ebp+%a] and pushes its address (the old contents not freed) +4,0xC7,1,CStrBool,,1,1,0,0,,1,,,convert,0x66109635,0x6610D753,"Bool→Str; pop VB bool; convert to ""True""/""False"" BSTR; push" +4,0xC8,1,CStrDate,,0,1,1,0,,f,,,convert,0x66109669,0x6610D787,Date(FPU)→Str; pop FPU R8 date; convert to BSTR; push +4,0xC9,1,CDateStr,,1,0,0,1,,1,,,convert,0x6610502E,0x6610D80C,Str→Date(FPU); pop BSTR; parse date; push FPU R8 +4,0xCA,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xCB,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xCC,1,FreeStrNoPop,,1,1,0,0,,1,,,stack,0x6610B7BB,0x6610F92C,"Frees the String the top of the stack points to, which stays" +4,0xCD,1,FreeVarNoPop,,1,1,0,0,,1,,,stack,0x6610B7FD,0x6610F96E,"Clears the Variant the top of the stack points to, which stays" +4,0xCE,1,FreeAdNoPop,,1,1,0,0,,1,,,stack,0x6610B7DC,0x6610F94D,"Releases the object the top of the stack points to, which stays" +4,0xCF,1,EraseNoPop,,1,1,0,0,,1,,,stack,0x66109105,0x6610D215,"Erases the array on top of the stack, which stays" +4,0xD0,3,WMemLdUI1,%2,0,1,0,0,,,,ld:w(%2):1z,load_mem,0x6610A5AC,0x6610E6F5,"Pushes the 1 bytes at [[ebp+0x10]+%2], zero-extended" +4,0xD1,3,WMemLdI2,%2,0,1,0,0,,,,ld:w(%2):2u,load_mem,0x6610A5C5,0x6610E70E,Pushes the 2 bytes at [[ebp+0x10]+%2] (the rest of the slot undefined) +4,0xD2,3,WMemLdStr,%2,0,1,0,0,,,,ld:w(%2):4,load_mem,0x6610A5DE,0x6610E727,Pushes the 4 bytes at [[ebp+0x10]+%2] +4,0xD3,3,WMemLdStr,%2,0,1,0,0,,,,ld:w(%2):4,load_mem,0x6610A5DE,0x6610E727,Pushes the 4 bytes at [[ebp+0x10]+%2] +4,0xD4,3,WMemLdCy,%2,0,2,0,0,,,,ld:w(%2):8,load_mem,0x6610A5F5,0x6610E73E,Pushes the 8 bytes at [[ebp+0x10]+%2] +4,0xD5,3,WMemLdCy,%2,0,2,0,0,,,,ld:w(%2):8,load_mem,0x6610A5F5,0x6610E73E,Pushes the 8 bytes at [[ebp+0x10]+%2] +4,0xD6,3,WMemLdRfVar,%2,0,1,0,0,,,,ad:w(%2),load_mem,0x6610A63D,0x6610E786,Pushes the address of [[ebp+0x10]+%2] +4,0xD7,3,WMemLdStr,%2,0,1,0,0,,,,ld:w(%2):4,load_mem,0x6610A5DE,0x6610E727,Pushes the 4 bytes at [[ebp+0x10]+%2] +4,0xD8,3,WMemLdStr,%2,0,1,0,0,,,,ld:w(%2):4,load_mem,0x6610A5DE,0x6610E727,Pushes the 4 bytes at [[ebp+0x10]+%2] +4,0xD9,3,WMemLdFPR4,%2,0,0,0,1,,,,ldfp:w(%2):4,load_mem,0x6610A60F,0x6610E758,Loads the 4-byte float at [[ebp+0x10]+%2] onto the x87 stack +4,0xDA,3,WMemLdFPR8,%2,0,0,0,1,,,,ldfp:w(%2):8,load_mem,0x6610A626,0x6610E76F,Loads the 8-byte float at [[ebp+0x10]+%2] onto the x87 stack +4,0xDB,3,IWMemLdPr,%2,0,0,0,0,,,>pr:with,prn:w(%2),load_mem,0x6610B224,0x6610F380,Loads Pr with the object at [[ebp+0x10]+%2]; error 91 when it is Nothing +4,0xDC,3,WMemLdRfVar,%2,0,1,0,0,,,,ad:w(%2),load_mem,0x6610A63D,0x6610E786,Pushes the address of [[ebp+0x10]+%2] +4,0xDD,3,WMemLdVar,%2,0,4,0,0,,,,ld:w(%2):16,load_mem,0x6610B1C6,0x6610F322,Pushes the 16 bytes at [[ebp+0x10]+%2] +4,0xDE,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xDF,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xE0,3,WMemStUI1,%2,1,0,0,0,,1,,st:w(%2):1,store_mem,0x6610A653,0x6610E79C,Pops and stores 1 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE1,3,WMemStI2,%2,1,0,0,0,,1,,st:w(%2):2,store_mem,0x6610A66B,0x6610E7B4,Pops and stores 2 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE2,3,WMemStR4,%2,1,0,0,0,,1,,st:w(%2):4,store_mem,0x6610A684,0x6610E7CD,Pops and stores 4 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE3,3,WMemStR4,%2,1,0,0,0,,1,,st:w(%2):4,store_mem,0x6610A684,0x6610E7CD,Pops and stores 4 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE4,3,WMemStR8,%2,2,0,0,0,,2,,st:w(%2):8,store_mem,0x6610A69B,0x6610E7E4,Pops and stores 8 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE5,3,WMemStR8,%2,2,0,0,0,,2,,st:w(%2):8,store_mem,0x6610A69B,0x6610E7E4,Pops and stores 8 bytes at [[ebp+0x10]+%2] (the old value not freed) +4,0xE6,3,WMemStVar,%2,1,0,0,0,,1,,x:var_let:w(%2),store_mem,0x6610B708,0x6610F879,Let of the popped Variant into [[ebp+0x10]+%2] (the source moves; an object source gives its default value) +4,0xE7,3,WMemStStr,%2,1,0,0,0,,1,,x:bstr_move:w(%2),store_mem,0x6610B29D,0x6610F3F9,"Stores the popped String at [[ebp+0x10]+%2], freeing the old one (the string moves)" +4,0xE8,3,WMemStAd,%2,1,0,0,0,,1,,x:set_obj:w(%2),store_mem,0x6610B3C2,0x6610F51E,"Stores the popped object at [[ebp+0x10]+%2], AddRef'd, Releasing the old one" +4,0xE9,3,WMemStFPR4,%2,0,0,1,0,,f,,stfp:w(%2):4,store_mem,0x6610A6B5,0x6610E7FE,Stores ST0 as an 4-byte float at [[ebp+0x10]+%2] +4,0xEA,3,WMemStFPR8,%2,0,0,1,0,,f,,stfp:w(%2):8,store_mem,0x6610A6D6,0x6610E81F,Stores ST0 as an 8-byte float at [[ebp+0x10]+%2] +4,0xEB,3,WMemStVarAd,%2,1,0,0,0,,1,,x:set_var9:w(%2),store_mem,0x6610B46F,0x6610F5CB,"Sets the Variant at [[ebp+0x10]+%2] to the popped object (VT_DISPATCH, AddRef'd)" +4,0xEC,3,WMemStVarAdFunc,%2,1,0,0,0,,1,,x:set_var9_owned:w(%2),store_mem,0x6610B45C,0x6610F5B8,"Sets the Variant at [[ebp+0x10]+%2] to the popped object (VT_DISPATCH, not AddRef'd)" +4,0xED,3,WMemStVarUnk,%2,1,0,0,0,,1,,x:set_var13:w(%2),store_mem,0x6610B625,0x6610F781,Sets the Variant at [[ebp+0x10]+%2] to the popped IUnknown (AddRef'd) +4,0xEE,3,WMemStVarUnkFunc,%2,1,0,0,0,,1,,x:set_var13_owned:w(%2),store_mem,0x6610B60E,0x6610F76A,Sets the Variant at [[ebp+0x10]+%2] to the popped IUnknown (not AddRef'd) +4,0xEF,3,WMemStAdFunc,%2,1,0,0,0,,1,,x:set_obj_owned:w(%2),store_mem,0x6610B3AF,0x6610F50B,"Stores the popped object at [[ebp+0x10]+%2] without AddRef, Releasing the old one" +4,0xF0,3,WMemStVarCopy,%2,1,0,0,0,,1,,x:var_copy:w(%2),store_mem,0x6610B6B4,0x6610F810,"Copies the popped Variant into [[ebp+0x10]+%2] (strings, objects and arrays duplicated)" +4,0xF1,3,WMemStStrCopy,%2,1,0,0,0,,1,,x:bstr_copy:w(%2),store_mem,0x6610B2BD,0x6610F419,"Stores a copy of the String at [[ebp+0x10]+%2], freeing the old one" +4,0xF2,7,VarIndexLdRfVarLock,%a %a %2,1,1,0,0,variants(2),1 *,,x:var_index_ad:pop:f(%a),load_ind,0x66109052,0x6610D162,Pushes the address of an element of the popped Variant (popped indices) +4,0xF3,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xF4,1,InvalidExcode,,0,0,0,0,,,,,,,, +4,0xF5,3,AssignRecord,%s,2,0,0,0,,1 1,,,stack,0x6610C0C1,0x6611024E,Assign UDT record; pop src+dst ptrs; memcpy; %s=type desc +4,0xF6,5,DestructAnsiOFrame,%a %s,0,0,0,0,,,,,stack,0x6610C09D,0x6611022A,Destroys the ANSI record at frame %a (descriptor in pool %s) +4,0xF7,3,FStVarZero,%a,1,0,0,0,,1,,x:var_move:f(%a),store_frame,0x6610B678,0x6610F7D4,"Moves the popped Variant into [ebp+%a], emptying the source" +4,0xF8,3,FStVarCopyObj,%a,1,0,0,0,,1,,x:var_dup:f(%a),store_frame,0x66106110,0x6610A222,Duplicates the Variant into [ebp+%a] (__vbaVarDup) +4,0xF9,1,VerifyVarObj,,4,4,0,0,,4,,,stack,0x6610534C,0x66109472,Checks that the Variant by value on top (four slots) holds an object; leaves it +4,0xFA,1,VerifyPVarObj,,1,1,0,0,,1,,,stack,0x66109DF4,0x6610DF3D,Verify ptr-to-Variant contains Object; pop addr; validate; push +4,0xFB,1,FnInStrB4,,4,1,0,0,,1 1 1 1,,,stack,0x6610C3AA,0x6611054D,InStrB (4-arg byte); pop start+str1+str2+compare; push i32 pos +4,0xFC,3,FnInStrB4Var,%a,4,1,0,0,,1 1 1 1,,,stack,0x6610C3BC,0x6611055F,"InStrB(start, s1, s2, compare) as a Variant in frame %a; pops four arguments, pushes its address" +4,0xFD,1,FnInStr4,,4,1,0,0,,1 1 1 1,,,stack,0x66106833,0x6610A902,InStr (4-arg); pop start+str1+str2+compare; push i32 position +4,0xFE,3,FnInStr4Var,%a,4,1,0,0,,1 1 1 1,,,stack,0x6610C3D7,0x6611057A,"InStr(start, s1, s2, compare) as a Variant in frame %a; pops four arguments, pushes its address" +4,0xFF,1,FnStrComp3,,3,1,0,0,,1 1 1,,,stack,0x6610C3F2,0x66110595,StrComp (3-arg); pop str1+str2+compare; push i32 result +5,0x00,3,FnStrComp3Var,%a,3,1,0,0,,1 1 1,,,stack,0x6610C404,0x661105A7,"StrComp(s1, s2, compare) as a Variant in frame %a; pops three arguments, pushes its address" +5,0x01,1,StAryMove,,2,0,0,0,,1 1,,x:ary_move:pop,store_ind,0x66104C89,0x66108DE1,Moves the popped source array into the popped destination (__vbaAryMove) +5,0x02,1,StAryCopy,,2,0,0,0,,1 1,,x:ary_copy:pop,store_ind,0x661090B8,0x6610D1C8,Copies the popped source array into the popped destination (__vbaAryCopy) +5,0x03,3,StAryRecMove,%s,2,0,0,0,,1 1,,x:ary_rec_move:pop,store_ind,0x661090E7,0x6610D1F7,Moves the popped record array into the popped destination +5,0x04,3,StAryRecCopy,%s,2,0,0,0,,1 1,,x:ary_rec_copy:pop,store_ind,0x661090C9,0x6610D1D9,Copies the popped record array into the popped destination +5,0x05,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x06,5,AryInRecLdPr,%s %2,1,0,0,0,count(1),* 1,>pr:array,"prad:ar(%s,%2)",load_ind,0x6610901C,0x6610D12C,Loads Pr with the address of the element of the array %s describes in a popped record +5,0x07,5,AryInRecLdRf,%s %2,1,1,0,0,count(1),* 1,,"ad:ar(%s,%2)",load_ind,0x66108FED,0x6610D0FD,Pushes the address of the element of the array %s describes in a popped record +5,0x08,1,CExtInstUnk,,1,1,0,0,,1,,,convert,0x6610B090,0x6610F1EC,Convert external instance to IUnknown; pop ptr; QI; push +5,0x09,3,IStVarCopyObj,%a,1,0,0,0,,1,,x:var_dup:fi(%a),store_ind,0x6610B6F9,0x6610F855,Duplicates the Variant into where the pointer at [ebp+%a] points (__vbaVarDup) +5,0x0A,1,ArrayRebase1Var,,1,1,0,0,,1,,,stack,0x661091F3,0x6610D303,Pops a Variant array's address; rebases it to 1; pushes the address +5,0x0B,1,Assert,,1,0,0,0,,1,,,stack,0x66108E22,0x6610CF32,Debug.Assert; pop bool; break if False; no-op in release +5,0x0C,7,RaiseEvent,%4 %2,0,0,0,0,variants(1),*,me,,call,0x6610A847,0x6610E990,RaiseEvent DISPID %4 on Me with %2 Variant arguments by value +5,0x0D,5,PrintObject,%s %2,0,0,0,0,bytes(1),*,,,io,0x66106246,0x6610A347,"Print/Write/Input #: pushes the pool descriptor %s, calls the cdecl helper, releases %2 bytes (the descriptor and the arguments)" +5,0x0E,5,PrintFile,%s %2,0,0,0,0,bytes(1),*,,,io,0x6610626A,0x6610A36B,"Print/Write/Input #: pushes the pool descriptor %s, calls the cdecl helper, releases %2 bytes (the descriptor and the arguments)" +5,0x0F,5,WriteFile,%s %2,0,0,0,0,bytes(1),*,,,io,0x6610B8D2,0x6610FA43,"Print/Write/Input #: pushes the pool descriptor %s, calls the cdecl helper, releases %2 bytes (the descriptor and the arguments)" +5,0x10,5,InputFile,%s %2,0,0,0,0,bytes(1),*,,,io,0x66109BAD,0x6610DCF6,"Print/Write/Input #: pushes the pool descriptor %s, calls the cdecl helper, releases %2 bytes (the descriptor and the arguments)" +5,0x11,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x12,1,GetRecFxStr3,,3,0,0,0,,1 1 1,,,io,0x66109C81,0x6610DDCA,Get with fixed string (3-arg); pop filenum+recnum+buffer +5,0x13,1,GetRecFxStr4,,4,0,0,0,,1 1 1 1,,,io,0x66109CA3,0x6610DDEC,Get with fixed string (4-arg); pop filenum+recnum+buffer+len +5,0x14,1,PutRecFxStr3,,3,0,0,0,,1 1 1,,,io,0x66109C92,0x6610DDDB,Put with fixed string (3-arg); pop filenum+recnum+buffer +5,0x15,1,PutRecFxStr4,,4,0,0,0,,1 1 1 1,,,io,0x66109CB4,0x6610DDFD,Put with fixed string (4-arg); pop filenum+recnum+buffer+len +5,0x16,3,GetRecOwn3,%s,2,0,0,0,,1 1,,,io,0x66109CC5,0x6610DE0E,Get # of a record (descriptor in pool %s): pops file number and destination +5,0x17,3,GetRecOwn4,%s,3,0,0,0,,1 1 1,,,io,0x66109CE2,0x6610DE2B,Get # of a record (descriptor in pool %s) with record number: pops three +5,0x18,3,PutRecOwn3,%s,2,0,0,0,,1 1,,,io,0x66109CFF,0x6610DE48,Put # of a record (descriptor in pool %s): pops file number and source +5,0x19,3,PutRecOwn4,%s,3,0,0,0,,1 1 1,,,io,0x66109D1C,0x6610DE65,Put # of a record (descriptor in pool %s) with record number: pops three +5,0x1A,2,LitI2_Byte,%1,0,1,0,0,,,,lit:1s,load_lit,0x661058EB,0x66109A11,"Pushes the 1-byte literal operand, sign-extended to a slot" +5,0x1B,1,CBoolVarNull,,1,1,0,0,,1,,,convert,0x66104F4D,0x661090A5,Variant to Boolean: pops the Variant's address; result in one slot +5,0x1C,2,LargeBos,%1,0,0,0,0,,,,,bos,0x66104BFE,0x66108D56,"Starts a statement: stores its address to [ebp-0x14]; %1 is the statement's length in bytes, which Resume Next skips (0 for the last statement)" +5,0x1D,0,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x1E,5,ImpAdCallNonVirt,%x,0,0,0,0,arg_bytes(0),*,,,call,0x6610B8F6,0x6610FA67,Calls the procedure whose address is in the pool entry of %x; the callee releases the %x argument bytes (checked); checks the HRESULT +5,0x1F,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x20,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x21,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x22,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x23,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x24,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x25,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x26,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x27,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x28,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x29,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x2A,3,DestructRecord,%s,0,0,0,0,,,,,stack,0x6610C059,0x661101E6,Destroys the record whose address is on top of the stack (stays; descriptor in pool %s) +5,0x2B,3,VCallFPR8,%2,0,0,0,c,callee,*,pr,,call,0x661063A1,0x6610A4A2,Calls Pr's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing; ST0 holds the result of a callee returning a float +5,0x2C,3,ThisVCallHidden,%2,0,0,0,0,callee,*,me,,call,0x6610BD78,0x6610FEE9,Calls Me's vtable method (vtable offset %2); the callee releases this and its arguments; pushes nothing +5,0x2D,1,ZeroRetVal,,0,0,0,0,,,,zero:f(-0x88):4,store_frame,0x66106590,0x6610A675,Zeroes 4 bytes at [ebp+-0x88] +5,0x2E,1,ZeroRetValVar,,0,0,0,0,,,,zero:f(-0x94):4,store_frame,0x661065A6,0x6611026B,Zeroes 4 bytes at [ebp+-0x94] +5,0x2F,5,ExitProcCbHresult,%a %2,0,0,0,0,,,,,return,0x661063F0,0x6610A4F1,"Copies %2 bytes of the result (from ebp-0x84-%2, rounded down to even: the top of the locals) to the [out, retval] pointer in argument %a; returns eax = 0 (S_OK)" +5,0x30,7,ExitProcFrameCbHresult,%a %a %2,0,0,0,0,,,,,return,0x6610BF05,0x66110076,"Copies %2 bytes from frame %a (the first) to the [out, retval] pointer in argument %a (the second); returns eax = 0 (S_OK)" +5,0x31,3,EraseDestrKeepData,%s,1,0,0,0,,1,,,stack,0x66109126,0x6610D236,Erase array but keep data; destructor variant; %s=type desc +5,0x32,5,CDargRefUdt,%2 %s,1,4,0,0,,1,,,convert,0x661098A3,0x6610D9D2,Pops a record's address; pushes a by-reference record Variant (descriptor in pool %s) by value +5,0x33,5,CVarRefUdt,%a %s,1,1,0,0,,1,,,convert,0x66109875,0x6610D9A4,Pops a record's address; builds a by-reference record Variant (descriptor pool %s) in frame %a; pushes its address +5,0x34,5,CVarUdt,%a %s,1,1,0,0,,1,,,convert,0x66109807,0x6610D936,Pops a record's address; builds a record Variant (descriptor pool %s) in frame %a; pushes its address +5,0x35,3,StUdtVar,%s,1,1,0,0,,1,,x:udt_from_var:pop,load_ind,0x661098D0,0x6610D9FF,Pops a Variant's address; pushes the record it holds +5,0x36,3,StAryVar,%2,1,1,0,0,,1,,x:ary_from_var:pop,load_ind,0x661098F0,0x6610DA1F,"Pops a Variant's address; __vbaAryVar(%2 = the VARTYPE of the array, the Variant) checks it holds such an array; pushes the array" +5,0x37,3,CopyBytesZero,%2,2,0,0,0,,1 1,,,stack,0x66109A09,0x6610DB52,Pops destination then source; copies %2 bytes and zeroes the source +5,0x38,5,FLdZeroAry,%a %a,0,1,0,0,,,,x:ld_zero_ary:f(%a):f(%a#2),load_lit,0x66109D8A,0x6610DED3,Pushes __vbaLdZeroAry of the array variable +5,0x39,3,FStVarZero,%a,1,0,0,0,,1,,x:var_move:f(%a),store_frame,0x6610B678,0x6610F7D4,"Moves the popped Variant into [ebp+%a], emptying the source" +5,0x3A,7,CVarAryUdt,%a %2 %s,1,1,0,0,,1,,,convert,0x66109835,0x6610D964,"Pops an array; builds an array Variant (vartype %2, descriptor pool %s) in frame %a; pushes its address" +5,0x3B,7,RedimVarUdt,%2 %2 %s,1,0,0,0,pairs(0),* 1,,,stack,0x661091CA,0x6610D2DA,ReDim of a Variant array: pops the address and 2*dims bounds +5,0x3C,7,RedimPreserveVarUdt,%2 %2 %s,1,0,0,0,pairs(0),* 1,,,stack,0x661091EC,0x6610D2FC,ReDim of a Variant array: pops the address and 2*dims bounds +5,0x3D,5,VarLateMemLdRfVar,%a %s,1,1,0,0,,1,tos,,call,0x66105875,0x6610999B,"Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); result Variant in frame %a, whose address it pushes" +5,0x3E,7,VarLateMemCallLdRfVar,%a %s %2,1,1,0,0,variants(2),1 *,tos,,call,0x6610A917,0x6610EA60,"Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); argc Variants by value; result Variant in frame %a, whose address it pushes" +5,0x3F,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x40,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x41,5,VarLateMemLdVar,%a %s,1,1,0,0,,1,tos,,call,0x6610587C,0x661099A2,"Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); result Variant in frame %a, whose address it pushes" +5,0x42,7,VarLateMemCallLdVar,%a %s %2,1,1,0,0,variants(2),1 *,tos,,call,0x6610A931,0x6610EA7A,"Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); argc Variants by value; result Variant in frame %a, whose address it pushes" +5,0x43,3,VarLateMemSt,%s,5,0,0,0,,1 4,tos,,call,0x661058C7,0x661099ED,Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); pops the value Variant (by value) +5,0x44,5,VarLateMemCallSt,%s %2,5,0,0,0,variants(1),1 * 4,tos,,call,0x6610A94E,0x6610EA97,Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); argc Variants by value; pops the value Variant (by value) +5,0x45,5,VarLateMemStAd,%s %2,5,0,0,0,variants(1),1 * 4,tos,,call,0x6610A938,0x6610EA81,Late-bound IDispatch call on the Variant whose address it pops by name (pool %s); pops the value Variant (by value) +5,0x46,1,InvalidExcode,,0,0,0,0,,,,,,,, +5,0x47,0,Unknown,,0,0,0,0,,,,,,,, +5,0x48,0,Unknown,,0,0,0,0,,,,,,,, +5,0x49,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x4F,0,Unknown,,0,0,0,0,,,,,,,, +5,0x50,0,Unknown,,0,0,0,0,,,,,,,, +5,0x51,0,Unknown,,0,0,0,0,,,,,,,, +5,0x52,0,Unknown,,0,0,0,0,,,,,,,, +5,0x53,0,Unknown,,0,0,0,0,,,,,,,, +5,0x54,0,Unknown,,0,0,0,0,,,,,,,, +5,0x55,0,Unknown,,0,0,0,0,,,,,,,, +5,0x56,0,Unknown,,0,0,0,0,,,,,,,, +5,0x57,0,Unknown,,0,0,0,0,,,,,,,, +5,0x58,0,Unknown,,0,0,0,0,,,,,,,, +5,0x59,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x5F,0,Unknown,,0,0,0,0,,,,,,,, +5,0x60,0,Unknown,,0,0,0,0,,,,,,,, +5,0x61,0,Unknown,,0,0,0,0,,,,,,,, +5,0x62,0,Unknown,,0,0,0,0,,,,,,,, +5,0x63,0,Unknown,,0,0,0,0,,,,,,,, +5,0x64,0,Unknown,,0,0,0,0,,,,,,,, +5,0x65,0,Unknown,,0,0,0,0,,,,,,,, +5,0x66,0,Unknown,,0,0,0,0,,,,,,,, +5,0x67,0,Unknown,,0,0,0,0,,,,,,,, +5,0x68,0,Unknown,,0,0,0,0,,,,,,,, +5,0x69,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x6F,0,Unknown,,0,0,0,0,,,,,,,, +5,0x70,0,Unknown,,0,0,0,0,,,,,,,, +5,0x71,0,Unknown,,0,0,0,0,,,,,,,, +5,0x72,0,Unknown,,0,0,0,0,,,,,,,, +5,0x73,0,Unknown,,0,0,0,0,,,,,,,, +5,0x74,0,Unknown,,0,0,0,0,,,,,,,, +5,0x75,0,Unknown,,0,0,0,0,,,,,,,, +5,0x76,0,Unknown,,0,0,0,0,,,,,,,, +5,0x77,0,Unknown,,0,0,0,0,,,,,,,, +5,0x78,0,Unknown,,0,0,0,0,,,,,,,, +5,0x79,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x7F,0,Unknown,,0,0,0,0,,,,,,,, +5,0x80,0,Unknown,,0,0,0,0,,,,,,,, +5,0x81,0,Unknown,,0,0,0,0,,,,,,,, +5,0x82,0,Unknown,,0,0,0,0,,,,,,,, +5,0x83,0,Unknown,,0,0,0,0,,,,,,,, +5,0x84,0,Unknown,,0,0,0,0,,,,,,,, +5,0x85,0,Unknown,,0,0,0,0,,,,,,,, +5,0x86,0,Unknown,,0,0,0,0,,,,,,,, +5,0x87,0,Unknown,,0,0,0,0,,,,,,,, +5,0x88,0,Unknown,,0,0,0,0,,,,,,,, +5,0x89,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x8F,0,Unknown,,0,0,0,0,,,,,,,, +5,0x90,0,Unknown,,0,0,0,0,,,,,,,, +5,0x91,0,Unknown,,0,0,0,0,,,,,,,, +5,0x92,0,Unknown,,0,0,0,0,,,,,,,, +5,0x93,0,Unknown,,0,0,0,0,,,,,,,, +5,0x94,0,Unknown,,0,0,0,0,,,,,,,, +5,0x95,0,Unknown,,0,0,0,0,,,,,,,, +5,0x96,0,Unknown,,0,0,0,0,,,,,,,, +5,0x97,0,Unknown,,0,0,0,0,,,,,,,, +5,0x98,0,Unknown,,0,0,0,0,,,,,,,, +5,0x99,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9A,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9B,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9C,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9D,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9E,0,Unknown,,0,0,0,0,,,,,,,, +5,0x9F,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xA9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAD,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xAF,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xB9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBD,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xBF,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xC9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCD,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xCF,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xD9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDD,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xDF,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xE9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xEA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xEB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xEC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xED,0,Unknown,,0,0,0,0,,,,,,,, +5,0xEE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xEF,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF0,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF1,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF2,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF3,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF4,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF5,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF6,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF7,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF8,0,Unknown,,0,0,0,0,,,,,,,, +5,0xF9,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFA,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFB,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFC,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFD,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFE,0,Unknown,,0,0,0,0,,,,,,,, +5,0xFF,0,Unknown,,0,0,0,0,,,,,,,, diff --git a/data/vb6_control_guids.csv b/data/vb6_control_guids.csv index 3890c58..f12c4a9 100644 --- a/data/vb6_control_guids.csv +++ b/data/vb6_control_guids.csv @@ -1,24 +1,93 @@ -clsid,name -33AD4ED0-6699-11CF-B70C-00AA0060D393,CommandButton +# GUID a ControlInfo (+0x08) names -> control class. The GUID is the +# control's events (source) interface in VB6.OLB; a control array names +# the events IID + 1 (Data1). Coclass CLSIDs are listed too. Read from +# VB6.OLB. +guid,name +33AD4ED2-6699-11CF-B70C-00AA0060D393,PictureBox +33AD4ED3-6699-11CF-B70C-00AA0060D393,PictureBox +33AD4ED0-6699-11CF-B70C-00AA0060D393,PictureBox +33AD4EDA-6699-11CF-B70C-00AA0060D393,Label +33AD4EDB-6699-11CF-B70C-00AA0060D393,Label +33AD4ED8-6699-11CF-B70C-00AA0060D393,Label +33AD4EE2-6699-11CF-B70C-00AA0060D393,TextBox +33AD4EE3-6699-11CF-B70C-00AA0060D393,TextBox 33AD4EE0-6699-11CF-B70C-00AA0060D393,TextBox -33AD4EF0-6699-11CF-B70C-00AA0060D393,Label -33AD4F00-6699-11CF-B70C-00AA0060D393,ListBox -33AD4F10-6699-11CF-B70C-00AA0060D393,ComboBox -33AD4F20-6699-11CF-B70C-00AA0060D393,CheckBox -33AD4F30-6699-11CF-B70C-00AA0060D393,OptionButton -33AD4F40-6699-11CF-B70C-00AA0060D393,Frame -33AD4F50-6699-11CF-B70C-00AA0060D393,PictureBox -33AD4F60-6699-11CF-B70C-00AA0060D393,Image -33AD4F70-6699-11CF-B70C-00AA0060D393,Shape -33AD4F80-6699-11CF-B70C-00AA0060D393,Line -33AD4F90-6699-11CF-B70C-00AA0060D393,HScrollBar -33AD4FA0-6699-11CF-B70C-00AA0060D393,VScrollBar -33AD4FB0-6699-11CF-B70C-00AA0060D393,Timer -33AD4FC0-6699-11CF-B70C-00AA0060D393,DriveListBox -33AD4FD0-6699-11CF-B70C-00AA0060D393,DirListBox -33AD4FE0-6699-11CF-B70C-00AA0060D393,FileListBox -33AD4FF0-6699-11CF-B70C-00AA0060D393,Menu -33AD5000-6699-11CF-B70C-00AA0060D393,Data -33AD5010-6699-11CF-B70C-00AA0060D393,OLE +33AD4EEA-6699-11CF-B70C-00AA0060D393,Frame +33AD4EEB-6699-11CF-B70C-00AA0060D393,Frame +33AD4EE8-6699-11CF-B70C-00AA0060D393,Frame +33AD4EF2-6699-11CF-B70C-00AA0060D393,CommandButton +33AD4EF3-6699-11CF-B70C-00AA0060D393,CommandButton +33AD4EF0-6699-11CF-B70C-00AA0060D393,CommandButton +33AD4EFA-6699-11CF-B70C-00AA0060D393,CheckBox +33AD4EFB-6699-11CF-B70C-00AA0060D393,CheckBox +33AD4EF8-6699-11CF-B70C-00AA0060D393,CheckBox +33AD4F02-6699-11CF-B70C-00AA0060D393,OptionButton +33AD4F03-6699-11CF-B70C-00AA0060D393,OptionButton +33AD4F00-6699-11CF-B70C-00AA0060D393,OptionButton +33AD4F0A-6699-11CF-B70C-00AA0060D393,ComboBox +33AD4F0B-6699-11CF-B70C-00AA0060D393,ComboBox +33AD4F08-6699-11CF-B70C-00AA0060D393,ComboBox +33AD4F12-6699-11CF-B70C-00AA0060D393,ListBox +33AD4F13-6699-11CF-B70C-00AA0060D393,ListBox +33AD4F10-6699-11CF-B70C-00AA0060D393,ListBox +33AD4F1A-6699-11CF-B70C-00AA0060D393,HScrollBar +33AD4F1B-6699-11CF-B70C-00AA0060D393,HScrollBar +33AD4F18-6699-11CF-B70C-00AA0060D393,HScrollBar +33AD4F22-6699-11CF-B70C-00AA0060D393,VScrollBar +33AD4F23-6699-11CF-B70C-00AA0060D393,VScrollBar +33AD4F20-6699-11CF-B70C-00AA0060D393,VScrollBar +33AD4F2A-6699-11CF-B70C-00AA0060D393,Timer +33AD4F2B-6699-11CF-B70C-00AA0060D393,Timer +33AD4F28-6699-11CF-B70C-00AA0060D393,Timer +33AD4F3A-6699-11CF-B70C-00AA0060D393,Form +33AD4F3B-6699-11CF-B70C-00AA0060D393,Form +33AD4F38-6699-11CF-B70C-00AA0060D393,Form +33AD4F42-6699-11CF-B70C-00AA0060D393,Screen +33AD4F43-6699-11CF-B70C-00AA0060D393,Screen +33AD4F40-6699-11CF-B70C-00AA0060D393,Screen +33AD4F4A-6699-11CF-B70C-00AA0060D393,Clipboard +33AD4F4B-6699-11CF-B70C-00AA0060D393,Clipboard +33AD4F48-6699-11CF-B70C-00AA0060D393,Clipboard +33AD4F52-6699-11CF-B70C-00AA0060D393,DriveListBox +33AD4F53-6699-11CF-B70C-00AA0060D393,DriveListBox +33AD4F50-6699-11CF-B70C-00AA0060D393,DriveListBox +33AD4F5A-6699-11CF-B70C-00AA0060D393,DirListBox +33AD4F5B-6699-11CF-B70C-00AA0060D393,DirListBox +33AD4F58-6699-11CF-B70C-00AA0060D393,DirListBox +33AD4F62-6699-11CF-B70C-00AA0060D393,FileListBox +33AD4F63-6699-11CF-B70C-00AA0060D393,FileListBox +33AD4F60-6699-11CF-B70C-00AA0060D393,FileListBox +33AD4F6A-6699-11CF-B70C-00AA0060D393,Menu +33AD4F6B-6699-11CF-B70C-00AA0060D393,Menu +33AD4F68-6699-11CF-B70C-00AA0060D393,Menu +33AD4F72-6699-11CF-B70C-00AA0060D393,MDIForm +33AD4F73-6699-11CF-B70C-00AA0060D393,MDIForm +33AD4F70-6699-11CF-B70C-00AA0060D393,MDIForm +33AD4F7A-6699-11CF-B70C-00AA0060D393,App +33AD4F7B-6699-11CF-B70C-00AA0060D393,App +33AD4F78-6699-11CF-B70C-00AA0060D393,App +33AD4F82-6699-11CF-B70C-00AA0060D393,Shape +33AD4F83-6699-11CF-B70C-00AA0060D393,Shape +33AD4F80-6699-11CF-B70C-00AA0060D393,Shape +33AD4F8A-6699-11CF-B70C-00AA0060D393,Line +33AD4F8B-6699-11CF-B70C-00AA0060D393,Line +33AD4F88-6699-11CF-B70C-00AA0060D393,Line +33AD4F92-6699-11CF-B70C-00AA0060D393,Image +33AD4F93-6699-11CF-B70C-00AA0060D393,Image +33AD4F90-6699-11CF-B70C-00AA0060D393,Image +33AD4FFA-6699-11CF-B70C-00AA0060D393,Data +33AD4FFB-6699-11CF-B70C-00AA0060D393,Data +33AD4FF8-6699-11CF-B70C-00AA0060D393,Data +33AD5002-6699-11CF-B70C-00AA0060D393,OLE +33AD5003-6699-11CF-B70C-00AA0060D393,OLE +33AD5000-6699-11CF-B70C-00AA0060D393,OLE 33AD5012-6699-11CF-B70C-00AA0060D393,UserControl -33AD5020-6699-11CF-B70C-00AA0060D393,UserControl +33AD5013-6699-11CF-B70C-00AA0060D393,UserControl +33AD5010-6699-11CF-B70C-00AA0060D393,UserControl +33AD501A-6699-11CF-B70C-00AA0060D393,PropertyPage +33AD501B-6699-11CF-B70C-00AA0060D393,PropertyPage +33AD5018-6699-11CF-B70C-00AA0060D393,PropertyPage +33AD5022-6699-11CF-B70C-00AA0060D393,UserDocument +33AD5023-6699-11CF-B70C-00AA0060D393,UserDocument +33AD5020-6699-11CF-B70C-00AA0060D393,UserDocument +FCFB3D21-A0FA-1068-A738-08002B3371B5,Class diff --git a/data/vb6_control_properties.csv b/data/vb6_control_properties.csv index 24289f8..2a05ab5 100644 --- a/data/vb6_control_properties.csv +++ b/data/vb6_control_properties.csv @@ -1,1246 +1,1250 @@ -# VB6 Control Property Descriptor Tables -# Extracted from MSVBVM60.DLL v6.00.9848 runtime descriptor pointer tables. -# Each row represents one entry in a control's property pointer table. -# Status: active=serializable, fontsub=flag-only, skip=runtime-only, sep=separator, obj=COM object ref -# -# Descriptor Table VAs: -# Timer: 0x66028A50 (9 entries) -# Label: 0x66027040 (47 entries) -# CommandButton: 0x660283C8 (43 entries) -# TextBox: 0x66026A40 (58 entries) -# CheckBox: 0x66025A78 (49 entries) -# OptionButton: 0x66027BB0 (43 entries) -# Frame: 0x660256A8 (35 entries) -# PictureBox: 0x66027FD8 (69 entries) -# ListBox: 0x66002330 (56 entries) -# ComboBox: 0x66025F30 (56 entries) -# HScrollBar: 0x660286B0 (27 entries) -# VScrollBar: 0x660286B0 (27 entries, shared with HScrollBar) -# Image: 0x660272E8 (29 entries) -# Shape: 0x66028900 (19 entries) -# Line: 0x66027748 (14 entries) -# Data: 0x660241E8 (46 entries) -# DriveListBox: 0x660265D0 (38 entries) -# DirListBox: 0x660262D0 (40 entries) -# FileListBox: 0x6601E8C0 (49 entries) -# Menu: 0x66027940 (14 entries) -# OLE: 0x66025000 (75 entries) -# Form: 0x660226B0 (75 entries) -# MDIForm: 0x660226B0 (75 entries, shared with Form) -# PropertyPage: 0x6602A3F0 (78 entries) -# UserControl: 0x66029530 (94 entries) -# UserDocument: 0x66029D10 (88 entries) -# -control_type,index,name,ser_type,callback_bytes,status,flags,descriptor_va -CheckBox,0,Name,18,0,skip,0x8400D412,0x66001E50 -CheckBox,1,Caption,1,0,active,0x80EA4401,0x66022290 -CheckBox,2,Index,17,0,active,0x84C1D411,0x66001F00 -CheckBox,3,BackColor,5,0,active,0x80F12405,0x66022260 -CheckBox,4,ForeColor,5,0,active,0x80F12405,0x66022280 -CheckBox,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -CheckBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 -CheckBox,7,Width,9,0,flag,0x90202409,0x66001E00 -CheckBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 -CheckBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 -CheckBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 -CheckBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -CheckBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 -CheckBox,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 -CheckBox,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -CheckBox,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -CheckBox,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -CheckBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 -CheckBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -CheckBox,19,Value,6,0,active,0x00C14406,0x66025A30 -CheckBox,20,Parent,25,0,skip,0x80003819,0x66001F10 -CheckBox,21,DragMode,6,0,active,0x80C12606,0x66001ED0 -CheckBox,22,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -CheckBox,23,TabStop,4,0,active,0x80C14404,0x66002000 -CheckBox,24,Tag,13,0,active,0x80C1220D,0x66001DD0 -CheckBox,25,Alignment,6,0,active,0x00C12406,0x66025A48 -CheckBox,26,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -CheckBox,27,hWnd,3,0,flag,0x80003803,0x66001D30 -CheckBox,28,DataSource,1,0,active,0x82F13201,0x66001FE0 -CheckBox,29,DataField,1,0,active,0x80F12601,0x66001FD0 -CheckBox,30,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -CheckBox,31,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -CheckBox,32,Font,20,0,active,0x80224414,0x66001CC0 -CheckBox,33,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -CheckBox,34,Appearance,6,0,active,0x80C12606,0x66001CA0 -CheckBox,35,Container,32,0,skip,0x80004C20,0x66001FB0 -CheckBox,36,RightToLeft,4,0,active,0x80C14404,0x66114000 -CheckBox,37,ToolTipText,1,0,active,0x80D12401,0x66001F20 -CheckBox,38,Picture,21,0,active,0x84E14495,0x660259E0 -CheckBox,39,DisabledPicture,21,0,active,0x84E14495,0x66025A00 -CheckBox,40,DownPicture,21,0,active,0x84E14495,0x660259F0 -CheckBox,41,Style,6,0,active,0x00C13406,0x66025A60 -CheckBox,42,OLEDropMode,6,0,active,0x80412406,0x66001D70 -CheckBox,43,MaskColor,5,0,active,0x80F14405,0x66025A10 -CheckBox,44,UseMaskColor,4,0,active,0x80E14404,0x66025A20 -CheckBox,45,CausesValidation,4,0,active,0x80C12204,0x66002010 -CheckBox,46,DataMember,33,0,active,0x80F12621,0x660020A0 -CheckBox,47,DataFormat,22,0,active,0x84654416,0x66002070 -CheckBox,48,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -ComboBox,0,Name,18,0,skip,0x8400D412,0x66001E50 -ComboBox,1,Style,6,0,active,0x00C13406,0x66025ED8 -ComboBox,2,Index,17,0,active,0x84C1D411,0x66001F00 -ComboBox,3,BackColor,5,0,active,0x80F12405,0x66001E40 -ComboBox,4,ForeColor,5,0,active,0x80F12405,0x66001E60 -ComboBox,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -ComboBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 -ComboBox,7,Width,9,0,flag,0x90202409,0x66001E00 -ComboBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 -ComboBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 -ComboBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 -ComboBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -ComboBox,12,Text,1,0,active,0x80EE4401,0x66025E50 -ComboBox,13,FontName,1,0,active,0x90224C01,0x66001CF0 -ComboBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -ComboBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -ComboBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -ComboBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -ComboBox,18,FontSize,7,0,flag,0x90304C07,0x66001D00 -ComboBox,19,TabIndex,2,0,active,0x84012402,0x66001FF0 -ComboBox,20,ListCount,2,0,flag,0x00005802,0x66025E78 -ComboBox,21,ListIndex,2,0,flag,0x00204C02,0x66025E88 -ComboBox,22,List,1,0,active,0x08064501,0x66025E60 -ComboBox,23,Sorted,4,0,active,0x00E13204,0x66025EC8 -ComboBox,24,SelStart,3,0,flag,0x00204C03,0x66025EA8 -ComboBox,25,SelLength,3,0,flag,0x00204C03,0x66025E98 -ComboBox,26,SelText,1,0,flag,0x00204C01,0x66025EB8 -ComboBox,27,Parent,25,0,skip,0x80003819,0x66001F10 -ComboBox,28,DragMode,6,0,active,0x80C12606,0x66001ED0 -ComboBox,29,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -ComboBox,30,TabStop,4,0,active,0x80C14404,0x66002000 -ComboBox,31,Tag,13,0,active,0x80C1220D,0x66001DD0 -ComboBox,32,hWnd,3,0,flag,0x80003803,0x66001D30 -ComboBox,33,ItemData,3,0,active,0x00264503,0x66025EF0 -ComboBox,34,NewIndex,2,0,flag,0x00003802,0x66025F00 -ComboBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -ComboBox,36,IMEMode,6,0,active,0xC0C16606,0x66114018 -ComboBox,37,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -ComboBox,38,Font,20,0,active,0x80224414,0x66001CC0 -ComboBox,39,DataSource,1,0,active,0x82F13201,0x66001FE0 -ComboBox,40,DataField,1,0,active,0x80F12601,0x66001FD0 -ComboBox,41,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -ComboBox,42,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -ComboBox,43,Appearance,6,0,active,0x80C12606,0x66001CA0 -ComboBox,44,Container,32,0,skip,0x80004C20,0x66001FB0 -ComboBox,45,IntegralHeight,4,0,active,0x00413604,0x66025F10 -ComboBox,46,RightToLeft,4,0,active,0x80C14404,0x66114000 -ComboBox,47,ToolTipText,1,0,active,0x80D12401,0x66001F20 -ComboBox,48,OLEDragMode,6,0,active,0x80412206,0x660021A0 -ComboBox,49,OLEDropMode,6,0,active,0x80412406,0x66001D70 -ComboBox,50,Locked,4,0,active,0x00C12604,0x66025F20 -ComboBox,51,TopIndex,2,0,flag,0x00204C02,0x660021C0 -ComboBox,52,CausesValidation,4,0,active,0x80C12204,0x66002010 -ComboBox,53,DataMember,33,0,active,0x80F12621,0x660020A0 -ComboBox,54,DataFormat,22,0,active,0x84654416,0x66002070 -ComboBox,55,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -CommandButton,0,Name,18,0,skip,0x8400D412,0x66001E50 -CommandButton,1,Caption,1,0,active,0x80EA4401,0x66022290 -CommandButton,2,Index,17,0,active,0x84C1D411,0x66001F00 -CommandButton,3,BackColor,5,0,active,0x80F12405,0x66022260 -CommandButton,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -CommandButton,5,Top,10,0,flag,0x9020240A,0x66001DE0 -CommandButton,6,Width,9,0,flag,0x90202409,0x66001E00 -CommandButton,7,Height,11,0,flag,0x9020240B,0x66001DA0 -CommandButton,8,Enabled,4,0,active,0x80E14404,0x66001D90 -CommandButton,9,Visible,4,0,active,0x80E14404,0x66001DF0 -CommandButton,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -CommandButton,11,FontName,1,0,active,0x90224C01,0x66001CF0 -CommandButton,12,FontSize,7,0,flag,0x90304C07,0x66001D00 -CommandButton,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 -CommandButton,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -CommandButton,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -CommandButton,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -CommandButton,17,TabIndex,2,0,active,0x84012402,0x66001FF0 -CommandButton,18,Value,4,0,flag,0x00202C04,0x660283A0 -CommandButton,19,Default,4,0,active,0x84C14404,0x66025348 -CommandButton,20,Cancel,4,0,active,0x84C14404,0x660252F0 -CommandButton,21,Parent,25,0,skip,0x80003819,0x66001F10 -CommandButton,22,DragMode,6,0,active,0x80C12606,0x66001ED0 -CommandButton,23,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -CommandButton,24,TabStop,4,0,active,0x80C14404,0x66002000 -CommandButton,25,Tag,13,0,active,0x80C1220D,0x66001DD0 -CommandButton,26,hWnd,3,0,flag,0x80003803,0x66001D30 -CommandButton,27,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -CommandButton,28,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -CommandButton,29,Font,20,0,active,0x80224414,0x66001CC0 -CommandButton,30,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -CommandButton,31,Appearance,6,0,active,0x80C12606,0x66001CA0 -CommandButton,32,Container,32,0,skip,0x80004C20,0x66001FB0 -CommandButton,33,RightToLeft,4,0,active,0x80C14404,0x66114000 -CommandButton,34,Picture,21,0,active,0x84E14495,0x660259E0 -CommandButton,35,DisabledPicture,21,0,active,0x84E14495,0x66025A00 -CommandButton,36,DownPicture,21,0,active,0x84E14495,0x660259F0 -CommandButton,37,ToolTipText,1,0,active,0x80D12401,0x66001F20 -CommandButton,38,OLEDropMode,6,0,active,0x80412406,0x66001D70 -CommandButton,39,MaskColor,5,0,active,0x80F14405,0x66025A10 -CommandButton,40,UseMaskColor,4,0,active,0x80E14404,0x66025A20 -CommandButton,41,Style,6,0,active,0x00C13406,0x660283B0 -CommandButton,42,CausesValidation,4,0,active,0x80C12204,0x66002010 -Data,0,Name,18,0,skip,0x8400D412,0x66001E50 -Data,1,Index,17,0,active,0x84C1D411,0x66001F00 -Data,2,LeftTop,8,4,active,0x90222408,0x66001DC0 -Data,3,Top,10,0,flag,0x9020240A,0x66001DE0 -Data,4,Width,9,0,flag,0x90202409,0x66001E00 -Data,5,Height,11,0,flag,0x9020240B,0x66001DA0 -Data,6,Enabled,4,0,active,0x80E14404,0x66001D90 -Data,7,Visible,4,0,active,0x80E14404,0x66001DF0 -Data,8,MousePointer,6,0,active,0x80C12406,0x66001D50 -Data,9,FontName,1,0,active,0x90224C01,0x66001CF0 -Data,10,FontSize,7,0,flag,0x90304C07,0x66001D00 -Data,11,FontBold,4,0,flag,0x90204C04,0x66001CD0 -Data,12,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -Data,13,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -Data,14,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -Data,15,Parent,25,0,skip,0x80003819,0x66001F10 -Data,16,Tag,13,0,active,0x80C1220D,0x66001DD0 -Data,17,_,4,0,sep,0xE0000804,0x660024A0 -Data,18,Connect,13,0,active,0x0011260D,0x660240C0 -Data,19,DatabaseName,13,0,active,0x0431260D,0x660240F8 -Data,20,Database,22,0,flag,0x00005C16,0x660240E0 -Data,21,RecordSource,22,0,flag,0x00204C16,0x66024158 -Data,22,Exclusive,4,0,active,0x00012604,0x66024118 -Data,23,ReadOnly,4,0,active,0x00012604,0x66024138 -Data,24,RecordSource,13,0,active,0x0431260D,0x66024148 -Data,25,Caption,1,0,active,0x80EA4401,0x66022290 -Data,26,EditMode,2,0,flag,0x00005802,0x66024108 -Data,27,Options,2,0,active,0x00012602,0x66024128 -Data,28,BackColor,5,0,active,0x80F12405,0x66001E40 -Data,29,ForeColor,5,0,active,0x80F12405,0x66001E60 -Data,30,DragMode,6,0,active,0x80C12606,0x66001ED0 -Data,31,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -Data,32,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -Data,33,Font,20,0,active,0x80224414,0x66001CC0 -Data,34,Align,6,0,active,0x80C12406,0x66024040 -Data,35,BOFAction,6,0,active,0x00C12206,0x66024170 -Data,36,EOFAction,6,0,active,0x00C12206,0x66024188 -Data,37,DefaultCursorType,6,0,active,0x00014406,0x660241A0 -Data,38,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -Data,39,Appearance,6,0,active,0x80C12606,0x66001CA0 -Data,40,Negotiate,4,0,active,0x82C13404,0x66024058 -Data,41,RightToLeft,4,0,active,0x80C14404,0x66114000 -Data,42,OLEDropMode,6,0,active,0x80412406,0x66001D70 -Data,43,ToolTipText,1,0,active,0x80D12401,0x66001F20 -Data,44,DefaultType,6,0,active,0x00014406,0x660241B8 -Data,45,RecordsetType,6,0,active,0x00014406,0x660241D0 -DirListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 -DirListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 -DirListBox,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -DirListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 -DirListBox,6,Width,9,0,flag,0x90202409,0x66001E00 -DirListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 -DirListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 -DirListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 -DirListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -DirListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 -DirListBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 -DirListBox,18,FontBold,4,0,flag,0x90204C04,0x66001CD0 -DirListBox,19,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -DirListBox,20,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -DirListBox,21,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -DirListBox,23,DragMode,6,0,active,0x80C12606,0x66001ED0 -DirListBox,25,TabStop,4,0,active,0x80C14404,0x66002000 -DirListBox,26,Tag,13,0,active,0x80C1220D,0x66001DD0 -DirListBox,28,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -DirListBox,29,IMEMode,6,0,active,0xC0C16606,0x66114018 -DirListBox,31,Font,20,-1,active,0x80224414,0x66001CC0 -DirListBox,32,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -DirListBox,33,Appearance,6,0,active,0x80C12606,0x66001CA0 -DirListBox,35,ToolTipText,1,0,active,0x80D12401,0x66001F20 -DirListBox,36,OLEDragMode,6,0,active,0x80412206,0x660021A0 -DirListBox,37,OLEDropMode,6,0,active,0x80412406,0x66001D70 -DirListBox,39,CausesValidation,4,0,active,0x80C12204,0x66002010 -DriveListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 -DriveListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 -DriveListBox,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -DriveListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 -DriveListBox,6,Width,9,0,flag,0x90202409,0x66001E00 -DriveListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 -DriveListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 -DriveListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 -DriveListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -DriveListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 -DriveListBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 -DriveListBox,18,FontBold,4,0,flag,0x90204C04,0x66001CD0 -DriveListBox,19,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -DriveListBox,20,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -DriveListBox,21,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -DriveListBox,23,DragMode,6,0,active,0x80C12606,0x66001ED0 -DriveListBox,25,TabStop,4,0,active,0x80C14404,0x66002000 -DriveListBox,26,Tag,13,0,active,0x80C1220D,0x66001DD0 -DriveListBox,28,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -DriveListBox,30,Font,20,-1,active,0x80224414,0x66001CC0 -DriveListBox,31,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -DriveListBox,32,Appearance,6,0,active,0x80C12606,0x66001CA0 -DriveListBox,34,ToolTipText,1,0,active,0x80D12401,0x66001F20 -DriveListBox,35,OLEDropMode,6,0,active,0x80412406,0x66001D70 -DriveListBox,37,CausesValidation,4,0,active,0x80C12204,0x66002010 -FileListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 -FileListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 -FileListBox,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -FileListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 -FileListBox,6,Width,9,0,flag,0x90202409,0x66001E00 -FileListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 -FileListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 -FileListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 -FileListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -FileListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 -FileListBox,13,FileName,1,0,active,0x00E12401,0x6601E890 -FileListBox,15,Pattern,4,0,active,0x00E12404,0x6601E870 -FileListBox,16,Archive,4,0,active,0x00C12404,0x6601E8A0 -FileListBox,17,Normal,4,0,active,0x00E12404,0x6601E810 -FileListBox,18,ReadOnly,4,0,active,0x00E12404,0x6601E830 -FileListBox,19,System,4,0,active,0x00E12404,0x6601E8B0 -FileListBox,22,Hidden,1,0,flag,0x00005901,0x6601E840 -FileListBox,24,FontSize,7,0,flag,0x90304C07,0x66001D00 -FileListBox,25,FontBold,4,0,flag,0x90204C04,0x66001CD0 -FileListBox,26,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -FileListBox,27,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -FileListBox,28,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -FileListBox,30,DragMode,6,0,active,0x80C12606,0x66001ED0 -FileListBox,32,TabStop,4,0,active,0x80C14404,0x66002000 -FileListBox,33,Tag,13,0,active,0x80C1220D,0x66001DD0 -FileListBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -FileListBox,36,MultiSelect,6,0,active,0x00C13206,0x6601E850 -FileListBox,41,Font,20,-1,active,0x80224414,0x66001CC0 -FileListBox,42,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -FileListBox,43,Appearance,6,0,active,0x80C12606,0x66001CA0 -FileListBox,45,ToolTipText,1,0,active,0x80D12401,0x66001F20 -FileListBox,46,OLEDragMode,6,0,active,0x80412206,0x660021A0 -FileListBox,47,OLEDropMode,6,0,active,0x80412406,0x66001D70 -FileListBox,48,CausesValidation,4,0,active,0x80C12204,0x66002010 -Form,0,Name,1,0,active,0x8400D412,0x660222A0 -Form,1,Caption,1,0,active,0x80EA4401,0x66022290 -Form,2,hWnd,3,0,flag,0x80003803,0x66001D30 -Form,3,BackColor,5,0,active,0x80F12405,0x66022260 -Form,4,ForeColor,5,0,active,0x80F12405,0x66022280 -Form,5,Left,8,0,active,0x90222408,0x66001DC0 -Form,6,Top,10,0,flag,0x9020240A,0x66001DE0 -Form,7,Width,9,0,flag,0x90202409,0x66001E00 -Form,8,Height,11,0,flag,0x9020240B,0x66001DA0 -Form,9,Enabled,4,0,active,0x80E14404,0x66001D90 -Form,10,WindowState,6,0,active,0x00C14406,0x66022558 -Form,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -Form,12,FontName,1,0,active,0x90224C01,0x66001CF0 -Form,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -Form,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -Form,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -Form,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -Form,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -Form,18,hDC,3,0,flag,0x00005803,0x66022170 -Form,19,CurrentX,7,0,flag,0x00004C07,0x66022150 -Form,20,CurrentY,7,0,flag,0x00004C07,0x66022160 -Form,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 -Form,22,ScaleTop,7,0,flag,0x10404407,0x66022240 -Form,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 -Form,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 -Form,25,ScaleMode,6,3,active,0x10422406,0x66022228 -Form,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 -Form,27,DrawStyle,6,0,active,0x00C14406,0x66022198 -Form,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 -Form,29,FillStyle,6,0,active,0x00C14406,0x660221D0 -Form,30,FillColor,5,0,active,0x00D12405,0x660221C0 -Form,31,DrawMode,6,0,active,0x00C14406,0x66022180 -Form,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 -Form,33,Picture,21,0,active,0x04E12415,0x66022548 -Form,34,BorderStyle,6,0,active,0x00C12406,0x660224C0 -Form,35,Icon,21,0,active,0x00C1A615,0x660224F0 -Form,36,LinkTopic,1,0,active,0x00C1A401,0x66022518 -Form,37,LinkMode,6,0,active,0x00C12406,0x66022500 -Form,38,MaxButton,4,0,active,0x00C13604,0x66022528 -Form,39,MinButton,4,0,active,0x00C13604,0x66022538 -Form,40,Moveable,4,0,active,0x00C13604,0x660224E0 -Form,41,Image,21,0,flag,0x04005815,0x660221F8 -Form,42,ShowInTaskbar,4,0,active,0x00C13204,0x660226A0 -Form,43,_,4,0,sep,0xE0000804,0x660024A0 -Form,44,_,4,0,sep,0xE0000804,0x660024A0 -Form,45,_,4,0,sep,0xE0000804,0x660024A0 -Form,46,Visible,4,0,active,0x80E14404,0x66001DF0 -Form,47,Tag,13,0,active,0x80C1220D,0x66001DD0 -Form,48,MDIChild,4,0,active,0x00C15404,0x66022580 -Form,49,NegotiateMenus,4,0,active,0x00C12204,0x66022570 -Form,50,ClipControls,4,0,active,0x80C12204,0x66022270 -Form,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -Form,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 -Form,53,ClientSize,8,12,active,0x12025A08,0x660225A0 -Form,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 -Form,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 -Form,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 -Form,57,Count,2,0,flag,0x00005802,0x660225E0 -Form,58,Palette,32,0,skip,0x00005820,0x660225F0 -Form,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -Form,60,_,4,0,sep,0xE0000804,0x660024A0 -Form,61,LockControls,4,0,active,0x02C13A04,0x66022600 -Form,62,NegotiateMenus,4,0,active,0x02C13204,0x66022610 -Form,63,_,4,0,sep,0xE0000804,0x660024A0 -Form,64,Font,20,0,active,0x80224414,0x66001CC0 -Form,65,Appearance,6,0,active,0x80C12606,0x66001CA0 -Form,66,WhatsThisButton,4,0,active,0x00C13404,0x66022680 -Form,67,WhatsThisHelp,4,0,active,0x00C13404,0x66022690 -Form,68,StartUpPosition,4,0,active,0x00C13204,0x66022658 -Form,69,RightToLeft,4,0,active,0x80C14404,0x66114000 -Form,70,PaletteMode,6,0,active,0x00C13406,0x66022668 -Form,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 -Form,72,Icon,21,0,active,0x04E12415,0x66022620 -Form,73,HasDC,6,0,active,0x00C1A406,0x66022630 -Form,74,Moveable,4,0,active,0x00C13204,0x66022648 -Frame,0,Name,18,0,skip,0x8400D412,0x66001E50 -Frame,1,Caption,1,0,active,0x80EA4401,0x66022290 -Frame,2,Index,17,0,active,0x84C1D411,0x66001F00 -Frame,3,BackColor,5,0,active,0x80F12405,0x66022260 -Frame,4,ForeColor,5,0,active,0x80F12405,0x66022280 -Frame,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -Frame,6,Top,10,0,flag,0x9020240A,0x66001DE0 -Frame,7,Width,9,0,flag,0x90202409,0x66001E00 -Frame,8,Height,11,0,flag,0x9020240B,0x66001DA0 -Frame,9,Enabled,4,0,active,0x80E14404,0x66001D90 -Frame,10,Visible,4,0,active,0x80E14404,0x66001DF0 -Frame,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -Frame,12,FontName,1,0,active,0x90224C01,0x66001CF0 -Frame,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -Frame,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -Frame,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -Frame,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -Frame,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -Frame,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -Frame,19,Parent,25,0,skip,0x80003819,0x66001F10 -Frame,20,DragMode,6,0,active,0x80C12606,0x66001ED0 -Frame,21,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -Frame,22,Tag,13,0,active,0x80C1220D,0x66001DD0 -Frame,23,hWnd,3,0,flag,0x80003803,0x66001D30 -Frame,24,ClipControls,4,0,active,0x80C12204,0x66022270 -Frame,25,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -Frame,26,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -Frame,27,Font,20,0,active,0x80224414,0x66001CC0 -Frame,28,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -Frame,29,Appearance,6,0,active,0x80C12606,0x66001CA0 -Frame,30,Container,32,0,skip,0x80004C20,0x66001FB0 -Frame,31,RightToLeft,4,0,active,0x80C14404,0x66114000 -Frame,32,ToolTipText,1,0,active,0x80D12401,0x66001F20 -Frame,33,OLEDropMode,6,0,active,0x80412406,0x66001D70 -Frame,34,BorderStyle,6,0,active,0x00C12606,0x66025690 -HScrollBar,0,Name,18,0,skip,0x8400D412,0x66001E50 -HScrollBar,1,Index,17,0,active,0x84C1D411,0x66001F00 -HScrollBar,2,LeftTop,8,4,active,0x90222408,0x66001DC0 -HScrollBar,3,Top,10,0,flag,0x9020240A,0x66001DE0 -HScrollBar,4,Width,9,0,flag,0x90202409,0x66001E00 -HScrollBar,5,Height,11,0,flag,0x9020240B,0x66001DA0 -HScrollBar,6,Enabled,4,0,active,0x80E14404,0x66001D90 -HScrollBar,7,Visible,4,0,active,0x80E14404,0x66001DF0 -HScrollBar,8,MousePointer,6,0,active,0x80C12406,0x66001D50 -HScrollBar,9,TabIndex,2,0,active,0x84012402,0x66001FF0 -HScrollBar,10,Min,2,0,active,0x00E12402,0x66028680 -HScrollBar,11,Max,2,0,active,0x00E12402,0x66028670 -HScrollBar,12,SmallChange,2,0,active,0x00E12402,0x66028690 -HScrollBar,13,LargeChange,2,0,active,0x00E12402,0x66028660 -HScrollBar,14,Value,2,0,active,0x00612402,0x660286A0 -HScrollBar,15,Parent,25,0,skip,0x80003819,0x66001F10 -HScrollBar,16,DragMode,6,0,active,0x80C12606,0x66001ED0 -HScrollBar,17,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -HScrollBar,18,TabStop,4,0,active,0x80C14404,0x66002000 -HScrollBar,19,Tag,13,0,active,0x80C1220D,0x66001DD0 -HScrollBar,20,hWnd,3,0,flag,0x80003803,0x66001D30 -HScrollBar,21,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -HScrollBar,22,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -HScrollBar,23,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -HScrollBar,24,Container,32,0,skip,0x80004C20,0x66001FB0 -HScrollBar,25,RightToLeft,4,0,active,0x80C14404,0x66114000 -HScrollBar,26,CausesValidation,4,0,active,0x80C12204,0x66002010 -Image,0,Name,18,0,skip,0x8400D412,0x66001E50 -Image,1,Index,17,0,active,0x84C1D411,0x66001F00 -Image,2,Picture,21,0,active,0x04E12695,0x660272D8 -Image,3,LeftTop,8,4,active,0x90222408,0x66001DC0 -Image,4,Top,10,0,flag,0x9020240A,0x66001DE0 -Image,5,Width,9,0,flag,0x90202409,0x66001E00 -Image,6,Height,11,0,flag,0x9020240B,0x66001DA0 -Image,7,Enabled,4,0,active,0x80E14404,0x66001D90 -Image,8,Visible,4,0,active,0x80E14404,0x66001DF0 -Image,9,MousePointer,6,0,active,0x80C12406,0x66001D50 -Image,10,Stretch,4,0,active,0x00E12604,0x660272C8 -Image,11,Parent,25,0,skip,0x80003819,0x66001F10 -Image,12,DragMode,6,0,active,0x80C12606,0x66001ED0 -Image,13,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -Image,14,Tag,13,0,active,0x80C1220D,0x66001DD0 -Image,15,BorderStyle,6,0,active,0x00C12406,0x660272B0 -Image,16,DataSource,1,0,active,0x82F13201,0x66001FE0 -Image,17,DataField,1,0,active,0x80F12601,0x66001FD0 -Image,18,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -Image,19,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -Image,20,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -Image,21,Appearance,6,0,active,0x80C12606,0x66001CA0 -Image,22,Container,32,0,skip,0x80004C20,0x66001FB0 -Image,23,ToolTipText,1,0,active,0x80D12401,0x66001F20 -Image,24,OLEDragMode,6,0,active,0x80412206,0x660021A0 -Image,25,OLEDropMode,6,0,active,0x80412406,0x66026960 -Image,26,DataMember,33,0,active,0x80F12621,0x660020A0 -Image,27,DataFormat,22,0,active,0x84654416,0x66002070 -Image,28,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -Label,0,Name,18,0,skip,0x8400D412,0x66001E50 -Label,1,Caption,1,0,active,0x80EA4401,0x66022290 -Label,2,Index,17,0,active,0x84C1D411,0x66001F00 -Label,3,BackColor,5,0,active,0x80F12405,0x66022260 -Label,4,ForeColor,5,0,active,0x80F12405,0x66022280 -Label,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -Label,6,Top,10,0,flag,0x9020240A,0x66001DE0 -Label,7,Width,9,0,flag,0x90202409,0x66001E00 -Label,8,Height,11,0,flag,0x9020240B,0x66001DA0 -Label,9,Enabled,4,0,active,0x80E14404,0x66001D90 -Label,10,Visible,4,0,active,0x80E14404,0x66001DF0 -Label,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -Label,12,FontName,1,0,active,0x90224C01,0x66001CF0 -Label,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -Label,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -Label,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -Label,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -Label,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -Label,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -Label,19,BorderStyle,6,0,active,0x00C12406,0x66026FF0 -Label,20,Alignment,6,0,active,0x01C12286,0x66026FC0 -Label,21,LinkTopic,1,0,active,0x80E1C401,0x66025338 -Label,22,LinkItem,1,0,active,0x80E1C401,0x66025300 -Label,23,LinkMode,6,0,active,0x80C1C406,0x66025310 -Label,24,AutoSize,4,0,active,0x00E12604,0x66026FE0 -Label,25,Parent,25,0,skip,0x80003819,0x66001F10 -Label,26,DragMode,6,0,active,0x80C12606,0x66001ED0 -Label,27,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -Label,28,LinkTimeout,2,0,active,0x80C14402,0x66025328 -Label,29,Tag,13,0,active,0x80C1220D,0x66001DD0 -Label,30,WordWrap,4,0,active,0x00E12404,0x66027008 -Label,31,BackStyle,6,0,active,0x00C12406,0x66027018 -Label,32,DataSource,1,0,active,0x82F13201,0x66001FE0 -Label,33,DataField,1,0,active,0x80F12601,0x66001FD0 -Label,34,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -Label,35,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -Label,36,UseMnemonic,4,0,active,0x01E12284,0x66027030 -Label,37,Font,20,0,active,0x80224414,0x66001CC0 -Label,38,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -Label,39,Appearance,6,0,active,0x80C12606,0x66001CA0 -Label,40,Container,32,0,skip,0x80004C20,0x66001FB0 -Label,41,RightToLeft,4,0,active,0x80C14404,0x66114000 -Label,42,ToolTipText,1,0,active,0x80D12401,0x66001F20 -Label,43,OLEDropMode,6,0,active,0x80412406,0x66001D70 -Label,44,DataMember,33,0,active,0x80F12621,0x660020A0 -Label,45,DataFormat,22,0,active,0x84654416,0x66002070 -Label,46,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -Line,0,Name,18,0,skip,0x8400D412,0x66001E50 -Line,1,Index,17,0,active,0x84C1D411,0x66001F00 -Line,2,BorderColor,5,0,active,0x01D12285,0x660276F8 -Line,3,X1,8,0,active,0x00214408,0x66027708 -Line,4,Y1,10,0,active,0x0021440A,0x66027728 -Line,5,X2,8,0,active,0x00214408,0x66027718 -Line,6,Y2,10,0,active,0x0021440A,0x66027738 -Line,7,Visible,4,0,active,0x80E14404,0x66001DF0 -Line,8,Parent,25,0,skip,0x80003819,0x66001F10 -Line,9,Tag,13,0,active,0x80C1220D,0x66001DD0 -Line,10,DrawMode,6,0,active,0x00C14406,0x66022180 -Line,11,BorderStyle,6,0,active,0x01C12286,0x660276D0 -Line,12,BorderWidth,2,0,active,0x00C12402,0x660276E8 -Line,13,Container,32,0,skip,0x80004C20,0x66001FB0 -ListBox,0,Name,18,0,skip,0x8400D412,0x66001E50 -ListBox,1,Index,17,0,active,0x84C1D411,0x66001F00 -ListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 -ListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 -ListBox,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -ListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 -ListBox,6,Width,9,0,flag,0x90202409,0x66001E00 -ListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 -ListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 -ListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 -ListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -ListBox,11,FontName,1,0,active,0x90224C01,0x66001CF0 -ListBox,12,FontSize,7,0,flag,0x90304C07,0x66001D00 -ListBox,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 -ListBox,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -ListBox,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -ListBox,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -ListBox,17,TabIndex,2,0,active,0x84012402,0x66001FF0 -ListBox,18,ListCount,2,0,flag,0x00005802,0x660021F8 -ListBox,19,ListIndex,2,0,flag,0x00204C02,0x66002208 -ListBox,20,List,1,0,active,0x08064501,0x66002270 -ListBox,21,Sorted,4,0,active,0x00C13204,0x66002290 -ListBox,22,Text,1,0,flag,0x00204C01,0x660022A0 -ListBox,23,Parent,25,0,skip,0x80003819,0x66001F10 -ListBox,24,DragMode,6,0,active,0x80C12606,0x66001ED0 -ListBox,25,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -ListBox,26,TabStop,4,0,active,0x80C14404,0x66002000 -ListBox,27,Tag,13,0,active,0x80C1220D,0x66001DD0 -ListBox,28,Columns,2,0,active,0x00E12402,0x660022B0 -ListBox,29,MultiSelect,6,0,active,0x00C15406,0x660022C0 -ListBox,30,Selected,4,0,flag,0x00204D04,0x66002220 -ListBox,31,SelCount,2,0,flag,0x00005802,0x660022D8 -ListBox,32,TopIndex,2,0,flag,0x00204C02,0x660021C0 -ListBox,33,ItemData,3,0,active,0x00064503,0x660022E8 -ListBox,34,NewIndex,2,0,flag,0x00003802,0x660022F8 -ListBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -ListBox,36,hWnd,3,0,flag,0x80003803,0x66001D30 -ListBox,37,IMEMode,6,0,active,0xC0C16606,0x66114018 -ListBox,38,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -ListBox,39,Font,20,0,active,0x80224414,0x66001CC0 -ListBox,40,DataSource,1,0,active,0x82F13201,0x66001FE0 -ListBox,41,DataField,1,0,active,0x80F12601,0x66001FD0 -ListBox,42,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -ListBox,43,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -ListBox,44,Appearance,6,0,active,0x80C12606,0x66001CA0 -ListBox,45,Container,32,0,skip,0x80004C20,0x66001FB0 -ListBox,46,IntegralHeight,4,0,active,0x00413604,0x66002308 -ListBox,47,RightToLeft,4,0,active,0x80C14404,0x66114000 -ListBox,48,ToolTipText,1,0,active,0x80D12401,0x66001F20 -ListBox,49,OLEDragMode,6,0,active,0x80412206,0x660021A0 -ListBox,50,OLEDropMode,6,0,active,0x80412406,0x66001D70 -ListBox,51,Style,6,0,active,0x00C13406,0x66002318 -ListBox,52,CausesValidation,4,0,active,0x80C12204,0x66002010 -ListBox,53,DataMember,33,0,active,0x80F12621,0x660020A0 -ListBox,54,DataFormat,22,0,active,0x84654416,0x66002070 -ListBox,55,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -MDIForm,0,Name,1,0,active,0x8400D412,0x660222A0 -MDIForm,1,Caption,1,0,active,0x80EA4401,0x66022290 -MDIForm,2,hWnd,3,0,flag,0x80003803,0x66001D30 -MDIForm,3,BackColor,5,0,active,0x80F12405,0x66022260 -MDIForm,4,ForeColor,5,0,active,0x80F12405,0x66022280 -MDIForm,5,Left,8,0,active,0x90222408,0x66001DC0 -MDIForm,6,Top,10,0,flag,0x9020240A,0x66001DE0 -MDIForm,7,Width,9,0,flag,0x90202409,0x66001E00 -MDIForm,8,Height,11,0,flag,0x9020240B,0x66001DA0 -MDIForm,9,Enabled,4,0,active,0x80E14404,0x66001D90 -MDIForm,10,WindowState,6,0,active,0x00C14406,0x66022558 -MDIForm,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -MDIForm,12,FontName,1,0,active,0x90224C01,0x66001CF0 -MDIForm,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -MDIForm,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -MDIForm,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -MDIForm,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -MDIForm,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -MDIForm,18,hDC,3,0,flag,0x00005803,0x66022170 -MDIForm,19,CurrentX,7,0,flag,0x00004C07,0x66022150 -MDIForm,20,CurrentY,7,0,flag,0x00004C07,0x66022160 -MDIForm,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 -MDIForm,22,ScaleTop,7,0,flag,0x10404407,0x66022240 -MDIForm,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 -MDIForm,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 -MDIForm,25,ScaleMode,6,3,active,0x10422406,0x66022228 -MDIForm,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 -MDIForm,27,DrawStyle,6,0,active,0x00C14406,0x66022198 -MDIForm,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 -MDIForm,29,FillStyle,6,0,active,0x00C14406,0x660221D0 -MDIForm,30,FillColor,5,0,active,0x00D12405,0x660221C0 -MDIForm,31,DrawMode,6,0,active,0x00C14406,0x66022180 -MDIForm,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 -MDIForm,33,Picture,21,0,active,0x04E12415,0x66022548 -MDIForm,34,BorderStyle,6,0,active,0x00C12406,0x660224C0 -MDIForm,35,Icon,21,0,active,0x00C1A615,0x660224F0 -MDIForm,36,LinkTopic,1,0,active,0x00C1A401,0x66022518 -MDIForm,37,LinkMode,6,0,active,0x00C12406,0x66022500 -MDIForm,38,MaxButton,4,0,active,0x00C13604,0x66022528 -MDIForm,39,MinButton,4,0,active,0x00C13604,0x66022538 -MDIForm,40,Moveable,4,0,active,0x00C13604,0x660224E0 -MDIForm,41,Image,21,0,flag,0x04005815,0x660221F8 -MDIForm,42,ShowInTaskbar,4,0,active,0x00C13204,0x660226A0 -MDIForm,43,_,4,0,sep,0xE0000804,0x660024A0 -MDIForm,44,_,4,0,sep,0xE0000804,0x660024A0 -MDIForm,45,_,4,0,sep,0xE0000804,0x660024A0 -MDIForm,46,Visible,4,0,active,0x80E14404,0x66001DF0 -MDIForm,47,Tag,13,0,active,0x80C1220D,0x66001DD0 -MDIForm,48,MDIChild,4,0,active,0x00C15404,0x66022580 -MDIForm,49,NegotiateMenus,4,0,active,0x00C12204,0x66022570 -MDIForm,50,ClipControls,4,0,active,0x80C12204,0x66022270 -MDIForm,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -MDIForm,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 -MDIForm,53,ClientSize,8,12,active,0x12025A08,0x660225A0 -MDIForm,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 -MDIForm,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 -MDIForm,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 -MDIForm,57,Count,2,0,flag,0x00005802,0x660225E0 -MDIForm,58,Palette,32,0,skip,0x00005820,0x660225F0 -MDIForm,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -MDIForm,60,_,4,0,sep,0xE0000804,0x660024A0 -MDIForm,61,LockControls,4,0,active,0x02C13A04,0x66022600 -MDIForm,62,NegotiateMenus,4,0,active,0x02C13204,0x66022610 -MDIForm,63,_,4,0,sep,0xE0000804,0x660024A0 -MDIForm,64,Font,20,0,active,0x80224414,0x66001CC0 -MDIForm,65,Appearance,6,0,active,0x80C12606,0x66001CA0 -MDIForm,66,WhatsThisButton,4,0,active,0x00C13404,0x66022680 -MDIForm,67,WhatsThisHelp,4,0,active,0x00C13404,0x66022690 -MDIForm,68,StartUpPosition,4,0,active,0x00C13204,0x66022658 -MDIForm,69,RightToLeft,4,0,active,0x80C14404,0x66114000 -MDIForm,70,PaletteMode,6,0,active,0x00C13406,0x66022668 -MDIForm,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 -MDIForm,72,Icon,21,0,active,0x04E12415,0x66022620 -MDIForm,73,HasDC,6,0,active,0x00C1A406,0x66022630 -MDIForm,74,Moveable,4,0,active,0x00C13204,0x66022648 -Menu,0,Name,18,0,skip,0x8400D412,0x66001E50 -Menu,1,Index,17,0,active,0x84C1D411,0x66001F00 -Menu,2,Visible,4,0,active,0x00C14404,0x66027908 -Menu,3,Caption,1,0,active,0x0801A601,0x660278B0 -Menu,4,Checked,4,0,active,0x00C12404,0x660278C8 -Menu,5,Enabled,4,0,active,0x00C14404,0x660278D8 -Menu,6,_,4,0,active,0x00C12C04,0x660278F8 -Menu,7,_,4,0,active,0x00C13A04,0x660278E8 -Menu,8,Shortcut,2,0,active,0x02C5B602,0x66027898 -Menu,9,Parent,25,0,skip,0x80003819,0x66001F10 -Menu,10,Tag,13,0,active,0x80C1220D,0x66001DD0 -Menu,11,WindowList,4,0,active,0x00C13404,0x66027918 -Menu,12,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -Menu,13,NegotiatePosition,6,0,active,0x02C1B206,0x66027928 -OLE,0,Name,18,0,skip,0x8400D412,0x66001E50 -OLE,1,Index,17,0,active,0x84C1D411,0x66001F00 -OLE,2,BackColor,5,0,active,0x80F12405,0x66001E40 -OLE,3,LeftTop,8,4,active,0x90222408,0x66001DC0 -OLE,4,Top,10,0,flag,0x9020240A,0x66001DE0 -OLE,5,Width,9,0,flag,0x90202409,0x66001E00 -OLE,6,Height,11,0,flag,0x9020240B,0x66001DA0 -OLE,7,Visible,4,0,active,0x80E14404,0x66001DF0 -OLE,8,Parent,25,0,skip,0x80003819,0x66001F10 -OLE,9,DragMode,6,0,active,0x80C12606,0x66001ED0 -OLE,10,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -OLE,11,Tag,13,0,active,0x80C1220D,0x66001DD0 -OLE,12,BorderStyle,6,0,active,0x00C12406,0x66024AE8 -OLE,13,Enabled,4,0,active,0x80E14404,0x66001D90 -OLE,14,TabStop,4,0,active,0x80C14404,0x66002000 -OLE,15,TabIndex,2,0,active,0x84012402,0x66001FF0 -OLE,16,MousePointer,6,0,active,0x80C12406,0x66001D50 -OLE,17,Class,1,0,active,0x04D14401,0x66024B00 -OLE,18,OLEType,6,0,flag,0x00005806,0x66024B20 -OLE,19,SourceDoc,1,0,active,0x04D14401,0x66024B48 -OLE,20,SourceItem,1,0,active,0x04D14401,0x66024B70 -OLE,21,UpdateOptions,6,0,active,0x00C12606,0x66024BC0 -OLE,22,HostName,1,0,active,0x00C14401,0x66024BE8 -OLE,23,SizeMode,6,0,active,0x00C12406,0x66024C10 -OLE,24,AutoActivate,6,0,active,0x00C12206,0x66024C38 -OLE,25,AutoVerbMenu,4,0,active,0x00C12204,0x66024C60 -OLE,26,AppIsRunning,4,0,flag,0x00004C04,0x66024C88 -OLE,27,Picture,21,0,flag,0x00005815,0x66024CA0 -OLE,28,OleObjectBlob,32,0,skip,0x00005820,0x66024AA8 -OLE,29,EditMode,3,0,flag,0x00004C03,0x66024CB8 -OLE,30,DataText,1,0,flag,0x00004C01,0x66024CE0 -OLE,31,Format,1,0,flag,0x00002A01,0x66024D00 -OLE,32,ObjectAcceptFormats,1,0,flag,0x00005901,0x66024D30 -OLE,33,ObjectAcceptFormatsCount,2,0,flag,0x00005802,0x66024D68 -OLE,34,ObjectGetFormats,1,0,flag,0x00005901,0x66024D98 -OLE,35,ObjectGetFormatsCount,2,0,flag,0x00005802,0x66024DC8 -OLE,36,OLETypeAllowed,6,0,active,0x00C12206,0x66024DF0 -OLE,37,PasteOK,4,0,flag,0x00005804,0x66024E10 -OLE,38,ObjectVerbs,1,0,flag,0x00005901,0x66024E38 -OLE,39,ObjectVerbFlags,3,0,flag,0x00005903,0x66024E60 -OLE,40,ObjectVerbsCount,2,0,flag,0x00005802,0x66024E90 -OLE,41,Verb,2,0,active,0x00C12202,0x66024EB0 -OLE,42,FileNumber,2,0,flag,0x00002A02,0x66024ED8 -OLE,43,Action,2,0,flag,0x02000C02,0x66024EF8 -OLE,44,MiscFlags,2,0,active,0x00C12202,0x66024F20 -OLE,45,OleObjectBlob2,3,0,active,0x02021803,0x66024AD0 -OLE,46,_,4,0,sep,0xE0000804,0x660024A0 -OLE,47,CausesValidation,4,0,active,0x80C12204,0x66002010 -OLE,48,DisplayType,4,0,active,0x22011804,0x66024F40 -OLE,49,hWnd,3,0,flag,0x80005803,0x66024FC0 -OLE,50,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -OLE,51,LpOleObject,6,0,active,0x00C14406,0x66024F68 -OLE,52,BackStyle,3,0,flag,0x00005803,0x66024F90 -OLE,53,OLEDropAllowed,6,0,active,0x00C12406,0x66024FA8 -OLE,54,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -OLE,55,_,4,0,sep,0xE0000804,0x660024A0 -OLE,56,_,4,0,sep,0xE0000804,0x660024A0 -OLE,57,_,4,0,sep,0xE0000804,0x660024A0 -OLE,58,_,4,0,sep,0xE0000804,0x660024A0 -OLE,59,_,4,0,sep,0xE0000804,0x660024A0 -OLE,60,_,4,0,sep,0xE0000804,0x660024A0 -OLE,61,_,4,0,sep,0xE0000804,0x660024A0 -OLE,62,_,4,0,sep,0xE0000804,0x660024A0 -OLE,63,_,4,0,sep,0xE0000804,0x660024A0 -OLE,64,_,4,0,sep,0xE0000804,0x660024A0 -OLE,65,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -OLE,66,DataField,1,0,active,0x80F12601,0x66001FD0 -OLE,67,DataSource,1,0,active,0x82F13201,0x66001FE0 -OLE,68,Bindings,1,0,active,0x02021801,0x66024FE8 -OLE,69,OLEDropAllowed,4,0,active,0x00C12404,0x66024B98 -OLE,70,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -OLE,71,Container,32,0,skip,0x80004C20,0x66001FB0 -OLE,72,Appearance,6,0,active,0x80C12606,0x66001CA0 -OLE,73,_,4,0,sep,0xE0000804,0x660024A0 -OLE,74,_,4,0,sep,0xE0000804,0x660024A0 -OptionButton,0,Name,18,0,skip,0x8400D412,0x66001E50 -OptionButton,1,Caption,1,0,active,0x80EA4401,0x66022290 -OptionButton,2,Index,17,0,active,0x84C1D411,0x66001F00 -OptionButton,3,BackColor,5,0,active,0x80F12405,0x66022260 -OptionButton,4,ForeColor,5,0,active,0x80F12405,0x66022280 -OptionButton,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -OptionButton,6,Top,10,0,flag,0x9020240A,0x66001DE0 -OptionButton,7,Width,9,0,flag,0x90202409,0x66001E00 -OptionButton,8,Height,11,0,flag,0x9020240B,0x66001DA0 -OptionButton,9,Enabled,4,0,active,0x80E14404,0x66001D90 -OptionButton,10,Visible,4,0,active,0x80E14404,0x66001DF0 -OptionButton,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -OptionButton,12,FontName,1,0,active,0x90224C01,0x66001CF0 -OptionButton,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -OptionButton,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -OptionButton,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -OptionButton,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -OptionButton,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -OptionButton,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -OptionButton,19,Value,4,0,active,0x00E14404,0x66027B70 -OptionButton,20,Parent,25,0,skip,0x80003819,0x66001F10 -OptionButton,21,DragMode,6,0,active,0x80C12606,0x66001ED0 -OptionButton,22,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -OptionButton,23,TabStop,4,0,active,0x80C14404,0x66002000 -OptionButton,24,Tag,13,0,active,0x80C1220D,0x66001DD0 -OptionButton,25,Alignment,6,0,active,0x00C12406,0x66027B80 -OptionButton,26,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -OptionButton,27,hWnd,3,0,flag,0x80003803,0x66001D30 -OptionButton,28,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -OptionButton,29,Font,20,0,active,0x80224414,0x66001CC0 -OptionButton,30,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -OptionButton,31,Appearance,6,0,active,0x80C12606,0x66001CA0 -OptionButton,32,Container,32,0,skip,0x80004C20,0x66001FB0 -OptionButton,33,RightToLeft,4,0,active,0x80C14404,0x66114000 -OptionButton,34,ToolTipText,1,0,active,0x80D12401,0x66001F20 -OptionButton,35,Picture,21,0,active,0x84E14495,0x660259E0 -OptionButton,36,DisabledPicture,21,0,active,0x84E14495,0x66025A00 -OptionButton,37,DownPicture,21,0,active,0x84E14495,0x660259F0 -OptionButton,38,Style,6,0,active,0x00C13406,0x66027B98 -OptionButton,39,OLEDropMode,6,0,active,0x80412406,0x66001D70 -OptionButton,40,MaskColor,5,0,active,0x80F14405,0x66025A10 -OptionButton,41,UseMaskColor,4,0,active,0x80E14404,0x66025A20 -OptionButton,42,CausesValidation,4,0,active,0x80C12204,0x66002010 -PictureBox,0,Name,1,0,active,0x8400D412,0x66001E50 -PictureBox,1,BackColor,5,0,active,0x80F12405,0x66022260 -PictureBox,2,Index,17,0,active,0x84C1D411,0x66001F00 -PictureBox,3,Picture,21,0,active,0x04E12415,0x66027FB8 -PictureBox,4,ForeColor,5,0,active,0x80F12405,0x66022280 -PictureBox,5,LeftTop,8,4,active,0x90222408,0x66001DC0 -PictureBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 -PictureBox,7,Width,9,0,flag,0x90202409,0x66001E00 -PictureBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 -PictureBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 -PictureBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 -PictureBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -PictureBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 -PictureBox,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -PictureBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -PictureBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -PictureBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -PictureBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -PictureBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -PictureBox,19,hDC,3,0,flag,0x00005803,0x66022170 -PictureBox,20,CurrentX,7,0,flag,0x00004C07,0x66022150 -PictureBox,21,CurrentY,7,0,flag,0x00004C07,0x66022160 -PictureBox,22,ScaleLeft,7,0,flag,0x10404407,0x66022218 -PictureBox,23,ScaleTop,7,0,flag,0x10404407,0x66022240 -PictureBox,24,ScaleWidth,7,0,flag,0x10004407,0x66022250 -PictureBox,25,ScaleHeight,7,0,flag,0x10004407,0x66022208 -PictureBox,26,ScaleMode,6,0,active,0x10422406,0x66022228 -PictureBox,27,FontTransparent,4,0,flag,0x10404404,0x660221E8 -PictureBox,28,DrawStyle,6,0,active,0x00C14406,0x66022198 -PictureBox,29,DrawWidth,2,0,active,0x00C14402,0x660221B0 -PictureBox,30,FillStyle,6,0,active,0x00C14406,0x660221D0 -PictureBox,31,FillColor,5,0,active,0x00D12405,0x660221C0 -PictureBox,32,DrawMode,6,0,active,0x00C14406,0x66022180 -PictureBox,33,AutoRedraw,4,0,flag,0x10604404,0x66022140 -PictureBox,34,CausesValidation,4,0,active,0x80C12204,0x66002010 -PictureBox,35,AutoSize,4,0,active,0x00E12604,0x66027F90 -PictureBox,36,BorderStyle,6,0,active,0x00C12406,0x66027FA0 -PictureBox,37,LinkTopic,1,0,active,0x80E1C401,0x66025338 -PictureBox,38,LinkItem,1,0,active,0x80E1C401,0x66025300 -PictureBox,39,LinkMode,6,0,active,0x80C1C406,0x66025310 -PictureBox,40,Image,21,0,flag,0x04005815,0x660221F8 -PictureBox,41,Parent,25,0,skip,0x80003819,0x66001F10 -PictureBox,42,DragMode,6,0,active,0x80C12606,0x66001ED0 -PictureBox,43,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -PictureBox,44,LinkTimeout,2,0,active,0x80C14402,0x66025328 -PictureBox,45,TabStop,4,0,active,0x80C14404,0x66002000 -PictureBox,46,Tag,13,0,active,0x80C1220D,0x66001DD0 -PictureBox,47,hWnd,3,0,flag,0x80003803,0x66001D30 -PictureBox,48,ClipControls,4,0,active,0x80C12204,0x66022270 -PictureBox,49,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -PictureBox,50,Align,6,0,active,0x80C12406,0x66024040 -PictureBox,51,IMEMode,6,0,active,0xC0C16606,0x66114018 -PictureBox,52,DataSource,1,0,active,0x82F13201,0x66001FE0 -PictureBox,53,DataField,1,0,active,0x80F12601,0x66001FD0 -PictureBox,54,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -PictureBox,55,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -PictureBox,56,Negotiate,4,0,active,0x82C13404,0x66024058 -PictureBox,57,Font,20,0,active,0x80224414,0x66001CC0 -PictureBox,58,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -PictureBox,59,Appearance,6,0,active,0x80C12606,0x66001CA0 -PictureBox,60,Container,32,0,skip,0x80004C20,0x66001FB0 -PictureBox,61,RightToLeft,4,0,active,0x80C14404,0x66114000 -PictureBox,62,ToolTipText,1,0,active,0x80D12401,0x66001F20 -PictureBox,63,OLEDragMode,6,0,active,0x80412206,0x660021A0 -PictureBox,64,OLEDropMode,6,0,active,0x80412406,0x66026960 -PictureBox,65,DataMember,33,0,active,0x80F12621,0x660020A0 -PictureBox,66,DataFormat,22,0,active,0x84654416,0x66002070 -PictureBox,67,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -PictureBox,68,HasDC,4,0,active,0x00C13204,0x66027FC8 -PropertyPage,0,Name,1,0,active,0x8400D412,0x660222A0 -PropertyPage,1,Caption,1,0,active,0x80EA4401,0x66022290 -PropertyPage,2,hWnd,3,0,flag,0x80003803,0x66001D30 -PropertyPage,3,BackColor,5,0,active,0x80F12405,0x66022260 -PropertyPage,4,ForeColor,5,0,active,0x80F12405,0x66022280 -PropertyPage,5,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,6,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,7,Width,9,0,flag,0x90203409,0x6602A3B8 -PropertyPage,8,Height,11,0,flag,0x9020340B,0x6602A3C8 -PropertyPage,9,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,10,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -PropertyPage,12,FontName,1,0,active,0x90224C01,0x66001CF0 -PropertyPage,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -PropertyPage,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -PropertyPage,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -PropertyPage,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -PropertyPage,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -PropertyPage,18,hDC,3,0,flag,0x00005803,0x66022170 -PropertyPage,19,CurrentX,7,0,flag,0x00004C07,0x66022150 -PropertyPage,20,CurrentY,7,0,flag,0x00004C07,0x66022160 -PropertyPage,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 -PropertyPage,22,ScaleTop,7,0,flag,0x10404407,0x66022240 -PropertyPage,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 -PropertyPage,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 -PropertyPage,25,ScaleMode,6,3,active,0x10422406,0x66022228 -PropertyPage,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 -PropertyPage,27,DrawStyle,6,0,active,0x00C14406,0x66022198 -PropertyPage,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 -PropertyPage,29,FillStyle,6,0,active,0x00C14406,0x660221D0 -PropertyPage,30,FillColor,5,0,active,0x00D12405,0x660221C0 -PropertyPage,31,DrawMode,6,0,active,0x00C14406,0x66022180 -PropertyPage,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 -PropertyPage,33,Picture,21,0,active,0x04E12415,0x66022548 -PropertyPage,34,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,35,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,36,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,37,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,38,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,39,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,40,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,41,Image,21,0,flag,0x04005815,0x660221F8 -PropertyPage,42,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,43,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,44,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,45,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,46,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,47,Tag,13,0,active,0x80C1220D,0x66001DD0 -PropertyPage,48,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,49,NegotiateMenus,4,0,active,0x00C12204,0x66022570 -PropertyPage,50,ClipControls,4,0,active,0x80C12204,0x66022270 -PropertyPage,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -PropertyPage,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 -PropertyPage,53,ClientSize,8,12,active,0x12025A08,0x660225A0 -PropertyPage,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 -PropertyPage,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 -PropertyPage,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 -PropertyPage,57,Count,2,0,flag,0x00005802,0x660225E0 -PropertyPage,58,Palette,32,0,skip,0x00005820,0x660225F0 -PropertyPage,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -PropertyPage,60,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,61,LockControls,4,0,active,0x02C13A04,0x66022600 -PropertyPage,62,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,63,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,64,Font,20,0,active,0x80224414,0x66001CC0 -PropertyPage,65,Appearance,6,0,active,0x80C12606,0x66001CA0 -PropertyPage,66,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,67,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,68,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,69,RightToLeft,4,0,active,0x80C14404,0x66114000 -PropertyPage,70,ShowInTaskbar,4,0,active,0x00C13204,0x660226A0 -PropertyPage,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 -PropertyPage,72,Icon,21,0,active,0x04E12415,0x66022620 -PropertyPage,73,PaletteMode,6,0,active,0x00C12406,0x6602A3A0 -PropertyPage,74,_,4,0,sep,0xE0000804,0x660024A0 -PropertyPage,75,SelectedControls,22,0,flag,0x00005816,0x6602A370 -PropertyPage,76,Changed,4,0,flag,0x00C04C04,0x6602A390 -PropertyPage,77,StandardSize,6,0,flag,0x02005446,0x6602A3D8 -Shape,0,Name,18,0,skip,0x8400D412,0x66001E50 -Shape,1,Index,17,0,active,0x84C1D411,0x66001F00 -Shape,2,BackColor,5,0,active,0x80F12405,0x66001E40 -Shape,3,BorderColor,5,0,active,0x01F12285,0x660288F0 -Shape,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -Shape,5,Top,10,0,flag,0x9020240A,0x66001DE0 -Shape,6,Width,9,0,flag,0x90202409,0x66001E00 -Shape,7,Height,11,0,flag,0x9020240B,0x66001DA0 -Shape,8,Visible,4,0,active,0x80E14404,0x66001DF0 -Shape,9,Parent,25,0,skip,0x80003819,0x66001F10 -Shape,10,Tag,13,0,active,0x80C1220D,0x66001DD0 -Shape,11,Shape,6,0,active,0x01C12286,0x66028870 -Shape,12,DrawMode,6,0,active,0x00C14406,0x66022180 -Shape,13,BorderStyle,6,0,active,0x00C12486,0x660288A0 -Shape,14,BorderWidth,2,0,active,0x00E12482,0x660288B8 -Shape,15,FillColor,5,0,active,0x00F12485,0x660288C8 -Shape,16,BackStyle,6,0,active,0x01C12286,0x66028888 -Shape,17,FillStyle,6,0,active,0x01C12286,0x660288D8 -Shape,18,Container,32,0,skip,0x80004C20,0x66001FB0 -TextBox,0,Name,18,0,skip,0x8400D412,0x66001E50 -TextBox,1,Index,17,0,active,0x84C1D411,0x66001F00 -TextBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 -TextBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 -TextBox,4,LeftTop,8,4,active,0x90222408,0x66001DC0 -TextBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 -TextBox,6,Width,9,0,flag,0x90202409,0x66001E00 -TextBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 -TextBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 -TextBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 -TextBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 -TextBox,11,Text,1,0,active,0x80EE4401,0x66025E50 -TextBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 -TextBox,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -TextBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -TextBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -TextBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -TextBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -TextBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 -TextBox,19,BorderStyle,6,0,active,0x00C12406,0x66026978 -TextBox,20,LinkTopic,1,0,active,0x80E1C401,0x66025338 -TextBox,21,LinkItem,1,0,active,0x80E1C401,0x66025300 -TextBox,22,LinkMode,6,0,active,0x80C1C406,0x66025310 -TextBox,23,MultiLine,4,0,active,0x00C13404,0x66026990 -TextBox,24,ScrollBars,6,0,active,0x00C13406,0x660269A0 -TextBox,25,SelStart,3,0,flag,0x00204C03,0x660269C8 -TextBox,26,SelLength,3,0,flag,0x00204C03,0x660269B8 -TextBox,27,SelText,1,0,flag,0x00204C01,0x660269D8 -TextBox,28,Parent,25,0,skip,0x80003819,0x66001F10 -TextBox,29,DragMode,6,0,active,0x80C12606,0x66001ED0 -TextBox,30,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -TextBox,31,LinkTimeout,2,0,active,0x80C14402,0x66025328 -TextBox,32,TabStop,4,0,active,0x80C14404,0x66002000 -TextBox,33,Tag,13,0,active,0x80C1220D,0x66001DD0 -TextBox,34,PasswordChar,1,0,active,0x00E92401,0x660269E8 -TextBox,35,HideSelection,4,0,active,0x00C13204,0x660269F8 -TextBox,36,Alignment,6,0,active,0x00C12406,0x66026A08 -TextBox,37,MaxLength,3,0,active,0x00E12403,0x66026A20 -TextBox,38,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -TextBox,39,hWnd,3,0,flag,0x80003803,0x66001D30 -TextBox,40,IMEMode,6,0,active,0xC0C16606,0x66114018 -TextBox,41,DataSource,1,0,active,0x82F13201,0x66001FE0 -TextBox,42,DataField,1,0,active,0x80F12601,0x66001FD0 -TextBox,43,DataChanged,4,0,flag,0x80106E04,0x66001FC0 -TextBox,44,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -TextBox,45,Locked,4,0,active,0x00C14404,0x66026A30 -TextBox,46,Font,20,0,active,0x80224414,0x66001CC0 -TextBox,47,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -TextBox,48,Appearance,6,0,active,0x80C12606,0x66001CA0 -TextBox,49,Container,32,0,skip,0x80004C20,0x66001FB0 -TextBox,50,RightToLeft,4,0,active,0x80C14404,0x66114000 -TextBox,51,ToolTipText,1,0,active,0x80D12401,0x66001F20 -TextBox,52,OLEDragMode,6,0,active,0x80412206,0x660021A0 -TextBox,53,OLEDropMode,6,0,active,0x80412406,0x66026960 -TextBox,54,CausesValidation,4,0,active,0x80C12204,0x66002010 -TextBox,55,DataMember,33,0,active,0x80F12621,0x660020A0 -TextBox,56,DataFormat,22,0,active,0x84654416,0x66002070 -TextBox,57,DataSource(obj),22,0,flag,0x84244C16,0x66002088 -Timer,0,Name,18,0,skip,0x8400D412,0x66001E50 -Timer,1,Index,17,0,active,0x84C1D411,0x66001F00 -Timer,2,Enabled,4,0,active,0x00C12604,0x66028A30 -Timer,3,Interval,3,0,active,0x00C12403,0x66028A40 -Timer,4,Parent,25,0,skip,0x80003819,0x66001F10 -Timer,5,Tag,13,0,active,0x80C1220D,0x66001DD0 -Timer,6,_,4,0,sep,0xE0000804,0x660024A0 -Timer,7,Left,8,0,active,0x82013408,0x66025360 -Timer,8,Top,10,0,active,0x8201340A,0x66025370 -UserControl,0,Name,1,0,active,0x8400D412,0x660222A0 -UserControl,1,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,2,hWnd,3,0,flag,0x80003803,0x66001D30 -UserControl,3,BackColor,5,0,active,0x80F12405,0x66022260 -UserControl,4,ForeColor,5,0,active,0x80F12405,0x66022280 -UserControl,5,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,6,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,7,Width,9,0,flag,0x90202409,0x66001E00 -UserControl,8,Height,11,0,flag,0x9020240B,0x66001DA0 -UserControl,9,Enabled,4,0,active,0x80E14404,0x66001D90 -UserControl,10,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -UserControl,12,FontName,1,0,active,0x90224C01,0x66001CF0 -UserControl,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -UserControl,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -UserControl,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -UserControl,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -UserControl,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -UserControl,18,hDC,3,0,flag,0x00005803,0x66022170 -UserControl,19,CurrentX,7,0,flag,0x00004C07,0x66022150 -UserControl,20,CurrentY,7,0,flag,0x00004C07,0x66022160 -UserControl,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 -UserControl,22,ScaleTop,7,0,flag,0x10404407,0x66022240 -UserControl,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 -UserControl,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 -UserControl,25,ScaleMode,6,3,active,0x10422406,0x66022228 -UserControl,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 -UserControl,27,DrawStyle,6,0,active,0x00C14406,0x66022198 -UserControl,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 -UserControl,29,FillStyle,6,0,active,0x00C14406,0x660221D0 -UserControl,30,FillColor,5,0,active,0x00D12405,0x660221C0 -UserControl,31,DrawMode,6,0,active,0x00C14406,0x66022180 -UserControl,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 -UserControl,33,Picture,21,0,active,0x04E12415,0x66022548 -UserControl,34,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,35,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,36,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,37,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,38,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,39,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,40,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,41,Image,21,0,flag,0x04005815,0x660221F8 -UserControl,42,Parent,32,0,skip,0x00005820,0x660294D0 -UserControl,43,MaskColor,5,0,active,0x00712205,0x66029330 -UserControl,44,MaskPicture,21,0,active,0x04E12215,0x66029320 -UserControl,45,Windowless,4,0,active,0x02C15444,0x660294E0 -UserControl,46,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,47,Tag,13,0,active,0x80C1220D,0x66001DD0 -UserControl,48,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,49,NegotiateMenus,4,0,active,0x00C12204,0x66022570 -UserControl,50,ClipControls,4,0,active,0x80C12204,0x66022270 -UserControl,51,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 -UserControl,53,ClientSize,8,12,active,0x12025A08,0x660225A0 -UserControl,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 -UserControl,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 -UserControl,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 -UserControl,57,Count,2,0,flag,0x00005802,0x660225E0 -UserControl,58,Palette,32,0,skip,0x00005820,0x660225F0 -UserControl,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -UserControl,60,DataMembers,22,0,flag,0x00005816,0x660293B8 -UserControl,61,LockControls,4,0,active,0x02C13A04,0x66022600 -UserControl,62,DataBindingBehavior,6,0,active,0x02C15446,0x66119048 -UserControl,63,ClipBehavior,6,0,active,0x00C12406,0x66029508 -UserControl,64,Font,20,0,active,0x80224414,0x66001CC0 -UserControl,65,Appearance,6,0,active,0x80C12606,0x66001CA0 -UserControl,66,DataSourceBehavior,6,0,active,0x02C15446,0x66119060 -UserControl,67,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,68,HyperLink,3,0,flag,0x00005803,0x66029520 -UserControl,69,RightToLeft,4,0,active,0x80C14404,0x66114000 -UserControl,70,ShowInTaskbar,4,0,active,0x00C13204,0x660226A0 -UserControl,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 -UserControl,72,Icon,21,0,active,0x04E12415,0x66022620 -UserControl,73,PaletteMode,6,0,active,0x00E1A406,0x66029410 -UserControl,74,PropertyChanged,6,0,active,0x00C12406,0x660294F0 -UserControl,75,_,4,0,sep,0xE0000804,0x660024A0 -UserControl,76,DefaultCancel,4,0,active,0x02C15444,0x66029340 -UserControl,77,ContainedControls,22,0,flag,0x00005816,0x660293A0 -UserControl,78,PropertyPages,1,0,active,0x08064501,0x660293E0 -UserControl,79,Extender,32,0,skip,0x00005820,0x660293D0 -UserControl,80,ContainerHwnd,22,0,flag,0x00005816,0x660293F8 -UserControl,81,ParentControls,22,0,flag,0x00005816,0x66029428 -UserControl,82,ForwardFocus,4,0,active,0x02C15444,0x66029350 -UserControl,83,CanGetFocus,4,0,active,0x02C15444,0x66029360 -UserControl,84,CanPropertyChange,4,0,active,0x02C15444,0x66029370 -UserControl,85,Alignable,4,0,active,0x02C15444,0x66029380 -UserControl,86,Ambient,4,0,active,0x02C15444,0x66029390 -UserControl,87,BackStyle,6,0,active,0x00C12406,0x66029440 -UserControl,88,EventsFrozen,4,0,flag,0x00005804,0x66029458 -UserControl,89,BorderStyle,6,0,active,0x00C12406,0x66029468 -UserControl,90,InvisibleAtRuntime,4,0,flag,0x0200D404,0x66029480 -UserControl,91,AccessKeys,1,0,active,0x08D14401,0x66029490 -UserControl,92,HitBehavior,4,0,active,0x02C1B204,0x660294A8 -UserControl,93,EditAtDesignTime,22,0,flag,0x00005816,0x660294B8 -UserDocument,0,Name,1,0,active,0x8400D412,0x660222A0 -UserDocument,1,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,2,hWnd,3,0,flag,0x80003803,0x66001D30 -UserDocument,3,BackColor,5,0,active,0x80F12405,0x66022260 -UserDocument,4,ForeColor,5,0,active,0x80F12405,0x66022280 -UserDocument,5,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,6,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,7,Width,9,0,flag,0x90202409,0x66001E00 -UserDocument,8,Height,11,0,flag,0x9020240B,0x66001DA0 -UserDocument,9,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,10,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,11,MousePointer,6,0,active,0x80C12406,0x66001D50 -UserDocument,12,FontName,1,0,active,0x90224C01,0x66001CF0 -UserDocument,13,FontSize,7,0,flag,0x90304C07,0x66001D00 -UserDocument,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 -UserDocument,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 -UserDocument,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 -UserDocument,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 -UserDocument,18,hDC,3,0,flag,0x00005803,0x66022170 -UserDocument,19,CurrentX,7,0,flag,0x00004C07,0x66022150 -UserDocument,20,CurrentY,7,0,flag,0x00004C07,0x66022160 -UserDocument,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 -UserDocument,22,ScaleTop,7,0,flag,0x10404407,0x66022240 -UserDocument,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 -UserDocument,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 -UserDocument,25,ScaleMode,6,3,active,0x10422406,0x66022228 -UserDocument,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 -UserDocument,27,DrawStyle,6,0,active,0x00C14406,0x66022198 -UserDocument,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 -UserDocument,29,FillStyle,6,0,active,0x00C14406,0x660221D0 -UserDocument,30,FillColor,5,0,active,0x00D12405,0x660221C0 -UserDocument,31,DrawMode,6,0,active,0x00C14406,0x66022180 -UserDocument,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 -UserDocument,33,Picture,21,0,active,0x04E12415,0x66022548 -UserDocument,34,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,35,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,36,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,37,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,38,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,39,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,40,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,41,Image,21,0,flag,0x04005815,0x660221F8 -UserDocument,42,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,43,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,44,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,45,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,46,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,47,Tag,13,0,active,0x80C1220D,0x66001DD0 -UserDocument,48,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,49,KeyPreview,4,0,active,0x00C12204,0x66022570 -UserDocument,50,ClipControls,4,0,active,0x80C12204,0x66022270 -UserDocument,51,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 -UserDocument,53,ClientLeft,8,12,active,0x12025A08,0x660225A0 -UserDocument,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 -UserDocument,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 -UserDocument,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 -UserDocument,57,Count,2,0,flag,0x00005802,0x660225E0 -UserDocument,58,Controls,32,0,skip,0x00005820,0x660225F0 -UserDocument,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -UserDocument,60,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,61,LockControls,4,0,active,0x02C13A04,0x66022600 -UserDocument,62,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,63,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,64,Font,20,-1,active,0x80224414,0x66001CC0 -UserDocument,65,Appearance,6,0,active,0x80C12606,0x66001CA0 -UserDocument,66,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,67,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,68,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,69,RightToLeft,4,0,active,0x80C14404,0x66114000 -UserDocument,70,HasDC,4,0,active,0x00C13204,0x660226A0 -UserDocument,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 -UserDocument,72,Palette,21,0,active,0x04E12415,0x66022620 -UserDocument,73,PaletteMode,6,0,active,0x00E12406,0x66029C40 -UserDocument,74,_,4,0,sep,0xE0000804,0x660024A0 -UserDocument,75,Parent,32,0,skip,0x00005820,0x66029C60 -UserDocument,76,ScrollBars,6,0,active,0x00C12406,0x66029C70 -UserDocument,77,ContinuousScroll,4,0,active,0x00C12204,0x66029C88 -UserDocument,78,HScrollSmallChange,7,0,active,0x00C14407,0x661190C0 -UserDocument,79,VScrollSmallChange,7,0,active,0x00C14407,0x661190D0 -UserDocument,80,MinWidth,9,0,flag,0x00204C09,0x66029C98 -UserDocument,81,MinHeight,11,0,flag,0x00204C0B,0x66029CA8 -UserDocument,82,ViewportLeft,7,0,flag,0x00204C07,0x66029CB8 -UserDocument,83,ViewportHeight,7,0,flag,0x00005807,0x66029CC8 -UserDocument,84,ViewportTop,7,0,flag,0x00204C07,0x66029CD8 -UserDocument,85,ViewportWidth,7,0,flag,0x00005807,0x66029CE8 -UserDocument,86,HyperLink,22,0,flag,0x00005816,0x66029CF8 -UserDocument,87,_,4,0,sep,0xE0000804,0x660024A0 -VScrollBar,0,Name,18,0,skip,0x8400D412,0x66001E50 -VScrollBar,1,Index,17,0,active,0x84C1D411,0x66001F00 -VScrollBar,2,LeftTop,8,4,active,0x90222408,0x66001DC0 -VScrollBar,3,Top,10,0,flag,0x9020240A,0x66001DE0 -VScrollBar,4,Width,9,0,flag,0x90202409,0x66001E00 -VScrollBar,5,Height,11,0,flag,0x9020240B,0x66001DA0 -VScrollBar,6,Enabled,4,0,active,0x80E14404,0x66001D90 -VScrollBar,7,Visible,4,0,active,0x80E14404,0x66001DF0 -VScrollBar,8,MousePointer,6,0,active,0x80C12406,0x66001D50 -VScrollBar,9,TabIndex,2,0,active,0x84012402,0x66001FF0 -VScrollBar,10,Min,2,0,active,0x00E12402,0x66028680 -VScrollBar,11,Max,2,0,active,0x00E12402,0x66028670 -VScrollBar,12,SmallChange,2,0,active,0x00E12402,0x66028690 -VScrollBar,13,LargeChange,2,0,active,0x00E12402,0x66028660 -VScrollBar,14,Value,2,0,active,0x00612402,0x660286A0 -VScrollBar,15,Parent,25,0,skip,0x80003819,0x66001F10 -VScrollBar,16,DragMode,6,0,active,0x80C12606,0x66001ED0 -VScrollBar,17,DragIcon,21,0,active,0x84C1A215,0x66001EC0 -VScrollBar,18,TabStop,4,0,active,0x80C14404,0x66002000 -VScrollBar,19,Tag,13,0,active,0x80C1220D,0x66001DD0 -VScrollBar,20,hWnd,3,0,flag,0x80003803,0x66001D30 -VScrollBar,21,HelpContextID,3,0,active,0x80C12203,0x66001DB0 -VScrollBar,22,MouseIcon,21,0,active,0x84C1A615,0x66001D40 -VScrollBar,23,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 -VScrollBar,24,Container,32,0,skip,0x80004C20,0x66001FB0 -VScrollBar,25,RightToLeft,4,0,active,0x80C14404,0x66114000 -VScrollBar,26,CausesValidation,4,0,active,0x80C12204,0x66002010 +# VB6 Control Property Descriptor Tables +# Extracted from MSVBVM60.DLL v6.00.9848 runtime descriptor pointer tables. +# Each row represents one entry in a control's property pointer table. +# A row's name is its descriptor's own (the descriptor's first field), except +# the composite labels Bounds (Left, Top, Width, Height), ClientSize (ClientLeft to +# ClientHeight) and DataSource(obj). A property stream names a property by +# its index in the table. +# Status: active=serializable, fontsub=flag-only, skip=runtime-only, sep=separator, obj=COM object ref +# +# Descriptor Table VAs: +# Timer: 0x66028A50 (9 entries) +# Label: 0x66027040 (47 entries) +# CommandButton: 0x660283C8 (43 entries) +# TextBox: 0x66026A40 (58 entries) +# CheckBox: 0x66025A78 (49 entries) +# OptionButton: 0x66027BB0 (43 entries) +# Frame: 0x660256A8 (35 entries) +# PictureBox: 0x66027FD8 (69 entries) +# ListBox: 0x66002330 (56 entries) +# ComboBox: 0x66025F30 (56 entries) +# HScrollBar: 0x660286B0 (27 entries) +# VScrollBar: 0x660286B0 (27 entries, shared with HScrollBar) +# Image: 0x660272E8 (29 entries) +# Shape: 0x66028900 (19 entries) +# Line: 0x66027748 (14 entries) +# Data: 0x660241E8 (46 entries) +# DriveListBox: 0x660265D0 (38 entries) +# DirListBox: 0x660262D0 (40 entries) +# FileListBox: 0x6601E8C0 (49 entries) +# Menu: 0x66027940 (14 entries) +# OLE: 0x66025000 (75 entries) +# Form: 0x660226B0 (75 entries) +# MDIForm: 0x660226B0 (75 entries, shared with Form) +# PropertyPage: 0x6602A3F0 (78 entries) +# UserControl: 0x66029530 (94 entries) +# UserDocument: 0x66029D10 (88 entries) +# +control_type,index,name,ser_type,callback_bytes,status,flags,descriptor_va +CheckBox,0,Name,18,0,skip,0x8400D412,0x66001E50 +CheckBox,1,Caption,1,0,active,0x80EA4401,0x66022290 +CheckBox,2,Index,17,0,active,0x84C1D411,0x66001F00 +CheckBox,3,BackColor,5,0,active,0x80F12405,0x66022260 +CheckBox,4,ForeColor,5,0,active,0x80F12405,0x66022280 +CheckBox,5,Bounds,8,4,active,0x90222408,0x66001DC0 +CheckBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 +CheckBox,7,Width,9,0,flag,0x90202409,0x66001E00 +CheckBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 +CheckBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 +CheckBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 +CheckBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +CheckBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 +CheckBox,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 +CheckBox,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +CheckBox,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +CheckBox,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +CheckBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 +CheckBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +CheckBox,19,Value,6,0,active,0x00C14406,0x66025A30 +CheckBox,20,Parent,25,0,skip,0x80003819,0x66001F10 +CheckBox,21,DragMode,6,0,active,0x80C12606,0x66001ED0 +CheckBox,22,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +CheckBox,23,TabStop,4,0,active,0x80C14404,0x66002000 +CheckBox,24,Tag,13,0,active,0x80C1220D,0x66001DD0 +CheckBox,25,Alignment,6,0,active,0x00C12406,0x66025A48 +CheckBox,26,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +CheckBox,27,hWnd,3,0,flag,0x80003803,0x66001D30 +CheckBox,28,DataSource,1,0,active,0x82F13201,0x66001FE0 +CheckBox,29,DataField,1,0,active,0x80F12601,0x66001FD0 +CheckBox,30,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +CheckBox,31,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +CheckBox,32,Font,20,0,active,0x80224414,0x66001CC0 +CheckBox,33,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +CheckBox,34,Appearance,6,0,active,0x80C12606,0x66001CA0 +CheckBox,35,Container,32,0,skip,0x80004C20,0x66001FB0 +CheckBox,36,RightToLeft,4,0,active,0x80C14404,0x66114000 +CheckBox,37,ToolTipText,1,0,active,0x80D12401,0x66001F20 +CheckBox,38,Picture,21,0,active,0x84E14495,0x660259E0 +CheckBox,39,DisabledPicture,21,0,active,0x84E14495,0x66025A00 +CheckBox,40,DownPicture,21,0,active,0x84E14495,0x660259F0 +CheckBox,41,Style,6,0,active,0x00C13406,0x66025A60 +CheckBox,42,OLEDropMode,6,0,active,0x80412406,0x66001D70 +CheckBox,43,MaskColor,5,0,active,0x80F14405,0x66025A10 +CheckBox,44,UseMaskColor,4,0,active,0x80E14404,0x66025A20 +CheckBox,45,CausesValidation,4,0,active,0x80C12204,0x66002010 +CheckBox,46,DataMember,33,0,active,0x80F12621,0x660020A0 +CheckBox,47,DataFormat,22,0,active,0x84654416,0x66002070 +CheckBox,48,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +ComboBox,0,Name,18,0,skip,0x8400D412,0x66001E50 +ComboBox,1,Style,6,0,active,0x00C13406,0x66025ED8 +ComboBox,2,Index,17,0,active,0x84C1D411,0x66001F00 +ComboBox,3,BackColor,5,0,active,0x80F12405,0x66001E40 +ComboBox,4,ForeColor,5,0,active,0x80F12405,0x66001E60 +ComboBox,5,Bounds,8,4,active,0x90222408,0x66001DC0 +ComboBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 +ComboBox,7,Width,9,0,flag,0x90202409,0x66001E00 +ComboBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 +ComboBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 +ComboBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 +ComboBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +ComboBox,12,Text,1,0,active,0x80EE4401,0x66025E50 +ComboBox,13,FontName,1,0,active,0x90224C01,0x66001CF0 +ComboBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +ComboBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +ComboBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +ComboBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +ComboBox,18,FontSize,7,0,flag,0x90304C07,0x66001D00 +ComboBox,19,TabIndex,2,0,active,0x84012402,0x66001FF0 +ComboBox,20,ListCount,2,0,flag,0x00005802,0x66025E78 +ComboBox,21,ListIndex,2,0,flag,0x00204C02,0x66025E88 +ComboBox,22,List,1,0,active,0x08064501,0x66025E60 +ComboBox,23,Sorted,4,0,active,0x00E13204,0x66025EC8 +ComboBox,24,SelStart,3,0,flag,0x00204C03,0x66025EA8 +ComboBox,25,SelLength,3,0,flag,0x00204C03,0x66025E98 +ComboBox,26,SelText,1,0,flag,0x00204C01,0x66025EB8 +ComboBox,27,Parent,25,0,skip,0x80003819,0x66001F10 +ComboBox,28,DragMode,6,0,active,0x80C12606,0x66001ED0 +ComboBox,29,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +ComboBox,30,TabStop,4,0,active,0x80C14404,0x66002000 +ComboBox,31,Tag,13,0,active,0x80C1220D,0x66001DD0 +ComboBox,32,hWnd,3,0,flag,0x80003803,0x66001D30 +ComboBox,33,ItemData,3,0,active,0x00264503,0x66025EF0 +ComboBox,34,NewIndex,2,0,flag,0x00003802,0x66025F00 +ComboBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +ComboBox,36,IMEMode,6,0,active,0xC0C16606,0x66114018 +ComboBox,37,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +ComboBox,38,Font,20,0,active,0x80224414,0x66001CC0 +ComboBox,39,DataSource,1,0,active,0x82F13201,0x66001FE0 +ComboBox,40,DataField,1,0,active,0x80F12601,0x66001FD0 +ComboBox,41,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +ComboBox,42,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +ComboBox,43,Appearance,6,0,active,0x80C12606,0x66001CA0 +ComboBox,44,Container,32,0,skip,0x80004C20,0x66001FB0 +ComboBox,45,IntegralHeight,4,0,active,0x00413604,0x66025F10 +ComboBox,46,RightToLeft,4,0,active,0x80C14404,0x66114000 +ComboBox,47,ToolTipText,1,0,active,0x80D12401,0x66001F20 +ComboBox,48,OLEDragMode,6,0,active,0x80412206,0x660021A0 +ComboBox,49,OLEDropMode,6,0,active,0x80412406,0x66001D70 +ComboBox,50,Locked,4,0,active,0x00C12604,0x66025F20 +ComboBox,51,TopIndex,2,0,flag,0x00204C02,0x660021C0 +ComboBox,52,CausesValidation,4,0,active,0x80C12204,0x66002010 +ComboBox,53,DataMember,33,0,active,0x80F12621,0x660020A0 +ComboBox,54,DataFormat,22,0,active,0x84654416,0x66002070 +ComboBox,55,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +CommandButton,0,Name,18,0,skip,0x8400D412,0x66001E50 +CommandButton,1,Caption,1,0,active,0x80EA4401,0x66022290 +CommandButton,2,Index,17,0,active,0x84C1D411,0x66001F00 +CommandButton,3,BackColor,5,0,active,0x80F12405,0x66022260 +CommandButton,4,Bounds,8,4,active,0x90222408,0x66001DC0 +CommandButton,5,Top,10,0,flag,0x9020240A,0x66001DE0 +CommandButton,6,Width,9,0,flag,0x90202409,0x66001E00 +CommandButton,7,Height,11,0,flag,0x9020240B,0x66001DA0 +CommandButton,8,Enabled,4,0,active,0x80E14404,0x66001D90 +CommandButton,9,Visible,4,0,active,0x80E14404,0x66001DF0 +CommandButton,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +CommandButton,11,FontName,1,0,active,0x90224C01,0x66001CF0 +CommandButton,12,FontSize,7,0,flag,0x90304C07,0x66001D00 +CommandButton,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 +CommandButton,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +CommandButton,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +CommandButton,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +CommandButton,17,TabIndex,2,0,active,0x84012402,0x66001FF0 +CommandButton,18,Value,4,0,flag,0x00202C04,0x660283A0 +CommandButton,19,Default,4,0,active,0x84C14404,0x66025348 +CommandButton,20,Cancel,4,0,active,0x84C14404,0x660252F0 +CommandButton,21,Parent,25,0,skip,0x80003819,0x66001F10 +CommandButton,22,DragMode,6,0,active,0x80C12606,0x66001ED0 +CommandButton,23,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +CommandButton,24,TabStop,4,0,active,0x80C14404,0x66002000 +CommandButton,25,Tag,13,0,active,0x80C1220D,0x66001DD0 +CommandButton,26,hWnd,3,0,flag,0x80003803,0x66001D30 +CommandButton,27,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +CommandButton,28,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +CommandButton,29,Font,20,0,active,0x80224414,0x66001CC0 +CommandButton,30,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +CommandButton,31,Appearance,6,0,active,0x80C12606,0x66001CA0 +CommandButton,32,Container,32,0,skip,0x80004C20,0x66001FB0 +CommandButton,33,RightToLeft,4,0,active,0x80C14404,0x66114000 +CommandButton,34,Picture,21,0,active,0x84E14495,0x660259E0 +CommandButton,35,DisabledPicture,21,0,active,0x84E14495,0x66025A00 +CommandButton,36,DownPicture,21,0,active,0x84E14495,0x660259F0 +CommandButton,37,ToolTipText,1,0,active,0x80D12401,0x66001F20 +CommandButton,38,OLEDropMode,6,0,active,0x80412406,0x66001D70 +CommandButton,39,MaskColor,5,0,active,0x80F14405,0x66025A10 +CommandButton,40,UseMaskColor,4,0,active,0x80E14404,0x66025A20 +CommandButton,41,Style,6,0,active,0x00C13406,0x660283B0 +CommandButton,42,CausesValidation,4,0,active,0x80C12204,0x66002010 +Data,0,Name,18,0,skip,0x8400D412,0x66001E50 +Data,1,Index,17,0,active,0x84C1D411,0x66001F00 +Data,2,Bounds,8,4,active,0x90222408,0x66001DC0 +Data,3,Top,10,0,flag,0x9020240A,0x66001DE0 +Data,4,Width,9,0,flag,0x90202409,0x66001E00 +Data,5,Height,11,0,flag,0x9020240B,0x66001DA0 +Data,6,Enabled,4,0,active,0x80E14404,0x66001D90 +Data,7,Visible,4,0,active,0x80E14404,0x66001DF0 +Data,8,MousePointer,6,0,active,0x80C12406,0x66001D50 +Data,9,FontName,1,0,active,0x90224C01,0x66001CF0 +Data,10,FontSize,7,0,flag,0x90304C07,0x66001D00 +Data,11,FontBold,4,0,flag,0x90204C04,0x66001CD0 +Data,12,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +Data,13,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +Data,14,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +Data,15,Parent,25,0,skip,0x80003819,0x66001F10 +Data,16,Tag,13,0,active,0x80C1220D,0x66001DD0 +Data,17,_,4,0,sep,0xE0000804,0x660024A0 +Data,18,Connect,13,0,active,0x0011260D,0x660240C0 +Data,19,DatabaseName,13,0,active,0x0431260D,0x660240F8 +Data,20,Database,22,0,flag,0x00005C16,0x660240E0 +Data,21,Recordset,22,0,flag,0x00204C16,0x66024158 +Data,22,Exclusive,4,0,active,0x00012604,0x66024118 +Data,23,ReadOnly,4,0,active,0x00012604,0x66024138 +Data,24,RecordSource,13,0,active,0x0431260D,0x66024148 +Data,25,Caption,1,0,active,0x80EA4401,0x66022290 +Data,26,EditMode,2,0,flag,0x00005802,0x66024108 +Data,27,Options,2,0,active,0x00012602,0x66024128 +Data,28,BackColor,5,0,active,0x80F12405,0x66001E40 +Data,29,ForeColor,5,0,active,0x80F12405,0x66001E60 +Data,30,DragMode,6,0,active,0x80C12606,0x66001ED0 +Data,31,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +Data,32,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +Data,33,Font,20,0,active,0x80224414,0x66001CC0 +Data,34,Align,6,0,active,0x80C12406,0x66024040 +Data,35,BOFAction,6,0,active,0x00C12206,0x66024170 +Data,36,EOFAction,6,0,active,0x00C12206,0x66024188 +Data,37,RecordsetType,6,0,active,0x00014406,0x660241A0 +Data,38,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +Data,39,Appearance,6,0,active,0x80C12606,0x66001CA0 +Data,40,Negotiate,4,0,active,0x82C13404,0x66024058 +Data,41,RightToLeft,4,0,active,0x80C14404,0x66114000 +Data,42,OLEDropMode,6,0,active,0x80412406,0x66001D70 +Data,43,ToolTipText,1,0,active,0x80D12401,0x66001F20 +Data,44,DefaultType,6,0,active,0x00014406,0x660241B8 +Data,45,DefaultCursorType,6,0,active,0x00014406,0x660241D0 +DirListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 +DirListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 +DirListBox,4,Bounds,8,4,active,0x90222408,0x66001DC0 +DirListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 +DirListBox,6,Width,9,0,flag,0x90202409,0x66001E00 +DirListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 +DirListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 +DirListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 +DirListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +DirListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 +DirListBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 +DirListBox,18,FontBold,4,0,flag,0x90204C04,0x66001CD0 +DirListBox,19,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +DirListBox,20,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +DirListBox,21,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +DirListBox,23,DragMode,6,0,active,0x80C12606,0x66001ED0 +DirListBox,25,TabStop,4,0,active,0x80C14404,0x66002000 +DirListBox,26,Tag,13,0,active,0x80C1220D,0x66001DD0 +DirListBox,28,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +DirListBox,29,IMEMode,6,0,active,0xC0C16606,0x66114018 +DirListBox,31,Font,20,-1,active,0x80224414,0x66001CC0 +DirListBox,32,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +DirListBox,33,Appearance,6,0,active,0x80C12606,0x66001CA0 +DirListBox,35,ToolTipText,1,0,active,0x80D12401,0x66001F20 +DirListBox,36,OLEDragMode,6,0,active,0x80412206,0x660021A0 +DirListBox,37,OLEDropMode,6,0,active,0x80412406,0x66001D70 +DirListBox,39,CausesValidation,4,0,active,0x80C12204,0x66002010 +DriveListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 +DriveListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 +DriveListBox,4,Bounds,8,4,active,0x90222408,0x66001DC0 +DriveListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 +DriveListBox,6,Width,9,0,flag,0x90202409,0x66001E00 +DriveListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 +DriveListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 +DriveListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 +DriveListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +DriveListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 +DriveListBox,17,FontSize,7,0,flag,0x90304C07,0x66001D00 +DriveListBox,18,FontBold,4,0,flag,0x90204C04,0x66001CD0 +DriveListBox,19,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +DriveListBox,20,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +DriveListBox,21,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +DriveListBox,23,DragMode,6,0,active,0x80C12606,0x66001ED0 +DriveListBox,25,TabStop,4,0,active,0x80C14404,0x66002000 +DriveListBox,26,Tag,13,0,active,0x80C1220D,0x66001DD0 +DriveListBox,28,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +DriveListBox,30,Font,20,-1,active,0x80224414,0x66001CC0 +DriveListBox,31,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +DriveListBox,32,Appearance,6,0,active,0x80C12606,0x66001CA0 +DriveListBox,34,ToolTipText,1,0,active,0x80D12401,0x66001F20 +DriveListBox,35,OLEDropMode,6,0,active,0x80412406,0x66001D70 +DriveListBox,37,CausesValidation,4,0,active,0x80C12204,0x66002010 +FileListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 +FileListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 +FileListBox,4,Bounds,8,4,active,0x90222408,0x66001DC0 +FileListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 +FileListBox,6,Width,9,0,flag,0x90202409,0x66001E00 +FileListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 +FileListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 +FileListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 +FileListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +FileListBox,11,TabIndex,2,0,active,0x84012402,0x66001FF0 +FileListBox,13,Pattern,1,0,active,0x00E12401,0x6601E890 +FileListBox,15,Normal,4,0,active,0x00E12404,0x6601E870 +FileListBox,16,ReadOnly,4,0,active,0x00C12404,0x6601E8A0 +FileListBox,17,Archive,4,0,active,0x00E12404,0x6601E810 +FileListBox,18,Hidden,4,0,active,0x00E12404,0x6601E830 +FileListBox,19,System,4,0,active,0x00E12404,0x6601E8B0 +FileListBox,22,List,1,0,flag,0x00005901,0x6601E840 +FileListBox,24,FontSize,7,0,flag,0x90304C07,0x66001D00 +FileListBox,25,FontBold,4,0,flag,0x90204C04,0x66001CD0 +FileListBox,26,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +FileListBox,27,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +FileListBox,28,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +FileListBox,30,DragMode,6,0,active,0x80C12606,0x66001ED0 +FileListBox,32,TabStop,4,0,active,0x80C14404,0x66002000 +FileListBox,33,Tag,13,0,active,0x80C1220D,0x66001DD0 +FileListBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +FileListBox,36,MultiSelect,6,0,active,0x00C13206,0x6601E850 +FileListBox,41,Font,20,-1,active,0x80224414,0x66001CC0 +FileListBox,42,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +FileListBox,43,Appearance,6,0,active,0x80C12606,0x66001CA0 +FileListBox,45,ToolTipText,1,0,active,0x80D12401,0x66001F20 +FileListBox,46,OLEDragMode,6,0,active,0x80412206,0x660021A0 +FileListBox,47,OLEDropMode,6,0,active,0x80412406,0x66001D70 +FileListBox,48,CausesValidation,4,0,active,0x80C12204,0x66002010 +Form,0,Name,1,0,active,0x8400D412,0x660222A0 +Form,1,Caption,1,0,active,0x80EA4401,0x66022290 +Form,2,hWnd,3,0,flag,0x80003803,0x66001D30 +Form,3,BackColor,5,0,active,0x80F12405,0x66022260 +Form,4,ForeColor,5,0,active,0x80F12405,0x66022280 +Form,5,Left,8,0,active,0x90222408,0x66001DC0 +Form,6,Top,10,0,flag,0x9020240A,0x66001DE0 +Form,7,Width,9,0,flag,0x90202409,0x66001E00 +Form,8,Height,11,0,flag,0x9020240B,0x66001DA0 +Form,9,Enabled,4,0,active,0x80E14404,0x66001D90 +Form,10,WindowState,6,0,active,0x00C14406,0x66022558 +Form,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +Form,12,FontName,1,0,active,0x90224C01,0x66001CF0 +Form,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +Form,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +Form,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +Form,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +Form,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +Form,18,hDC,3,0,flag,0x00005803,0x66022170 +Form,19,CurrentX,7,0,flag,0x00004C07,0x66022150 +Form,20,CurrentY,7,0,flag,0x00004C07,0x66022160 +Form,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 +Form,22,ScaleTop,7,0,flag,0x10404407,0x66022240 +Form,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 +Form,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 +Form,25,ScaleMode,6,3,active,0x10422406,0x66022228 +Form,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 +Form,27,DrawStyle,6,0,active,0x00C14406,0x66022198 +Form,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 +Form,29,FillStyle,6,0,active,0x00C14406,0x660221D0 +Form,30,FillColor,5,0,active,0x00D12405,0x660221C0 +Form,31,DrawMode,6,0,active,0x00C14406,0x66022180 +Form,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 +Form,33,Picture,21,0,active,0x04E12415,0x66022548 +Form,34,BorderStyle,6,0,active,0x00C12406,0x660224C0 +Form,35,Icon,21,0,active,0x00C1A615,0x660224F0 +Form,36,LinkTopic,1,0,active,0x00C1A401,0x66022518 +Form,37,LinkMode,6,0,active,0x00C12406,0x66022500 +Form,38,MaxButton,4,0,active,0x00C13604,0x66022528 +Form,39,MinButton,4,0,active,0x00C13604,0x66022538 +Form,40,ControlBox,4,0,active,0x00C13604,0x660224E0 +Form,41,Image,21,0,flag,0x04005815,0x660221F8 +Form,42,HasDC,4,0,active,0x00C13204,0x660226A0 +Form,43,_,4,0,sep,0xE0000804,0x660024A0 +Form,44,_,4,0,sep,0xE0000804,0x660024A0 +Form,45,_,4,0,sep,0xE0000804,0x660024A0 +Form,46,Visible,4,0,active,0x80E14404,0x66001DF0 +Form,47,Tag,13,0,active,0x80C1220D,0x66001DD0 +Form,48,MDIChild,4,0,active,0x00C15404,0x66022580 +Form,49,KeyPreview,4,0,active,0x00C12204,0x66022570 +Form,50,ClipControls,4,0,active,0x80C12204,0x66022270 +Form,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +Form,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 +Form,53,ClientSize,8,12,active,0x12025A08,0x660225A0 +Form,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 +Form,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 +Form,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 +Form,57,Count,2,0,flag,0x00005802,0x660225E0 +Form,58,Controls,32,0,skip,0x00005820,0x660225F0 +Form,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +Form,60,_,4,0,sep,0xE0000804,0x660024A0 +Form,61,LockControls,4,0,active,0x02C13A04,0x66022600 +Form,62,NegotiateMenus,4,0,active,0x02C13204,0x66022610 +Form,63,_,4,0,sep,0xE0000804,0x660024A0 +Form,64,Font,20,0,active,0x80224414,0x66001CC0 +Form,65,Appearance,6,0,active,0x80C12606,0x66001CA0 +Form,66,WhatsThisButton,4,0,active,0x00C13404,0x66022680 +Form,67,WhatsThisHelp,4,0,active,0x00C13404,0x66022690 +Form,68,ShowInTaskbar,4,0,active,0x00C13204,0x66022658 +Form,69,RightToLeft,4,0,active,0x80C14404,0x66114000 +Form,70,StartUpPosition,6,0,active,0x00C13406,0x66022668 +Form,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 +Form,72,Palette,21,0,active,0x04E12415,0x66022620 +Form,73,PaletteMode,6,0,active,0x00C1A406,0x66022630 +Form,74,Moveable,4,0,active,0x00C13204,0x66022648 +Frame,0,Name,18,0,skip,0x8400D412,0x66001E50 +Frame,1,Caption,1,0,active,0x80EA4401,0x66022290 +Frame,2,Index,17,0,active,0x84C1D411,0x66001F00 +Frame,3,BackColor,5,0,active,0x80F12405,0x66022260 +Frame,4,ForeColor,5,0,active,0x80F12405,0x66022280 +Frame,5,Bounds,8,4,active,0x90222408,0x66001DC0 +Frame,6,Top,10,0,flag,0x9020240A,0x66001DE0 +Frame,7,Width,9,0,flag,0x90202409,0x66001E00 +Frame,8,Height,11,0,flag,0x9020240B,0x66001DA0 +Frame,9,Enabled,4,0,active,0x80E14404,0x66001D90 +Frame,10,Visible,4,0,active,0x80E14404,0x66001DF0 +Frame,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +Frame,12,FontName,1,0,active,0x90224C01,0x66001CF0 +Frame,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +Frame,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +Frame,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +Frame,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +Frame,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +Frame,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +Frame,19,Parent,25,0,skip,0x80003819,0x66001F10 +Frame,20,DragMode,6,0,active,0x80C12606,0x66001ED0 +Frame,21,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +Frame,22,Tag,13,0,active,0x80C1220D,0x66001DD0 +Frame,23,hWnd,3,0,flag,0x80003803,0x66001D30 +Frame,24,ClipControls,4,0,active,0x80C12204,0x66022270 +Frame,25,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +Frame,26,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +Frame,27,Font,20,0,active,0x80224414,0x66001CC0 +Frame,28,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +Frame,29,Appearance,6,0,active,0x80C12606,0x66001CA0 +Frame,30,Container,32,0,skip,0x80004C20,0x66001FB0 +Frame,31,RightToLeft,4,0,active,0x80C14404,0x66114000 +Frame,32,ToolTipText,1,0,active,0x80D12401,0x66001F20 +Frame,33,OLEDropMode,6,0,active,0x80412406,0x66001D70 +Frame,34,BorderStyle,6,0,active,0x00C12606,0x66025690 +HScrollBar,0,Name,18,0,skip,0x8400D412,0x66001E50 +HScrollBar,1,Index,17,0,active,0x84C1D411,0x66001F00 +HScrollBar,2,Bounds,8,4,active,0x90222408,0x66001DC0 +HScrollBar,3,Top,10,0,flag,0x9020240A,0x66001DE0 +HScrollBar,4,Width,9,0,flag,0x90202409,0x66001E00 +HScrollBar,5,Height,11,0,flag,0x9020240B,0x66001DA0 +HScrollBar,6,Enabled,4,0,active,0x80E14404,0x66001D90 +HScrollBar,7,Visible,4,0,active,0x80E14404,0x66001DF0 +HScrollBar,8,MousePointer,6,0,active,0x80C12406,0x66001D50 +HScrollBar,9,TabIndex,2,0,active,0x84012402,0x66001FF0 +HScrollBar,10,Min,2,0,active,0x00E12402,0x66028680 +HScrollBar,11,Max,2,0,active,0x00E12402,0x66028670 +HScrollBar,12,SmallChange,2,0,active,0x00E12402,0x66028690 +HScrollBar,13,LargeChange,2,0,active,0x00E12402,0x66028660 +HScrollBar,14,Value,2,0,active,0x00612402,0x660286A0 +HScrollBar,15,Parent,25,0,skip,0x80003819,0x66001F10 +HScrollBar,16,DragMode,6,0,active,0x80C12606,0x66001ED0 +HScrollBar,17,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +HScrollBar,18,TabStop,4,0,active,0x80C14404,0x66002000 +HScrollBar,19,Tag,13,0,active,0x80C1220D,0x66001DD0 +HScrollBar,20,hWnd,3,0,flag,0x80003803,0x66001D30 +HScrollBar,21,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +HScrollBar,22,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +HScrollBar,23,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +HScrollBar,24,Container,32,0,skip,0x80004C20,0x66001FB0 +HScrollBar,25,RightToLeft,4,0,active,0x80C14404,0x66114000 +HScrollBar,26,CausesValidation,4,0,active,0x80C12204,0x66002010 +Image,0,Name,18,0,skip,0x8400D412,0x66001E50 +Image,1,Index,17,0,active,0x84C1D411,0x66001F00 +Image,2,Picture,21,0,active,0x04E12695,0x660272D8 +Image,3,Bounds,8,4,active,0x90222408,0x66001DC0 +Image,4,Top,10,0,flag,0x9020240A,0x66001DE0 +Image,5,Width,9,0,flag,0x90202409,0x66001E00 +Image,6,Height,11,0,flag,0x9020240B,0x66001DA0 +Image,7,Enabled,4,0,active,0x80E14404,0x66001D90 +Image,8,Visible,4,0,active,0x80E14404,0x66001DF0 +Image,9,MousePointer,6,0,active,0x80C12406,0x66001D50 +Image,10,Stretch,4,0,active,0x00E12604,0x660272C8 +Image,11,Parent,25,0,skip,0x80003819,0x66001F10 +Image,12,DragMode,6,0,active,0x80C12606,0x66001ED0 +Image,13,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +Image,14,Tag,13,0,active,0x80C1220D,0x66001DD0 +Image,15,BorderStyle,6,0,active,0x00C12406,0x660272B0 +Image,16,DataSource,1,0,active,0x82F13201,0x66001FE0 +Image,17,DataField,1,0,active,0x80F12601,0x66001FD0 +Image,18,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +Image,19,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +Image,20,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +Image,21,Appearance,6,0,active,0x80C12606,0x66001CA0 +Image,22,Container,32,0,skip,0x80004C20,0x66001FB0 +Image,23,ToolTipText,1,0,active,0x80D12401,0x66001F20 +Image,24,OLEDragMode,6,0,active,0x80412206,0x660021A0 +Image,25,OLEDropMode,6,0,active,0x80412406,0x66026960 +Image,26,DataMember,33,0,active,0x80F12621,0x660020A0 +Image,27,DataFormat,22,0,active,0x84654416,0x66002070 +Image,28,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +Label,0,Name,18,0,skip,0x8400D412,0x66001E50 +Label,1,Caption,1,0,active,0x80EA4401,0x66022290 +Label,2,Index,17,0,active,0x84C1D411,0x66001F00 +Label,3,BackColor,5,0,active,0x80F12405,0x66022260 +Label,4,ForeColor,5,0,active,0x80F12405,0x66022280 +Label,5,Bounds,8,4,active,0x90222408,0x66001DC0 +Label,6,Top,10,0,flag,0x9020240A,0x66001DE0 +Label,7,Width,9,0,flag,0x90202409,0x66001E00 +Label,8,Height,11,0,flag,0x9020240B,0x66001DA0 +Label,9,Enabled,4,0,active,0x80E14404,0x66001D90 +Label,10,Visible,4,0,active,0x80E14404,0x66001DF0 +Label,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +Label,12,FontName,1,0,active,0x90224C01,0x66001CF0 +Label,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +Label,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +Label,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +Label,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +Label,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +Label,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +Label,19,BorderStyle,6,0,active,0x00C12406,0x66026FF0 +Label,20,Alignment,6,0,active,0x01C12286,0x66026FC0 +Label,21,LinkTopic,1,0,active,0x80E1C401,0x66025338 +Label,22,LinkItem,1,0,active,0x80E1C401,0x66025300 +Label,23,LinkMode,6,0,active,0x80C1C406,0x66025310 +Label,24,AutoSize,4,0,active,0x00E12604,0x66026FE0 +Label,25,Parent,25,0,skip,0x80003819,0x66001F10 +Label,26,DragMode,6,0,active,0x80C12606,0x66001ED0 +Label,27,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +Label,28,LinkTimeout,2,0,active,0x80C14402,0x66025328 +Label,29,Tag,13,0,active,0x80C1220D,0x66001DD0 +Label,30,WordWrap,4,0,active,0x00E12404,0x66027008 +Label,31,BackStyle,6,0,active,0x00C12406,0x66027018 +Label,32,DataSource,1,0,active,0x82F13201,0x66001FE0 +Label,33,DataField,1,0,active,0x80F12601,0x66001FD0 +Label,34,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +Label,35,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +Label,36,UseMnemonic,4,0,active,0x01E12284,0x66027030 +Label,37,Font,20,0,active,0x80224414,0x66001CC0 +Label,38,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +Label,39,Appearance,6,0,active,0x80C12606,0x66001CA0 +Label,40,Container,32,0,skip,0x80004C20,0x66001FB0 +Label,41,RightToLeft,4,0,active,0x80C14404,0x66114000 +Label,42,ToolTipText,1,0,active,0x80D12401,0x66001F20 +Label,43,OLEDropMode,6,0,active,0x80412406,0x66001D70 +Label,44,DataMember,33,0,active,0x80F12621,0x660020A0 +Label,45,DataFormat,22,0,active,0x84654416,0x66002070 +Label,46,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +Line,0,Name,18,0,skip,0x8400D412,0x66001E50 +Line,1,Index,17,0,active,0x84C1D411,0x66001F00 +Line,2,BorderColor,5,0,active,0x01D12285,0x660276F8 +Line,3,X1,8,0,active,0x00214408,0x66027708 +Line,4,Y1,10,0,active,0x0021440A,0x66027728 +Line,5,X2,8,0,active,0x00214408,0x66027718 +Line,6,Y2,10,0,active,0x0021440A,0x66027738 +Line,7,Visible,4,0,active,0x80E14404,0x66001DF0 +Line,8,Parent,25,0,skip,0x80003819,0x66001F10 +Line,9,Tag,13,0,active,0x80C1220D,0x66001DD0 +Line,10,DrawMode,6,0,active,0x00C14406,0x66022180 +Line,11,BorderStyle,6,0,active,0x01C12286,0x660276D0 +Line,12,BorderWidth,2,0,active,0x00C12402,0x660276E8 +Line,13,Container,32,0,skip,0x80004C20,0x66001FB0 +ListBox,0,Name,18,0,skip,0x8400D412,0x66001E50 +ListBox,1,Index,17,0,active,0x84C1D411,0x66001F00 +ListBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 +ListBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 +ListBox,4,Bounds,8,4,active,0x90222408,0x66001DC0 +ListBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 +ListBox,6,Width,9,0,flag,0x90202409,0x66001E00 +ListBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 +ListBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 +ListBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 +ListBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +ListBox,11,FontName,1,0,active,0x90224C01,0x66001CF0 +ListBox,12,FontSize,7,0,flag,0x90304C07,0x66001D00 +ListBox,13,FontBold,4,0,flag,0x90204C04,0x66001CD0 +ListBox,14,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +ListBox,15,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +ListBox,16,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +ListBox,17,TabIndex,2,0,active,0x84012402,0x66001FF0 +ListBox,18,ListCount,2,0,flag,0x00005802,0x660021F8 +ListBox,19,ListIndex,2,0,flag,0x00204C02,0x66002208 +ListBox,20,List,1,0,active,0x08064501,0x66002270 +ListBox,21,Sorted,4,0,active,0x00C13204,0x66002290 +ListBox,22,Text,1,0,flag,0x00204C01,0x660022A0 +ListBox,23,Parent,25,0,skip,0x80003819,0x66001F10 +ListBox,24,DragMode,6,0,active,0x80C12606,0x66001ED0 +ListBox,25,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +ListBox,26,TabStop,4,0,active,0x80C14404,0x66002000 +ListBox,27,Tag,13,0,active,0x80C1220D,0x66001DD0 +ListBox,28,Columns,2,0,active,0x00E12402,0x660022B0 +ListBox,29,MultiSelect,6,0,active,0x00C15406,0x660022C0 +ListBox,30,Selected,4,0,flag,0x00204D04,0x66002220 +ListBox,31,SelCount,2,0,flag,0x00005802,0x660022D8 +ListBox,32,TopIndex,2,0,flag,0x00204C02,0x660021C0 +ListBox,33,ItemData,3,0,active,0x00064503,0x660022E8 +ListBox,34,NewIndex,2,0,flag,0x00003802,0x660022F8 +ListBox,35,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +ListBox,36,hWnd,3,0,flag,0x80003803,0x66001D30 +ListBox,37,IMEMode,6,0,active,0xC0C16606,0x66114018 +ListBox,38,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +ListBox,39,Font,20,0,active,0x80224414,0x66001CC0 +ListBox,40,DataSource,1,0,active,0x82F13201,0x66001FE0 +ListBox,41,DataField,1,0,active,0x80F12601,0x66001FD0 +ListBox,42,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +ListBox,43,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +ListBox,44,Appearance,6,0,active,0x80C12606,0x66001CA0 +ListBox,45,Container,32,0,skip,0x80004C20,0x66001FB0 +ListBox,46,IntegralHeight,4,0,active,0x00413604,0x66002308 +ListBox,47,RightToLeft,4,0,active,0x80C14404,0x66114000 +ListBox,48,ToolTipText,1,0,active,0x80D12401,0x66001F20 +ListBox,49,OLEDragMode,6,0,active,0x80412206,0x660021A0 +ListBox,50,OLEDropMode,6,0,active,0x80412406,0x66001D70 +ListBox,51,Style,6,0,active,0x00C13406,0x66002318 +ListBox,52,CausesValidation,4,0,active,0x80C12204,0x66002010 +ListBox,53,DataMember,33,0,active,0x80F12621,0x660020A0 +ListBox,54,DataFormat,22,0,active,0x84654416,0x66002070 +ListBox,55,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +MDIForm,0,Name,1,0,active,0x8400D412,0x660222A0 +MDIForm,1,Caption,1,0,active,0x80EA4401,0x66022290 +MDIForm,2,hWnd,3,0,flag,0x80003803,0x66001D30 +MDIForm,3,BackColor,5,0,active,0x80F12405,0x66022260 +MDIForm,4,ForeColor,5,0,active,0x80F12405,0x66022280 +MDIForm,5,Left,8,0,active,0x90222408,0x66001DC0 +MDIForm,6,Top,10,0,flag,0x9020240A,0x66001DE0 +MDIForm,7,Width,9,0,flag,0x90202409,0x66001E00 +MDIForm,8,Height,11,0,flag,0x9020240B,0x66001DA0 +MDIForm,9,Enabled,4,0,active,0x80E14404,0x66001D90 +MDIForm,10,WindowState,6,0,active,0x00C14406,0x66022558 +MDIForm,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +MDIForm,12,FontName,1,0,active,0x90224C01,0x66001CF0 +MDIForm,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +MDIForm,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +MDIForm,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +MDIForm,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +MDIForm,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +MDIForm,18,hDC,3,0,flag,0x00005803,0x66022170 +MDIForm,19,CurrentX,7,0,flag,0x00004C07,0x66022150 +MDIForm,20,CurrentY,7,0,flag,0x00004C07,0x66022160 +MDIForm,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 +MDIForm,22,ScaleTop,7,0,flag,0x10404407,0x66022240 +MDIForm,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 +MDIForm,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 +MDIForm,25,ScaleMode,6,3,active,0x10422406,0x66022228 +MDIForm,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 +MDIForm,27,DrawStyle,6,0,active,0x00C14406,0x66022198 +MDIForm,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 +MDIForm,29,FillStyle,6,0,active,0x00C14406,0x660221D0 +MDIForm,30,FillColor,5,0,active,0x00D12405,0x660221C0 +MDIForm,31,DrawMode,6,0,active,0x00C14406,0x66022180 +MDIForm,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 +MDIForm,33,Picture,21,0,active,0x04E12415,0x66022548 +MDIForm,34,BorderStyle,6,0,active,0x00C12406,0x660224C0 +MDIForm,35,Icon,21,0,active,0x00C1A615,0x660224F0 +MDIForm,36,LinkTopic,1,0,active,0x00C1A401,0x66022518 +MDIForm,37,LinkMode,6,0,active,0x00C12406,0x66022500 +MDIForm,38,MaxButton,4,0,active,0x00C13604,0x66022528 +MDIForm,39,MinButton,4,0,active,0x00C13604,0x66022538 +MDIForm,40,ControlBox,4,0,active,0x00C13604,0x660224E0 +MDIForm,41,Image,21,0,flag,0x04005815,0x660221F8 +MDIForm,42,HasDC,4,0,active,0x00C13204,0x660226A0 +MDIForm,43,_,4,0,sep,0xE0000804,0x660024A0 +MDIForm,44,_,4,0,sep,0xE0000804,0x660024A0 +MDIForm,45,_,4,0,sep,0xE0000804,0x660024A0 +MDIForm,46,Visible,4,0,active,0x80E14404,0x66001DF0 +MDIForm,47,Tag,13,0,active,0x80C1220D,0x66001DD0 +MDIForm,48,MDIChild,4,0,active,0x00C15404,0x66022580 +MDIForm,49,KeyPreview,4,0,active,0x00C12204,0x66022570 +MDIForm,50,ClipControls,4,0,active,0x80C12204,0x66022270 +MDIForm,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +MDIForm,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 +MDIForm,53,ClientSize,8,12,active,0x12025A08,0x660225A0 +MDIForm,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 +MDIForm,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 +MDIForm,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 +MDIForm,57,Count,2,0,flag,0x00005802,0x660225E0 +MDIForm,58,Controls,32,0,skip,0x00005820,0x660225F0 +MDIForm,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +MDIForm,60,_,4,0,sep,0xE0000804,0x660024A0 +MDIForm,61,LockControls,4,0,active,0x02C13A04,0x66022600 +MDIForm,62,NegotiateMenus,4,0,active,0x02C13204,0x66022610 +MDIForm,63,_,4,0,sep,0xE0000804,0x660024A0 +MDIForm,64,Font,20,0,active,0x80224414,0x66001CC0 +MDIForm,65,Appearance,6,0,active,0x80C12606,0x66001CA0 +MDIForm,66,WhatsThisButton,4,0,active,0x00C13404,0x66022680 +MDIForm,67,WhatsThisHelp,4,0,active,0x00C13404,0x66022690 +MDIForm,68,ShowInTaskbar,4,0,active,0x00C13204,0x66022658 +MDIForm,69,RightToLeft,4,0,active,0x80C14404,0x66114000 +MDIForm,70,StartUpPosition,6,0,active,0x00C13406,0x66022668 +MDIForm,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 +MDIForm,72,Palette,21,0,active,0x04E12415,0x66022620 +MDIForm,73,PaletteMode,6,0,active,0x00C1A406,0x66022630 +MDIForm,74,Moveable,4,0,active,0x00C13204,0x66022648 +Menu,0,Name,18,0,skip,0x8400D412,0x66001E50 +Menu,1,Index,17,0,active,0x84C1D411,0x66001F00 +Menu,2,Visible,4,0,active,0x00C14404,0x66027908 +Menu,3,Caption,1,0,active,0x0801A601,0x660278B0 +Menu,4,Checked,4,0,active,0x00C12404,0x660278C8 +Menu,5,Enabled,4,0,active,0x00C14404,0x660278D8 +Menu,6,_,4,0,active,0x00C12C04,0x660278F8 +Menu,7,_,4,0,active,0x00C13A04,0x660278E8 +Menu,8,Shortcut,2,0,active,0x02C5B602,0x66027898 +Menu,9,Parent,25,0,skip,0x80003819,0x66001F10 +Menu,10,Tag,13,0,active,0x80C1220D,0x66001DD0 +Menu,11,WindowList,4,0,active,0x00C13404,0x66027918 +Menu,12,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +Menu,13,NegotiatePosition,6,0,active,0x02C1B206,0x66027928 +OLE,0,Name,18,0,skip,0x8400D412,0x66001E50 +OLE,1,Index,17,0,active,0x84C1D411,0x66001F00 +OLE,2,BackColor,5,0,active,0x80F12405,0x66001E40 +OLE,3,Bounds,8,4,active,0x90222408,0x66001DC0 +OLE,4,Top,10,0,flag,0x9020240A,0x66001DE0 +OLE,5,Width,9,0,flag,0x90202409,0x66001E00 +OLE,6,Height,11,0,flag,0x9020240B,0x66001DA0 +OLE,7,Visible,4,0,active,0x80E14404,0x66001DF0 +OLE,8,Parent,25,0,skip,0x80003819,0x66001F10 +OLE,9,DragMode,6,0,active,0x80C12606,0x66001ED0 +OLE,10,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +OLE,11,Tag,13,0,active,0x80C1220D,0x66001DD0 +OLE,12,BorderStyle,6,0,active,0x00C12406,0x66024AE8 +OLE,13,Enabled,4,0,active,0x80E14404,0x66001D90 +OLE,14,TabStop,4,0,active,0x80C14404,0x66002000 +OLE,15,TabIndex,2,0,active,0x84012402,0x66001FF0 +OLE,16,MousePointer,6,0,active,0x80C12406,0x66001D50 +OLE,17,Class,1,0,active,0x04D14401,0x66024B00 +OLE,18,OLEType,6,0,flag,0x00005806,0x66024B20 +OLE,19,SourceDoc,1,0,active,0x04D14401,0x66024B48 +OLE,20,SourceItem,1,0,active,0x04D14401,0x66024B70 +OLE,21,UpdateOptions,6,0,active,0x00C12606,0x66024BC0 +OLE,22,HostName,1,0,active,0x00C14401,0x66024BE8 +OLE,23,SizeMode,6,0,active,0x00C12406,0x66024C10 +OLE,24,AutoActivate,6,0,active,0x00C12206,0x66024C38 +OLE,25,AutoVerbMenu,4,0,active,0x00C12204,0x66024C60 +OLE,26,AppIsRunning,4,0,flag,0x00004C04,0x66024C88 +OLE,27,Picture,21,0,flag,0x00005815,0x66024CA0 +OLE,28,Object,32,0,skip,0x00005820,0x66024AA8 +OLE,29,Data,3,0,flag,0x00004C03,0x66024CB8 +OLE,30,DataText,1,0,flag,0x00004C01,0x66024CE0 +OLE,31,Format,1,0,flag,0x00002A01,0x66024D00 +OLE,32,ObjectAcceptFormats,1,0,flag,0x00005901,0x66024D30 +OLE,33,ObjectAcceptFormatsCount,2,0,flag,0x00005802,0x66024D68 +OLE,34,ObjectGetFormats,1,0,flag,0x00005901,0x66024D98 +OLE,35,ObjectGetFormatsCount,2,0,flag,0x00005802,0x66024DC8 +OLE,36,OLETypeAllowed,6,0,active,0x00C12206,0x66024DF0 +OLE,37,PasteOK,4,0,flag,0x00005804,0x66024E10 +OLE,38,ObjectVerbs,1,0,flag,0x00005901,0x66024E38 +OLE,39,ObjectVerbFlags,3,0,flag,0x00005903,0x66024E60 +OLE,40,ObjectVerbsCount,2,0,flag,0x00005802,0x66024E90 +OLE,41,Verb,2,0,active,0x00C12202,0x66024EB0 +OLE,42,FileNumber,2,0,flag,0x00002A02,0x66024ED8 +OLE,43,Action,2,0,flag,0x02000C02,0x66024EF8 +OLE,44,MiscFlags,2,0,active,0x00C12202,0x66024F20 +OLE,45,OleObjectBlob,3,0,flag,0x02021803,0x66024AD0 +OLE,46,_,4,0,sep,0xE0000804,0x660024A0 +OLE,47,CausesValidation,4,0,active,0x80C12204,0x66002010 +OLE,48,fFFHk,4,0,active,0x22011804,0x66024F40 +OLE,49,hWnd,3,0,flag,0x80005803,0x66024FC0 +OLE,50,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +OLE,51,DisplayType,6,0,active,0x00C14406,0x66024F68 +OLE,52,LpOleObject,3,0,flag,0x00005803,0x66024F90 +OLE,53,BackStyle,6,0,active,0x00C12406,0x66024FA8 +OLE,54,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +OLE,55,_,4,0,sep,0xE0000804,0x660024A0 +OLE,56,_,4,0,sep,0xE0000804,0x660024A0 +OLE,57,_,4,0,sep,0xE0000804,0x660024A0 +OLE,58,_,4,0,sep,0xE0000804,0x660024A0 +OLE,59,_,4,0,sep,0xE0000804,0x660024A0 +OLE,60,_,4,0,sep,0xE0000804,0x660024A0 +OLE,61,_,4,0,sep,0xE0000804,0x660024A0 +OLE,62,_,4,0,sep,0xE0000804,0x660024A0 +OLE,63,_,4,0,sep,0xE0000804,0x660024A0 +OLE,64,_,4,0,sep,0xE0000804,0x660024A0 +OLE,65,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +OLE,66,DataField,1,0,active,0x80F12601,0x66001FD0 +OLE,67,DataSource,1,0,active,0x82F13201,0x66001FE0 +OLE,68,Bindings,1,0,active,0x02021801,0x66024FE8 +OLE,69,OLEDropAllowed,4,0,active,0x00C12404,0x66024B98 +OLE,70,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +OLE,71,Container,32,0,skip,0x80004C20,0x66001FB0 +OLE,72,Appearance,6,0,active,0x80C12606,0x66001CA0 +OLE,73,_,4,0,sep,0xE0000804,0x660024A0 +OLE,74,_,4,0,sep,0xE0000804,0x660024A0 +OptionButton,0,Name,18,0,skip,0x8400D412,0x66001E50 +OptionButton,1,Caption,1,0,active,0x80EA4401,0x66022290 +OptionButton,2,Index,17,0,active,0x84C1D411,0x66001F00 +OptionButton,3,BackColor,5,0,active,0x80F12405,0x66022260 +OptionButton,4,ForeColor,5,0,active,0x80F12405,0x66022280 +OptionButton,5,Bounds,8,4,active,0x90222408,0x66001DC0 +OptionButton,6,Top,10,0,flag,0x9020240A,0x66001DE0 +OptionButton,7,Width,9,0,flag,0x90202409,0x66001E00 +OptionButton,8,Height,11,0,flag,0x9020240B,0x66001DA0 +OptionButton,9,Enabled,4,0,active,0x80E14404,0x66001D90 +OptionButton,10,Visible,4,0,active,0x80E14404,0x66001DF0 +OptionButton,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +OptionButton,12,FontName,1,0,active,0x90224C01,0x66001CF0 +OptionButton,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +OptionButton,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +OptionButton,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +OptionButton,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +OptionButton,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +OptionButton,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +OptionButton,19,Value,4,0,active,0x00E14404,0x66027B70 +OptionButton,20,Parent,25,0,skip,0x80003819,0x66001F10 +OptionButton,21,DragMode,6,0,active,0x80C12606,0x66001ED0 +OptionButton,22,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +OptionButton,23,TabStop,4,0,active,0x80C14404,0x66002000 +OptionButton,24,Tag,13,0,active,0x80C1220D,0x66001DD0 +OptionButton,25,Alignment,6,0,active,0x00C12406,0x66027B80 +OptionButton,26,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +OptionButton,27,hWnd,3,0,flag,0x80003803,0x66001D30 +OptionButton,28,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +OptionButton,29,Font,20,0,active,0x80224414,0x66001CC0 +OptionButton,30,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +OptionButton,31,Appearance,6,0,active,0x80C12606,0x66001CA0 +OptionButton,32,Container,32,0,skip,0x80004C20,0x66001FB0 +OptionButton,33,RightToLeft,4,0,active,0x80C14404,0x66114000 +OptionButton,34,ToolTipText,1,0,active,0x80D12401,0x66001F20 +OptionButton,35,Picture,21,0,active,0x84E14495,0x660259E0 +OptionButton,36,DisabledPicture,21,0,active,0x84E14495,0x66025A00 +OptionButton,37,DownPicture,21,0,active,0x84E14495,0x660259F0 +OptionButton,38,Style,6,0,active,0x00C13406,0x66027B98 +OptionButton,39,OLEDropMode,6,0,active,0x80412406,0x66001D70 +OptionButton,40,MaskColor,5,0,active,0x80F14405,0x66025A10 +OptionButton,41,UseMaskColor,4,0,active,0x80E14404,0x66025A20 +OptionButton,42,CausesValidation,4,0,active,0x80C12204,0x66002010 +PictureBox,0,Name,1,0,active,0x8400D412,0x66001E50 +PictureBox,1,BackColor,5,0,active,0x80F12405,0x66022260 +PictureBox,2,Index,17,0,active,0x84C1D411,0x66001F00 +PictureBox,3,Picture,21,0,active,0x04E12415,0x66027FB8 +PictureBox,4,ForeColor,5,0,active,0x80F12405,0x66022280 +PictureBox,5,Bounds,8,4,active,0x90222408,0x66001DC0 +PictureBox,6,Top,10,0,flag,0x9020240A,0x66001DE0 +PictureBox,7,Width,9,0,flag,0x90202409,0x66001E00 +PictureBox,8,Height,11,0,flag,0x9020240B,0x66001DA0 +PictureBox,9,Enabled,4,0,active,0x80E14404,0x66001D90 +PictureBox,10,Visible,4,0,active,0x80E14404,0x66001DF0 +PictureBox,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +PictureBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 +PictureBox,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +PictureBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +PictureBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +PictureBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +PictureBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +PictureBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +PictureBox,19,hDC,3,0,flag,0x00005803,0x66022170 +PictureBox,20,CurrentX,7,0,flag,0x00004C07,0x66022150 +PictureBox,21,CurrentY,7,0,flag,0x00004C07,0x66022160 +PictureBox,22,ScaleLeft,7,0,flag,0x10404407,0x66022218 +PictureBox,23,ScaleTop,7,0,flag,0x10404407,0x66022240 +PictureBox,24,ScaleWidth,7,0,flag,0x10004407,0x66022250 +PictureBox,25,ScaleHeight,7,0,flag,0x10004407,0x66022208 +PictureBox,26,ScaleMode,6,3,active,0x10422406,0x66022228 +PictureBox,27,FontTransparent,4,0,flag,0x10404404,0x660221E8 +PictureBox,28,DrawStyle,6,0,active,0x00C14406,0x66022198 +PictureBox,29,DrawWidth,2,0,active,0x00C14402,0x660221B0 +PictureBox,30,FillStyle,6,0,active,0x00C14406,0x660221D0 +PictureBox,31,FillColor,5,0,active,0x00D12405,0x660221C0 +PictureBox,32,DrawMode,6,0,active,0x00C14406,0x66022180 +PictureBox,33,AutoRedraw,4,0,flag,0x10604404,0x66022140 +PictureBox,34,CausesValidation,4,0,active,0x80C12204,0x66002010 +PictureBox,35,AutoSize,4,0,active,0x00E12604,0x66027F90 +PictureBox,36,BorderStyle,6,0,active,0x00C12406,0x66027FA0 +PictureBox,37,LinkTopic,1,0,active,0x80E1C401,0x66025338 +PictureBox,38,LinkItem,1,0,active,0x80E1C401,0x66025300 +PictureBox,39,LinkMode,6,0,active,0x80C1C406,0x66025310 +PictureBox,40,Image,21,0,flag,0x04005815,0x660221F8 +PictureBox,41,Parent,25,0,skip,0x80003819,0x66001F10 +PictureBox,42,DragMode,6,0,active,0x80C12606,0x66001ED0 +PictureBox,43,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +PictureBox,44,LinkTimeout,2,0,active,0x80C14402,0x66025328 +PictureBox,45,TabStop,4,0,active,0x80C14404,0x66002000 +PictureBox,46,Tag,13,0,active,0x80C1220D,0x66001DD0 +PictureBox,47,hWnd,3,0,flag,0x80003803,0x66001D30 +PictureBox,48,ClipControls,4,0,active,0x80C12204,0x66022270 +PictureBox,49,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +PictureBox,50,Align,6,0,active,0x80C12406,0x66024040 +PictureBox,51,IMEMode,6,0,active,0xC0C16606,0x66114018 +PictureBox,52,DataSource,1,0,active,0x82F13201,0x66001FE0 +PictureBox,53,DataField,1,0,active,0x80F12601,0x66001FD0 +PictureBox,54,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +PictureBox,55,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +PictureBox,56,Negotiate,4,0,active,0x82C13404,0x66024058 +PictureBox,57,Font,20,0,active,0x80224414,0x66001CC0 +PictureBox,58,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +PictureBox,59,Appearance,6,0,active,0x80C12606,0x66001CA0 +PictureBox,60,Container,32,0,skip,0x80004C20,0x66001FB0 +PictureBox,61,RightToLeft,4,0,active,0x80C14404,0x66114000 +PictureBox,62,ToolTipText,1,0,active,0x80D12401,0x66001F20 +PictureBox,63,OLEDragMode,6,0,active,0x80412206,0x660021A0 +PictureBox,64,OLEDropMode,6,0,active,0x80412406,0x66026960 +PictureBox,65,DataMember,33,0,active,0x80F12621,0x660020A0 +PictureBox,66,DataFormat,22,0,active,0x84654416,0x66002070 +PictureBox,67,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +PictureBox,68,HasDC,4,0,active,0x00C13204,0x66027FC8 +PropertyPage,0,Name,1,0,active,0x8400D412,0x660222A0 +PropertyPage,1,Caption,1,0,active,0x80EA4401,0x66022290 +PropertyPage,2,hWnd,3,0,flag,0x80003803,0x66001D30 +PropertyPage,3,BackColor,5,0,active,0x80F12405,0x66022260 +PropertyPage,4,ForeColor,5,0,active,0x80F12405,0x66022280 +PropertyPage,5,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,6,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,7,Width,9,0,flag,0x90203409,0x6602A3B8 +PropertyPage,8,Height,11,0,flag,0x9020340B,0x6602A3C8 +PropertyPage,9,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,10,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +PropertyPage,12,FontName,1,0,active,0x90224C01,0x66001CF0 +PropertyPage,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +PropertyPage,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +PropertyPage,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +PropertyPage,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +PropertyPage,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +PropertyPage,18,hDC,3,0,flag,0x00005803,0x66022170 +PropertyPage,19,CurrentX,7,0,flag,0x00004C07,0x66022150 +PropertyPage,20,CurrentY,7,0,flag,0x00004C07,0x66022160 +PropertyPage,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 +PropertyPage,22,ScaleTop,7,0,flag,0x10404407,0x66022240 +PropertyPage,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 +PropertyPage,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 +PropertyPage,25,ScaleMode,6,3,active,0x10422406,0x66022228 +PropertyPage,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 +PropertyPage,27,DrawStyle,6,0,active,0x00C14406,0x66022198 +PropertyPage,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 +PropertyPage,29,FillStyle,6,0,active,0x00C14406,0x660221D0 +PropertyPage,30,FillColor,5,0,active,0x00D12405,0x660221C0 +PropertyPage,31,DrawMode,6,0,active,0x00C14406,0x66022180 +PropertyPage,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 +PropertyPage,33,Picture,21,0,active,0x04E12415,0x66022548 +PropertyPage,34,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,35,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,36,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,37,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,38,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,39,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,40,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,41,Image,21,0,flag,0x04005815,0x660221F8 +PropertyPage,42,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,43,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,44,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,45,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,46,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,47,Tag,13,0,active,0x80C1220D,0x66001DD0 +PropertyPage,48,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,49,KeyPreview,4,0,active,0x00C12204,0x66022570 +PropertyPage,50,ClipControls,4,0,active,0x80C12204,0x66022270 +PropertyPage,51,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +PropertyPage,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 +PropertyPage,53,ClientSize,8,12,active,0x12025A08,0x660225A0 +PropertyPage,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 +PropertyPage,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 +PropertyPage,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 +PropertyPage,57,Count,2,0,flag,0x00005802,0x660225E0 +PropertyPage,58,Controls,32,0,skip,0x00005820,0x660225F0 +PropertyPage,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +PropertyPage,60,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,61,LockControls,4,0,active,0x02C13A04,0x66022600 +PropertyPage,62,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,63,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,64,Font,20,0,active,0x80224414,0x66001CC0 +PropertyPage,65,Appearance,6,0,active,0x80C12606,0x66001CA0 +PropertyPage,66,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,67,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,68,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,69,RightToLeft,4,0,active,0x80C14404,0x66114000 +PropertyPage,70,HasDC,4,0,active,0x00C13204,0x660226A0 +PropertyPage,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 +PropertyPage,72,Palette,21,0,active,0x04E12415,0x66022620 +PropertyPage,73,PaletteMode,6,0,active,0x00C12406,0x6602A3A0 +PropertyPage,74,_,4,0,sep,0xE0000804,0x660024A0 +PropertyPage,75,SelectedControls,22,0,flag,0x00005816,0x6602A370 +PropertyPage,76,Changed,4,0,flag,0x00C04C04,0x6602A390 +PropertyPage,77,StandardSize,6,0,flag,0x02005446,0x6602A3D8 +Shape,0,Name,18,0,skip,0x8400D412,0x66001E50 +Shape,1,Index,17,0,active,0x84C1D411,0x66001F00 +Shape,2,BackColor,5,0,active,0x80F12405,0x66001E40 +Shape,3,BorderColor,5,0,active,0x01F12285,0x660288F0 +Shape,4,Bounds,8,4,active,0x90222408,0x66001DC0 +Shape,5,Top,10,0,flag,0x9020240A,0x66001DE0 +Shape,6,Width,9,0,flag,0x90202409,0x66001E00 +Shape,7,Height,11,0,flag,0x9020240B,0x66001DA0 +Shape,8,Visible,4,0,active,0x80E14404,0x66001DF0 +Shape,9,Parent,25,0,skip,0x80003819,0x66001F10 +Shape,10,Tag,13,0,active,0x80C1220D,0x66001DD0 +Shape,11,Shape,6,0,active,0x01C12286,0x66028870 +Shape,12,DrawMode,6,0,active,0x00C14406,0x66022180 +Shape,13,BorderStyle,6,0,active,0x00C12486,0x660288A0 +Shape,14,BorderWidth,2,0,active,0x00E12482,0x660288B8 +Shape,15,FillColor,5,0,active,0x00F12485,0x660288C8 +Shape,16,BackStyle,6,0,active,0x01C12286,0x66028888 +Shape,17,FillStyle,6,0,active,0x01C12286,0x660288D8 +Shape,18,Container,32,0,skip,0x80004C20,0x66001FB0 +TextBox,0,Name,18,0,skip,0x8400D412,0x66001E50 +TextBox,1,Index,17,0,active,0x84C1D411,0x66001F00 +TextBox,2,BackColor,5,0,active,0x80F12405,0x66001E40 +TextBox,3,ForeColor,5,0,active,0x80F12405,0x66001E60 +TextBox,4,Bounds,8,4,active,0x90222408,0x66001DC0 +TextBox,5,Top,10,0,flag,0x9020240A,0x66001DE0 +TextBox,6,Width,9,0,flag,0x90202409,0x66001E00 +TextBox,7,Height,11,0,flag,0x9020240B,0x66001DA0 +TextBox,8,Enabled,4,0,active,0x80E14404,0x66001D90 +TextBox,9,Visible,4,0,active,0x80E14404,0x66001DF0 +TextBox,10,MousePointer,6,0,active,0x80C12406,0x66001D50 +TextBox,11,Text,1,0,active,0x80EE4401,0x66025E50 +TextBox,12,FontName,1,0,active,0x90224C01,0x66001CF0 +TextBox,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +TextBox,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +TextBox,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +TextBox,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +TextBox,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +TextBox,18,TabIndex,2,0,active,0x84012402,0x66001FF0 +TextBox,19,BorderStyle,6,0,active,0x00C12406,0x66026978 +TextBox,20,LinkTopic,1,0,active,0x80E1C401,0x66025338 +TextBox,21,LinkItem,1,0,active,0x80E1C401,0x66025300 +TextBox,22,LinkMode,6,0,active,0x80C1C406,0x66025310 +TextBox,23,MultiLine,4,0,active,0x00C13404,0x66026990 +TextBox,24,ScrollBars,6,0,active,0x00C13406,0x660269A0 +TextBox,25,SelStart,3,0,flag,0x00204C03,0x660269C8 +TextBox,26,SelLength,3,0,flag,0x00204C03,0x660269B8 +TextBox,27,SelText,1,0,flag,0x00204C01,0x660269D8 +TextBox,28,Parent,25,0,skip,0x80003819,0x66001F10 +TextBox,29,DragMode,6,0,active,0x80C12606,0x66001ED0 +TextBox,30,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +TextBox,31,LinkTimeout,2,0,active,0x80C14402,0x66025328 +TextBox,32,TabStop,4,0,active,0x80C14404,0x66002000 +TextBox,33,Tag,13,0,active,0x80C1220D,0x66001DD0 +TextBox,34,PasswordChar,1,0,active,0x00E92401,0x660269E8 +TextBox,35,HideSelection,4,0,active,0x00C13204,0x660269F8 +TextBox,36,Alignment,6,0,active,0x00C12406,0x66026A08 +TextBox,37,MaxLength,3,0,active,0x00E12403,0x66026A20 +TextBox,38,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +TextBox,39,hWnd,3,0,flag,0x80003803,0x66001D30 +TextBox,40,IMEMode,6,0,active,0xC0C16606,0x66114018 +TextBox,41,DataSource,1,0,active,0x82F13201,0x66001FE0 +TextBox,42,DataField,1,0,active,0x80F12601,0x66001FD0 +TextBox,43,DataChanged,4,0,flag,0x80106E04,0x66001FC0 +TextBox,44,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +TextBox,45,Locked,4,0,active,0x00C14404,0x66026A30 +TextBox,46,Font,20,0,active,0x80224414,0x66001CC0 +TextBox,47,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +TextBox,48,Appearance,6,0,active,0x80C12606,0x66001CA0 +TextBox,49,Container,32,0,skip,0x80004C20,0x66001FB0 +TextBox,50,RightToLeft,4,0,active,0x80C14404,0x66114000 +TextBox,51,ToolTipText,1,0,active,0x80D12401,0x66001F20 +TextBox,52,OLEDragMode,6,0,active,0x80412206,0x660021A0 +TextBox,53,OLEDropMode,6,0,active,0x80412406,0x66026960 +TextBox,54,CausesValidation,4,0,active,0x80C12204,0x66002010 +TextBox,55,DataMember,33,0,active,0x80F12621,0x660020A0 +TextBox,56,DataFormat,22,0,active,0x84654416,0x66002070 +TextBox,57,DataSource(obj),22,0,flag,0x84244C16,0x66002088 +Timer,0,Name,18,0,skip,0x8400D412,0x66001E50 +Timer,1,Index,17,0,active,0x84C1D411,0x66001F00 +Timer,2,Enabled,4,0,active,0x00C12604,0x66028A30 +Timer,3,Interval,3,0,active,0x00C12403,0x66028A40 +Timer,4,Parent,25,0,skip,0x80003819,0x66001F10 +Timer,5,Tag,13,0,active,0x80C1220D,0x66001DD0 +Timer,6,_,4,0,sep,0xE0000804,0x660024A0 +Timer,7,Left,8,0,active,0x82013408,0x66025360 +Timer,8,Top,10,0,active,0x8201340A,0x66025370 +UserControl,0,Name,1,0,active,0x8400D412,0x660222A0 +UserControl,1,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,2,hWnd,3,0,flag,0x80003803,0x66001D30 +UserControl,3,BackColor,5,0,active,0x80F12405,0x66022260 +UserControl,4,ForeColor,5,0,active,0x80F12405,0x66022280 +UserControl,5,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,6,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,7,Width,9,0,flag,0x90202409,0x66001E00 +UserControl,8,Height,11,0,flag,0x9020240B,0x66001DA0 +UserControl,9,Enabled,4,0,active,0x80E14404,0x66001D90 +UserControl,10,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +UserControl,12,FontName,1,0,active,0x90224C01,0x66001CF0 +UserControl,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +UserControl,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +UserControl,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +UserControl,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +UserControl,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +UserControl,18,hDC,3,0,flag,0x00005803,0x66022170 +UserControl,19,CurrentX,7,0,flag,0x00004C07,0x66022150 +UserControl,20,CurrentY,7,0,flag,0x00004C07,0x66022160 +UserControl,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 +UserControl,22,ScaleTop,7,0,flag,0x10404407,0x66022240 +UserControl,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 +UserControl,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 +UserControl,25,ScaleMode,6,3,active,0x10422406,0x66022228 +UserControl,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 +UserControl,27,DrawStyle,6,0,active,0x00C14406,0x66022198 +UserControl,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 +UserControl,29,FillStyle,6,0,active,0x00C14406,0x660221D0 +UserControl,30,FillColor,5,0,active,0x00D12405,0x660221C0 +UserControl,31,DrawMode,6,0,active,0x00C14406,0x66022180 +UserControl,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 +UserControl,33,Picture,21,0,active,0x04E12415,0x66022548 +UserControl,34,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,35,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,36,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,37,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,38,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,39,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,40,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,41,Image,21,0,flag,0x04005815,0x660221F8 +UserControl,42,Parent,32,0,skip,0x00005820,0x660294D0 +UserControl,43,MaskColor,5,0,active,0x00712205,0x66029330 +UserControl,44,MaskPicture,21,0,active,0x04E12215,0x66029320 +UserControl,45,Windowless,4,0,active,0x02C15444,0x660294E0 +UserControl,46,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,47,Tag,13,0,active,0x80C1220D,0x66001DD0 +UserControl,48,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,49,KeyPreview,4,0,active,0x00C12204,0x66022570 +UserControl,50,ClipControls,4,0,active,0x80C12204,0x66022270 +UserControl,51,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 +UserControl,53,ClientSize,8,12,active,0x12025A08,0x660225A0 +UserControl,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 +UserControl,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 +UserControl,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 +UserControl,57,Count,2,0,flag,0x00005802,0x660225E0 +UserControl,58,Controls,32,0,skip,0x00005820,0x660225F0 +UserControl,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +UserControl,60,DataMembers,22,0,flag,0x00005816,0x660293B8 +UserControl,61,LockControls,4,0,active,0x02C13A04,0x66022600 +UserControl,62,DataBindingBehavior,6,0,active,0x02C15446,0x66119048 +UserControl,63,ClipBehavior,6,0,active,0x00C12406,0x66029508 +UserControl,64,Font,20,0,active,0x80224414,0x66001CC0 +UserControl,65,Appearance,6,0,active,0x80C12606,0x66001CA0 +UserControl,66,DataSourceBehavior,6,0,active,0x02C15446,0x66119060 +UserControl,67,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,68,ContainerHwnd,3,0,flag,0x00005803,0x66029520 +UserControl,69,RightToLeft,4,0,active,0x80C14404,0x66114000 +UserControl,70,HasDC,4,0,active,0x00C13204,0x660226A0 +UserControl,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 +UserControl,72,Palette,21,0,active,0x04E12415,0x66022620 +UserControl,73,PaletteMode,6,0,active,0x00E1A406,0x66029410 +UserControl,74,HitBehavior,6,0,active,0x00C12406,0x660294F0 +UserControl,75,_,4,0,sep,0xE0000804,0x660024A0 +UserControl,76,ControlContainer,4,0,active,0x02C15444,0x66029340 +UserControl,77,Ambient,22,0,flag,0x00005816,0x660293A0 +UserControl,78,PropertyPages,1,0,active,0x08064501,0x660293E0 +UserControl,79,Extender,32,0,skip,0x00005820,0x660293D0 +UserControl,80,ContainedControls,22,0,flag,0x00005816,0x660293F8 +UserControl,81,ParentControls,22,0,flag,0x00005816,0x66029428 +UserControl,82,InvisibleAtRuntime,4,0,active,0x02C15444,0x66029350 +UserControl,83,CanGetFocus,4,0,active,0x02C15444,0x66029360 +UserControl,84,Alignable,4,0,active,0x02C15444,0x66029370 +UserControl,85,ForwardFocus,4,0,active,0x02C15444,0x66029380 +UserControl,86,DefaultCancel,4,0,active,0x02C15444,0x66029390 +UserControl,87,BackStyle,6,0,active,0x00C12406,0x66029440 +UserControl,88,EventsFrozen,4,0,flag,0x00005804,0x66029458 +UserControl,89,BorderStyle,6,0,active,0x00C12406,0x66029468 +UserControl,90,Public,4,0,flag,0x0200D404,0x66029480 +UserControl,91,AccessKeys,1,0,active,0x08D14401,0x66029490 +UserControl,92,EditAtDesignTime,4,0,active,0x02C1B204,0x660294A8 +UserControl,93,HyperLink,22,0,flag,0x00005816,0x660294B8 +UserDocument,0,Name,1,0,active,0x8400D412,0x660222A0 +UserDocument,1,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,2,hWnd,3,0,flag,0x80003803,0x66001D30 +UserDocument,3,BackColor,5,0,active,0x80F12405,0x66022260 +UserDocument,4,ForeColor,5,0,active,0x80F12405,0x66022280 +UserDocument,5,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,6,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,7,Width,9,0,flag,0x90202409,0x66001E00 +UserDocument,8,Height,11,0,flag,0x9020240B,0x66001DA0 +UserDocument,9,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,10,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,11,MousePointer,6,0,active,0x80C12406,0x66001D50 +UserDocument,12,FontName,1,0,active,0x90224C01,0x66001CF0 +UserDocument,13,FontSize,7,0,flag,0x90304C07,0x66001D00 +UserDocument,14,FontBold,4,0,flag,0x90204C04,0x66001CD0 +UserDocument,15,FontItalic,4,0,flag,0x90204C04,0x66001CE0 +UserDocument,16,FontStrikethru,4,0,flag,0x90204C04,0x66001D10 +UserDocument,17,FontUnderline,4,0,flag,0x90204C04,0x66001D20 +UserDocument,18,hDC,3,0,flag,0x00005803,0x66022170 +UserDocument,19,CurrentX,7,0,flag,0x00004C07,0x66022150 +UserDocument,20,CurrentY,7,0,flag,0x00004C07,0x66022160 +UserDocument,21,ScaleLeft,7,0,flag,0x10404407,0x66022218 +UserDocument,22,ScaleTop,7,0,flag,0x10404407,0x66022240 +UserDocument,23,ScaleWidth,7,0,flag,0x10004407,0x66022250 +UserDocument,24,ScaleHeight,7,0,flag,0x10004407,0x66022208 +UserDocument,25,ScaleMode,6,3,active,0x10422406,0x66022228 +UserDocument,26,FontTransparent,4,0,flag,0x10404404,0x660221E8 +UserDocument,27,DrawStyle,6,0,active,0x00C14406,0x66022198 +UserDocument,28,DrawWidth,2,0,active,0x00C14402,0x660221B0 +UserDocument,29,FillStyle,6,0,active,0x00C14406,0x660221D0 +UserDocument,30,FillColor,5,0,active,0x00D12405,0x660221C0 +UserDocument,31,DrawMode,6,0,active,0x00C14406,0x66022180 +UserDocument,32,AutoRedraw,4,0,flag,0x10604404,0x66022140 +UserDocument,33,Picture,21,0,active,0x04E12415,0x66022548 +UserDocument,34,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,35,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,36,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,37,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,38,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,39,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,40,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,41,Image,21,0,flag,0x04005815,0x660221F8 +UserDocument,42,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,43,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,44,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,45,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,46,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,47,Tag,13,0,active,0x80C1220D,0x66001DD0 +UserDocument,48,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,49,KeyPreview,4,0,active,0x00C12204,0x66022570 +UserDocument,50,ClipControls,4,0,active,0x80C12204,0x66022270 +UserDocument,51,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,52,ActiveControl,26,0,flag,0x0000581A,0x66022590 +UserDocument,53,ClientSize,8,12,active,0x12025A08,0x660225A0 +UserDocument,54,ClientTop,10,0,flag,0x12005A0A,0x660225B0 +UserDocument,55,ClientWidth,8,0,flag,0x12005A08,0x660225C0 +UserDocument,56,ClientHeight,10,0,flag,0x12005A0A,0x660225D0 +UserDocument,57,Count,2,0,flag,0x00005802,0x660225E0 +UserDocument,58,Controls,32,0,skip,0x00005820,0x660225F0 +UserDocument,59,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +UserDocument,60,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,61,LockControls,4,0,active,0x02C13A04,0x66022600 +UserDocument,62,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,63,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,64,Font,20,-1,active,0x80224414,0x66001CC0 +UserDocument,65,Appearance,6,0,active,0x80C12606,0x66001CA0 +UserDocument,66,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,67,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,68,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,69,RightToLeft,4,0,active,0x80C14404,0x66114000 +UserDocument,70,HasDC,4,0,active,0x00C13204,0x660226A0 +UserDocument,71,OLEDropMode,6,0,active,0x80412406,0x66001D70 +UserDocument,72,Palette,21,0,active,0x04E12415,0x66022620 +UserDocument,73,PaletteMode,6,0,active,0x00E12406,0x66029C40 +UserDocument,74,_,4,0,sep,0xE0000804,0x660024A0 +UserDocument,75,Parent,32,0,skip,0x00005820,0x66029C60 +UserDocument,76,ScrollBars,6,0,active,0x00C12406,0x66029C70 +UserDocument,77,ContinuousScroll,4,0,active,0x00C12204,0x66029C88 +UserDocument,78,HScrollSmallChange,7,0,active,0x00C14407,0x661190C0 +UserDocument,79,VScrollSmallChange,7,0,active,0x00C14407,0x661190D0 +UserDocument,80,MinWidth,9,0,flag,0x00204C09,0x66029C98 +UserDocument,81,MinHeight,11,0,flag,0x00204C0B,0x66029CA8 +UserDocument,82,ViewportLeft,7,0,flag,0x00204C07,0x66029CB8 +UserDocument,83,ViewportHeight,7,0,flag,0x00005807,0x66029CC8 +UserDocument,84,ViewportTop,7,0,flag,0x00204C07,0x66029CD8 +UserDocument,85,ViewportWidth,7,0,flag,0x00005807,0x66029CE8 +UserDocument,86,HyperLink,22,0,flag,0x00005816,0x66029CF8 +UserDocument,87,_,4,0,sep,0xE0000804,0x660024A0 +VScrollBar,0,Name,18,0,skip,0x8400D412,0x66001E50 +VScrollBar,1,Index,17,0,active,0x84C1D411,0x66001F00 +VScrollBar,2,Bounds,8,4,active,0x90222408,0x66001DC0 +VScrollBar,3,Top,10,0,flag,0x9020240A,0x66001DE0 +VScrollBar,4,Width,9,0,flag,0x90202409,0x66001E00 +VScrollBar,5,Height,11,0,flag,0x9020240B,0x66001DA0 +VScrollBar,6,Enabled,4,0,active,0x80E14404,0x66001D90 +VScrollBar,7,Visible,4,0,active,0x80E14404,0x66001DF0 +VScrollBar,8,MousePointer,6,0,active,0x80C12406,0x66001D50 +VScrollBar,9,TabIndex,2,0,active,0x84012402,0x66001FF0 +VScrollBar,10,Min,2,0,active,0x00E12402,0x66028680 +VScrollBar,11,Max,2,0,active,0x00E12402,0x66028670 +VScrollBar,12,SmallChange,2,0,active,0x00E12402,0x66028690 +VScrollBar,13,LargeChange,2,0,active,0x00E12402,0x66028660 +VScrollBar,14,Value,2,0,active,0x00612402,0x660286A0 +VScrollBar,15,Parent,25,0,skip,0x80003819,0x66001F10 +VScrollBar,16,DragMode,6,0,active,0x80C12606,0x66001ED0 +VScrollBar,17,DragIcon,21,0,active,0x84C1A215,0x66001EC0 +VScrollBar,18,TabStop,4,0,active,0x80C14404,0x66002000 +VScrollBar,19,Tag,13,0,active,0x80C1220D,0x66001DD0 +VScrollBar,20,hWnd,3,0,flag,0x80003803,0x66001D30 +VScrollBar,21,HelpContextID,3,0,active,0x80C12203,0x66001DB0 +VScrollBar,22,MouseIcon,21,0,active,0x84C1A615,0x66001D40 +VScrollBar,23,WhatsThisHelpID,3,0,active,0x80C12203,0x66001EF0 +VScrollBar,24,Container,32,0,skip,0x80004C20,0x66001FB0 +VScrollBar,25,RightToLeft,4,0,active,0x80C14404,0x66114000 +VScrollBar,26,CausesValidation,4,0,active,0x80C12204,0x66002010 diff --git a/data/vb6_events.csv b/data/vb6_events.csv index 4049f5a..30b9cb6 100644 --- a/data/vb6_events.csv +++ b/data/vb6_events.csv @@ -1,47 +1,464 @@ -template,slot,name -standard,0,Click -standard,1,DblClick -standard,2,DragDrop -standard,3,DragOver -standard,4,GotFocus -standard,5,KeyDown -standard,6,KeyPress -standard,7,KeyUp -standard,8,LostFocus -standard,9,MouseDown -standard,10,MouseMove -standard,11,MouseUp -standard,12,LinkError -standard,13,LinkOpen -standard,14,LinkClose -standard,15,LinkNotify -standard,16,Change -standard,17,OLEDragOver -standard,18,OLEDragDrop -standard,19,OLEGiveFeedback -standard,20,OLEStartDrag -standard,21,OLESetData -standard,22,OLECompleteDrag -standard,23,Validate -form,0,Activate -form,1,Initialize -form,2,Resize -form,3,Terminate -form,4,Load -form,5,Paint -form,6,QueryUnload -form,7,Unload -timer,0,Timer -usercontrol,0,ReadProperties -usercontrol,1,WriteProperties -usercontrol,2,InitProperties -usercontrol,3,Show -usercontrol,4,Hide -usercontrol,5,AmbientChanged -usercontrol,6,EnterFocus -usercontrol,7,ExitFocus -usercontrol,8,AccessKeyPress -usercontrol,9,GetDataMember -usercontrol,10,HitTest -usercontrol,11,AsyncReadComplete -usercontrol,12,AsyncReadProgress +# Event sink slots per control class, from the events interfaces of VB6.OLB +# (Class: IClassModuleEvt in MSVBVM60.DLL; Extender: the first 9 slots a +# UserControl instance has on its host, from VBControlExtenderEvents, then +# the UserControl's own events). Slot k is the member at vtable offset +# 0x0C + 4k (the interfaces derive from IUnknown); slots without a member +# are omitted. +control,slot,name +PictureBox,0,Change +PictureBox,1,Click +PictureBox,2,DblClick +PictureBox,3,DragDrop +PictureBox,4,DragOver +PictureBox,5,GotFocus +PictureBox,6,KeyDown +PictureBox,7,KeyPress +PictureBox,8,KeyUp +PictureBox,9,LinkClose +PictureBox,10,LinkError +PictureBox,11,LinkOpen +PictureBox,12,LostFocus +PictureBox,13,MouseDown +PictureBox,14,MouseMove +PictureBox,15,MouseUp +PictureBox,16,Paint +PictureBox,17,LinkNotify +PictureBox,18,Resize +PictureBox,19,OLEDragOver +PictureBox,20,OLEDragDrop +PictureBox,21,OLEGiveFeedback +PictureBox,22,OLEStartDrag +PictureBox,23,OLESetData +PictureBox,24,OLECompleteDrag +PictureBox,25,Validate +Label,0,Change +Label,1,Click +Label,2,DblClick +Label,3,DragDrop +Label,4,DragOver +Label,5,LinkClose +Label,6,LinkError +Label,7,LinkOpen +Label,8,MouseDown +Label,9,MouseMove +Label,10,MouseUp +Label,11,LinkNotify +Label,12,OLEDragOver +Label,13,OLEDragDrop +Label,14,OLEGiveFeedback +Label,15,OLEStartDrag +Label,16,OLESetData +Label,17,OLECompleteDrag +TextBox,0,Change +TextBox,1,DragDrop +TextBox,2,DragOver +TextBox,3,GotFocus +TextBox,4,KeyDown +TextBox,5,KeyPress +TextBox,6,KeyUp +TextBox,7,LinkClose +TextBox,8,LinkError +TextBox,9,LinkOpen +TextBox,10,LostFocus +TextBox,11,LinkNotify +TextBox,12,MouseDown +TextBox,13,MouseMove +TextBox,14,MouseUp +TextBox,15,Click +TextBox,16,DblClick +TextBox,17,OLEDragOver +TextBox,18,OLEDragDrop +TextBox,19,OLEGiveFeedback +TextBox,20,OLEStartDrag +TextBox,21,OLESetData +TextBox,22,OLECompleteDrag +TextBox,23,Validate +Frame,0,DragDrop +Frame,1,DragOver +Frame,2,MouseDown +Frame,3,MouseMove +Frame,4,MouseUp +Frame,5,Click +Frame,6,DblClick +Frame,7,OLEDragOver +Frame,8,OLEDragDrop +Frame,9,OLEGiveFeedback +Frame,10,OLEStartDrag +Frame,11,OLESetData +Frame,12,OLECompleteDrag +CommandButton,0,Click +CommandButton,1,DragDrop +CommandButton,2,DragOver +CommandButton,3,GotFocus +CommandButton,4,KeyDown +CommandButton,5,KeyPress +CommandButton,6,KeyUp +CommandButton,7,LostFocus +CommandButton,8,MouseDown +CommandButton,9,MouseMove +CommandButton,10,MouseUp +CommandButton,11,OLEDragOver +CommandButton,12,OLEDragDrop +CommandButton,13,OLEGiveFeedback +CommandButton,14,OLEStartDrag +CommandButton,15,OLESetData +CommandButton,16,OLECompleteDrag +CheckBox,0,Click +CheckBox,1,DragDrop +CheckBox,2,DragOver +CheckBox,3,GotFocus +CheckBox,4,KeyDown +CheckBox,5,KeyPress +CheckBox,6,KeyUp +CheckBox,7,LostFocus +CheckBox,8,MouseDown +CheckBox,9,MouseMove +CheckBox,10,MouseUp +CheckBox,11,OLEDragOver +CheckBox,12,OLEDragDrop +CheckBox,13,OLEGiveFeedback +CheckBox,14,OLEStartDrag +CheckBox,15,OLESetData +CheckBox,16,OLECompleteDrag +CheckBox,17,Validate +OptionButton,0,Click +OptionButton,1,DblClick +OptionButton,2,DragDrop +OptionButton,3,DragOver +OptionButton,4,GotFocus +OptionButton,5,KeyDown +OptionButton,6,KeyPress +OptionButton,7,KeyUp +OptionButton,8,LostFocus +OptionButton,9,MouseDown +OptionButton,10,MouseMove +OptionButton,11,MouseUp +OptionButton,12,OLEDragOver +OptionButton,13,OLEDragDrop +OptionButton,14,OLEGiveFeedback +OptionButton,15,OLEStartDrag +OptionButton,16,OLESetData +OptionButton,17,OLECompleteDrag +OptionButton,18,Validate +ComboBox,0,Change +ComboBox,1,Click +ComboBox,2,DblClick +ComboBox,3,DragDrop +ComboBox,4,DragOver +ComboBox,5,DropDown +ComboBox,6,GotFocus +ComboBox,7,KeyDown +ComboBox,8,KeyPress +ComboBox,9,KeyUp +ComboBox,10,LostFocus +ComboBox,11,OLEDragOver +ComboBox,12,OLEDragDrop +ComboBox,13,OLEGiveFeedback +ComboBox,14,OLEStartDrag +ComboBox,15,OLESetData +ComboBox,16,OLECompleteDrag +ComboBox,17,Scroll +ComboBox,18,Validate +ListBox,0,Click +ListBox,1,DblClick +ListBox,2,DragDrop +ListBox,3,DragOver +ListBox,4,GotFocus +ListBox,5,KeyDown +ListBox,6,KeyPress +ListBox,7,KeyUp +ListBox,8,LostFocus +ListBox,9,MouseDown +ListBox,10,MouseMove +ListBox,11,MouseUp +ListBox,12,OLEDragOver +ListBox,13,OLEDragDrop +ListBox,14,OLEGiveFeedback +ListBox,15,OLEStartDrag +ListBox,16,OLESetData +ListBox,17,OLECompleteDrag +ListBox,18,Scroll +ListBox,19,ItemCheck +ListBox,20,Validate +HScrollBar,0,Change +HScrollBar,1,DragDrop +HScrollBar,2,DragOver +HScrollBar,3,GotFocus +HScrollBar,4,KeyDown +HScrollBar,5,KeyPress +HScrollBar,6,KeyUp +HScrollBar,7,LostFocus +HScrollBar,8,Scroll +HScrollBar,9,Validate +VScrollBar,0,Change +VScrollBar,1,DragDrop +VScrollBar,2,DragOver +VScrollBar,3,GotFocus +VScrollBar,4,KeyDown +VScrollBar,5,KeyPress +VScrollBar,6,KeyUp +VScrollBar,7,LostFocus +VScrollBar,8,Scroll +VScrollBar,9,Validate +Timer,0,Timer +Form,0,DragDrop +Form,1,DragOver +Form,2,LinkClose +Form,3,LinkError +Form,4,LinkExecute +Form,5,LinkOpen +Form,6,Load +Form,7,Resize +Form,8,Unload +Form,9,QueryUnload +Form,10,Activate +Form,11,Deactivate +Form,12,Click +Form,13,DblClick +Form,14,GotFocus +Form,15,KeyDown +Form,16,KeyPress +Form,17,KeyUp +Form,18,LostFocus +Form,19,MouseDown +Form,20,MouseMove +Form,21,MouseUp +Form,22,Paint +Form,23,Initialize +Form,24,Terminate +Form,25,OLEDragOver +Form,26,OLEDragDrop +Form,27,OLEGiveFeedback +Form,28,OLEStartDrag +Form,29,OLESetData +Form,30,OLECompleteDrag +DriveListBox,0,Change +DriveListBox,1,DragDrop +DriveListBox,2,DragOver +DriveListBox,3,GotFocus +DriveListBox,4,KeyDown +DriveListBox,5,KeyPress +DriveListBox,6,KeyUp +DriveListBox,7,LostFocus +DriveListBox,8,OLEDragOver +DriveListBox,9,OLEDragDrop +DriveListBox,10,OLEGiveFeedback +DriveListBox,11,OLEStartDrag +DriveListBox,12,OLESetData +DriveListBox,13,OLECompleteDrag +DriveListBox,14,Scroll +DriveListBox,15,Validate +DirListBox,0,Change +DirListBox,1,Click +DirListBox,2,DragDrop +DirListBox,3,DragOver +DirListBox,4,GotFocus +DirListBox,5,KeyDown +DirListBox,6,KeyPress +DirListBox,7,KeyUp +DirListBox,8,LostFocus +DirListBox,9,MouseDown +DirListBox,10,MouseMove +DirListBox,11,MouseUp +DirListBox,12,OLEDragOver +DirListBox,13,OLEDragDrop +DirListBox,14,OLEGiveFeedback +DirListBox,15,OLEStartDrag +DirListBox,16,OLESetData +DirListBox,17,OLECompleteDrag +DirListBox,18,Scroll +DirListBox,19,Validate +FileListBox,0,Click +FileListBox,1,DblClick +FileListBox,2,DragDrop +FileListBox,3,DragOver +FileListBox,4,GotFocus +FileListBox,5,KeyDown +FileListBox,6,KeyPress +FileListBox,7,KeyUp +FileListBox,8,LostFocus +FileListBox,9,MouseDown +FileListBox,10,MouseMove +FileListBox,11,MouseUp +FileListBox,12,PathChange +FileListBox,13,PatternChange +FileListBox,14,OLEDragOver +FileListBox,15,OLEDragDrop +FileListBox,16,OLEGiveFeedback +FileListBox,17,OLEStartDrag +FileListBox,18,OLESetData +FileListBox,19,OLECompleteDrag +FileListBox,20,Scroll +FileListBox,21,Validate +Menu,0,Click +MDIForm,0,DragDrop +MDIForm,1,DragOver +MDIForm,2,LinkClose +MDIForm,3,LinkError +MDIForm,4,LinkExecute +MDIForm,5,LinkOpen +MDIForm,6,Load +MDIForm,7,Resize +MDIForm,8,Unload +MDIForm,9,QueryUnload +MDIForm,10,Activate +MDIForm,11,Deactivate +MDIForm,12,Click +MDIForm,13,DblClick +MDIForm,19,MouseDown +MDIForm,20,MouseMove +MDIForm,21,MouseUp +MDIForm,23,Initialize +MDIForm,24,Terminate +MDIForm,25,OLEDragOver +MDIForm,26,OLEDragDrop +MDIForm,27,OLEGiveFeedback +MDIForm,28,OLEStartDrag +MDIForm,29,OLESetData +MDIForm,30,OLECompleteDrag +Image,0,Click +Image,1,DblClick +Image,2,DragDrop +Image,3,DragOver +Image,4,MouseDown +Image,5,MouseMove +Image,6,MouseUp +Image,7,OLEDragOver +Image,8,OLEDragDrop +Image,9,OLEGiveFeedback +Image,10,OLEStartDrag +Image,11,OLESetData +Image,12,OLECompleteDrag +Data,0,Error +Data,1,Reposition +Data,2,Validate +Data,3,DragDrop +Data,4,DragOver +Data,5,MouseDown +Data,6,MouseMove +Data,7,MouseUp +Data,8,Resize +Data,9,OLEDragOver +Data,10,OLEDragDrop +Data,11,OLEGiveFeedback +Data,12,OLEStartDrag +Data,13,OLESetData +Data,14,OLECompleteDrag +OLE,0,Click +OLE,1,DblClick +OLE,2,DragDrop +OLE,3,DragOver +OLE,4,GotFocus +OLE,5,KeyDown +OLE,6,KeyPress +OLE,7,KeyUp +OLE,8,LostFocus +OLE,9,MouseDown +OLE,10,MouseMove +OLE,11,MouseUp +OLE,12,Resize +OLE,13,Updated +OLE,14,ObjectMove +OLE,15,Validate +UserControl,0,DragDrop +UserControl,1,DragOver +UserControl,7,Resize +UserControl,12,Click +UserControl,13,DblClick +UserControl,14,GotFocus +UserControl,15,KeyDown +UserControl,16,KeyPress +UserControl,17,KeyUp +UserControl,18,LostFocus +UserControl,19,MouseDown +UserControl,20,MouseMove +UserControl,21,MouseUp +UserControl,22,Paint +UserControl,23,Initialize +UserControl,24,Terminate +UserControl,25,OLEDragOver +UserControl,26,OLEDragDrop +UserControl,27,OLEGiveFeedback +UserControl,28,OLEStartDrag +UserControl,29,OLESetData +UserControl,30,OLECompleteDrag +UserControl,31,WriteProperties +UserControl,32,ReadProperties +UserControl,33,InitProperties +UserControl,34,AsyncReadComplete +UserControl,35,EnterFocus +UserControl,36,ExitFocus +UserControl,37,Show +UserControl,38,Hide +UserControl,39,AmbientChanged +UserControl,40,AccessKeyPress +UserControl,41,AsyncReadProgress +UserControl,42,GetDataMember +UserControl,43,HitTest +PropertyPage,0,DragDrop +PropertyPage,1,DragOver +PropertyPage,12,Click +PropertyPage,13,DblClick +PropertyPage,14,GotFocus +PropertyPage,15,KeyDown +PropertyPage,16,KeyPress +PropertyPage,17,KeyUp +PropertyPage,18,LostFocus +PropertyPage,19,MouseDown +PropertyPage,20,MouseMove +PropertyPage,21,MouseUp +PropertyPage,22,Paint +PropertyPage,23,Initialize +PropertyPage,24,Terminate +PropertyPage,25,OLEDragOver +PropertyPage,26,OLEDragDrop +PropertyPage,27,OLEGiveFeedback +PropertyPage,28,OLEStartDrag +PropertyPage,29,OLESetData +PropertyPage,30,OLECompleteDrag +PropertyPage,31,ApplyChanges +PropertyPage,32,SelectionChanged +PropertyPage,33,EditProperty +UserDocument,0,DragDrop +UserDocument,1,DragOver +UserDocument,7,Resize +UserDocument,12,Click +UserDocument,13,DblClick +UserDocument,14,GotFocus +UserDocument,15,KeyDown +UserDocument,16,KeyPress +UserDocument,17,KeyUp +UserDocument,18,LostFocus +UserDocument,19,MouseDown +UserDocument,20,MouseMove +UserDocument,21,MouseUp +UserDocument,22,Paint +UserDocument,23,Initialize +UserDocument,24,Terminate +UserDocument,25,OLEDragOver +UserDocument,26,OLEDragDrop +UserDocument,27,OLEGiveFeedback +UserDocument,28,OLEStartDrag +UserDocument,29,OLESetData +UserDocument,30,OLECompleteDrag +UserDocument,31,WriteProperties +UserDocument,32,ReadProperties +UserDocument,33,InitProperties +UserDocument,34,AsyncReadComplete +UserDocument,35,EnterFocus +UserDocument,36,ExitFocus +UserDocument,37,Show +UserDocument,38,Hide +UserDocument,39,Scroll +UserDocument,41,AsyncReadProgress +Extender,0,GotFocus +Extender,1,LostFocus +Extender,2,DeprecatedEvent1 +Extender,3,DeprecatedEvent2 +Extender,4,DeprecatedEvent3 +Extender,5,DeprecatedEvent4 +Extender,6,DragDrop +Extender,7,DragOver +Extender,8,Validate +Class,0,Initialize +Class,1,Terminate diff --git a/examples/dump.rs b/examples/dump.rs index 4d1b9ef..9fd2e6d 100644 --- a/examples/dump.rs +++ b/examples/dump.rs @@ -10,17 +10,18 @@ use std::{env, fs, process}; use visualbasic::{ MethodEntry, VbControl, VbObject, VbProject, - pcode::operand::Operand, + pcode::{calltarget::CallResolver, operand::Operand}, + project::MethodLinkKind, vb::{ - comreg::ComRegData, - constants, eventname, + comreg::{ComRegData, ComRegObject}, + eventname, external::ExternalKind, formdata::{FormControlType, FormDataParser}, functype::FuncTypDesc, guitable::{GuiTableEntry, GuiTableIter}, projectinfo2::{ControlTypeIter, ProjectInfo2, read_name_strings}, - property::{PropertyValue, decode_form_type}, - publicbytes::{ClassFormPublicBytes, PublicVarTable}, + property::{Property, PropertyValue}, + publicbytes::ClassFormPublicBytes, varstub::VarStubIter, }, }; @@ -60,20 +61,25 @@ fn print_asm(project: &VbProject<'_>, path: &str) -> DynResult<()> { let pi2_va = project.object_table().project_info2_va()?; - // Collect GUI table entries for form data parsing (parallel index with objects) + // Collect GUI table entries for form data parsing (keyed by object index) let map = project.address_map(); let hdr = project.vb_header(); let gui_va = hdr.gui_table_va()?; let form_count = hdr.form_count()?; let gui_entries: Vec> = GuiTableIter::new(map, gui_va, form_count).collect(); + let resolver = CallResolver::new(project)?; for (i, obj) in project.objects()?.enumerate() { let obj = obj.map_err(|e| -> Box { format!("failed to parse object {i}: {e}").into() })?; println!(); - let gui_entry = gui_entries.get(i); - print_object(&obj, pi2_va, gui_entry)?; + // The GUI table lists only the designer objects, each naming its + // object's index at +0x24: match by it, not by position. + let gui_entry = gui_entries + .iter() + .find(|entry| entry.object_index().ok() == u32::try_from(i).ok()); + print_object(&obj, u16::try_from(i)?, &resolver, pi2_va, gui_entry)?; } Ok(()) } @@ -97,20 +103,21 @@ fn print_assembly_header(project: &VbProject<'_>, path: &str) -> DynResult<()> { let object_count = project.object_count()?; let project_data_va = hdr.project_data_va()?; let sub_main_va = hdr.sub_main_va()?; + let vbp_path = pd.path().unwrap_or_default(); println!("// VB6 Assembly: {path}"); println!( "// Runtime {runtime_build}.{runtime_revision:02} | {mode} | LCID 0x{lcid:04X} | {object_count} objects" ); println!("// Language DLL: {}", lossy_cstr(hdr.lang_dll()?)); - println!("// Path: {}", lossy_cstr(pd.path_info()?)); + println!("// Path: {vbp_path}"); if sub_main_va != 0 { println!("// Entry: Sub Main (VA 0x{sub_main_va:08X})"); } println!("//"); println!( "// VBHeader VA: 0x{:08X} ProjectData VA: 0x{:08X}", - project_data_va.wrapping_sub(0x30), + project.vb_header_va(), project_data_va ); println!( @@ -189,17 +196,14 @@ fn print_com_registration(project: &VbProject<'_>) -> DynResult<()> { let desc = obj.description(map); let prog_id = format!("{proj_name}.{name}"); let object_flags = obj.object_flags()?; + let flag_names = format_obj_flags(&obj)?; println!("// .comclass {prog_id} {{"); println!("// CLSID = {clsid}"); if let Some(d) = desc { println!("// Description = \"{d}\""); } - println!( - "// Flags = 0x{:04X}{}", - object_flags, - format_obj_flags(object_flags) - ); + println!("// Flags = 0x{object_flags:04X}{flag_names}"); let misc = obj.misc_status()?; if misc != 0 { println!("// MiscStatus = {misc}"); @@ -243,7 +247,14 @@ fn print_gui_table(project: &VbProject<'_>) -> DynResult<()> { .guid() .map(|g| format!("{g}")) .unwrap_or_else(|| "?".into()); - let otype = entry.object_type(); + // The designer of the object the entry names (its index at +0x24), + // else what the entry's type says. + let otype = entry + .object_index() + .ok() + .and_then(|index| project.objects().ok()?.nth(usize::try_from(index).ok()?)) + .and_then(|obj| obj.ok()?.object_kind().ok()) + .map_or_else(|| entry.object_type().to_string(), str::to_string); let data_va = entry.form_data_va()?; let data_size = entry.form_data_size()?; let type_flags = entry.object_type_raw()?; @@ -297,9 +308,14 @@ fn print_components(project: &VbProject<'_>) -> DynResult<()> { let progid = comp.prog_id(); let class = comp.class_name(); print!(".component {filename}!{class} // {progid}"); - let events = comp.event_names(); - if !events.is_empty() { - print!(" events=[{}]", events.join(", ")); + let dispids = comp.event_dispids(); + if !dispids.is_empty() { + let list: Vec = dispids.iter().map(i32::to_string).collect(); + print!(" event_dispids=[{}]", list.join(", ")); + } + let bindable: Vec<&str> = comp.bindable_properties().iter().map(|p| p.name).collect(); + if !bindable.is_empty() { + print!(" bindable=[{}]", bindable.join(", ")); } println!(); } @@ -324,8 +340,8 @@ fn print_control_types(project: &VbProject<'_>) -> DynResult<()> { return Ok(()); } - // Collect COM property names from trailing strings - let prop_names = read_name_strings(map, pi2_va, entries.len() as u32); + // The parameter names between and after the records + let param_names = read_name_strings(map, pi2_va); println!(); println!(".controltypes {{"); @@ -338,33 +354,33 @@ fn print_control_types(project: &VbProject<'_>) -> DynResult<()> { println!(" {guid_str} \"{name_str}\""); } } - if !prop_names.is_empty() { - println!(" // COM properties: {}", prop_names.join(", ")); + if !param_names.is_empty() { + println!(" // Parameter names: {}", param_names.join(", ")); } println!("}}"); Ok(()) } -/// Formats object type flags as a human-readable parenthesized list. -fn format_obj_flags(flags: u16) -> String { +/// Formats a COM registration record's flags as a parenthesized list. +fn format_obj_flags(obj: &ComRegObject<'_>) -> DynResult { let mut parts = Vec::new(); - if flags & 0x0020 != 0 { + if obj.is_control()? { parts.push("Control"); } - if flags & 0x0080 != 0 { + if obj.is_doc_object()? { parts.push("DocObject"); } - if flags & 0x00B2 != 0 { + if obj.is_automatable()? { parts.push("Automatable"); } - if flags & 0x0001 != 0 { + if obj.object_flags()? & 0x0001 != 0 { parts.push("SkipReg"); } - if parts.is_empty() { + Ok(if parts.is_empty() { String::new() } else { format!(" ({})", parts.join(", ")) - } + }) } /// Formats a ProjectInfo2 control type entry as `{GUID} (ClassName)`. @@ -408,11 +424,10 @@ fn resolve_external( let func = decl.function_name(map).unwrap_or("?"); // Surface by-ordinal imports - the API name is absent and the // runtime resolves via GetProcAddress(ordinal), a name-hiding tell. - match decl.api_stub(map) { - Some(stub) if stub.is_by_ordinal() => { - format!("{lib}!#{}", stub.ordinal().unwrap_or(0)) - } - _ => format!("{lib}!{func}"), + if decl.is_by_ordinal() { + format!("{lib}!#{}", decl.ordinal().unwrap_or(0)) + } else { + format!("{lib}!{func}") } } else { format!("va=0x{obj_va:08X}") @@ -437,6 +452,8 @@ fn resolve_external( /// disassembled P-Code methods. fn print_object( obj: &VbObject<'_, '_>, + object_index: u16, + resolver: &CallResolver<'_, '_>, _pi2_va: u32, gui_entry: Option<&GuiTableEntry<'_>>, ) -> DynResult<()> { @@ -463,12 +480,13 @@ fn print_object( obj.project() .address_map() .slice_from_va(entry_va, 4) - .map(|d| <[u8; 4]>::try_from(d).map(u32::from_le_bytes).unwrap_or(0)) - .unwrap_or(0) + .ok() + .and_then(|d| d.first_chunk::<4>().copied()) + .map_or(0, u32::from_le_bytes) } MethodEntry::Native { va } => *va, MethodEntry::Runtime { va } => *va, - MethodEntry::Null => 0, + MethodEntry::Null | MethodEntry::Declare => 0, }; if va != 0 { va_to_method.insert(va, (mi as u16, mname.clone())); @@ -480,16 +498,23 @@ fn print_object( println!(" // Object Type: 0x{:08X}", desc.object_type_raw()?); println!(" // ObjectInfo VA: 0x{:08X}", desc.object_info_va()?); println!(" // Object Name VA: 0x{:08X}", desc.object_name_va()?); - println!( - " // Methods VA: 0x{:08X} ({} methods)", - info.methods_va()?, - desc.method_count()? - ); + if obj.has_method_table()? { + println!( + " // Methods VA: 0x{:08X} ({} methods)", + info.methods_va()?, + obj.method_count()? + ); + } else { + println!( + " // Methods VA: none ({} methods counted)", + desc.method_count()? + ); + } println!(" // Constants VA: 0x{:08X}", info.constants_va()?); if let Some(opt) = obj.optional_info() { println!( - " // P-Code Count: {} Control Count: {} Method Links: {}", - opt.pcode_count()?, + " // Inherited slots: {} Control Count: {} Method Links: {}", + opt.inherited_vtable_slots()?, opt.control_count()?, opt.method_link_count()? ); @@ -508,17 +533,14 @@ fn print_object( } let init_off = opt.initialize_event_offset()?; let term_off = opt.terminate_event_offset()?; - let init_slot = init_off / 4; - let term_slot = term_off / 4; - println!( - " // Init/Term slots: {init_slot}/{term_slot} (offsets 0x{init_off:04X}/0x{term_off:04X})" - ); + println!(" // Init/Term offsets: 0x{init_off:04X}/0x{term_off:04X}"); } if let Some(priv_obj) = obj.private_object() { println!( - " // Public funcs: {} Public vars: {} Flags: 0x{:04X}", - priv_obj.func_count()?, - priv_obj.var_count()?, + " // Prototypes: {} Members: {} Events: {} Flags: 0x{:04X}", + obj.public_func_count()?, + priv_obj.member_count()?, + priv_obj.event_count()?, priv_obj.flags()? ); let ftd_va = priv_obj.func_type_descs_va()?; @@ -534,20 +556,18 @@ fn print_object( // Build FuncTypDesc lookup table (needed for signatures and variable types) let func_descs = build_func_type_descs(obj); - // PublicBytes has different formats per object type - let pb_va = desc.public_bytes_va()?; - if desc.is_module() { - // Modules: PublicVarTable with variable descriptors - print_public_vars(obj.project(), pb_va); - } else { - // Classes/Forms: instance size + control property init entries - print_class_form_public_bytes(obj.project(), pb_va); + // The variable descriptor tables (one format for every object type) + if let Some(table) = obj.public_bytes() { + print_variable_table("vars", &table); + } + if let Some(table) = obj.static_bytes() { + print_variable_table("statics", &table); } // Print variable implementation stubs (compiler metadata) if let Some(priv_obj) = obj.private_object() { let stubs_va = priv_obj.var_stubs_va()?; - let var_count = priv_obj.var_count()?; + let var_count = priv_obj.var_stub_count()?; if stubs_va != 0 && var_count > 0 { println!(); for (i, stub) in @@ -596,14 +616,8 @@ fn print_object( // Decode form-level properties let form_props = fd.form_properties(); if !form_props.is_empty() { - let ge_otype = ge.object_type(); - let form_ctype = decode_form_type(ge_otype, form_props, obj.project()); - let decoded: Vec = fd - .form_properties_decoded(form_ctype) - .map(|p| match &p.value { - PropertyValue::Flag => p.name.to_string(), - v => format!("{}={v}", p.name), - }) + let decoded: Vec = std::iter::once(format!("Name=\"{}\"", fd.form_name())) + .chain(fd.form_properties_decoded().map(|p| property_text(&p))) .collect(); if !decoded.is_empty() { println!(" // {}", decoded.join(", ")); @@ -626,13 +640,7 @@ fn print_object( fc.control_type() ); if !props.is_empty() { - let decoded: Vec = fc - .properties() - .map(|p| match &p.value { - PropertyValue::Flag => p.name.to_string(), - v => format!("{}={v}", p.name), - }) - .collect(); + let decoded: Vec = fc.properties().map(|p| property_text(&p)).collect(); let decoded = decoded.join(", "); if !decoded.is_empty() { if props.len() > 64 { @@ -665,6 +673,14 @@ fn print_object( } }; + // The library's event names per (control index, sink slot). + let bound_names: HashMap<(u16, u16), &'static str> = obj + .events_all_slots(None) + .unwrap_or_default() + .into_iter() + .filter_map(|b| Some(((b.control_index, b.event_slot), b.event_name?))) + .collect(); + if !controls.is_empty() { println!(); for ctrl in &controls { @@ -708,16 +724,24 @@ fn print_object( _ => FormControlType::Unknown(0xFF), } }); - let ev_name = eventname::event_name(slot, ev_ctype).unwrap_or("?"); + let ev_name = ctrl + .class_name() + .and_then(|class| eventname::event_name_for_class(class, slot)) + .or_else(|| eventname::event_name(slot, ev_ctype)) + .or_else(|| bound_names.get(&(ctrl_index, slot)).copied()) + .unwrap_or("?"); if let Some(thunk) = sink.resolve_handler_thunk(slot, map) { + // The method table holds ProcDscInfo VAs: the thunk's + // `mov edx` names the handler. let method_ref = va_to_method - .get(&thunk.method_entry_va) + .get(&thunk.proc_dsc_info_va) + .or_else(|| va_to_method.get(&thunk.method_entry_va)) .map(|(mi, mname)| format!("/*{mi:02X}*/ {mname}")) .unwrap_or_else(|| format!("0x{:08X}", thunk.method_entry_va)); println!( - " sink[{:02}] {ev_name} event_id={} -> {}", - slot, thunk.event_dispatch_id, method_ref + " sink[{:02}] {ev_name} this_adjust=0x{:X} -> {}", + slot, thunk.this_adjust, method_ref ); } else if let Some(native) = sink.resolve_native_thunk(slot, map) { println!(" sink[{slot:02}] {ev_name} native {native}"); @@ -729,11 +753,18 @@ fn print_object( } } - // Build remaining lookup tables for method info + // Build remaining lookup tables for method info. The link table is in + // vtable order, not method order: a P-Code stub names its method by its + // ProcDscInfo; null entries and variable accessors name none. let links: HashMap = match obj.method_links() { Ok(it) => it - .enumerate() - .filter_map(|(i, r)| Some((i, r.ok()?))) + .filter_map(|r| { + let link = r.ok()?; + let MethodLinkKind::Procedure { proc_dsc_va } = link.kind else { + return None; + }; + Some((usize::from(va_to_method.get(&proc_dsc_va)?.0), link)) + }) .collect(), Err(_) => HashMap::new(), }; @@ -744,15 +775,7 @@ fn print_object( // Determine total method count from all sources let descriptor_method_count = obj.descriptor().method_count().unwrap_or(0); - let total = descriptor_method_count - .max(method_entries.len() as u32) - .max( - links - .keys() - .copied() - .max() - .map_or(0, |m| (m as u32).saturating_add(1)), - ); + let total = descriptor_method_count.max(method_entries.len() as u32); // Print unified .method blocks for mi in 0..total as usize { @@ -819,13 +842,8 @@ fn print_object( // Show method link thunk if available if let Some(lnk) = link { - let adjust = match lnk.this_adjust { - Some(0xFFFF) => " this_adjust=default".to_string(), - Some(a) => format!(" this_adjust=0x{a:02X}"), - None => String::new(), - }; println!( - " // thunk 0x{:08X} -> code 0x{:08X}{adjust}", + " // thunk 0x{:08X} -> code 0x{:08X}", lnk.thunk_va, lnk.code_va ); } @@ -855,20 +873,52 @@ fn print_object( entry.property_type() ); } + // Where Pr, the object register, was last loaded from: a VCall* + // on Me reaches the object's own vtable. + let mut pr = None; for insn in method.instructions()? { match insn { Ok(i) => { - // Annotate integer literals with VB6 constant names - let annotation = i.operands.iter().find_map(|op| match op { - Some(Operand::Int32(v)) => constants::constant_name(*v as i64), - Some(Operand::Int16(v)) => constants::constant_name(*v as i64), - _ => None, - }); + // Annotate what the operands name: a call's callee and + // effect, a string literal. + let pool = obj.constants_pool().ok(); + let annotation = if i.info.is_call() { + let call = resolver.resolve_with_pr(object_index, &i, pr.as_ref()); + let effect = i.stack_effect(call.as_ref()); + let callee = call.as_ref().map(|c| c.callee.to_string()); + let pops = effect + .pop_slots() + .map_or("?".to_string(), |n| n.to_string()); + let x87 = effect + .fpu_pushes() + .map_or("?".to_string(), |n| n.to_string()); + Some(format!( + "{} (pops {pops}, pushes {}, x87 +{x87})", + callee.unwrap_or_default(), + effect.pushes() + )) + } else { + i.operands.iter().find_map(|op| match op { + Some(Operand::ConstPoolIndex(index)) + if i.info.mnemonic.starts_with("Lit") => + { + pool.as_ref()? + .string_at(*index) + .ok() + .flatten() + .map(|s| format!("{:?}", s.to_string_lossy())) + } + _ => None, + }) + }; if let Some(name) = annotation { println!(" {i} // {name}"); } else { println!(" {i}"); } + if i.info.writes_pr() { + pr = i.pr_source(); + } } Err(e) => { println!(" // decode error: {e}"); @@ -892,89 +942,25 @@ fn str_or(result: Result, visualbasic::Error>, fallbac .unwrap_or_else(|_| fallback.into()) } -/// Prints public variable declarations from a module's PublicVarTable. -fn print_public_vars(project: &VbProject<'_>, pb_va: u32) { - if pb_va == 0 { - return; - } - let map = project.address_map(); - let Ok(header) = map.slice_from_va(pb_va, PublicVarTable::HEADER_SIZE) else { - return; - }; - let Ok(pvt_header) = PublicVarTable::parse(header) else { - return; - }; - let total_size = match pvt_header.total_size() { - Ok(t) => t as usize, - Err(_) => return, - }; - let Ok(full_data) = map.slice_from_va(pb_va, total_size) else { - return; - }; - let Ok(pvt) = PublicVarTable::parse(full_data) else { - return; - }; - if pvt.var_count() == 0 { - return; - } - println!(); - for entry in pvt.valid_vars() { - println!( - " Public var_{:04X} As {} // offset=0x{:04X} type=0x{:04X}", - entry.frame_offset, - entry.type_name(), - entry.frame_offset, - entry.type_code - ); - } -} - -/// Prints class/form instance metadata (instance size, IIDs, control properties). -fn print_class_form_public_bytes(project: &VbProject<'_>, pb_va: u32) { - if pb_va == 0 { - return; - } - let map = project.address_map(); - // Read enough for header + potential GUID data - let Ok(data) = map.slice_from_va(pb_va, 0x80) else { - return; - }; - let Ok(cfpb) = ClassFormPublicBytes::parse(data) else { - return; - }; - - let instance_size = cfpb.instance_size().unwrap_or(0); - println!(" // instance_size=0x{instance_size:04X} ({instance_size} bytes)"); - - if let Some(iid) = cfpb.default_iid() { - println!(" // default_iid={iid}"); - } - if let Some(iid) = cfpb.events_iid() { - println!(" // events_iid={iid}"); - } - - if cfpb.has_controls() { +/// Prints a variable descriptor table: data block size and entries. +fn print_variable_table(label: &str, table: &ClassFormPublicBytes<'_>) { + let size = table.instance_size().unwrap_or(0); + println!(" // {label}: data size 0x{size:04X} ({size} bytes)"); + for entry in table.control_entries() { + let cleanup = entry.cleanup_action(); + let cleanup_note = if cleanup == visualbasic::vb::controlprop::CleanupAction::None { + String::new() + } else { + format!(" cleanup={cleanup}") + }; println!( - " // control_props: {} entries ({} properties)", - cfpb.control_count().unwrap_or(0), - cfpb.property_count().unwrap_or(0) + " // +0x{:04X}: {} (type=0x{:02X} flags=0x{:02X}{})", + entry.frame_offset().unwrap_or(0), + entry.property_type(), + entry.raw_type(), + entry.flags(), + cleanup_note ); - for entry in cfpb.control_entries() { - let cleanup = entry.cleanup_action(); - let cleanup_note = if cleanup == visualbasic::vb::controlprop::CleanupAction::None { - String::new() - } else { - format!(" cleanup={cleanup}") - }; - println!( - " // +0x{:04X}: {} (type=0x{:02X} flags=0x{:02X}{})", - entry.frame_offset().unwrap_or(0), - entry.property_type(), - entry.raw_type(), - entry.flags(), - cleanup_note - ); - } } } @@ -986,44 +972,20 @@ fn lossy_cstr(bytes: &[u8]) -> String { /// Build a map of method_index -> FuncTypDesc from the PrivateObjectDescriptor. fn build_func_type_descs<'a>(obj: &VbObject<'a, 'a>) -> HashMap> { - let mut map = HashMap::new(); - let Some(priv_obj) = obj.private_object() else { - return map; - }; - let ftd_array_va = match priv_obj.func_type_descs_va() { - Ok(v) => v, - Err(_) => return map, - }; - if ftd_array_va == 0 { - return map; - } - - // The FuncTypDesc pointer array has one entry per function+variable - let func_count = priv_obj.func_count().unwrap_or(0) as u32; - let var_count = priv_obj.var_count().unwrap_or(0) as u32; - let total = func_count.saturating_add(var_count); - let am = obj.project().address_map(); - - for i in 0..total { - // Read the VA of this FuncTypDesc entry - let ptr_va = ftd_array_va.wrapping_add(i.wrapping_mul(4)); - let Ok(ptr_data) = am.slice_from_va(ptr_va, 4) else { - continue; - }; - let desc_va = <[u8; 4]>::try_from(ptr_data) - .map(u32::from_le_bytes) - .unwrap_or(0); - if desc_va == 0 { - continue; - } + obj.func_type_descs() + .map(|iter| iter.map(|(i, ftd)| (i as usize, ftd)).collect()) + .unwrap_or_default() +} - // Read and parse the FuncTypDesc with extended data (arg types at +0x20) - let Ok(desc_data) = am.slice_from_va(desc_va, 0x40) else { - continue; - }; - if let Ok(ftd) = FuncTypDesc::parse_extended(desc_data) { - map.insert(i as usize, ftd); - } +/// One decoded form property as `Name=value`, an index the table does not +/// describe as `?0xNN`. +fn property_text(property: &Property) -> String { + let name = match property.name { + "?" => format!("?0x{:02X}", property.index), + name => name.to_string(), + }; + match &property.value { + PropertyValue::Flag => name, + value => format!("{name}={value}"), } - map } diff --git a/src/addressmap.rs b/src/addressmap.rs index 57bb675..214cb16 100644 --- a/src/addressmap.rs +++ b/src/addressmap.rs @@ -27,7 +27,8 @@ pub(crate) struct SectionEntry { } impl SectionEntry { - /// Inclusive RVA range upper bound, saturating on overflow. + /// Exclusive RVA upper bound (`VirtualAddress + VirtualSize`), saturating + /// on overflow. /// /// Malformed PE section headers can declare absurdly large sizes; rather /// than panic, we cap the section at `u32::MAX`. RVAs landing past the @@ -37,7 +38,7 @@ impl SectionEntry { self.virtual_address.saturating_add(self.virtual_size) } - /// Inclusive raw-offset upper bound, saturating on overflow. + /// Exclusive raw-offset upper bound, saturating on overflow. #[inline] fn raw_end(self) -> u32 { self.raw_data_offset.saturating_add(self.raw_data_size) @@ -76,7 +77,8 @@ impl<'a> AddressMap<'a> { /// /// # Errors /// - /// Returns [`Error::Not32Bit`] if the PE is not a 32-bit (PE32) executable. + /// - [`Error::TooShort`] if the PE has no optional header. + /// - [`Error::Not32Bit`] if the PE is not a 32-bit (PE32) executable. pub fn from_goblin(file: &'a [u8], pe: &goblin::pe::PE<'_>) -> Result { // Verify this is PE32 (not PE32+) let oh = pe.header.optional_header.as_ref().ok_or(Error::TooShort { @@ -144,6 +146,10 @@ impl<'a> AddressMap<'a> { /// Converts a 32-bit relative virtual address (RVA) to a file offset. /// + /// An RVA maps when it lies in `[VirtualAddress, VirtualAddress + + /// VirtualSize)` of a section and within that section's raw data. The PE + /// headers (RVAs below the first section) are not mapped. + /// /// # Arguments /// /// * `rva` - The relative virtual address to translate. @@ -151,8 +157,11 @@ impl<'a> AddressMap<'a> { /// # Errors /// /// - [`Error::RvaNotMapped`] if the RVA does not fall within any section. - /// - [`Error::RvaInBssRegion`] if the RVA falls in a BSS region - /// (virtual size exceeds raw data size) with no file backing. + /// - [`Error::RvaInBssRegion`] if the RVA falls in a section past its raw + /// data (virtual size exceeds raw data size), which has no file backing. + /// A P-Code executable's `.data` section has no raw data at all + /// (`SizeOfRawData` 0), so every VA in it, such as a module variable, + /// gives this error. pub fn rva_to_offset(&self, rva: u32) -> Result { for s in &self.sections { if rva >= s.virtual_address && rva < s.rva_end() { @@ -211,10 +220,12 @@ impl<'a> AddressMap<'a> { None } - /// Returns `true` if the given VA falls within the PE image's mapped sections. + /// Returns `true` if the given VA has bytes in the file, that is, if + /// [`va_to_offset`](AddressMap::va_to_offset) succeeds. /// - /// This is useful for classifying pointers: a VA that returns `false` likely - /// points into an external DLL (e.g., MSVBVM60.DLL) rather than the PE file. + /// `false` covers a VA outside the image (in MSVBVM60.DLL, for example), but + /// also the PE headers and a section's uninitialized tail: the whole + /// `.data` section of a P-Code executable, which has no raw data. #[inline] pub fn is_va_in_image(&self, va: u32) -> bool { self.va_to_offset(va).is_ok() @@ -226,7 +237,9 @@ impl<'a> AddressMap<'a> { /// from a pointer field, get a slice into the file buffer. /// /// The returned slice extends from the resolved offset to the **end of - /// the file buffer**, not just `min_len` bytes. This allows callers to + /// the file buffer**, not just `min_len` bytes, and is not bounded by the + /// section: past the section's raw data it holds whatever follows in the + /// file, not what the loader maps at those VAs. This allows callers to /// read variable-length data (e.g., null-terminated strings) or parse /// headers then access trailing fields without a second lookup. Callers /// that need an exact-length slice should re-slice the result. diff --git a/src/entrypoint.rs b/src/entrypoint.rs index 7cecef4..8cdb114 100644 --- a/src/entrypoint.rs +++ b/src/entrypoint.rs @@ -1,27 +1,38 @@ //! VB6 entry point detection. //! -//! VB6 executables (EXE) have this entry point pattern: +//! The PE entry point of a VB6 executable (EXE) is a two-instruction stub: //! //! ```x86asm //! push offset VBHeader ; 0x68 -//! call ThunRTMain ; 0xE8 (or indirect call) +//! call ThunRTMain ; 0xE8 , to the import thunk +//! ; jmp dword ptr [__imp_ThunRTMain] (0xFF 0x25) //! ``` //! -//! VB6 ActiveX DLLs/OCXs use a different pattern - the DllMain entry -//! does NOT contain the VBHeader VA. Instead, the DLL exports -//! (`DllGetClassObject`, `DllRegisterServer`, etc.) each push it: +//! `ThunRTMain` is MSVBVM60.DLL ordinal 100, imported by ordinal. P-Code and +//! native-code builds have the same stub. +//! +//! The entry point of a VB6 ActiveX DLL or OCX does not contain the VBHeader +//! VA. Its COM exports do: each is a stub that slips the VBHeader VA and two +//! more values under the caller's arguments and jumps to the matching runtime +//! function (`VBDllGetClassObject`, `VBDllRegisterServer`, +//! `VBDllUnRegisterServer`): //! //! ```x86asm -//! pop eax +//! pop eax ; 0x58: the return address //! push offset VBHeader ; 0x68 -//! push -//! push -//! push eax -//! jmp ThunRTMain +//! push ; 0x68 +//! push ; 0x68 +//! push eax ; 0x50 +//! jmp VBDllGetClassObject ; 0xE9 //! ``` //! -//! This module tries the EXE pattern first, then falls back to scanning -//! for the `"VB5!"` magic with ProjectData validation. +//! The `DllCanUnloadNow` stub pushes one value (`58 68 50 E9 `). +//! +//! [`extract_vb_header_va`] reads the EXE stub and +//! [`extract_vb_header_va_from_exports`] the DLL stubs, each accepting only +//! a pushed VA that holds the `"VB5!"` magic; +//! [`VbProject::from_goblin`](crate::project::VbProject::from_goblin) tries +//! the first, then the second. Nothing scans the file for the magic. use crate::{addressmap::AddressMap, error::Error}; @@ -34,12 +45,14 @@ const PUSH_IMM32: u8 = 0x68; /// VBHeader magic signature. const VB5_MAGIC: &[u8; 4] = b"VB5!"; -/// Extracts the VBHeader virtual address from a VB6 PE. +/// Extracts the VBHeader virtual address from the PE entry point. /// -/// Tries two methods: -/// 1. **EXE pattern**: `push imm32` at the PE entry point. -/// 2. **DLL exports**: checks exported functions for the -/// `pop eax; push imm32` pattern that VB6 DLL exports use. +/// Returns the immediate of the `push imm32` (`0x68`) that begins the entry +/// point when the `"VB5!"` magic is there (every fixture executable). A pushed VA +/// that the file is too short to hold four bytes at is returned as well, so +/// that the caller reports a truncated VB6 file. A DLL, whose entry point +/// does not push the VBHeader VA, is read with +/// [`extract_vb_header_va_from_exports`] instead. /// /// # Arguments /// @@ -52,31 +65,54 @@ const VB5_MAGIC: &[u8; 4] = b"VB5!"; /// /// # Errors /// -/// - [`Error::EntryPointNotPush`] if both methods fail. +/// - [`Error::EntryPointNotPush`] if the entry point does not begin with +/// `0x68` and four more bytes; `byte` is the first byte there, or 0 when +/// the entry point RVA is not file-backed. +/// - [`Error::BadMagic`] if the pushed VA holds four bytes other than +/// `"VB5!"` (a packer's `push imm32; ret` entry, say). +/// - The address error if the pushed VA is in no section, below the image +/// base, or in a section's zero-filled part. pub fn extract_vb_header_va(map: &AddressMap<'_>, entry_point_rva: u32) -> Result { - // Method 1: EXE entry point - push imm32 (0x68 xx xx xx xx) - if let Ok(code) = map.slice_from_rva(entry_point_rva, MIN_ENTRY_BYTES) - && let Some(&[PUSH_IMM32, b0, b1, b2, b3]) = code.first_chunk::<5>() - { - return Ok(u32::from_le_bytes([b0, b1, b2, b3])); - } - - let byte = map - .slice_from_rva(entry_point_rva, 1) + let Some(&[PUSH_IMM32, b0, b1, b2, b3]) = map + .slice_from_rva(entry_point_rva, MIN_ENTRY_BYTES) .ok() - .and_then(|c| c.first().copied()) - .unwrap_or(0); - Err(Error::EntryPointNotPush { byte }) + .and_then(|code| code.first_chunk::<5>()) + else { + let byte = map + .slice_from_rva(entry_point_rva, 1) + .ok() + .and_then(|c| c.first().copied()) + .unwrap_or(0); + return Err(Error::EntryPointNotPush { byte }); + }; + let va = u32::from_le_bytes([b0, b1, b2, b3]); + match map.slice_from_va(va, VB5_MAGIC.len()) { + Ok(data) => match data.first_chunk::<4>() { + Some(magic) if magic == VB5_MAGIC => Ok(va), + Some(magic) => Err(Error::BadMagic { + expected: "VB5!", + got: *magic, + }), + None => Err(Error::TooShort { + expected: VB5_MAGIC.len(), + actual: data.len(), + context: "VBHeader magic", + }), + }, + // The file ends before the header: a truncated VB6 file. + Err(Error::TooShort { .. }) => Ok(va), + Err(e) => Err(e), + } } /// Extracts the VBHeader VA from a VB6 DLL by checking its exports. /// -/// VB6 ActiveX DLLs/OCXs export functions like `DllGetClassObject` and -/// `DllRegisterServer` that each contain `pop eax; push VBHeader_VA` -/// (0x58 0x68 xx xx xx xx). The VBHeader VA is validated by checking -/// for the `"VB5!"` magic at the target address. +/// The COM exports of a VB6 ActiveX DLL or OCX (`DllGetClassObject`, +/// `DllRegisterServer`, ...) begin with `pop eax; push VBHeader_VA` +/// (`0x58 0x68 `). Exports are tried in the order given; the first +/// whose immediate points to the `"VB5!"` magic wins. /// -/// Returns `None` if no suitable export is found. +/// Returns `None` if no export matches. pub fn extract_vb_header_va_from_exports( map: &AddressMap<'_>, exports: &[goblin::pe::export::Export<'_>], @@ -132,12 +168,36 @@ mod tests { file[0x204] = 0x00; // Followed by call (0xE8) - not checked, just for realism file[0x205] = 0xE8; + // The VBHeader magic at VA 0x00401234 (file offset 0x434). + file[0x434..0x438].copy_from_slice(VB5_MAGIC); let map = make_test_map(&file); let va = extract_vb_header_va(&map, 0x1000).unwrap(); assert_eq!(va, 0x00401234); } + #[test] + fn test_extract_vb_header_va_requires_the_magic() { + let mut file = vec![0u8; 0x2000]; + // push 0x00401000; ret: the push points back at the entry point. + file[0x200..0x206].copy_from_slice(&[PUSH_IMM32, 0x00, 0x10, 0x40, 0x00, 0xC3]); + let map = make_test_map(&file); + assert_eq!( + extract_vb_header_va(&map, 0x1000), + Err(Error::BadMagic { + expected: "VB5!", + got: [PUSH_IMM32, 0x00, 0x10, 0x40], + }) + ); + // A VA in no section. + file[0x201..0x205].copy_from_slice(&0x12345678u32.to_le_bytes()); + let map = make_test_map(&file); + assert!(matches!( + extract_vb_header_va(&map, 0x1000), + Err(Error::RvaNotMapped { .. }) + )); + } + #[test] fn test_extract_vb_header_va_not_push() { let mut file = vec![0u8; 0x2000]; diff --git a/src/error.rs b/src/error.rs index c9c961a..c051e55 100644 --- a/src/error.rs +++ b/src/error.rs @@ -66,8 +66,9 @@ pub enum Error { // -- Entry point errors -- /// The PE entry point does not start with `push imm32` (`0x68`). /// - /// Every VB6 executable begins with `push offset VBHeader; call ThunRTMain`. - /// If the first byte is not `0x68`, this is not a VB6 binary. + /// Every VB6 executable (EXE) begins with + /// `push offset VBHeader; call ThunRTMain`. A VB6 DLL or OCX does not, so + /// this alone does not rule VB6 out: the export stubs are tried next. EntryPointNotPush { /// The actual first byte at the entry point. byte: u8, @@ -76,10 +77,10 @@ pub enum Error { /// The container is a valid PE but doesn't look like a VB6 binary. /// /// Neither the entry point (EXE pattern: `push imm32; call ThunRTMain`) - /// nor the export table (DLL pattern: `pop eax; push imm32; push eax; - /// ...`) contained a recognizable VB6 header pointer, **and** no - /// secondary scan turned up the `"VB5!"` magic. Almost certainly not - /// a VB6 file at all (e.g., a Delphi/MFC/CRT-only PE). + /// nor the export table (DLL pattern: `pop eax; push imm32; ...`) + /// pushes the VA of a `"VB5!"` magic. Almost certainly not a VB6 file + /// at all (e.g., a Delphi/MFC/CRT-only PE, or a packer stub that + /// starts `push imm32; ret`). /// /// Consumers tagging files as "VB6 or not" should treat this as the /// quiet-path negative - log nothing or only at debug level. @@ -177,6 +178,13 @@ pub enum Error { /// The byte count read from the instruction stream. size: u16, }, + + /// A string is not a GUID in registry form + /// (`{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}`). + InvalidGuid { + /// The text that failed to parse. + text: String, + }, } impl fmt::Display for Error { @@ -243,6 +251,7 @@ impl fmt::Display for Error { Error::InvalidVariableLengthSize { opcode_name, size } => { write!(f, "{opcode_name}: invalid variable-length size {size}") } + Error::InvalidGuid { text } => write!(f, "not a GUID in registry form: {text:?}"), } } } diff --git a/src/imports.rs b/src/imports.rs new file mode 100644 index 0000000..1d50ac1 --- /dev/null +++ b/src/imports.rs @@ -0,0 +1,224 @@ +//! The PE import table, by import address table slot. +//! +//! A P-Code procedure calls a function the executable imports - a runtime +//! function such as `rtcIsMissing` or `VarPtr` - through an `ImpAdCall*` +//! whose constant pool entry is an import thunk `jmp [slot]` (`FF 25 +//! `, [`PoolEntry::Import`](crate::vb::constantpool::PoolEntry::Import)). +//! [`ImportTable`] maps such a slot's VA to the library and function. +//! +//! VB6 executables import the runtime's `rtc*` functions by ordinal; +//! [`Import::function`] names `MSVBVM60.DLL` ordinals from the runtime's +//! export table ([`lookup_export_by_ordinal`]). + +use std::{borrow::Cow, collections::BTreeMap}; + +use crate::{ + addressmap::AddressMap, + util::{read_cstr, read_u32_le}, + vb::exports::{ExportSignature, lookup_export, lookup_export_by_ordinal}, +}; + +/// How an import names its function. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum ImportSymbol { + /// By name. + Name(String), + /// By ordinal. + Ordinal(u16), +} + +/// One imported function: an import address table slot. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct Import { + /// The library, as the import descriptor names it (e.g. `MSVBVM60.DLL`). + pub library: String, + /// The function. + pub symbol: ImportSymbol, +} + +impl Import { + /// Returns `true` if the import is from the VB runtime, `MSVBVM60.DLL`. + pub fn is_runtime(&self) -> bool { + self.library.eq_ignore_ascii_case("MSVBVM60.DLL") + } + + /// Returns the function's name: the imported name, a runtime ordinal's + /// export name, or `#`. + pub fn function(&self) -> Cow<'_, str> { + match &self.symbol { + ImportSymbol::Name(name) => Cow::Borrowed(name), + ImportSymbol::Ordinal(ordinal) => match self.runtime_export() { + Some(export) => Cow::Borrowed(export.name), + None => Cow::Owned(format!("#{ordinal}")), + }, + } + } + + /// Returns the runtime export's signature, for an import from + /// `MSVBVM60.DLL` the export table describes. + pub fn runtime_export(&self) -> Option<&'static ExportSignature> { + if !self.is_runtime() { + return None; + } + match &self.symbol { + ImportSymbol::Ordinal(ordinal) => lookup_export_by_ordinal(*ordinal), + ImportSymbol::Name(name) => lookup_export(name), + } + } +} + +/// The executable's imports, keyed by the VA of their import address table +/// slot. +/// +/// Read fail-soft: a malformed descriptor, thunk or name ends that +/// descriptor's walk, and the imports read so far remain. +#[derive(Debug, Clone, Default)] +pub struct ImportTable { + by_slot: BTreeMap, +} + +impl ImportTable { + /// The most descriptors, and thunks per descriptor, read. + const LIMIT: u32 = 0x4000; + + /// Reads the import directory at `directory_rva`. + /// + /// Each `IMAGE_IMPORT_DESCRIPTOR` (20 bytes: `OriginalFirstThunk`, + /// `TimeDateStamp`, `ForwarderChain`, `Name`, `FirstThunk`) is read + /// until the all-zero terminator; each thunk of its lookup table + /// (`OriginalFirstThunk`, else `FirstThunk`) is an ordinal (bit 31 set) + /// or the RVA of a hint and a name, and names the slot at the same index + /// of `FirstThunk`. + pub fn parse(map: &AddressMap<'_>, directory_rva: u32) -> Self { + let mut by_slot = BTreeMap::new(); + if directory_rva == 0 { + return Self { by_slot }; + } + let image_base = map.image_base(); + let file = map.file(); + let dword = + |rva: u32| -> Option { read_u32_le(file, map.rva_to_offset(rva).ok()?).ok() }; + let name_at = |rva: u32| -> Option { + let bytes = read_cstr(file, map.rva_to_offset(rva).ok()?).ok()?; + Some(String::from_utf8_lossy(bytes).into_owned()) + }; + for index in 0..Self::LIMIT { + let Some(descriptor) = index + .checked_mul(20) + .and_then(|offset| directory_rva.checked_add(offset)) + else { + break; + }; + let field = |offset: u32| descriptor.checked_add(offset).and_then(dword); + let (Some(lookup), Some(name), Some(first)) = (field(0), field(12), field(16)) else { + break; + }; + if lookup == 0 && name == 0 && first == 0 { + break; + } + let Some(library) = name_at(name) else { + continue; + }; + let lookup = if lookup == 0 { first } else { lookup }; + for slot in 0..Self::LIMIT { + let Some(step) = slot.checked_mul(4) else { + break; + }; + let (Some(thunk), Some(slot_rva)) = ( + lookup.checked_add(step).and_then(dword), + first.checked_add(step), + ) else { + break; + }; + if thunk == 0 { + break; + } + let symbol = if thunk & 0x8000_0000 != 0 { + ImportSymbol::Ordinal(u16::try_from(thunk & 0xFFFF).unwrap_or(0)) + } else { + match thunk.checked_add(2).and_then(name_at) { + Some(name) => ImportSymbol::Name(name), + None => break, + } + }; + by_slot.insert( + image_base.wrapping_add(slot_rva), + Import { + library: library.clone(), + symbol, + }, + ); + } + } + Self { by_slot } + } + + /// Returns the import whose address table slot is at `va`. + pub fn by_slot(&self, va: u32) -> Option<&Import> { + self.by_slot.get(&va) + } + + /// Returns every import with its slot's VA, in slot order. + pub fn iter(&self) -> impl Iterator { + self.by_slot.iter().map(|(&va, import)| (va, import)) + } + + /// Returns the number of imports. + pub fn len(&self) -> usize { + self.by_slot.len() + } + + /// Returns `true` if there are no imports. + pub fn is_empty(&self) -> bool { + self.by_slot.is_empty() + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::addressmap::SectionEntry; + + #[test] + fn test_parse_names_and_ordinals() { + // One section: RVA 0x1000 at file 0x200. + let mut file = vec![0u8; 0x1200]; + let put = |file: &mut Vec, rva: u32, bytes: &[u8]| { + let at = (rva - 0x1000 + 0x200) as usize; + file[at..at + bytes.len()].copy_from_slice(bytes); + }; + // Descriptor at RVA 0x1100: lookup 0x1200, name 0x1300, IAT 0x1000. + put(&mut file, 0x1100, &0x1200u32.to_le_bytes()); + put(&mut file, 0x110C, &0x1300u32.to_le_bytes()); + put(&mut file, 0x1110, &0x1000u32.to_le_bytes()); + put(&mut file, 0x1300, b"MSVBVM60.DLL\0"); + // Lookup: ordinal 592, then the name "VarPtr" (hint first), then end. + put(&mut file, 0x1200, &0x8000_0250u32.to_le_bytes()); + put(&mut file, 0x1204, &0x1320u32.to_le_bytes()); + put(&mut file, 0x1322, b"__vbaFreeStr\0"); + let map = AddressMap::from_parts( + &file, + 0x00400000, + vec![SectionEntry { + virtual_address: 0x1000, + virtual_size: 0x1000, + raw_data_offset: 0x200, + raw_data_size: 0x1000, + }], + ); + let imports = ImportTable::parse(&map, 0x1100); + assert_eq!(imports.len(), 2); + + let first = imports.by_slot(0x00401000).unwrap(); + assert!(first.is_runtime()); + assert_eq!(first.symbol, ImportSymbol::Ordinal(592)); + assert_eq!(first.function(), "rtcIsMissing"); + + let second = imports.by_slot(0x00401004).unwrap(); + assert_eq!(second.function(), "__vbaFreeStr"); + assert!(second.runtime_export().is_some()); + + assert!(imports.by_slot(0x00401008).is_none()); + assert!(ImportTable::parse(&map, 0).is_empty()); + } +} diff --git a/src/lib.rs b/src/lib.rs index 76eeaaa..c36afd9 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -1,8 +1,9 @@ //! Parse and inspect Visual Basic 6 compiled binaries. //! -//! This crate provides typed access to all internal structures within a -//! VB6 compiled executable, from the PE entry point down to individual -//! P-Code bytecode instructions. +//! This crate provides typed access to the internal structures of a VB6 +//! compiled executable, from the PE entry point down to individual P-Code +//! instructions. In a native-code build the procedures are machine code, +//! which the crate locates but does not decode. //! //! # Quick Start //! @@ -28,10 +29,14 @@ //! //! - **Address translation** ([`addressmap::AddressMap`]): Converts VAs/RVAs to file offsets //! using section tables from [`goblin`]. +//! - **Entry point** ([`entrypoint`]): Finds the VBHeader through the PE entry +//! point stub (EXE) or the COM export stubs (DLL, OCX). //! - **VB structures** ([`vb`]): View types for each structure in the VB6 //! internal format (VBHeader, ProjectData, ObjectTable, etc.). //! - **P-Code decoding** ([`pcode`]): Opcode tables, operand types, and a streaming //! instruction iterator. +//! - **Imports** ([`imports::ImportTable`]): The PE import table by address +//! table slot, naming the runtime functions P-Code calls by ordinal. //! - **High-level API** ([`VbProject`]): Ties everything together into a convenient //! exploration interface. //! @@ -45,7 +50,7 @@ //! //! VB6 binaries from the wild include malware samples that may be truncated, //! have inconsistent structure-size fields, or carry intentionally adversarial -//! VAs. Every public API in this crate falls into one of three behavioural +//! VAs. Every public API in this crate falls into one of four behavioural //! categories - pick the one that matches your call site: //! //! ## 1. Fail-loud at the byte boundary (primitive accessors) @@ -56,35 +61,41 @@ //! [`VbObject::name_bytes`](crate::project::VbObject::name_bytes) returns //! `Result`. The crate's underlying byte readers are //! panic-free (no `unwrap`, no panicking indexing, no unchecked arithmetic); -//! out-of-buffer reads surface as -//! [`Error::Truncated`] and offset overflows as [`Error::ArithmeticOverflow`]. -//! Use `?` to propagate. +//! out-of-buffer reads surface as [`Error::Truncated`] or [`Error::TooShort`], +//! VAs with no bytes in the file as [`Error::RvaNotMapped`], +//! [`Error::RvaInBssRegion`] or [`Error::VaBelowImageBase`], and offset +//! overflows as [`Error::ArithmeticOverflow`]. Use `?` to propagate. //! //! ## 2. Skip-and-continue (per-entry iterators) //! //! Iterators like //! [`InstructionIterator`](crate::pcode::decoder::InstructionIterator), //! [`PCodeMethodIterator`](crate::project::PCodeMethodIterator), and -//! [`ConstPoolIter`](crate::vb::constantpool::ConstPoolIter) yield -//! `Item = Result` per entry - they emit one `Err` per malformed -//! row and *keep going*, so a single bad entry does not poison the whole -//! sweep. Match on each `Item` to pull successes, log failures, or stop -//! early on first error per your policy. Iteration ends only when the -//! underlying byte stream is exhausted (or a structural-truncation -//! `Err` is yielded - most iterators continue past per-entry errors). +//! [`ConstPoolIter`](crate::vb::constantpool::ConstPoolIter) yield a +//! `Result` per entry (`ConstPoolIter` pairs it with the entry's +//! index) - they emit one `Err` per malformed row and *keep going*, so a +//! single bad entry does not poison the whole sweep. Match on each `Item` to +//! pull successes, log failures, or stop early on first error per your +//! policy. An iterator over a counted table ends after the count the file +//! declares, whether or not its entries read; +//! [`InstructionIterator`](crate::pcode::decoder::InstructionIterator) ends at +//! the end of the procedure's P-Code, and after an `Err` resumes where the +//! failed decode stopped, which need not be an instruction boundary. //! //! ## 3. Silent fail-soft (high-level joins) //! //! High-level convenience methods like -//! [`VbObject::events`](crate::project::VbObject::events), -//! [`VbProject::code_entrypoints`](crate::project::VbProject::code_entrypoints), -//! and the [`pcode::calltarget`] resolvers eagerly -//! collect from one or more underlying iterators and **silently drop** -//! malformed rows (`filter_map(|r| r.ok())`) so the returned `Vec` is -//! "everything that parsed". This matches malware-analysis triage: one -//! corrupt control should not block enumeration of the other 50. -//! Enable the optional `tracing` feature to capture the dropped rows -//! as `target = "visualbasic::dropped"` `warn` events. +//! [`VbObject::events`](crate::project::VbObject::events) and +//! [`VbProject::code_entrypoints`](crate::project::VbProject::code_entrypoints) +//! eagerly collect from one or more underlying iterators and **silently +//! drop** malformed rows (`code_entrypoints` drops a whole object whose +//! entries do not read) so the returned `Vec` is "everything that parsed". +//! This matches malware-analysis triage: one corrupt control should not +//! block enumeration of the other 50. Enable the optional `tracing` feature +//! to capture the dropped rows as `target = "visualbasic::dropped"` `warn` +//! events. The [`pcode::calltarget`] resolver is fail-soft the same way but +//! untraced: what it cannot read becomes `None` or +//! [`Callee::Unknown`](crate::pcode::calltarget::Callee::Unknown). //! //! ## 4. Recognition-time errors at [`VbProject::from_bytes`] //! @@ -130,6 +141,7 @@ pub mod addressmap; pub mod entrypoint; pub mod error; +pub mod imports; pub mod pcode; pub mod project; pub mod vb; diff --git a/src/pcode/calltarget.rs b/src/pcode/calltarget.rs index 74c6dc2..90b6288 100644 --- a/src/pcode/calltarget.rs +++ b/src/pcode/calltarget.rs @@ -1,246 +1,1636 @@ -//! Call target resolution for P-Code call operands. +//! Call-signature resolution for the P-Code call opcodes. //! -//! Resolves `%v` (VTableRef), `%x` (ExternalCall), and `%c` (ControlIndex) -//! operands to human-readable call target names like `"kernel32!CreateFileA"` -//! or `"Timer1"` with vtable offset. +//! A call opcode's evaluation-stack effect depends on its callee: a +//! `VCallHresult` pops whatever arguments the method it reaches takes, an +//! `ImpAdCall*` pops the argument bytes its operand states, a late-bound call +//! four slots per Variant argument. [`CallResolver`] finds the callee of each +//! call opcode from the project and the constant pool of the calling object, +//! and returns a [`CallSignature`]: who is called, how many slots the +//! arguments take and each one's width, and whether a float result comes +//! back on the x87 stack. [`Instruction::stack_effect`] turns it into the +//! instruction's [`StackEffect`](super::stackeffect::StackEffect). //! -//! Two resolver types are provided: -//! - [`ImportResolver`]: Lightweight - needs only an [`AddressMap`] and the -//! external table VA/count. Resolves `%x` imports without a full -//! [`VbProject`]. -//! - [`CallResolver`]: Full - wraps [`ImportResolver`] and adds `%v`/`%c` -//! resolution that requires project context. +//! | Opcode family | Callee from | +//! |---------------|-------------| +//! | `VCallHresult` (`%v`) | the IID in the pool: the project object whose default interface it is, then the method at the vtable offset; otherwise [`Callee::External`] | +//! | `ThisVCall*` | `Me`'s object (the calling object): the method at the vtable offset | +//! | `VCall*` (`%2`) | the receiver's class is not in the instruction: [`Callee::Unknown`]; a caller that knows Pr's source asks [`CallResolver::resolve_with_pr`] (Pr loaded by `FLdPrThis` is `Me`), one that knows its class asks [`CallResolver::resolve_vtable`] | +//! | `ImpAdCall*` (`%x`) | the pool entry: a procedure thunk (module procedure, `Friend` method), a `Declare` stub or an import thunk; the operand's byte count is exact either way | +//! | `Late*` | the member name (pool, [`ConstantPool::name_at`]) or the DISPID, and the argument count operand | +//! +//! # The vtable of a project object +//! +//! The method link table +//! ([`OptionalObjectInfo::method_link_table_va`](crate::vb::object::OptionalObjectInfo::method_link_table_va), +//! [`method_link_count`](crate::vb::object::OptionalObjectInfo::method_link_count) +//! entries) lists +//! the object's own vtable slots in order: entry `k` is the slot at +//! `user_base + 4 * k`. An entry is a P-Code stub (`33 C0 BA ` +//! or `BA `) naming one of the object's methods, a runtime +//! accessor stub for a member variable (`58 81 04 24 ... jmp` for +//! a `WithEvents` variable, `81 44 24 04 ... jmp` for a `Public` +//! one, reaching `GetMem*` / `PutMem*` / `SetMem*`), or null (three per +//! `Implements`). Public variables' accessors come first, then the null +//! entries, then public `WithEvents` accessors, the public procedures at +//! their [`FuncTypDesc`] offsets, every other method (`Private`, `Friend`, +//! event handlers, `Class_Initialize`) in method-table order, and last the +//! private `WithEvents` accessors (see [`MethodLink`](crate::project::MethodLink) +//! for the measured order). +//! +//! `user_base` is `0x1C + 4 * n`: the runtime builds an object's vtable from +//! `IDispatch`'s 7 slots, `n` inherited slots +//! ([`OptionalObjectInfo::inherited_vtable_slots`](crate::vb::object::OptionalObjectInfo::inherited_vtable_slots)) +//! and the method links. `n` is 0 for a class. A designer object's +//! inherited slots are its [designer](crate::vb::designer::Designer)'s +//! built-in interface (`_Form` 0x2F8 bytes, `_UserControl` 0x3A4; the size +//! is the interface's `cbSizeVft` in `VB6.OLB`) after `IDispatch`, then 256 +//! control getters (the control with +//! [`ControlInfo::index`](crate::vb::control::ControlInfo::index) `i` at +//! `size + 4 * i`, taking no argument and returning the control in eax), so +//! `user_base` is `size + 0x400`: 0x6F8 for a Form or MDIForm, 0x7A4 for a +//! UserControl, 0x770 for a UserDocument, 0x710 for a PropertyPage +//! (`tests/fixtures/forms`, `mdi`, `ocx`, `docs`). A member of the built-in +//! interface resolves to [`Callee::External`] with the built-in interface's +//! IID, a getter to [`Callee::Control`]. +//! +//! A form's or UserControl's vtable is named by two IIDs: its default +//! interface (OptionalObjectInfo, [`VbObject::default_iids`]) and its own +//! full interface, which the form data header records at +0x15 and which +//! `Me.Caption`-style calls name. +//! +//! External interfaces (the intrinsic controls and forms of `VB6.OLB`, the +//! VBA objects of the runtime, ActiveX controls, referenced type libraries) +//! are not described in the executable: their signatures are in the type +//! libraries that define them, keyed by [`Callee::External`]'s IID and +//! vtable offset. A caller that has them supplies an [`InterfaceCatalog`] +//! ([`CallResolver::with_interfaces`]), and such calls resolve to +//! [`Callee::Interface`] with the member's argument widths. The runtime's +//! own interfaces that no type library describes are built in +//! ([`RuntimeInterfaces`]) and resolve without a catalog: the control-array +//! object a form's getter returns for a control array, which the compiler +//! records under the all-zero IID (`Item` at 0x40 takes the index and the +//! return pointer; `LBound` 0x44, `UBound` 0x48 and `Count` 0x4C the return +//! pointer). +//! +//! [`Instruction::stack_effect`]: super::decoder::Instruction::stack_effect + +use std::{ + collections::{BTreeMap, HashMap, HashSet}, + fmt, + sync::Arc, +}; use crate::{ - addressmap::AddressMap, - project::{VbObject, VbProject}, - vb::external::ExternalTableEntry, + error::Error, + imports::ImportSymbol, + pcode::{ + decoder::Instruction, + opcode::{Receiver, StackRule}, + operand::Operand, + semantics::{CallKind, OpcodeSemantics}, + stackeffect::PrSource, + stacksim::{InstructionStack, ProcedureStack, StackValue}, + }, + project::{MethodEntry, MethodLinkKind, VbObject, VbProject}, + vb::{ + constantpool::{ConstantPool, PoolEntry}, + control::Guid, + exports::VbParamType, + functype::{ArgType, FuncTypDesc}, + }, }; -/// Resolved call target information. +/// Vtable offset of the first slot after `IDispatch`'s 7: a class's first +/// own slot, a designer object's first inherited one. +const CLASS_USER_BASE: u16 = 0x1C; + +/// One entry of an object's method link table. +enum Link { + /// A null entry: a slot with no code. + Empty, + /// A P-Code stub: the method's ProcDscInfo VA. + Procedure(u32), + /// A runtime accessor for the member variable at `offset` in the instance. + Variable { + /// Offset of the variable in the instance. + offset: u32, + /// The runtime function the stub jumps to. + function: String, + }, + /// Anything else (a native thunk). + Other, +} + +/// Who a call reaches. #[derive(Debug, Clone)] -pub enum CallTarget { - /// External DLL API call (Declare function). - Api { - /// DLL library name (e.g., `"kernel32"`). +pub enum Callee { + /// A procedure of the project: method `method` of object `object` (the + /// indices of [`VbProject::objects`] and [`VbObject::methods`]). + Procedure { + /// Index of the object. + object: u16, + /// Index of the method in the object's method table. + method: u16, + }, + /// A `Declare` function, called through its stub and `DllFunctionCall`. + Declare { + /// DLL name (e.g. `"kernel32"`). library: String, - /// API function name (e.g., `"CreateFileA"`). + /// Function name (e.g. `"GetTickCount"`). function: String, }, - /// COM vtable method call on a control or object. - VTableMethod { - /// Control name if resolved (e.g., `"Timer1"`). - control_name: Option, - /// Raw vtable byte offset. + /// A function the executable imports, called through its import thunk: + /// in P-Code, a runtime function such as `rtcIsMissing` or `VarPtr`. + Import { + /// The library (e.g. `"MSVBVM60.DLL"`). + library: String, + /// The function's name ([`Import::function`](crate::imports::Import::function): an ordinal of the + /// runtime is named from its export table, another as `#`). + function: String, + /// The ordinal, for an import by ordinal. + ordinal: Option, + }, + /// A member of an interface the project does not implement (a control, + /// a referenced type library): its signature is in the type library that + /// defines the interface, not in the executable. + External { + /// The interface's IID. + iid: Guid, + /// Byte offset of the member in the interface's vtable. + vtable_offset: u16, + }, + /// A member of an external interface the caller's + /// [`InterfaceCatalog`] describes. + Interface { + /// The interface's IID. + iid: Guid, + /// Byte offset of the member in the interface's vtable. vtable_offset: u16, + /// The member, under each name the catalog gives the slot. + members: Vec, }, - /// Resolved import/control name from `%c` operand. - ImportRef { - /// Resolved name of the referenced item. + /// The getter a form's or UserControl's vtable has for one of its + /// controls: no argument, the control (for a control array, the array + /// object) returned in eax. + Control { + /// Index of the object that owns the control. + object: u16, + /// The control's index ([`ControlInfo::index`](crate::vb::control::ControlInfo::index)). + index: u16, + /// The control's name. + name: String, + }, + /// The runtime accessor a vtable slot has for a member variable of the + /// object (a `WithEvents` or `Public` variable): `GetMem*` takes the + /// `[out, retval]` pointer, `PutMem*` / `SetMem*` the value: two slots + /// for `PutMem8` (a `Double`, `Date` or `Currency`), the Variant's + /// address for `PutMemVar` / `SetMemVar`, one slot otherwise. + Variable { + /// Index of the object that owns the variable. + object: u16, + /// Offset of the variable in the instance. + offset: u32, + /// The runtime function (`GetMemEvent`, `PutMem4`, `SetMemObj`, ...). + function: String, + }, + /// The handlers of an event the calling object raises (`RaiseEvent`). + Event { + /// The event's id, the instruction's `%4` operand (1 for the first + /// event the object declares, `tests/fixtures/events`). + id: i32, + }, + /// A late-bound `IDispatch` member. + Late { + /// The member's name (`LateMem*`), from the constant pool. name: Option, + /// The member's DISPID (`LateId*`). + dispid: Option, + }, + /// The instruction does not say (`VCall*` on Pr of unknown interface). + Unknown { + /// Byte offset of the member in the receiver's vtable, if the + /// opcode carries one. + vtable_offset: Option, }, - /// Could not resolve the call target. - Unknown, } -/// Lightweight import resolver for `%x` (ExternalCall) operands. +/// What a call opcode passes and gets back. +#[derive(Debug, Clone)] +pub struct CallSignature<'a> { + /// Who the call reaches. + pub callee: Callee, + /// Evaluation-stack slots the arguments take, which the call pops; not + /// counting a receiver the opcode pushes itself. `None` when only the + /// callee's (unknown) signature could say. + pub arg_slots: Option, + /// Each argument's width in slots, in the order they are popped (top of + /// the stack first), the `[out, retval]` pointer last when the callee + /// has one. `None` when the callee's parameter types are unknown. + /// + /// A vtable, procedure, `Declare` or runtime call (`VCall*`, + /// `ThisVCall*`, `ImpAdCall*`) is stdcall: the compiler pushes the last + /// parameter first, so this is parameter order (the first parameter on + /// top). A late-bound call (`Late*`) and `RaiseEvent` push their Variants + /// in source order, the order `IDispatch::Invoke` takes them (the last + /// argument first in `DISPPARAMS`), so the last argument is on top + /// (`tests/fixtures/late`: `o.Add "a", 1` pushes `"a"`, then `1`). + pub arg_widths: Option>, + /// The callee's prototype, for a project method that has one. + pub signature: Option>, + /// `Some(true)` when the callee leaves a Single, Double or Date result on + /// the x87 stack (a P-Code procedure ending in `ExitProcR4` / + /// `ExitProcR8`, a runtime function returning a float), `Some(false)` + /// when it does not, `None` when unknown (a `Declare` function, an + /// external interface). Only the calls with + /// [`OpcodeInfo::fpu_callee`](super::opcode::OpcodeInfo::fpu_callee) + /// pass the callee's x87 result on. + pub float_result: Option, +} + +/// What the resolver knows of one method of the project. +#[derive(Debug, Clone)] +struct MethodFacts<'a> { + /// The method's prototype, if it has one. + ftd: Option>, + /// The evaluation-stack slots of its arguments, from its ProcDscInfo's + /// argument size (less the `ebp+8` slot every P-Code frame has). + arg_slots: Option, + /// Whether it returns through the x87 stack (`ExitProcR4` / `ExitProcR8`). + float_result: Option, +} + +/// What the resolver knows of one object of the project. +#[derive(Debug, Clone, Default)] +struct ObjectFacts<'a> { + /// The IIDs that name the object's vtable: its default interface and, + /// for a form or UserControl, its own full interface. + iids: Vec, + /// Its methods, by method-table index. + methods: Vec>, + /// Method index by vtable offset, for the methods whose slot is known. + by_vtable: HashMap, + /// Control getters by vtable offset: the control's index and name. + controls: HashMap, + /// Member variable accessors by vtable offset: the variable's instance + /// offset and the runtime function. + variables: HashMap, + /// A designer object's built-in interface (`_Form`, `_UserControl`, ...) + /// and its vtable size: offsets below it are that interface's members. + builtin: Option<(Guid, u16)>, + /// The VA of its ObjectInfo, which a prototype's class type names. + info_va: u32, +} + +/// The interfaces a procedure's own code states for the objects in its frame +/// slots, which a `VCall*` without an IID needs. +/// +/// A module's procedure records no parameter or local types, but its code +/// names them where it uses them (`tests/fixtures/vtable`: `Vtable(ByVal r +/// As IRaw)` copies `r` to a local whose typed `VCallUI1` / `VCallFPR8` +/// calls carry no IID, and whose `VCallHresult` names `IRaw`). A slot's +/// interface comes from: /// -/// Resolves import indices to `CallTarget::Api` entries using only the -/// address map and external table location - no [`VbProject`] required. +/// - a `VCallHresult` (an IID operand) on a Pr loaded from the slot; +/// - `CastAd [IID]` (a QueryInterface) stored into the slot (`FStAdFunc`, +/// `FStAd`); +/// - a call whose result's interface is known +/// ([`CallResolver::returned_interface`]: a catalog member's +/// [`InterfaceMember::returns_interface`], a project function returning +/// one of the project's classes, a runtime export such as `rtcErrObj`), +/// stored into the slot when the call pushes it, or written to the slot +/// whose address it takes as its `[out, retval]` pointer +/// (`FLdRfVar slot; VCallHresult`); +/// - a copy of another slot (`ILdRf a; FStAd b`, or `FLdZeroAd a; FStAdFunc +/// b`, which moves the reference), both ways. /// -/// Construct from [`AddressMap`] + external table VA + count (available -/// from [`ProjectData`](crate::vb::projectdata::ProjectData)), or from -/// an existing [`VbProject`] via [`ImportResolver::from_project`]. -pub struct ImportResolver<'a> { - map: &'a AddressMap<'a>, - externals: Vec>, +/// A slot given two different interfaces has none as a whole: it is a +/// temporary the compiler reuses (`tests/fixtures/vtable`: `var_E4` holds +/// `r.GetUnknown()`'s result, then `o.GetSelf()`'s). A call on a Pr loaded +/// from it takes the interface of the latest store into it before the call +/// ([`for_pr_at`](Self::for_pr_at)), which [`CallResolver::resolve_with_slots`] +/// uses. +#[derive(Debug, Clone, Default, PartialEq, Eq)] +pub struct SlotInterfaces { + slots: HashMap, + conflicting: HashSet, + /// Each store into a frame slot, by slot and P-Code offset, with the + /// interface of what it stores when known. + stores: BTreeMap>>, } -impl<'a> ImportResolver<'a> { - /// Creates an import resolver from raw external table parameters. - /// - /// # Arguments - /// - /// * `map` - Address map for VA-to-offset resolution. - /// * `external_table_va` - Base VA of the external table - /// (from [`ProjectData::external_table_va`](crate::vb::projectdata::ProjectData::external_table_va)). - /// * `external_count` - Number of entries in the table - /// (from [`ProjectData::external_count`](crate::vb::projectdata::ProjectData::external_count)). - pub fn new(map: &'a AddressMap<'a>, external_table_va: u32, external_count: u32) -> Self { - let mut externals = Vec::new(); - if external_table_va != 0 { - let entry_size = ExternalTableEntry::SIZE as u32; - for i in 0..external_count { - // Bounded by external_count loop; saturating prevents wrap on hostile counts. - let offset = i.saturating_mul(entry_size); - let entry_va = external_table_va.wrapping_add(offset); - if let Ok(data) = map.slice_from_va(entry_va, ExternalTableEntry::SIZE) - && let Ok(entry) = ExternalTableEntry::parse(data) - { - externals.push(entry); - } +/// What one store into a frame slot stores. +enum StoredValue { + /// An object of this interface. + Known(Guid), + /// A copy of another slot. + Copy(i16), + /// Something else. + Unknown, +} + +impl SlotInterfaces { + /// Infers the slots' interfaces from `code` and the Pr sources of a + /// simulation of it, repeating until they settle: a call on a slot + /// resolves (and names what it returns) only once the slot's own + /// interface is known (`Set o = r.GetSelf()`). + pub fn infer( + resolver: &CallResolver<'_, '_>, + object: u16, + code: &[Instruction], + stack: &ProcedureStack, + ) -> Self { + Self::infer_seeded(resolver, object, code, stack, &Self::default()) + } + + /// Infers the slots' interfaces like [`infer`](Self::infer), starting + /// from the interfaces `seed` gives (what the procedure's callers and + /// callees state for its parameters and arguments, [`ProjectSlots`]). + pub fn infer_seeded( + resolver: &CallResolver<'_, '_>, + object: u16, + code: &[Instruction], + stack: &ProcedureStack, + seed: &Self, + ) -> Self { + let mut slots = seed.clone(); + for _ in 0..8 { + let next = Self::infer_once(resolver, object, code, stack, &slots, seed); + if next == slots { + break; } + slots = next; } - Self { map, externals } + slots } - /// Creates an import resolver from an existing [`VbProject`]. - pub fn from_project(project: &'a VbProject<'a>) -> Self { - let externals: Vec<_> = project - .externals() - .into_iter() - .flatten() - .filter_map(|r| match r { - Ok(e) => Some(e), - Err(e) => { - crate::trace::warn_drop!("import_resolver.externals", error = ?e); - None + /// One inference pass from `seed`, resolving calls through the slots + /// `known` so far. + fn infer_once( + resolver: &CallResolver<'_, '_>, + object: u16, + code: &[Instruction], + stack: &ProcedureStack, + known: &Self, + seed: &Self, + ) -> Self { + let mut found = seed.clone(); + let pool = VbObject::parse(resolver.project, object) + .ok() + .and_then(|o| o.constants_pool().ok()); + let frame_operand = |insn: &Instruction| match insn.operands.first() { + Some(Some(Operand::StackVar(offset))) => Some(*offset), + _ => None, + }; + let is_store = |insn: &Instruction| { + matches!( + insn.info.mnemonic, + "FStAdFunc" | "FStAdFuncNoPop" | "FStAd" | "FStAdNoPop" + ) + }; + let mut copies = Vec::new(); + let mut sites: Vec<(i16, u16, StoredValue)> = Vec::new(); + // Pr at each instruction: the simulation's where it reached, else + // the last Pr load before it in code order (a cut hides the rest of + // a path, and `FLdPr slot; VCall*` are adjacent). + let mut last_load: Option = None; + for (index, insn) in code.iter().enumerate() { + let pr = match stack.instructions.get(index) { + Some(InstructionStack::Reached { pr, .. } | InstructionStack::Cut { pr, .. }) => { + *pr } - }) - .collect(); - Self { - map: project.address_map(), - externals, + _ => last_load, + }; + if let Some(source) = insn.pr_source() { + last_load = Some(source); + } + let call = resolver.resolve_with_slots(object, insn, pr.as_ref(), known); + let returned = call + .as_ref() + .and_then(|call| resolver.returned_interface(call)); + // A call that returns through its [retval] pointer fills the slot + // whose address it consumes last (pushed first). + if let (Some(iid), Some(call)) = (returned, call.as_ref()) + && insn.info.pushes == 0 + && let Some(slot) = Self::retval_slot(code, stack, index, call) + { + found.add(slot, iid); + sites.push((slot, insn.offset, StoredValue::Known(iid))); + } + // A VCallHresult on a Pr loaded from a slot names its interface. + if let Some(Operand::VTableRef { interface, .. }) = + insn.operands.first().copied().flatten() + && insn.info.receiver == Receiver::Pr + && let Some(PrSource::Frame { offset }) = pr + && let Some(iid) = pool + .as_ref() + .and_then(|p| p.guid_at(interface).ok().flatten()) + { + found.add(offset, iid); + } + let Some(next) = code.get(index.wrapping_add(1)) else { + continue; + }; + let Some(target) = frame_operand(next).filter(|_| is_store(next)) else { + continue; + }; + let stored = match insn.info.mnemonic { + "CastAd" => match insn.operands.first() { + Some(Some(Operand::ConstPoolIndex(entry))) => pool + .as_ref() + .and_then(|p| p.guid_at(*entry).ok().flatten()) + .map_or(StoredValue::Unknown, StoredValue::Known), + _ => StoredValue::Unknown, + }, + "ILdRf" | "ILdAd" | "FLdZeroAd" => match frame_operand(insn) { + Some(source) => { + copies.push((source, target)); + StoredValue::Copy(source) + } + None => StoredValue::Unknown, + }, + // A call that pushes the object it returns, stored. + _ => match returned { + Some(iid) if insn.info.pushes != 0 => StoredValue::Known(iid), + _ => StoredValue::Unknown, + }, + }; + if let StoredValue::Known(iid) = stored { + found.add(target, iid); + } + sites.push((target, next.offset, stored)); + } + // Copies carry an interface both ways, to a fixed point. + let mut changed = true; + while changed { + changed = false; + for &(a, b) in &copies { + for (from, to) in [(a, b), (b, a)] { + if let Some(&iid) = found.slots.get(&from) + && !found.conflicting.contains(&to) + && found.slots.get(&to) != Some(&iid) + { + found.add(to, iid); + changed = true; + } + } + } } + for (slot, offset, stored) in sites { + let iid = match stored { + StoredValue::Known(iid) => Some(iid), + StoredValue::Copy(source) => found.get(source), + StoredValue::Unknown => None, + }; + found.stores.entry(slot).or_default().insert(offset, iid); + } + found } - /// Resolves an ExternalCall operand (`%x`). - /// - /// The `import` field indexes into the external table from - /// `ProjectData.external_table_va`. For `Declare` functions, - /// returns `Api { library, function }`. - pub fn resolve_external(&self, import: u16) -> CallTarget { - if let Some(entry) = self.externals.get(import as usize) - && let Some(decl) = entry.as_declare(self.map) - { - let library = decl.library_name(self.map).unwrap_or("").to_string(); - let function = decl.function_name(self.map).unwrap_or("").to_string(); - if !library.is_empty() || !function.is_empty() { - return CallTarget::Api { library, function }; + /// The frame slot whose address the call at `index` takes as its + /// `[out, retval]` pointer: the value its last popped argument is + /// (`FLdRfVar slot` pushed it). + fn retval_slot( + code: &[Instruction], + stack: &ProcedureStack, + index: usize, + call: &CallSignature<'_>, + ) -> Option { + let arguments = call.arg_widths.as_ref()?.len(); + let last = arguments.checked_sub(1)?; + let insn = Self::pusher(code, stack, index, last)?; + match (insn.info.mnemonic, insn.operands.first()) { + ("FLdRfVar" | "FLdRf", Some(Some(Operand::StackVar(offset)))) => Some(*offset), + _ => None, + } + } + + /// The instruction that last set the value `from_top` values below the + /// top of the evaluation stack as the instruction at `index` finds it, + /// from the simulated depths: the latest one before it that popped down + /// to that position or below and pushed it (`CastAd`, which replaces the + /// value, rather than the load before it). `None` if that instruction + /// pushed nothing there or was not simulated. + fn pusher<'c>( + code: &'c [Instruction], + stack: &ProcedureStack, + index: usize, + from_top: usize, + ) -> Option<&'c Instruction> { + let depth = |at: usize| match stack.instructions.get(at) { + Some(InstructionStack::Reached { entry, .. } | InstructionStack::Cut { entry, .. }) => { + Some(entry.eval.len()) + } + _ => None, + }; + let position = depth(index)?.checked_sub(from_top)?.checked_sub(1)?; + for at in (0..index).rev() { + let Some(InstructionStack::Reached { entry, effect, .. }) = stack.instructions.get(at) + else { + return None; + }; + let lowest = entry.eval.len().checked_sub(effect.popped.len())?; + if lowest > position { + continue; } + // It reached the position: it set the value if it left the stack + // just above it. + return (depth(at.wrapping_add(1)) == Some(position.wrapping_add(1)) + && effect.pushed.is_some()) + .then(|| code.get(at)) + .flatten(); } - CallTarget::Unknown + None } - /// Resolves a ControlIndex operand (`%c`) to a name. - /// - /// For `ImpAdCall*` opcodes the `%c` operand identifies the import. - /// This method tries to resolve it via the external table. - pub fn resolve_import_index(&self, index: u16) -> CallTarget { - let target = self.resolve_external(index); - match target { - CallTarget::Unknown => CallTarget::ImportRef { name: None }, - other => other, + /// The arguments of the call at `index` that are the value of one of the + /// caller's frame slots (pushed by `ILdRf slot`, or left by + /// `FStAdNoPop slot` / `FStAdFuncNoPop slot`), each with the + /// callee's parameter slot that receives it: `ebp+0x0C` plus the widths + /// of the arguments popped before it. + fn passed_slots(code: &[Instruction], stack: &ProcedureStack, index: usize) -> Vec<(i16, i16)> { + let Some(InstructionStack::Reached { effect, .. }) = stack.instructions.get(index) else { + return Vec::new(); + }; + let mut found = Vec::new(); + let mut offset: i16 = 0x0C; + for (k, value) in effect.popped.iter().enumerate() { + let StackValue::Eval(width) = *value else { + break; + }; + if width == 1 + && let Some(insn) = Self::pusher(code, stack, index, k) + && matches!( + insn.info.mnemonic, + "ILdRf" | "ILdAd" | "FStAdNoPop" | "FStAdFuncNoPop" + ) + && let Some(Some(Operand::StackVar(slot))) = insn.operands.first() + { + found.push((*slot, offset)); + } + offset = offset.saturating_add(i16::from(width).saturating_mul(4)); } + found } - /// Returns the underlying address map. - pub fn address_map(&self) -> &AddressMap<'a> { - self.map + /// Records `iid` for slot `offset`; a second, different one makes the + /// slot conflicting. + fn add(&mut self, offset: i16, iid: Guid) { + if self.conflicting.contains(&offset) { + return; + } + match self.slots.get(&offset) { + Some(&known) if known != iid => { + self.slots.remove(&offset); + self.conflicting.insert(offset); + } + _ => { + self.slots.insert(offset, iid); + } + } + } + + /// Returns the interface known for frame slot `ebp + offset`. + pub fn get(&self, offset: i16) -> Option { + self.slots.get(&offset).copied() + } + + /// Returns the interface of the object Pr holds when it was loaded + /// from a frame slot ([`PrSource::Frame`]). + pub fn for_pr(&self, pr: Option<&PrSource>) -> Option { + match pr { + Some(PrSource::Frame { offset }) => self.get(*offset), + _ => None, + } + } + + /// Returns the interface of the object Pr holds at the instruction at + /// P-Code offset `at`, when it was loaded from a frame slot: the slot's + /// own interface ([`for_pr`](Self::for_pr)), or for a slot that holds + /// objects of several interfaces (a temporary the compiler reuses), the + /// interface of the latest store into it before `at`. + pub fn for_pr_at(&self, pr: Option<&PrSource>, at: u16) -> Option { + let Some(PrSource::Frame { offset }) = pr else { + return None; + }; + if let Some(iid) = self.get(*offset) { + return Some(iid); + } + if !self.conflicting.contains(offset) { + return None; + } + self.stores + .get(offset)? + .range(..at) + .next_back() + .and_then(|(_, iid)| *iid) + } + + /// Returns the slots with a known interface, by offset. + pub fn iter(&self) -> impl Iterator + '_ { + self.slots.iter().map(|(&offset, &iid)| (offset, iid)) } } -/// Resolves call-related P-Code operands to human-readable targets. +/// The frame-slot interfaces of every P-Code procedure of a project +/// ([`SlotInterfaces`]), with the interfaces arguments carry between a +/// caller's slot and the callee's parameter. /// -/// Wraps [`ImportResolver`] and adds `%v` (VTableRef) resolution that -/// requires project context for control name lookup. -pub struct CallResolver<'a> { - project: &'a VbProject<'a>, - imports: ImportResolver<'a>, +/// A procedure's own code may not state the interface of a parameter it +/// only makes typed `VCall*` calls on, nor a caller that of the variable it +/// passes (`tests/fixtures/vtable`: `Sub Main` passes `r`, which its code +/// only compares with `Nothing`, to `Vtable(ByVal r As IRaw)`, whose +/// `VCallHresult` names `IRaw`). An argument the caller pushed from a frame +/// slot (`ILdRf slot`) is the object the callee's parameter slot holds +/// (`ebp+0x0C` plus the widths of the arguments before it), so the +/// interface either one's code states is the other's. A `ByRef` argument +/// (`FLdRfVar slot`, the slot's address) carries none. +#[derive(Debug, Clone, Default)] +pub struct ProjectSlots { + procedures: HashMap<(u16, u16), SlotInterfaces>, } -impl<'a> CallResolver<'a> { - /// Creates a resolver, caching the project's external table. - pub fn new(project: &'a VbProject<'a>) -> Self { - let imports = ImportResolver::from_project(project); - Self { project, imports } +impl ProjectSlots { + /// Returns the slot interfaces of method `method` (its method-table + /// index) of object `object`. + pub fn get(&self, object: u16, method: u16) -> Option<&SlotInterfaces> { + self.procedures.get(&(object, method)) } - /// Returns the underlying [`ImportResolver`]. - pub fn import_resolver(&self) -> &ImportResolver<'a> { - &self.imports + /// Returns each P-Code procedure's slot interfaces, by object and + /// method-table index. + pub fn iter(&self) -> impl Iterator + '_ { + self.procedures.iter().map(|(&key, slots)| (key, slots)) } +} - /// Resolves an ExternalCall operand (`%x`). - /// - /// The `import` field indexes into the external table from - /// `ProjectData.external_table_va`. For `Declare` functions, - /// returns `Api { library, function }`. - pub fn resolve_external(&self, import: u16) -> CallTarget { - self.imports.resolve_external(import) +/// Resolves the call opcodes of a project's procedures to [`CallSignature`]s. +/// +/// Built once per project ([`CallResolver::new`]); [`resolve`](Self::resolve) +/// then answers per instruction. +pub struct CallResolver<'a, 'p> { + project: &'p VbProject<'a>, + objects: Vec>, + /// `(object, method)` by the VA of the method's ProcDscInfo. + by_proc_dsc: HashMap, + /// The descriptions of external interfaces, if supplied. + interfaces: Option>, +} + +/// How a member of an interface is invoked. +#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] +pub enum InvokeKind { + /// A method. + Method, + /// A property get. + Get, + /// A property let. + Let, + /// A property set (`Set` of an object property). + Set, +} + +/// A member of an external interface, as its type library describes it. +#[derive(Debug, Clone, PartialEq, Eq)] +pub struct InterfaceMember { + /// The interface's name (e.g. `"_TextBox"`). + pub interface: String, + /// The member's name. + pub name: String, + /// How it is invoked. + pub invoke: InvokeKind, + /// Its DISPID, if the type library gives one. + pub dispid: Option, + /// Each argument's width in evaluation-stack slots, in the order the + /// call pops them (see [`CallSignature::arg_widths`]): parameter order, + /// the `[out, retval]` pointer last; `this` not included. + pub arg_widths: Vec, + /// `true` if the member returns a Single, Double or Date on the x87 + /// stack (a non-`HRESULT` member). + pub float_result: bool, + /// The IID of the object the member returns, through its return value + /// or its `[out, retval]` pointer, when the type library names it: + /// [`SlotInterfaces`] gives it to the frame slot the result is stored + /// in. + pub returns_interface: Option, +} + +/// The descriptions of interfaces the executable uses but does not +/// describe: the intrinsic controls and forms of `VB6.OLB`, the runtime's +/// objects (`Collection`, `ErrObject`), ActiveX controls and referenced type +/// libraries. A caller that has them (from the type libraries) supplies them +/// to [`CallResolver::with_interfaces`]. The runtime's interfaces that no +/// type library describes are the crate's own ([`RuntimeInterfaces`]) and +/// take precedence. +pub trait InterfaceCatalog { + /// Returns the members at `vtable_offset` of interface `iid`: one + /// function, which a type library may list under several names (a + /// property's `Let` and `Set`, a `_Default` alias), all with the same + /// arguments. Empty when the interface or the slot is unknown. + fn members(&self, iid: &Guid, vtable_offset: u16) -> Vec; +} + +/// The runtime's interfaces that no type library describes, built into the +/// crate and consulted by every [`CallResolver`] before a caller's +/// [`InterfaceCatalog`]. +/// +/// One interface: the control-array object (the all-zero IID), which a +/// form's or UserControl's getter for a control array returns +/// ([`Callee::Control`]). Its vtable is the runtime's (MSVBVM60 6.00.8176, +/// 0x66036758, read from a live object): after `IDispatch`, slot 0x1C +/// returns `0x800A01A9` (error 425, "Invalid object use") taking no +/// argument, 0x20-0x34 return the same error taking one, 0x38 and 0x3C do +/// nothing; the members are `Item` (0x40: an `Integer` index and the return +/// pointer), `LBound`, `UBound` and `Count` (0x44-0x4C: the return pointer, +/// an `Integer` written through it). Only those four are described. +#[derive(Debug, Clone, Copy, Default, PartialEq, Eq)] +pub struct RuntimeInterfaces; + +impl RuntimeInterfaces { + /// The name given to the control-array object's interface. + pub const CONTROL_ARRAY: &'static str = "ControlArray"; + + /// The VBA library's `_ErrObject` interface, + /// `{A4C466B8-499F-101B-BB78-00AA00383CBB}` (`Err.Raise` at 0x44, + /// `Err.Clear` at 0x48). + pub const ERR_OBJECT: Guid = Guid { + bytes: [ + 0xB8, 0x66, 0xC4, 0xA4, 0x9F, 0x49, 0x1B, 0x10, 0xBB, 0x78, 0x00, 0xAA, 0x00, 0x38, + 0x3C, 0xBB, + ], + }; + + /// Returns the interface of the object a runtime export returns, for + /// the exports that return one fixed interface: `rtcErrObj` (`Err`) + /// returns `_ErrObject` (`tests/fixtures/flow`: its `VCallHresult`s on + /// that object name `_ErrObject`). + pub fn import_return(function: &str) -> Option { + (function == "rtcErrObj").then_some(Self::ERR_OBJECT) + } +} + +impl InterfaceCatalog for RuntimeInterfaces { + fn members(&self, iid: &Guid, vtable_offset: u16) -> Vec { + if iid.bytes != [0; 16] { + return Vec::new(); + } + let (name, invoke, arg_widths) = match vtable_offset { + 0x40 => ("Item", InvokeKind::Get, vec![1, 1]), + 0x44 => ("LBound", InvokeKind::Get, vec![1]), + 0x48 => ("UBound", InvokeKind::Get, vec![1]), + 0x4C => ("Count", InvokeKind::Get, vec![1]), + _ => return Vec::new(), + }; + vec![InterfaceMember { + interface: Self::CONTROL_ARRAY.to_string(), + name: name.to_string(), + invoke, + dispid: None, + arg_widths, + float_result: false, + returns_interface: None, + }] } +} - /// Resolves a VTableRef operand (`%v`). +impl<'a, 'p: 'a> CallResolver<'a, 'p> { + /// Collects the project's objects, methods, prototypes and vtable slots. /// - /// The `control` field indexes into the object's control array. - /// The `vtable_offset` is a byte offset into the control's COM vtable. - pub fn resolve_vtable( - &self, - vtable_offset: u16, - control_index: u16, - object: &VbObject<'a, '_>, - ) -> CallTarget { - let controls: Vec<_> = object - .controls() - .into_iter() - .flatten() - .filter_map(|r| match r { - Ok(c) => Some(c), - Err(e) => { - crate::trace::warn_drop!("call_resolver.vtable_controls", error = ?e); - None + /// The slots come from each object's method link table (see the module + /// documentation); an object without one falls back to its publics at + /// their [`FuncTypDesc`] offsets, then, for a class, its other methods in + /// method-table order. + /// + /// # Errors + /// + /// Returns an error if the project's object table cannot be read. + pub fn new(project: &'p VbProject<'a>) -> Result { + let mut objects = Vec::new(); + let mut by_proc_dsc = HashMap::new(); + for (object_index, object) in project.objects()?.enumerate() { + let object_index = u16::try_from(object_index).unwrap_or(u16::MAX); + objects.push(match object { + Ok(object) => Self::object_facts(&object, object_index, &mut by_proc_dsc), + Err(_) => ObjectFacts::default(), + }); + } + Ok(Self { + project, + objects, + by_proc_dsc, + interfaces: None, + }) + } + + /// Supplies the descriptions of external interfaces: a call that reaches + /// one ([`Callee::External`]) then resolves to [`Callee::Interface`] + /// with the member's argument widths. [`RuntimeInterfaces`] is + /// consulted first. + #[must_use] + pub fn with_interfaces(mut self, catalog: Arc) -> Self { + self.interfaces = Some(catalog); + self + } + + /// The signature of member `vtable_offset` of external interface `iid`: + /// from [`RuntimeInterfaces`] or the caller's catalog when one describes + /// it, else [`Callee::External`]. + fn external(&self, iid: Guid, vtable_offset: u16) -> CallSignature<'a> { + let mut members = RuntimeInterfaces.members(&iid, vtable_offset); + if members.is_empty() + && let Some(catalog) = &self.interfaces + { + members = catalog.members(&iid, vtable_offset); + } + let Some(first) = members.first() else { + return CallSignature { + callee: Callee::External { iid, vtable_offset }, + ..Self::unknown(Some(vtable_offset)) + }; + }; + let arg_widths = first.arg_widths.clone(); + CallSignature { + arg_slots: Some(arg_widths.iter().map(|&w| u16::from(w)).sum()), + float_result: Some(first.float_result), + arg_widths: Some(arg_widths), + signature: None, + callee: Callee::Interface { + iid, + vtable_offset, + members, + }, + } + } + + /// Collects one object's facts, recording its methods' ProcDscInfo VAs. + fn object_facts( + object: &VbObject<'a, 'p>, + object_index: u16, + by_proc_dsc: &mut HashMap, + ) -> ObjectFacts<'a> { + let mut iids: Vec = object.default_iids().map(|(_, guid)| guid).collect(); + iids.extend(Self::own_interface(object, object_index)); + let mut ftds: HashMap> = HashMap::new(); + if let Ok(iter) = object.func_type_descs() { + ftds.extend(iter); + } + let mut methods = Vec::new(); + let mut method_by_dsc = HashMap::new(); + if let Ok(iter) = object.methods() { + for (index, entry) in iter.enumerate() { + let index_u16 = u16::try_from(index).unwrap_or(u16::MAX); + let ftd = u32::try_from(index) + .ok() + .and_then(|i| ftds.get(&i).copied()); + let (arg_slots, float_result) = match &entry { + Ok(MethodEntry::PCode(method)) => { + by_proc_dsc.insert(method.proc_dsc_va(), (object_index, index_u16)); + method_by_dsc.insert(method.proc_dsc_va(), index_u16); + let slots = method + .proc_dsc() + .arg_size() + .ok() + .map(|bytes| (bytes / 4).saturating_sub(1)); + let float = method.instructions().ok().map(|iter| { + iter.flatten() + .any(|i| matches!(i.info.mnemonic, "ExitProcR4" | "ExitProcR8")) + }); + (slots, float) + } + _ => (None, None), + }; + methods.push(MethodFacts { + ftd, + arg_slots, + float_result, + }); + } + } + + // The designer's built-in interface and the control getters. + let builtin = object + .designer() + .map(|designer| (designer.interface_iid(), designer.builtin_vtable_size())); + let mut controls = HashMap::new(); + let mut named = Vec::new(); + if let Ok(iter) = object.controls() { + for control in iter.flatten() { + match control.index() { + Ok(0xFFFF) | Err(_) => {} + Ok(index) => named.push((index, control.name().into_owned())), } + } + } + // A control with no event handler has no ControlInfo; the form data + // names every control by the same index (`activex` + // `CommonDialog1`, getter 0x318). + let form_data = object.project().gui_entries().ok().and_then(|mut entries| { + entries.find_map(|entry| { + (entry.object_index().ok()? == u32::from(object_index)) + .then(|| object.form_data_from_gui_entry(&entry)) + .flatten() }) - .collect(); + }); + if let Some(form_data) = form_data { + for record in form_data.controls() { + let index = u16::from(record.cid()); + if !named.iter().any(|(known, _)| *known == index) { + named.push((index, record.name().into_owned())); + } + } + } + if let Some((_, size)) = builtin { + for (index, name) in named { + if let Some(offset) = index.checked_mul(4).and_then(|o| o.checked_add(size)) { + controls.insert(offset, (index, name)); + } + } + } - let control_name = controls.get(control_index as usize).and_then(|ctrl| { - let name = ctrl.name(); - if name.is_empty() { - None - } else { - Some(name.into_owned()) + // The object's own slots, in method-link order. + let links = Self::links(object); + let mut by_vtable = HashMap::new(); + let mut variables = HashMap::new(); + // The base: a public method's FuncTypDesc offset less its link + // position, else the slot after `IDispatch`'s 7 and the inherited + // ones (OptionalObjectInfo +0x2A), as the runtime lays it out. + let base = links + .iter() + .enumerate() + .find_map(|(k, link)| { + let Link::Procedure(dsc) = link else { + return None; + }; + let method = method_by_dsc.get(dsc)?; + let offset = methods + .get(usize::from(*method))? + .ftd? + .vtable_offset() + .ok()?; + offset.checked_sub(u16::try_from(k).ok()?.checked_mul(4)?) + }) + .or_else(|| { + let inherited = object + .optional_info() + .and_then(|opt| opt.inherited_vtable_slots().ok()) + .unwrap_or(0); + inherited.checked_mul(4)?.checked_add(CLASS_USER_BASE) + }); + if let Some(base) = base + && !links.is_empty() + { + for (k, link) in links.into_iter().enumerate() { + let Some(offset) = u16::try_from(k) + .ok() + .and_then(|k| k.checked_mul(4)) + .and_then(|o| o.checked_add(base)) + else { + break; + }; + match link { + Link::Procedure(dsc) => { + if let Some(&method) = method_by_dsc.get(&dsc) { + by_vtable.insert(offset, method); + } + } + Link::Variable { + offset: field, + function, + } => { + variables.insert(offset, (field, function)); + } + Link::Empty | Link::Other => {} + } } - }); + } else { + // No link table: the publics at their FuncTypDesc offsets, then a + // class's other methods in method-table order. + let mut last = None; + for (index, method) in methods.iter().enumerate() { + if let Some(offset) = method.ftd.and_then(|f| f.vtable_offset().ok()) { + by_vtable.insert(offset, u16::try_from(index).unwrap_or(u16::MAX)); + last = last.max(Some(offset)); + } + } + if builtin.is_none() + && let Some(mut offset) = last + { + for (index, method) in methods.iter().enumerate() { + if method.ftd.is_none() { + offset = offset.saturating_add(4); + by_vtable.insert(offset, u16::try_from(index).unwrap_or(u16::MAX)); + } + } + } + } + ObjectFacts { + iids, + methods, + by_vtable, + controls, + variables, + builtin, + info_va: object.descriptor().object_info_va().unwrap_or(0), + } + } + + /// The IID of a form's or UserControl's own full interface: the form + /// data header's GUID at +0x15, found through the GUI table entry whose + /// [`object_index`](crate::vb::guitable::GuiTableEntry::object_index) is + /// the object's. + fn own_interface(object: &VbObject<'a, 'p>, object_index: u16) -> Option { + object + .project() + .gui_entries() + .ok()? + .find(|entry| entry.object_index().ok() == Some(u32::from(object_index))) + .and_then(|entry| object.form_data_from_gui_entry(&entry)) + .and_then(|data| data.header().secondary_guid()) + } + + /// Reads the object's method link table ([`VbObject::method_links`]), + /// naming the runtime function each variable accessor jumps to. + fn links(object: &VbObject<'a, 'p>) -> Vec { + let project = object.project(); + let map = project.address_map(); + // The runtime function behind an import thunk (`jmp [IAT slot]`). + let function = |thunk_va: u32| { + map.slice_from_va(thunk_va, 6) + .ok() + .and_then(|code| match code { + [0xFF, 0x25, s0, s1, s2, s3, ..] => project + .imports() + .by_slot(u32::from_le_bytes([*s0, *s1, *s2, *s3])), + _ => None, + }) + .map(|import| import.function().into_owned()) + .unwrap_or_default() + }; + let Ok(links) = object.method_links() else { + return Vec::new(); + }; + links + .map(|link| match link.map(|link| link.kind) { + Ok(MethodLinkKind::Empty) => Link::Empty, + Ok(MethodLinkKind::Procedure { proc_dsc_va }) => Link::Procedure(proc_dsc_va), + Ok(MethodLinkKind::Variable { offset, thunk_va }) => Link::Variable { + offset, + function: function(thunk_va), + }, + Ok(MethodLinkKind::Jump | MethodLinkKind::Other) | Err(_) => Link::Other, + }) + .collect() + } + + /// Resolves the call `instruction` makes from a procedure of object + /// `object` (an index of [`VbProject::objects`]). + /// + /// Returns `None` for an instruction that is not a call. + pub fn resolve(&self, object: u16, instruction: &Instruction) -> Option> { + let OpcodeSemantics::Call { kind } = instruction.info.semantics else { + return None; + }; + let pool = VbObject::parse(self.project, object) + .ok() + .and_then(|o| o.constants_pool().ok()); + let operands: Vec = instruction.operands.iter().flatten().copied().collect(); + Some(match kind { + CallKind::VCall | CallKind::ThisVCall => self.vtable_call(object, instruction, pool), + CallKind::ImpAdCall => self.address_call(instruction, &operands, pool), + CallKind::LateCall => Self::late_call(instruction, &operands, pool), + CallKind::Event => Self::event_call(instruction, &operands), + CallKind::Other => Self::unknown(None), + }) + } + + /// A call nothing more is known of. + fn unknown(vtable_offset: Option) -> CallSignature<'a> { + CallSignature { + callee: Callee::Unknown { vtable_offset }, + arg_slots: None, + arg_widths: None, + signature: None, + float_result: None, + } + } - CallTarget::VTableMethod { - control_name, - vtable_offset, + /// The signature of method `method` of object `object`. + fn procedure(&self, object: u16, method: u16) -> CallSignature<'a> { + let facts = self + .objects + .get(usize::from(object)) + .and_then(|o| o.methods.get(usize::from(method))); + let ftd = facts.and_then(|m| m.ftd); + let arg_widths = ftd.and_then(|f| { + let mut widths: Vec = f.arg_types().iter().map(|t| t.slots()).collect(); + widths.extend(f.return_type().map(ArgType::slots)); + (widths.len() == usize::from(f.entry_count())).then_some(widths) + }); + let arg_slots = ftd + .and_then(|f| f.arg_slots()) + .or_else(|| facts.and_then(|m| m.arg_slots)); + CallSignature { + callee: Callee::Procedure { object, method }, + arg_slots, + arg_widths, + signature: ftd, + float_result: facts.and_then(|m| m.float_result), } } - /// Resolves a ControlIndex operand (`%c`) to a name. + /// Resolves the slot at `offset` in the vtable of project object + /// `object`: the call a `VCall*` makes when its receiver (Pr) is known to + /// be an instance of that object. /// - /// For `ImpAdCall*` opcodes the `%c` operand identifies the import. - /// This method tries to resolve it via the external table. - pub fn resolve_import_index(&self, index: u16) -> CallTarget { - self.imports.resolve_import_index(index) + /// The slot is one of the object's methods ([`Callee::Procedure`]), a + /// control getter ([`Callee::Control`]), a member variable accessor + /// ([`Callee::Variable`]) or, below a designer object's own slots, a + /// member of its built-in interface ([`Callee::External`] with + /// `_Form`'s, `_UserControl`'s ... IID). Returns [`Callee::Unknown`] + /// otherwise. + pub fn resolve_vtable(&self, object: u16, offset: u16) -> CallSignature<'a> { + let Some(facts) = self.objects.get(usize::from(object)) else { + return Self::unknown(Some(offset)); + }; + if let Some(&method) = facts.by_vtable.get(&offset) { + return self.procedure(object, method); + } + if let Some((index, name)) = facts.controls.get(&offset) { + return CallSignature { + callee: Callee::Control { + object, + index: *index, + name: name.clone(), + }, + arg_slots: Some(0), + arg_widths: Some(Vec::new()), + signature: None, + float_result: Some(false), + }; + } + if let Some((field, function)) = facts.variables.get(&offset) { + // GetMem*: the [out, retval] pointer. PutMem8 (a Double, Date or + // Currency): the 8-byte value, two slots (`ret 0xC` with + // `this`). Every other PutMem* / SetMem*: one slot, the value or, + // for a Variant, its address (`ret 8`; `tests/fixtures/members`). + let width: u8 = if function == "PutMem8" { 2 } else { 1 }; + return CallSignature { + callee: Callee::Variable { + object, + offset: *field, + function: function.clone(), + }, + arg_slots: Some(u16::from(width)), + arg_widths: Some(vec![width]), + signature: None, + float_result: Some(false), + }; + } + if let Some((iid, size)) = facts.builtin + && offset < size + { + return self.external(iid, offset); + } + Self::unknown(Some(offset)) + } + + /// Resolves `instruction` like [`resolve`](Self::resolve), with what + /// the caller knows of Pr, the object register: a `VCall*` whose Pr was + /// loaded by `FLdPrThis` ([`PrSource::Me`]) or from `ebp+8` (`FLdPr` of + /// the `Me` slot) calls the calling object's own vtable, such as the + /// control getters of a form (`FLdPrThis`, `VCallAd 0x02FC`). + pub fn resolve_with_pr( + &self, + object: u16, + instruction: &Instruction, + pr: Option<&PrSource>, + ) -> Option> { + let resolved = self.resolve(object, instruction)?; + // `ebp+8` is `Me` in an object's method; in a module's procedure it + // is the module's data block. + let is_module = VbObject::parse(self.project, object) + .ok() + .and_then(|o| o.object_type_flags().ok()) + .is_none_or(|flags| flags.is_module()); + let is_me = match pr { + Some(PrSource::Me) => true, + Some(PrSource::Frame { offset: 8 }) => !is_module, + _ => false, + }; + match resolved.callee { + Callee::Unknown { + vtable_offset: Some(offset), + } if is_me && instruction.info.receiver == Receiver::Pr => { + Some(self.resolve_vtable(object, offset)) + } + _ => Some(resolved), + } + } + + /// `VCall*` / `ThisVCall*`. + fn vtable_call( + &self, + object: u16, + instruction: &Instruction, + pool: Option>, + ) -> CallSignature<'a> { + let (offset, interface) = match instruction.operands.first() { + Some(Some(Operand::VTableRef { offset, interface })) => (*offset, Some(*interface)), + Some(Some(Operand::Int16(offset))) => (*offset as u16, None), + _ => return Self::unknown(None), + }; + // ThisVCall: Me is an instance of the calling object. + if instruction.info.receiver == Receiver::Me { + return self.resolve_vtable(object, offset); + } + // VCallHresult: the IID names the interface. + let Some(iid) = interface.and_then(|i| pool.as_ref()?.guid_at(i).ok().flatten()) else { + return Self::unknown(Some(offset)); + }; + self.interface_vtable(iid, offset) + } + + /// Member `offset` of interface `iid`: a project object's vtable when the + /// IID is one of its own, else an external interface. + fn interface_vtable(&self, iid: Guid, offset: u16) -> CallSignature<'a> { + match self + .objects + .iter() + .position(|facts| facts.iids.contains(&iid)) + { + Some(index) => self.resolve_vtable(u16::try_from(index).unwrap_or(u16::MAX), offset), + None => self.external(iid, offset), + } } - /// Returns the underlying address map for custom resolution. - pub fn address_map(&self) -> &AddressMap<'a> { - self.project.address_map() + /// Returns the interface of the object a resolved call returns: a + /// catalog member's [`InterfaceMember::returns_interface`], a project + /// method whose prototype returns one of the project's classes (that + /// class's default interface), or a runtime export with a fixed object + /// return ([`RuntimeInterfaces::import_return`]). + pub fn returned_interface(&self, call: &CallSignature<'_>) -> Option { + match &call.callee { + Callee::Interface { members, .. } => members.first()?.returns_interface, + Callee::Import { function, .. } => RuntimeInterfaces::import_return(function), + Callee::Procedure { .. } => { + let returns = call.signature.as_ref()?.return_type()?; + let info_va = returns + .object_va() + .filter(|_| returns.code() & 0x5F == 0x13)?; + self.objects + .iter() + .find(|facts| facts.info_va == info_va)? + .iids + .first() + .copied() + } + _ => None, + } + } + + /// Resolves `instruction` like [`resolve_with_pr`](Self::resolve_with_pr), + /// and a `VCall*` that carries no IID (the typed forms, `VCallUI1`, + /// `VCallFPR8`, ...) through the interface `slots` know for the frame + /// slot Pr was loaded from. + pub fn resolve_with_slots( + &self, + object: u16, + instruction: &Instruction, + pr: Option<&PrSource>, + slots: &SlotInterfaces, + ) -> Option> { + let resolved = self.resolve_with_pr(object, instruction, pr)?; + match resolved.callee { + Callee::Unknown { + vtable_offset: Some(offset), + } if instruction.info.receiver == Receiver::Pr => { + match slots.for_pr_at(pr, instruction.offset) { + Some(iid) => Some(self.interface_vtable(iid, offset)), + None => Some(resolved), + } + } + _ => Some(resolved), + } + } + + /// Simulates a procedure's stacks ([`ProcedureStack::simulate`]) with + /// the interfaces its frame slots hold: it alternates simulation and + /// [`SlotInterfaces::infer`] until they agree (a resolved call can + /// reach code a cut hid), at most four rounds. + pub fn simulate_procedure( + &self, + object: u16, + code: &[Instruction], + bytes: &[u8], + ) -> (ProcedureStack, SlotInterfaces) { + self.simulate_procedure_seeded(object, code, bytes, &SlotInterfaces::default()) + } + + /// Simulates a procedure like + /// [`simulate_procedure`](Self::simulate_procedure), starting from the + /// slot interfaces `seed` gives ([`SlotInterfaces::infer_seeded`]): for + /// instance a procedure's entry of [`ProjectSlots`]. + pub fn simulate_procedure_seeded( + &self, + object: u16, + code: &[Instruction], + bytes: &[u8], + seed: &SlotInterfaces, + ) -> (ProcedureStack, SlotInterfaces) { + let mut slots = seed.clone(); + let mut stack = ProcedureStack::simulate(code, bytes, &|insn, pr| { + self.resolve_with_slots(object, insn, pr, &slots) + }); + for _ in 0..4 { + let next = SlotInterfaces::infer_seeded(self, object, code, &stack, seed); + if next == slots { + break; + } + slots = next; + stack = ProcedureStack::simulate(code, bytes, &|insn, pr| { + self.resolve_with_slots(object, insn, pr, &slots) + }); + } + (stack, slots) + } + + /// Infers the frame-slot interfaces of every P-Code procedure of the + /// project ([`ProjectSlots`]): each procedure is simulated + /// ([`simulate_procedure_seeded`](Self::simulate_procedure_seeded)), the + /// interfaces its calls' arguments carry seed its callees' parameters + /// and its callers' argument slots, and the procedures are simulated + /// again until the seeds settle (at most eight rounds). + pub fn infer_project_slots(&self) -> ProjectSlots { + let mut procedures: Vec<(u16, u16, Vec, &'a [u8])> = Vec::new(); + if let Ok(objects) = self.project.objects() { + for (object, entry) in objects.enumerate() { + let (Ok(object), Ok(entry)) = (u16::try_from(object), entry) else { + continue; + }; + let Ok(methods) = entry.methods() else { + continue; + }; + for (method, method_entry) in methods.enumerate() { + if let (Ok(method), Ok(MethodEntry::PCode(pcode))) = + (u16::try_from(method), method_entry) + && let Ok(code) = pcode.instructions() + { + procedures.push(( + object, + method, + code.flatten().collect(), + pcode.pcode_bytes(), + )); + } + } + } + } + let mut seeds: HashMap<(u16, u16), SlotInterfaces> = HashMap::new(); + let mut result = ProjectSlots::default(); + for _ in 0..8 { + let simulated: Vec<(ProcedureStack, SlotInterfaces)> = procedures + .iter() + .map(|(object, method, code, bytes)| { + let seed = seeds.get(&(*object, *method)).cloned().unwrap_or_default(); + self.simulate_procedure_seeded(*object, code, bytes, &seed) + }) + .collect(); + result.procedures = procedures + .iter() + .zip(&simulated) + .map(|((object, method, ..), (_, slots))| ((*object, *method), slots.clone())) + .collect(); + let mut next: HashMap<(u16, u16), SlotInterfaces> = HashMap::new(); + for ((object, method, code, _), (stack, slots)) in procedures.iter().zip(&simulated) { + let caller = (*object, *method); + let mut last_load: Option = None; + for (index, insn) in code.iter().enumerate() { + let pr = match stack.instructions.get(index) { + Some( + InstructionStack::Reached { pr, .. } | InstructionStack::Cut { pr, .. }, + ) => *pr, + _ => last_load, + }; + if let Some(source) = insn.pr_source() { + last_load = Some(source); + } + let Some(Callee::Procedure { + object: callee_object, + method: callee_method, + }) = self + .resolve_with_slots(*object, insn, pr.as_ref(), slots) + .map(|call| call.callee) + else { + continue; + }; + let callee = (callee_object, callee_method); + for (slot, parameter) in SlotInterfaces::passed_slots(code, stack, index) { + if let Some(iid) = slots.get(slot) { + next.entry(callee).or_default().add(parameter, iid); + } + if let Some(iid) = result + .get(callee.0, callee.1) + .and_then(|s| s.get(parameter)) + { + next.entry(caller).or_default().add(slot, iid); + } + } + } + } + if next == seeds { + break; + } + seeds = next; + } + result + } + + /// `ImpAdCall*`: the procedure address in the pool, the exact byte count. + fn address_call( + &self, + instruction: &Instruction, + operands: &[Operand], + pool: Option>, + ) -> CallSignature<'a> { + let StackRule::ArgBytes { operand } = instruction.info.stack else { + return Self::unknown(None); + }; + let Some(&Operand::ExternalCall { import, arg_bytes }) = operands.get(usize::from(operand)) + else { + return Self::unknown(None); + }; + let arg_slots = Some(arg_bytes / 4); + match pool.and_then(|p| p.entry_at(import).ok()) { + Some(PoolEntry::Procedure { proc_dsc_va }) => { + match self.by_proc_dsc.get(&proc_dsc_va) { + Some(&(object, method)) => CallSignature { + arg_slots, + ..self.procedure(object, method) + }, + None => CallSignature { + arg_slots, + ..Self::unknown(None) + }, + } + } + Some(PoolEntry::Declare(stub)) => { + let map = self.project.address_map(); + let text = |b: Result<&[u8], Error>| { + b.map(|b| String::from_utf8_lossy(b).into_owned()) + .unwrap_or_default() + }; + CallSignature { + callee: Callee::Declare { + library: text(stub.library_name_bytes(map)), + function: text(stub.function_name_bytes(map)), + }, + arg_slots, + ..Self::unknown(None) + } + } + Some(PoolEntry::Import { iat_va }) => match self.project.imports().by_slot(iat_va) { + Some(import) => CallSignature { + callee: Callee::Import { + library: import.library.clone(), + function: import.function().into_owned(), + ordinal: match import.symbol { + ImportSymbol::Ordinal(ordinal) => Some(ordinal), + ImportSymbol::Name(_) => None, + }, + }, + arg_slots, + arg_widths: import.runtime_export().and_then(|export| { + let widths: Vec = export + .params + .iter() + .map(|param| match param.ty { + VbParamType::Double | VbParamType::Int64 => 2, + _ => 1, + }) + .collect(); + let known = export.params.iter().all(|p| p.ty != VbParamType::Unknown); + let slots: u16 = widths.iter().map(|&w| u16::from(w)).sum(); + (known && Some(slots) == arg_slots).then_some(widths) + }), + float_result: import.runtime_export().and_then(|export| { + match export.return_type { + VbParamType::Float | VbParamType::Double => Some(true), + VbParamType::Unknown => None, + _ => Some(false), + } + }), + ..Self::unknown(None) + }, + None => CallSignature { + arg_slots, + ..Self::unknown(None) + }, + }, + _ => CallSignature { + arg_slots, + ..Self::unknown(None) + }, + } + } + + /// `RaiseEvent` (0x6610a847): the runtime calls the sinks with `Me`, + /// the event id and the Variants by value the instruction pops. + fn event_call(instruction: &Instruction, operands: &[Operand]) -> CallSignature<'a> { + let id = operands.iter().find_map(|operand| match *operand { + Operand::Int32(id) => Some(id), + _ => None, + }); + let argc = match instruction.info.stack { + StackRule::Variants { operand } => match operands.get(usize::from(operand)) { + Some(Operand::Int16(n)) => u16::try_from(*n).ok(), + _ => None, + }, + _ => None, + }; + CallSignature { + callee: id.map_or( + Callee::Unknown { + vtable_offset: None, + }, + |id| Callee::Event { id }, + ), + arg_slots: argc.map(|n| n.saturating_mul(4)), + arg_widths: argc.map(|n| vec![4; usize::from(n)]), + signature: None, + float_result: Some(false), + } + } + + /// `Late*`: Variants by value, four slots each. + fn late_call( + instruction: &Instruction, + operands: &[Operand], + pool: Option>, + ) -> CallSignature<'a> { + let mut name = None; + let mut dispid = None; + for operand in operands { + match *operand { + Operand::ConstPoolIndex(index) if name.is_none() => { + name = pool.as_ref().and_then(|p| p.name_at(index).ok().flatten()); + } + Operand::Int32(id) if dispid.is_none() => dispid = Some(id), + _ => {} + } + } + let argc = match instruction.info.stack { + StackRule::Variants { operand } => match operands.get(usize::from(operand)) { + Some(Operand::Int16(n)) => Some(*n as u16), + _ => None, + }, + _ => Some(0), + }; + CallSignature { + callee: Callee::Late { name, dispid }, + arg_slots: argc.map(|n| n.saturating_mul(4)), + arg_widths: argc.map(|n| vec![4; usize::from(n)]), + signature: None, + float_result: Some(false), + } } } -/// Formats as `LIB!Func` for API calls, `ctrl.vtbl+0xOFFSET` for vtable -/// methods, or the import name for import references. -impl core::fmt::Display for CallTarget { - fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result { +/// Formats as `LIB!Func` for API calls, `{iid}+0xOFFSET` for external +/// members, the member for late-bound calls. +impl fmt::Display for Callee { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { - Self::Api { library, function } => write!(f, "{library}!{function}"), - Self::VTableMethod { - control_name, - vtable_offset, + Self::Procedure { object, method } => write!(f, "object{object}.method{method}"), + Self::Declare { library, function } + | Self::Import { + library, function, .. } => { - if let Some(name) = control_name { - write!(f, "{name}.vtbl+0x{vtable_offset:04X}") - } else { - write!(f, "vtbl+0x{vtable_offset:04X}") - } + write!(f, "{library}!{function}") } - Self::ImportRef { name: Some(n) } => write!(f, "{n}"), - Self::ImportRef { name: None } => write!(f, ""), - Self::Unknown => write!(f, ""), + Self::External { iid, vtable_offset } => write!(f, "{iid}+0x{vtable_offset:04X}"), + Self::Interface { members, .. } => match members.first() { + Some(member) => write!(f, "{}.{}", member.interface, member.name), + None => f.write_str(""), + }, + Self::Control { object, name, .. } => write!(f, "object{object}.{name}"), + Self::Variable { + object, + offset, + function, + } => write!(f, "object{object}.var_{offset:X}:{function}"), + Self::Event { id } => write!(f, "event#{id}"), + Self::Late { + name: Some(name), .. + } => write!(f, "late:{name}"), + Self::Late { + dispid: Some(id), .. + } => write!(f, "late:#{id}"), + Self::Late { .. } => write!(f, "late:?"), + Self::Unknown { + vtable_offset: Some(o), + } => write!(f, "vtbl+0x{o:04X}"), + Self::Unknown { + vtable_offset: None, + } => write!(f, ""), } } } diff --git a/src/pcode/decoder.rs b/src/pcode/decoder.rs index 98e41bf..ddbdd8c 100644 --- a/src/pcode/decoder.rs +++ b/src/pcode/decoder.rs @@ -13,10 +13,15 @@ use std::fmt; use crate::{ error::Error, - pcode::opcode::{self, OpcodeInfo}, - pcode::operand::{self, Operand}, - pcode::semantics::PCodeDataType, - util::read_u16_le, + pcode::{ + calltarget::CallSignature, + movement::Movement, + opcode::{self, OpcodeInfo, PrLoad, StackRule}, + operand::{self, Operand}, + semantics::{OpcodeSemantics, PCodeDataType}, + stackeffect::{Pop, PrSource, Push, StackEffect}, + }, + util::{read_i16_le, read_u16_le}, }; /// Maximum sentinel raw length when an instruction's byte span exceeds `u8::MAX`. @@ -66,20 +71,22 @@ impl Instruction { self.info.data_type } - /// Returns the inferred type of the operand at slot `index`, if any. - /// - /// Today this projects the parent opcode's - /// [`data_type`](Self::data_type) for every operand slot - VB6 P-Code - /// opcodes are monomorphic in their operand kinds (a `LitI4` always - /// produces `I4`, an `FStR8` always stores `R8`), so the per-operand - /// type equals the per-instruction type when one is defined. The - /// per-slot signature is preserved so future revisions can refine it - /// to per-operand types (for example, `Convert { from, to }` opcodes - /// where the source operand has a different type than the result). + /// Returns the VB type the instruction fixes + /// ([`OpcodeInfo::value_type`]): an operation's operand type, a + /// conversion's target, an x87 move's float type; `None` for a move that + /// names only a width, whose type comes from where its value goes. + #[inline] + pub fn value_type(&self) -> Option { + self.info.value_type + } + + /// Returns the opcode's [`data_type`](Self::data_type) for an operand + /// slot that holds an operand. /// - /// Returns `None` for out-of-range `index`, for empty operand slots, - /// and for opcodes whose [`OpcodeInfo::data_type`] is `None` - /// (control flow, stack manipulation, debug markers). + /// The opcode tables type the instruction, not each operand: this is + /// the instruction's type for every operand present. Returns `None` for + /// an out-of-range `index`, an empty slot, and an opcode with no + /// [`OpcodeInfo::data_type`]. #[inline] pub fn operand_type(&self, index: usize) -> Option { // Validate the slot exists and carries an operand. @@ -113,29 +120,323 @@ impl Instruction { } } - /// Classifies a `Resume` / `OnErrorGoto` instruction's signed operand into - /// the source-level error-flow construct it encodes. + /// Returns the code offsets this instruction can transfer control to. + /// + /// Covers `%l` operands - except the sentinels of `OnErrorGoto` (`0`, + /// `0xFFFF`, `0xFFFE`) and `Resume` (`0xFFFF`, `0xFFFE`), which are no + /// offsets (see + /// [`error_flow`](Self::error_flow)) - and the entries of an `On ... GoTo` + /// jump table, read from `code`, the procedure's P-Code the instruction + /// was decoded from. + pub fn jump_targets<'a>(&'a self, code: &'a [u8]) -> impl Iterator + 'a { + let semantics = self.info.semantics; + let sentinel = move |target: u16| match semantics { + OpcodeSemantics::OnError => target == 0 || target >= 0xFFFE, + OpcodeSemantics::Resume => target >= 0xFFFE, + _ => false, + }; + self.operands.iter().flatten().flat_map( + move |operand| -> Box + 'a> { + match *operand { + Operand::JumpTarget(t) if !sentinel(t) => Box::new(std::iter::once(t)), + Operand::JumpTable { at, count } => Box::new( + (0..usize::from(count)) + .map(move |i| usize::from(at).saturating_add(i.saturating_mul(2))) + .filter_map(move |pos| read_u16_le(code, pos).ok()), + ), + _ => Box::new(std::iter::empty()), + } + }, + ) + } + + /// Returns what the instruction does to the evaluation stack, the x87 + /// stack and Pr. + /// + /// The fixed part comes from the opcode table + /// ([`OpcodeInfo::popped`]); the operand-dependent part + /// ([`OpcodeInfo::stack`]) from the operands: 4-slot Variants for a + /// late-bound call's arguments, one slot per array index, two per + /// `ReDim` dimension. A call's arguments come from `call`, the + /// [`CallSignature`] of its callee: /// - /// These opcodes carry a `%l` operand that is a **signed** `i16`: positive - /// values are P-Code offsets (a label/handler target), while the sentinels - /// `-1` (`0xFFFF`) and `-2` (`0xFFFE`) select the `Next` / bare / disable - /// forms. Verified against the runtime `op_Lead2_Resume` (Resume) and - /// `op_OnErrorGoto` (handler-address math) in MSVBVM60.DLL. + /// - `VCall*` / `ThisVCall*` ([`StackRule::Callee`]): the callee's + /// argument widths, else its slot count ([`Pop::Slots`]), else + /// [`Pop::Unknown`]; + /// - `ImpAdCall*` ([`StackRule::ArgBytes`]): the operand's byte count, + /// exact whatever the callee, split into the callee's argument widths + /// when they add up to it. + /// + /// A call that leaves the x87 stack to its callee + /// ([`OpcodeInfo::fpu_callee`]) pushes an x87 value when + /// [`CallSignature::float_result`] is `Some(true)`, nothing when it is + /// `Some(false)`, and [`Push::MaybeX87`] without a signature. + /// + /// A `GoSub` pushes the return position (one slot) that its `Return` + /// pops, so inside a `GoSub` body the stack is one slot deeper than at + /// the `GoSub`. + pub fn stack_effect(&self, call: Option<&CallSignature<'_>>) -> StackEffect { + let info = self.info; + let rule: Vec = match info.stack { + StackRule::Fixed => Vec::new(), + StackRule::Callee => match call { + Some(CallSignature { + arg_widths: Some(widths), + .. + }) => widths.iter().map(|&w| Pop::Eval(w)).collect(), + Some(CallSignature { + arg_slots: Some(slots), + .. + }) => vec![Pop::Slots(*slots)], + _ => vec![Pop::Unknown], + }, + StackRule::ArgBytes { operand } => match self.operands.get(usize::from(operand)) { + Some(Some(Operand::ExternalCall { arg_bytes, .. })) => { + let slots = arg_bytes / 4; + match call.and_then(|c| c.arg_widths.as_ref()) { + Some(widths) + if widths.iter().map(|&w| u16::from(w)).sum::() == slots => + { + widths.iter().map(|&w| Pop::Eval(w)).collect() + } + _ => vec![Pop::Slots(slots)], + } + } + _ => vec![Pop::Unknown], + }, + StackRule::Variants { operand } => self.repeat(operand, 1, Pop::Eval(4)), + StackRule::Count { operand } => self.repeat(operand, 1, Pop::Eval(1)), + StackRule::Pairs { operand } => self.repeat(operand, 2, Pop::Eval(1)), + StackRule::PairsAtLeastOne { operand } => match self.count_operand(operand) { + Some(n) => vec![Pop::Eval(1); usize::from(n.max(1)).saturating_mul(2)], + None => vec![Pop::Unknown], + }, + StackRule::Bytes { operand } => match self.count_operand(operand) { + Some(bytes) => vec![Pop::Slots(bytes.saturating_sub(4) / 4)], + None => vec![Pop::Unknown], + }, + }; + let at = usize::from(info.rule_at).min(info.popped.len()); + let (before, after) = info.popped.split_at(at); + let popped = before + .iter() + .copied() + .chain(rule) + .chain(after.iter().copied()) + .collect(); + let pushed = if info.pushes > 0 { + Some(Push::Eval(u8::try_from(info.pushes).unwrap_or(0))) + } else if info.fpu_push > 0 { + Some(Push::X87) + } else if info.fpu_callee { + match call.and_then(|c| c.float_result) { + Some(true) => Some(Push::X87), + Some(false) => None, + None => Some(Push::MaybeX87), + } + } else { + None + }; + StackEffect { + popped, + pushed, + receiver: info.receiver, + pr: self.pr_source(), + } + } + + /// Returns where the instruction loads Pr, the object register, from, + /// with the operands that locate the object; `None` if it does not load + /// Pr ([`OpcodeInfo::pr_load`]). + pub fn pr_source(&self) -> Option { + let operand = |index: usize| self.operands.get(index).copied().flatten(); + let frame = |index: usize| match operand(index) { + Some(Operand::StackVar(offset)) => Some(offset), + _ => None, + }; + let int16 = |index: usize| match operand(index) { + Some(Operand::Int16(value)) => Some(value), + _ => None, + }; + let pool = |index: usize| match operand(index) { + Some(Operand::ConstPoolIndex(value)) => Some(value), + _ => None, + }; + Some(match self.info.pr_load? { + PrLoad::Frame => PrSource::Frame { offset: frame(0)? }, + PrLoad::Me => PrSource::Me, + PrLoad::Pool => PrSource::Pool { index: pool(0)? }, + PrLoad::FrameIndirect => PrSource::FrameIndirect { offset: frame(0)? }, + PrLoad::PrMember => PrSource::PrMember { + offset: int16(0)?.cast_unsigned(), + }, + PrLoad::FrameMember => PrSource::FrameMember { + frame: frame(0)?, + offset: int16(1)?.cast_unsigned(), + }, + PrLoad::ArrayElement => PrSource::ArrayElement, + PrLoad::Variant => PrSource::Variant, + PrLoad::NewIfNull => PrSource::NewIfNull { class: pool(0)? }, + PrLoad::WithMember => PrSource::WithMember { offset: int16(0)? }, + PrLoad::LateGet => PrSource::LateGet { + dispid: match operand(1) { + Some(Operand::Int32(value)) => value, + _ => return None, + }, + object: frame(2)?, + temp: frame(0)?, + }, + }) + } + + /// Returns operand `index` as a count: an unsigned `%2` or `%1`. + fn count_operand(&self, index: u8) -> Option { + match self.operands.get(usize::from(index))? { + Some(Operand::Int16(n)) => u16::try_from(*n).ok(), + Some(Operand::Byte(n)) => Some(u16::from(*n)), + _ => None, + } + } + + /// `per` copies of `pop` for each unit of count operand `index`. + fn repeat(&self, index: u8, per: usize, pop: Pop) -> Vec { + match self.count_operand(index) { + Some(n) => vec![pop; usize::from(n).saturating_mul(per)], + None => vec![Pop::Unknown], + } + } + + /// Returns what a load, store or literal instruction moves, with its + /// operands resolved ([`Movement::of`]); `None` for other instructions. + pub fn movement(&self) -> Option { + Movement::of(self) + } + + /// Returns every frame slot (offset from ebp) the instruction names, in + /// order: its `%a` operands and the slots of an `FFree*` payload + /// ([`Operand::FrameList`], read from `code`, the procedure's P-Code). + /// + /// A `GetRecOwner*` / `PutRecOwner*` payload is an inline record + /// descriptor the runtime reads (its address is passed to the helper), + /// not frame slots; no fixture emits those opcodes. + pub fn frame_slots(&self, code: &[u8]) -> Vec { + let mut slots = Vec::new(); + for operand in self.operands.iter().flatten() { + match *operand { + Operand::StackVar(offset) => slots.push(offset), + Operand::FrameList { at, count } => slots.extend( + (0..usize::from(count)) + .map_while(|i| usize::from(at).checked_add(i.checked_mul(2)?)) + .map_while(|pos| read_i16_le(code, pos).ok()), + ), + _ => {} + } + } + slots + } + + /// Returns how an `ExitProc*` instruction returns its procedure's result + /// ([`ProcedureReturn`]); `None` for any other instruction. + pub fn procedure_return(&self) -> Option { + /// The interpreter's slots end here; the locals start below. + const TOP: i16 = -0x84; + // The copy (0x6610640a) aligns its source down to an even address. + let even = |offset: i16| offset & !1; + let operand = |index: usize| match self.operands.get(index).copied().flatten() { + Some(Operand::Int16(value) | Operand::StackVar(value)) => Some(value), + _ => None, + }; + // A width code: 1, 2, 4, else 8 bytes. + let width = |code: i16| match code { + 1 => 1u8, + 2 => 2, + 4 => 4, + _ => 8, + }; + let register = |from: i16, bytes: u8| ProcedureReturn::Register { + from, + bytes, + signed: false, + }; + Some(match self.info.mnemonic { + "ExitProc" | "ExitProcStr" => register(-0x88, 4), + "ExitProcI2" => ProcedureReturn::Register { + from: -0x86, + bytes: 2, + signed: true, + }, + "ExitProcUI1" => register(-0x86, 1), + "ExitProcCy" => register(-0x8C, 8), + "ExitProcR4" => ProcedureReturn::X87 { + from: -0x88, + bytes: 4, + }, + "ExitProcR8" => ProcedureReturn::X87 { + from: -0x8C, + bytes: 8, + }, + "ExitProcHresult" => ProcedureReturn::Hresult, + "ExitProcCbStack" => { + let bytes = width(operand(0)?); + register(TOP.saturating_sub(i16::from(bytes)), bytes) + } + "ExitProcFrameCbStack" => register(operand(0)?, width(operand(1)?)), + "ExitProcCbHresult" => { + let bytes = operand(1)?; + ProcedureReturn::CopyToRetval { + from: even(TOP.saturating_sub(bytes)), + bytes: bytes.cast_unsigned(), + retval_arg: operand(0)?, + } + } + "ExitProcFrameCbHresult" => ProcedureReturn::CopyToRetval { + from: even(operand(0)?), + bytes: operand(2)?.cast_unsigned(), + retval_arg: operand(1)?, + }, + "ExitProcCb" => { + let bytes = operand(0)?; + ProcedureReturn::CopyToHidden { + from: even(TOP.saturating_sub(bytes)), + bytes: bytes.cast_unsigned(), + } + } + "ExitProcFrameCb" => ProcedureReturn::CopyToHidden { + from: even(operand(0)?), + bytes: operand(1)?.cast_unsigned(), + }, + _ => return None, + }) + } + + /// Classifies a `Resume` / `OnErrorGoto` instruction's operand into the + /// error-flow construct it encodes. + /// + /// The operand is a P-Code offset (a label) or a sentinel. Read from the + /// handlers (6.00.8176): `OnErrorGoto` (0x66105e46) first zeroes `Erl` + /// (runtime context + 0x98) and resets the error object at context + + /// 0x78 (0x66003b2f), then sets the handler `[ebp-0x40]` to + /// the label, to -1 for `0xFFFF` (`On Error Resume Next`) or to 0 for + /// `0xFFFE` (`On Error GoTo 0`); operand `0` instead clears the + /// statement an active handler is handling (`[ebp-0x3C]`) and keeps the + /// handler. `Resume` takes a label, `0xFFFF` (`Resume Next`) or `0xFFFE` + /// (`Resume`). /// /// Returns `None` for any other opcode. Prefer this over reading the raw - /// [`Operand::JumpTarget`], which renders a sentinel as a bogus `loc_FFFF`. + /// [`Operand::JumpTarget`], which renders a sentinel as `loc_FFFF`. pub fn error_flow(&self) -> Option { let target = match self.operands.first() { Some(Some(Operand::JumpTarget(v))) => *v, _ => return None, }; - match self.info.mnemonic { - "OnErrorGoto" => Some(match target { + match self.info.semantics { + OpcodeSemantics::OnError => Some(match target { 0xFFFF => ErrorFlow::OnErrorResumeNext, 0xFFFE => ErrorFlow::OnErrorGotoZero, + 0 => ErrorFlow::OnErrorClearActive, label => ErrorFlow::OnErrorGoto(label), }), - "Resume" => Some(match target { + OpcodeSemantics::Resume => Some(match target { 0xFFFF => ErrorFlow::ResumeNext, 0xFFFE => ErrorFlow::Resume, label => ErrorFlow::ResumeLabel(label), @@ -145,10 +446,67 @@ impl Instruction { } } +/// How an `ExitProc*` instruction returns its procedure's result, read from +/// the handlers (6.00.8176). Returned by +/// [`Instruction::procedure_return`]. +/// +/// The result never comes from the evaluation stack: a function stores it in +/// its frame (a 2-byte one at `ebp-0x86`, a 4-byte one at `ebp-0x88`, an +/// 8-byte one at `ebp-0x8C`, a Variant at `ebp-0x94`: the top of the locals, +/// just below the interpreter's slots that end at `ebp-0x84`), and the +/// `ExitProc*` form says where to take it from and how to hand it back. A +/// `Sub` ends with `ExitProc`, whose `eax` is then unused. +#[derive(Debug, Clone, Copy, PartialEq, Eq)] +pub enum ProcedureReturn { + /// In `eax` (1, 2 or 4 bytes, extended) or `edx:eax` (8 bytes), loaded + /// from frame offset `from`. + Register { + /// Frame offset (from ebp) of the value. + from: i16, + /// Its size in bytes. + bytes: u8, + /// `true` if a 2-byte value is sign-extended (`ExitProcI2`). + signed: bool, + }, + /// On the x87 stack (`fld`), from frame offset `from`: a Single (4 + /// bytes), a Double or Date (8). + X87 { + /// Frame offset (from ebp) of the value. + from: i16, + /// Its size in bytes. + bytes: u8, + }, + /// `eax` = 0 (`S_OK`) and nothing else: a method with no result, or one + /// whose result went through its `[out, retval]` pointer before. + Hresult, + /// `bytes` copied from frame offset `from` to the `[out, retval]` + /// pointer the caller passed in argument `retval_arg` (an offset from + /// ebp); `eax` = 0 (`S_OK`) (`ExitProcCbHresult`, + /// `ExitProcFrameCbHresult`). + CopyToRetval { + /// Frame offset (from ebp) of the value. + from: i16, + /// Bytes copied. + bytes: u16, + /// Offset from ebp of the argument holding the pointer. + retval_arg: i16, + }, + /// `bytes` copied from frame offset `from` to the hidden result pointer + /// the caller passed as the first argument (`ebp+0xC`), which `eax` + /// returns (`ExitProcCb`, `ExitProcFrameCb`: a module function returning + /// a Variant or a record). + CopyToHidden { + /// Frame offset (from ebp) of the value. + from: i16, + /// Bytes copied. + bytes: u16, + }, +} + /// Source-level error-handling construct recovered from a `Resume` or /// `OnErrorGoto` instruction by [`Instruction::error_flow`]. /// -/// VB6 encodes the three `On Error` and three `Resume` source forms in a single +/// VB6 encodes the `On Error` and `Resume` forms in one /// signed `i16` operand; this enum makes the encoding legible (and keeps the /// disassembler from printing a sentinel as `loc_FFFF`). #[derive(Debug, Clone, Copy, PartialEq, Eq)] @@ -159,6 +517,10 @@ pub enum ErrorFlow { OnErrorResumeNext, /// `On Error GoTo 0` - disables error handling; operand `-2` (`0xFFFE`). OnErrorGotoZero, + /// Operand `0`: resets the error state and the statement an active + /// handler is handling, keeping the installed handler. No fixture's source compiles + /// to it. + OnErrorClearActive, /// `Resume