1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#ifndef WINVXD_H
#define WINVXD_H
/** Some definitions from VMM or general VXD structs. */
#include <stdint.h>
#include <sassert.h>
enum {
SDK_VERSION_3 = 0x30A,
SDK_VERSION_4 = 0x400
};
enum {
UNDEFINED_INIT_ORDER = 0x80000000UL
};
enum VXD_DEVICE_IDS {
UNDEFINED_DEVICE_ID = 0,
VMM_DEVICE_ID = 1,
VMD_DEVICE_ID = 0xC,
VKD_DEVICE_ID = 0xD,
CONFIGMG_DEVICE_ID = 0x33,
};
enum {
/* Required for w9x to load 4.0 VxD */
DDB_PREV_INIT = 'Prev'
};
typedef struct {
uint32_t next;
uint16_t sdk_version;
uint16_t req_device_number;
uint8_t dev_major_version;
uint8_t dev_minor_version;
uint16_t flags;
char name[8];
uint32_t init_order;
void * control_proc;
void * v86_api_proc;
void * pm_api_proc;
void * v86_api_csip;
void * pm_api_csip;
void * reference_data;
void * service_table_ptr;
uint32_t service_table_size;
/** Windows 9x */
void * win32_service_table;
uint32_t prev;
uint32_t size;
uint32_t reserved[3];
} VxD_Desc_Block;
STATIC_ASSERT(sizeof(VxD_Desc_Block) == 80);
enum SYSTEM_CONTROL_MSGS {
SYS_CRITICAL_INIT = 0x0,
DEVICE_INIT = 0x1,
INIT_COMPLETE = 0x2,
SYS_VM_INIT = 0x3,
SYS_VM_TERMINATE = 0x4,
SYSTEM_EXIT = 0x5,
SYS_CRITICAL_EXIT=0x6,
CREATE_VM=0x7,
VM_CRITICAL_INIT=0x8,
VM_INIT=0x9,
VM_TERMINATE=0xA,
VM_NOT_EXECUTEABLE=0xB,
DESTROY_VM=0xC,
VM_SUSPEND=0xD,
VM_RESUME=0xE,
SET_DEVICE_FOCUS=0xF,
BEGIN_MESSAGE_MODE=0x10,
END_MESSAGE_MODE=0x11,
REBOOT_PROCESSOR=0x12,
QUERY_DESTROY=0x13,
DEBUG_QUERY=0x14,
BEGIN_PM_APP=0x15,
END_PM_APP=0x16,
DEVICE_REBOOT_NOTIFY=0x17,
CRIT_REBOOT_NOTIFY=0x18,
CLOSE_VM_NOTIFY=0x19,
POWER_EVENT=0x1A,
SYS_DYNAMIC_DEVICE_INIT=0x1B,
SYS_DYNAMIC_DEVICE_EXIT=0x1C,
CREATE_THREAD=0x1D,
THREAD_INIT=0x1E,
TERMINATE_THREAD=0x1F,
THREAD_NOT_EXECUTEABLE=0x20,
DESTROY_THREAD=0x21,
PNP_NEW_DEVNODE = 0x22,
W32_DEVICEIOCONTROL = 0x23,
SYS_VM_TERMINATE2 = 0x24,
//...
CLOSE_VM_NOTIFY2 = 0x2F,
KERNEL32_INITIALIZED=0x31,
KERNEL32_SHUTDOWN=0x32
};
static inline void clear_carry(void);
#pragma aux clear_carry = "clc" modify exact [];
static inline void set_carry(void);
#pragma aux set_carry = "stc" modify exact [];
static inline int set_carry_if_notzero(int arg);
#pragma aux set_carry_if_notzero = \
"cmp eax, 1" \
parm [eax] \
value [eax] \
modify exact [];
#endif // WINVXD_H
|