#define WIN32_LEAN_AND_MEAN
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <Shlwapi.h>
#include <malloc.h>
typedef struct {
// 0x0004 *this
// 0x011e heap ptr
// 0x015c stack position
// 0x0154 stack pointer
// 0x0158 something else stack related?
}vm_state;
#pragma pack(1)
enum pbvalue_type
{
pbvalue_notype = 0,
pbvalue_int,
pbvalue_long,
pbvalue_real,
pbvalue_double,
pbvalue_dec,
pbvalue_string,
pbvalue_boolean,
pbvalue_any,
pbvalue_uint,
pbvalue_ulong,
pbvalue_blob,
pbvalue_date,
pbvalue_time,
pbvalue_datetime,
pbvalue_dummy1,
pbvalue_dummy2,
pbvalue_dummy3,
pbvalue_char,
pbvalue_dummy4,
pbvalue_longlong,
pbvalue_byte
};
typedef struct {
DWORD value;
short flags;
/* known flags
0x0001 is null
0x0004 autoinstantiate
0x0040 system type
0x0100 instance?
0x0200 shared?
0x0400 2 byte
0x0800 not valid?
0x2000 is array;
*/
short type;
}value;
typedef struct {
DWORD len;
char data[1];
}blob;
#define IS_NULL 1
#define IS_ARRAY 0x2000
// variable?
typedef struct {
DWORD flag; // 0 = immediate value / local variable, 1 = object field, 2 = object array element?
short noidea; // -1??
short type;
short flags;
value *value; // +0x0ah
DWORD parent; // +0x0eh
DWORD noidea3;
DWORD item;
}lvalue;
// reference to variable?
typedef struct {
lvalue *ptr;
short isnull;
}lvalue_ref;
typedef struct{
long f1;
short group_id;//+4
short class_id;//+6
short routine_id;
short f2;
short f3;
short f4;
short f5;
short f6;
short f7;
short f8;
short f9;
void * f10;
short f12;
short f13;
short f14;
short f15;
short caller_line_no;//+38
short f16;
short f17;
short f18;
short f19;
short f20;
short f21;
void * f22;
short f24;
short f25;
short f26;
short f27;
short f28;
}stack_info;
typedef struct{ // don't need to know what's actually in this struct...
}group_data;
typedef struct{ // don't need to know what's actually in this struct...
}class_data;
typedef struct {
} pb_array;
typedef struct {
} pb_class;
typedef bool __stdcall shlist_callback(stack_info *, void *);
// PBVM imports
value * __stdcall ot_get_field_lv(vm_state *, value *, DWORD);
value * __stdcall ot_get_field_item_lv(vm_state *, value *, DWORD, DWORD);
value * __stdcall ot_get_next_evaled_arg_no_convert(vm_state *);
short __stdcall ot_get_simple_intarg(vm_state *, DWORD *);
int __stdcall ot_array_num_items(vm_state *, pb_array *);
value * __stdcall ot_array_index(vm_state *, pb_array *, int);
void __stdcall ot_set_return_val(vm_state *, value *);
void __stdcall ot_no_return_val(vm_state *);
int __stdcall rt_create_obinst(vm_state *, wchar_t *, pb_class**);
int __stdcall ot_create_obinst_at_lval(vm_state *,lvalue_ref *,int,int);
int __stdcall ob_set_field(vm_state *, int,int,value*);
int __stdcall ob_set_ptr_field(vm_state *, pb_class*,int,void *);
int __stdcall ob_set_ulong_field(vm_state *, int,int,int);
int __stdcall ob_get_ulong_field(vm_state *, int,int);
wchar_t * __stdcall ob_dup_string(vm_state *, wchar_t *);
void * __stdcall ot_get_valptr_arg(vm_state *, DWORD *);
int __stdcall ot_get_curr_obinst_expr(vm_state *, pb_class**, DWORD*);
lvalue_ref * __stdcall ot_get_next_lvalue_arg(vm_state *, DWORD *);
pb_array * __stdcall ot_array_create_unbounded(vm_state *, int, int);
void __stdcall ot_free_val_ptr(vm_state *, value *);
void * __stdcall pbstg_alc(vm_state *, int, int);
void __stdcall ot_assign_ref_array(vm_state *, lvalue *, pb_array*, short, short);
void __stdcall ot_assign_ref_string(vm_state *, lvalue *, wchar_t*, short);
void __stdcall ot_assign_ref_long(vm_state *, lvalue *, int, short);
int __stdcall ob_get_no_fields(vm_state *, pb_class *);
int __stdcall ob_get_first_user_field(vm_state *, pb_class *);
void __stdcall ob_get_field(vm_state *, pb_class *, int, value *);
void __stdcall ob_set_field(vm_state *, pb_class *, int, value *);
int __stdcall ot_get_ulongarg(vm_state *, DWORD *);
int __stdcall pbstg_sz(vm_state *, void *);
void * __stdcall pbstg_realc(vm_state *, void *, int, int);
wchar_t * __stdcall ob_get_group_name(vm_state *, short);
wchar_t * __stdcall ob_class_name_not_indirect(vm_state *, int);
group_data * __stdcall ob_group_data_srch(vm_state *, short);
class_data * __stdcall ob_get_class_entry(vm_state *, group_data **, short);
wchar_t * __stdcall ob_event_module_name(vm_state *, group_data *, class_data *, short);
bool __stdcall shlist_traversal(void *, void *, shlist_callback);
int __stdcall rtRoutineExec(vm_state *, int, pb_class *, int, int, value*, int, int, int, int);
#define GET_HEAP(x) (*(DWORD *)(((char *)x) + 0x11e))
#define GET_STACKLIST(x) (void*)(*(DWORD *)(((char *)x) + 218))
#define GET_THROW(x) (((pb_class**)x)[147])
value * get_lvalue(vm_state *vm, lvalue_ref *value_ref);
void Throw_Exception(vm_state *vm, wchar_t *text, ...);
void Install_Crash_Hook();
void Uninstall_Crash_Hook();
extern vm_state *last_vm;
File: pbvm.h
Size: 4977
Date: Tue, 08 May 2012 23:13:40 +0200
Type: h
Size: 4977
Date: Tue, 08 May 2012 23:13:40 +0200
Type: h