ReactOS 0.4.17-dev-357-ga8f14ff
vbscript.h
Go to the documentation of this file.
1/*
2 * Copyright 2011 Jacek Caban for CodeWeavers
3 *
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
8 *
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
13 *
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
17 */
18
19#pragma once
20
21#include <stdarg.h>
22#include <stdint.h>
23
24#define COBJMACROS
25
26#include "windef.h"
27#include "winbase.h"
28#include "ole2.h"
29#include "dispex.h"
30#include "activscp.h"
31#include "activdbg.h"
32
33#include "vbscript_classes.h"
34#include "vbscript_defs.h"
35
36#include "wine/list.h"
37
38typedef struct {
39 void **blocks;
40 DWORD block_cnt;
41 DWORD last_block;
43 BOOL mark;
44 struct list custom_blocks;
46
53
54typedef struct _function_t function_t;
55typedef struct _vbscode_t vbscode_t;
57typedef struct _vbdisp_t vbdisp_t;
58
59typedef enum {
65
66typedef struct {
67 unsigned dim_cnt;
70
71typedef struct {
74 const WCHAR *name;
76
77typedef struct {
78 const WCHAR *name;
83
84typedef struct _class_desc_t {
85 const WCHAR *name;
87
90 unsigned func_cnt;
92
93 unsigned prop_cnt;
95
96 unsigned array_cnt;
98
100
103
104struct _vbdisp_t {
106
109 struct list entry;
110
114};
115
116typedef struct _dynamic_var_t {
119 const WCHAR *name;
123
124typedef struct {
127
131
135
137
140
141 unsigned int rnd;
142} ScriptDisp;
143
145
146typedef struct {
153
154typedef struct named_item_t {
157 unsigned ref;
158 DWORD flags;
159 LPWSTR name;
160
161 struct list entry;
163
172
173HRESULT to_int(VARIANT*,int*);
174
175static inline unsigned arg_cnt(const DISPPARAMS *dp)
176{
177 return dp->cArgs - dp->cNamedArgs;
178}
179
180static inline VARIANT *get_arg(DISPPARAMS *dp, DWORD i)
181{
182 return dp->rgvarg + dp->cArgs-i-1;
183}
184
185#define SP_CALLER_UNINITIALIZED ((IServiceProvider*)IntToPtr(-1))
186
187struct vbcaller {
189
191
194};
195
196struct _script_ctx_t {
198 LCID lcid;
200
204
206
209
210 EXCEPINFO ei;
213
214 struct list objects;
216 struct list named_items;
217};
218
221
223
224typedef enum {
234
235#define OP_LIST \
236 X(add, 1, 0, 0) \
237 X(and, 1, 0, 0) \
238 X(assign_ident, 1, ARG_BSTR, ARG_UINT) \
239 X(assign_member, 1, ARG_BSTR, ARG_UINT) \
240 X(bool, 1, ARG_INT, 0) \
241 X(catch, 1, ARG_ADDR, ARG_UINT) \
242 X(case, 0, ARG_ADDR, 0) \
243 X(concat, 1, 0, 0) \
244 X(const, 1, ARG_BSTR, 0) \
245 X(date, 1, ARG_DATE, 0) \
246 X(deref, 1, 0, 0) \
247 X(dim, 1, ARG_BSTR, ARG_UINT) \
248 X(div, 1, 0, 0) \
249 X(double, 1, ARG_DOUBLE, 0) \
250 X(empty, 1, 0, 0) \
251 X(enumnext, 0, ARG_ADDR, ARG_BSTR) \
252 X(equal, 1, 0, 0) \
253 X(hres, 1, ARG_UINT, 0) \
254 X(errmode, 1, ARG_INT, 0) \
255 X(eqv, 1, 0, 0) \
256 X(exp, 1, 0, 0) \
257 X(gt, 1, 0, 0) \
258 X(gteq, 1, 0, 0) \
259 X(icall, 1, ARG_BSTR, ARG_UINT) \
260 X(icallv, 1, ARG_BSTR, ARG_UINT) \
261 X(ident, 1, ARG_BSTR, 0) \
262 X(idiv, 1, 0, 0) \
263 X(imp, 1, 0, 0) \
264 X(incc, 1, ARG_BSTR, 0) \
265 X(int, 1, ARG_INT, 0) \
266 X(is, 1, 0, 0) \
267 X(jmp, 0, ARG_ADDR, 0) \
268 X(jmp_false, 0, ARG_ADDR, 0) \
269 X(jmp_true, 0, ARG_ADDR, 0) \
270 X(lt, 1, 0, 0) \
271 X(lteq, 1, 0, 0) \
272 X(mcall, 1, ARG_BSTR, ARG_UINT) \
273 X(mcallv, 1, ARG_BSTR, ARG_UINT) \
274 X(me, 1, 0, 0) \
275 X(mod, 1, 0, 0) \
276 X(mul, 1, 0, 0) \
277 X(neg, 1, 0, 0) \
278 X(nequal, 1, 0, 0) \
279 X(new, 1, ARG_STR, 0) \
280 X(newenum, 1, 0, 0) \
281 X(not, 1, 0, 0) \
282 X(nothing, 1, 0, 0) \
283 X(null, 1, 0, 0) \
284 X(numval, 1, 0, 0) \
285 X(or, 1, 0, 0) \
286 X(pop, 1, ARG_UINT, 0) \
287 X(redim, 1, ARG_BSTR, ARG_UINT) \
288 X(redim_preserve, 1, ARG_BSTR, ARG_UINT) \
289 X(ret, 0, 0, 0) \
290 X(retval, 1, 0, 0) \
291 X(set_ident, 1, ARG_BSTR, ARG_UINT) \
292 X(set_member, 1, ARG_BSTR, ARG_UINT) \
293 X(stack, 1, ARG_UINT, 0) \
294 X(step, 0, ARG_ADDR, ARG_BSTR) \
295 X(stop, 1, 0, 0) \
296 X(string, 1, ARG_STR, 0) \
297 X(sub, 1, 0, 0) \
298 X(val, 1, 0, 0) \
299 X(vcall, 1, ARG_UINT, 0) \
300 X(vcallv, 1, ARG_UINT, 0) \
301 X(xor, 1, 0, 0)
302
303typedef enum {
304#define X(x,n,a,b) OP_##x,
306#undef X
307 OP_LAST
309
310typedef union {
311 const WCHAR *str;
312 BSTR bstr;
313 unsigned uint;
314 LONG lng;
315 double *dbl;
318
319typedef struct {
321 unsigned loc;
324} instr_t;
325
326typedef struct {
327 const WCHAR *name;
329} arg_desc_t;
330
331typedef enum {
339
340typedef struct {
341 const WCHAR *name;
342} var_desc_t;
343
346 const WCHAR *name;
349 unsigned arg_cnt;
351 unsigned var_cnt;
353 unsigned array_cnt;
354 unsigned code_off;
357};
358
361 unsigned ref;
362
365 unsigned start_line;
366
368
373
376 unsigned bstr_cnt;
378
382
383 struct list entry;
384};
385
386static inline void grab_vbscode(vbscode_t *code)
387{
388 code->ref++;
389}
390
398void clear_ei(EXCEPINFO*);
402HRESULT array_access(SAFEARRAY *array, DISPPARAMS *dp, VARIANT **ret);
403
404void release_regexp_typelib(void);
406
407static inline BOOL is_int32(double d)
408{
409 return INT32_MIN <= d && d <= INT32_MAX && (double)(int)d == d;
410}
411
412static inline BOOL is_digit(WCHAR c)
413{
414 return '0' <= c && c <= '9';
415}
416
418BSTR string_replace(BSTR,BSTR,BSTR,int,int,int);
419
420void map_vbs_exception(EXCEPINFO *);
421
423
424#define FACILITY_VBS 0xa
425#define MAKE_VBSERROR(code) MAKE_HRESULT(SEVERITY_ERROR, FACILITY_VBS, code)
426
429
431
432#define VBSCRIPT_BUILD_VERSION 16978
433#define VBSCRIPT_MAJOR_VERSION 5
434#define VBSCRIPT_MINOR_VERSION 8
static struct sockaddr_in sa
Definition: adnsresfilter.c:69
#define is_digit(c)
Definition: astoll.c:39
Definition: list.h:37
UINT32 uint
Definition: types.h:83
double DATE
Definition: compat.h:2253
OLECHAR * BSTR
Definition: compat.h:2293
#define __WINE_ALLOC_SIZE(...)
Definition: corecrt.h:328
#define INT32_MAX
Definition: stdint.h:80
#define INT32_MIN
Definition: stdint.h:75
return ret
Definition: mutex.c:146
unsigned short WORD
Definition: ntddk_ex.h:93
unsigned int BOOL
Definition: ntddk_ex.h:94
unsigned long DWORD
Definition: ntddk_ex.h:95
GLintptr offset
Definition: glext.h:5920
const GLubyte * c
Definition: glext.h:8905
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
#define d
Definition: ke_i.h:81
static int blocks
Definition: mkdosfs.c:527
static const char mbstate_t *static wchar_t const char mbstate_t *static const wchar_t int *static double
Definition: string.c:91
static VARIANTARG static DISPID
Definition: ordinal.c:49
unsigned int UINT
Definition: ndis.h:50
short WCHAR
Definition: pedump.c:58
long LONG
Definition: pedump.c:60
#define REFIID
Definition: guiddef.h:118
DWORD LCID
Definition: nls.h:13
size_t member_cnt
Definition: vbscript.h:149
LONG ref
Definition: vbscript.h:148
const builtin_prop_t * members
Definition: vbscript.h:150
IDispatch IDispatch_iface
Definition: vbscript.h:147
script_ctx_t * ctx
Definition: vbscript.h:151
size_t global_funcs_size
Definition: vbscript.h:134
heap_pool_t heap
Definition: vbscript.h:139
LONG ref
Definition: vbscript.h:126
function_t ** global_funcs
Definition: vbscript.h:132
size_t global_vars_size
Definition: vbscript.h:130
size_t global_funcs_cnt
Definition: vbscript.h:133
class_desc_t * classes
Definition: vbscript.h:136
dynamic_var_t ** global_vars
Definition: vbscript.h:128
script_ctx_t * ctx
Definition: vbscript.h:138
size_t global_vars_cnt
Definition: vbscript.h:129
unsigned int rnd
Definition: vbscript.h:141
IDispatchEx IDispatchEx_iface
Definition: vbscript.h:125
array_desc_t * array_descs
Definition: vbscript.h:97
unsigned prop_cnt
Definition: vbscript.h:93
vbdisp_prop_desc_t * props
Definition: vbscript.h:94
vbdisp_funcprop_desc_t * funcs
Definition: vbscript.h:91
unsigned class_terminate_id
Definition: vbscript.h:89
script_ctx_t * ctx
Definition: vbscript.h:86
unsigned class_initialize_id
Definition: vbscript.h:88
unsigned func_cnt
Definition: vbscript.h:90
struct _class_desc_t * next
Definition: vbscript.h:101
const WCHAR * name
Definition: vbscript.h:85
unsigned array_cnt
Definition: vbscript.h:96
function_t * value_func
Definition: vbscript.h:99
VARIANT v
Definition: vbscript.h:118
SAFEARRAY * array
Definition: vbscript.h:121
const WCHAR * name
Definition: vbscript.h:119
struct _dynamic_var_t * next
Definition: vbscript.h:117
unsigned arg_cnt
Definition: vbscript.h:349
unsigned code_off
Definition: vbscript.h:354
function_type_t type
Definition: vbscript.h:345
vbscode_t * code_ctx
Definition: vbscript.h:355
BOOL is_public
Definition: vbscript.h:347
var_desc_t * vars
Definition: vbscript.h:350
array_desc_t * array_descs
Definition: vbscript.h:352
unsigned var_cnt
Definition: vbscript.h:351
arg_desc_t * args
Definition: vbscript.h:348
const WCHAR * name
Definition: vbscript.h:346
unsigned array_cnt
Definition: vbscript.h:353
function_t * next
Definition: vbscript.h:356
vbscode_t * error_loc_code
Definition: vbscript.h:211
ScriptDisp * script_obj
Definition: vbscript.h:205
EXCEPINFO ei
Definition: vbscript.h:210
IActiveScriptSite * site
Definition: jscript.h:392
UINT codepage
Definition: vbscript.h:199
struct list code_list
Definition: vbscript.h:215
BuiltinDisp * err_obj
Definition: vbscript.h:208
struct list objects
Definition: vbscript.h:214
struct vbcaller * vbcaller
Definition: vbscript.h:202
unsigned error_loc_offset
Definition: vbscript.h:212
DWORD safeopt
Definition: jscript.h:394
IInternetHostSecurityManager * secmgr
Definition: jscript.h:393
struct list named_items
Definition: jscript.h:391
BuiltinDisp * global_obj
Definition: vbscript.h:207
SAFEARRAY ** arrays
Definition: vbscript.h:112
IDispatchEx IDispatchEx_iface
Definition: vbscript.h:105
struct list entry
Definition: vbscript.h:109
const class_desc_t * desc
Definition: vbscript.h:111
BOOL terminator_ran
Definition: vbscript.h:108
LONG ref
Definition: vbscript.h:107
VARIANT props[1]
Definition: vbscript.h:113
BOOL is_persistent
Definition: vbscript.h:370
heap_pool_t heap
Definition: vbscript.h:377
function_t * funcs
Definition: vbscript.h:379
class_desc_t * last_class
Definition: vbscript.h:381
instr_t * instrs
Definition: vbscript.h:360
function_t main_code
Definition: vbscript.h:371
BOOL pending_exec
Definition: vbscript.h:369
named_item_t * named_item
Definition: vbscript.h:372
unsigned start_line
Definition: vbscript.h:365
DWORD_PTR cookie
Definition: vbscript.h:364
unsigned bstr_cnt
Definition: vbscript.h:376
BSTR * bstr_pool
Definition: vbscript.h:374
unsigned ref
Definition: vbscript.h:361
unsigned bstr_pool_size
Definition: vbscript.h:375
WCHAR * source
Definition: vbscript.h:363
class_desc_t * classes
Definition: vbscript.h:380
struct list entry
Definition: vbscript.h:383
BOOL option_explicit
Definition: vbscript.h:367
const WCHAR * name
Definition: vbscript.h:327
BOOL by_ref
Definition: vbscript.h:328
unsigned dim_cnt
Definition: vbscript.h:67
SAFEARRAYBOUND * bounds
Definition: vbscript.h:68
Definition: undname.c:54
Definition: inflate.c:139
instr_arg_t arg2
Definition: vbscript.h:323
vbsop_t op
Definition: vbscript.h:320
instr_arg_t arg1
Definition: vbscript.h:322
ScriptDisp * script_obj
Definition: vbscript.h:155
unsigned ref
Definition: jscript.h:152
struct list entry
Definition: jscript.h:156
LPWSTR name
Definition: jscript.h:154
DWORD flags
Definition: jscript.h:153
IDispatch * disp
Definition: jscript.h:151
const WCHAR * name
Definition: vbscript.h:341
IServiceProvider * caller
Definition: vbscript.h:193
IServiceProvider IServiceProvider_iface
Definition: vbscript.h:188
script_ctx_t * ctx
Definition: vbscript.h:192
LONG ref
Definition: vbscript.h:190
const WCHAR * name
Definition: vbscript.h:78
const WCHAR * name
Definition: vbscript.h:74
uint32_t DWORD_PTR
Definition: typedefs.h:65
uint16_t * LPWSTR
Definition: typedefs.h:56
DATE * date
Definition: vbscript.h:316
double * dbl
Definition: vbscript.h:315
const WCHAR * str
Definition: vbscript.h:311
static void grab_vbscode(vbscode_t *code)
Definition: vbscript.h:386
HRESULT WINAPI VBScriptRegExpFactory_CreateInstance(IClassFactory *, IUnknown *, REFIID, void **)
Definition: vbregexp.c:1833
HRESULT compile_procedure(script_ctx_t *, const WCHAR *, const WCHAR *, const WCHAR *, DWORD_PTR, unsigned, DWORD, class_desc_t **)
Definition: compile.c:2078
HRESULT create_safearray_iter(SAFEARRAY *sa, BOOL owned, IEnumVARIANT **ev)
Definition: utils.c:167
HRESULT array_access(SAFEARRAY *array, DISPPARAMS *dp, VARIANT **ret)
Definition: interp.c:525
vbdisp_invoke_type_t
Definition: vbscript.h:59
@ VBDISP_LET
Definition: vbscript.h:61
@ VBDISP_SET
Definition: vbscript.h:62
@ VBDISP_CALLGET
Definition: vbscript.h:60
@ VBDISP_ANY
Definition: vbscript.h:63
void release_dynamic_var(dynamic_var_t *)
Definition: interp.c:2411
BSTR get_vbscript_string(int)
Definition: vbscript_main.c:39
HRESULT disp_call(script_ctx_t *, IDispatch *, DISPID, DISPPARAMS *, VARIANT *)
Definition: vbdisp.c:1675
void clear_ei(EXCEPINFO *)
Definition: interp.c:288
HRESULT init_global(script_ctx_t *)
Definition: global.c:1091
HRESULT create_vbdisp(const class_desc_t *, vbdisp_t **)
Definition: vbdisp.c:507
HRESULT create_script_disp(script_ctx_t *, ScriptDisp **)
Definition: vbdisp.c:1545
vbsop_t
Definition: vbscript.h:303
@ OP_LAST
Definition: vbscript.h:307
IUnknown * create_ax_site(script_ctx_t *)
Definition: jscript.c:614
HRESULT init_err(script_ctx_t *)
#define OP_LIST
Definition: vbscript.h:235
void heap_pool_clear(heap_pool_t *)
Definition: jsutils.c:141
HRESULT get_disp_value(script_ctx_t *, IDispatch *, VARIANT *)
Definition: vbdisp.c:1710
static unsigned arg_cnt(const DISPPARAMS *dp)
Definition: vbscript.h:175
heap_pool_t * heap_pool_mark(heap_pool_t *)
Definition: jsutils.c:177
void * heap_pool_grow(heap_pool_t *, void *, DWORD, DWORD)
Definition: jsutils.c:125
struct _dynamic_var_t dynamic_var_t
HRESULT exec_script(script_ctx_t *, BOOL, function_t *, vbdisp_t *, DISPPARAMS *, VARIANT *)
Definition: interp.c:2455
struct _class_desc_t class_desc_t
void heap_pool_init(heap_pool_t *)
Definition: jsutils.c:66
void collect_objects(script_ctx_t *)
Definition: vbdisp.c:1563
HRESULT get_builtin_id(BuiltinDisp *, const WCHAR *, DISPID *)
Definition: global.c:127
static BOOL is_int32(double d)
Definition: vbscript.h:407
named_item_t * lookup_named_item(script_ctx_t *, const WCHAR *, unsigned)
Definition: jscript.c:162
HRESULT to_int(VARIANT *, int *)
Definition: global.c:419
function_type_t
Definition: vbscript.h:331
@ FUNC_PROPLET
Definition: vbscript.h:336
@ FUNC_PROPSET
Definition: vbscript.h:337
@ FUNC_SUB
Definition: vbscript.h:334
@ FUNC_PROPGET
Definition: vbscript.h:335
@ FUNC_GLOBAL
Definition: vbscript.h:332
@ FUNC_FUNCTION
Definition: vbscript.h:333
BSTR string_replace(BSTR, BSTR, BSTR, int, int, int)
Definition: vbregexp.c:1635
void heap_pool_free(heap_pool_t *)
Definition: jsutils.c:164
instr_arg_type_t
Definition: vbscript.h:224
@ ARG_DATE
Definition: vbscript.h:232
@ ARG_INT
Definition: vbscript.h:228
@ ARG_ADDR
Definition: vbscript.h:230
@ ARG_BSTR
Definition: vbscript.h:227
@ ARG_NONE
Definition: vbscript.h:225
@ ARG_DOUBLE
Definition: vbscript.h:231
@ ARG_STR
Definition: vbscript.h:226
@ ARG_UINT
Definition: vbscript.h:229
HRESULT compile_script(script_ctx_t *, const WCHAR *, const WCHAR *, const WCHAR *, DWORD_PTR, unsigned, DWORD, vbscode_t **)
Definition: compile.c:1986
HRESULT disp_propput(script_ctx_t *, IDispatch *, DISPID, WORD, DISPPARAMS *)
Definition: vbdisp.c:1718
void release_named_item(named_item_t *)
Definition: jscript.c:186
HRESULT WINAPI VBScriptFactory_CreateInstance(IClassFactory *, IUnknown *, REFIID, void **)
Definition: vbscript.c:1201
HRESULT vbdisp_get_id(vbdisp_t *, BSTR, vbdisp_invoke_type_t, BOOL, DISPID *)
Definition: vbdisp.c:60
void map_vbs_exception(EXCEPINFO *)
Definition: vbdisp.c:1605
void release_regexp_typelib(void)
Definition: vbregexp.c:1849
void detach_global_objects(script_ctx_t *)
Definition: global.c:3602
HRESULT report_script_error(script_ctx_t *, const vbscode_t *, unsigned)
Definition: vbscript.c:558
void release_vbscode(vbscode_t *)
Definition: compile.c:1915
HRESULT create_regexp(IDispatch **)
Definition: vbregexp.c:1811
HRESULT get_dispatch_typeinfo(ITypeInfo **)
Definition: jscript_main.c:78
HRESULT disp_get_id(IDispatch *, BSTR, vbdisp_invoke_type_t, BOOL, DISPID *)
Definition: vbdisp.c:1582
static VARIANT * get_arg(DISPPARAMS *dp, DWORD i)
Definition: vbscript.h:180
void * heap_pool_alloc(heap_pool_t *, size_t) __WINE_ALLOC_SIZE(2)
Definition: vbscript_main.c:60
#define WINAPI
Definition: msvc.h:6