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
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
|
/*
* nt_vdd.h
*
* VDD services exports and defines
*
*/
#ifndef _NT_VDD
#define _NT_VDD
/**
* IO port service prototypes and data structure definitions
**/
/** Basic typedefs of VDD IO hooks **/
typedef VOID (*PFNVDD_INB) (WORD iport,BYTE * data);
typedef VOID (*PFNVDD_INW) (WORD iport,WORD * data);
typedef VOID (*PFNVDD_INSB) (WORD iport,BYTE * data,WORD count);
typedef VOID (*PFNVDD_INSW) (WORD iport,WORD * data,WORD count);
typedef VOID (*PFNVDD_OUTB) (WORD iport,BYTE data);
typedef VOID (*PFNVDD_OUTW) (WORD iport,WORD data);
typedef VOID (*PFNVDD_OUTSB) (WORD iport,BYTE * data,WORD count);
typedef VOID (*PFNVDD_OUTSW) (WORD iport,WORD * data,WORD count);
/** Array of handlers for VDD IO hooks. **/
typedef struct _VDD_IO_HANDLERS {
PFNVDD_INB inb_handler;
PFNVDD_INW inw_handler;
PFNVDD_INSB insb_handler;
PFNVDD_INSW insw_handler;
PFNVDD_OUTB outb_handler;
PFNVDD_OUTW outw_handler;
PFNVDD_OUTSB outsb_handler;
PFNVDD_OUTSW outsw_handler;
} VDD_IO_HANDLERS, *PVDD_IO_HANDLERS;
/** Port Range structure **/
typedef struct _VDD_IO_PORTRANGE {
WORD First;
WORD Last;
} VDD_IO_PORTRANGE, *PVDD_IO_PORTRANGE;
BOOL VDDInstallIOHook (
HANDLE hVDD,
WORD cPortRange,
PVDD_IO_PORTRANGE pPortRange,
PVDD_IO_HANDLERS IOhandler
);
VOID VDDDeInstallIOHook (
HANDLE hVdd,
WORD cPortRange,
PVDD_IO_PORTRANGE pPortRange
);
WORD VDDReserveIrqLine (
HANDLE hVdd,
WORD IrqLine
);
BOOL VDDReleaseIrqLine (
HANDLE hVdd,
WORD IrqLine
);
/**
* DMA service prototypes and data structure definitions
**/
/** Buffer definition for returning DMA information **/
typedef struct _VDD_DMA_INFO {
WORD addr;
WORD count;
WORD page;
BYTE status;
BYTE mode;
BYTE mask;
} VDD_DMA_INFO, *PVDD_DMA_INFO;
/** bits for querying the DMA information **/
#define VDD_DMA_ADDR 0x01
#define VDD_DMA_COUNT 0x02
#define VDD_DMA_PAGE 0x04
#define VDD_DMA_STATUS 0x08
#define VDD_DMA_ALL VDD_DMA_ADDR | VDD_DMA_COUNT | VDD_DMA_PAGE | VDD_DMA_STATUS
DWORD VDDRequestDMA (
HANDLE hVDD,
WORD iChannel,
PVOID Buffer,
DWORD length
);
BOOL VDDSetDMA (
HANDLE hVDD,
WORD iChannel,
WORD fDMA,
PVDD_DMA_INFO Buffer
);
BOOL VDDQueryDMA (
HANDLE hVDD,
WORD iChannel,
PVDD_DMA_INFO pDmaInfo
);
/**
* Memory mapped I/O service prototypes and data structure definitions
**/
typedef VOID (*PVDD_MEMORY_HANDLER) (PVOID FaultAddress, ULONG RWMode);
BOOL VDDInstallMemoryHook (
HANDLE hVDD,
PVOID pStart,
DWORD count,
PVDD_MEMORY_HANDLER MemoryHandler
);
BOOL VDDDeInstallMemoryHook (
HANDLE hVDD,
PVOID pStart,
DWORD count
);
BOOL VDDAllocMem(
HANDLE hVDD,
PVOID Address,
DWORD Size
);
BOOL VDDFreeMem(
HANDLE hVDD,
PVOID Address,
DWORD Size
);
/**
* Misc. service prototypes and data structure definitions
**/
BOOL VDDIncludeMem(
HANDLE hVDD,
PVOID Address,
DWORD Size
);
VOID VDDTerminateVDM();
/** Basic typedefs of VDD User hooks **/
typedef VOID (*PFNVDD_UCREATE) (USHORT DosPDB);
typedef VOID (*PFNVDD_UTERMINATE) (USHORT DosPDB);
typedef VOID (*PFNVDD_UBLOCK) (VOID);
typedef VOID (*PFNVDD_URESUME) (VOID);
/** Array of handlers for VDD User hooks. **/
typedef struct _VDD_USER_HANDLERS {
HANDLE hvdd;
PFNVDD_UCREATE ucr_handler;
PFNVDD_UTERMINATE uterm_handler;
PFNVDD_UBLOCK ublock_handler;
PFNVDD_URESUME uresume_handler;
struct _VDD_USER_HANDLERS *next;
} VDD_USER_HANDLERS, *PVDD_USER_HANDLERS;
/** Function prototypes **/
BOOL VDDInstallUserHook (
HANDLE hVDD,
PFNVDD_UCREATE Ucr_Handler,
PFNVDD_UTERMINATE Uterm_Handler,
PFNVDD_UBLOCK Ublock_handler,
PFNVDD_URESUME Uresume_handler
);
BOOL VDDDeInstallUserHook (
HANDLE hVdd
);
VOID VDDTerminateUserHook(USHORT DosPDB);
VOID VDDCreateUserHook(USHORT DosPDB);
VOID VDDBlockUserHook(VOID);
VOID VDDResumeUserHook(VOID);
VOID VDDSimulate16(VOID);
SHORT VDDAllocateDosHandle(ULONG pPDB, PVOID* ppSFT, PVOID* ppJFT);
VOID VDDAssociateNtHandle(PVOID pSFT, HANDLE h32File, WORD wAccess);
BOOL VDDReleaseDosHandle (ULONG pPDB, SHORT hFile);
HANDLE VDDRetrieveNtHandle (ULONG pPDB, SHORT hFile, PVOID* ppSFT, PVOID* ppJFT);
#endif // ifndef _NT_VDD
|